IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Comment tester l'absence de paramètres avant d'ouvrir la Form [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre averti
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 306
    Points : 303
    Points
    303
    Par défaut Comment tester l'absence de paramètres avant d'ouvrir la Form
    bonjour à tous
    J'ai une application à laquelle je passe un paramètre.
    Dans FormCreate je veux tester si un paramètre est présent, si pas de paramètre fin de l'application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    if paramstr(1)='' then application.Terminate; 
    end;
    mais ça ne marche pas, l'application se lance même sans paramètre et plante.

  2. #2
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 413
    Points : 9 899
    Points
    9 899
    Par défaut
    Je ferai plutôt le test dans le corps du programme, en testant ParamStr avant la création des Forms et dans le cas où il n'y a pas de paramètre, je n’exécute pas le Application.run.

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  3. #3
    Membre habitué Avatar de danucc
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    Un vieux souvenir... j'utilisais ParamCnt et s'il était à 0, c'est qu'il n'y avait pas de paramètres.
    (Pas testé récemment)

  4. #4
    Membre averti
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 306
    Points : 303
    Points
    303
    Par défaut
    avec paramcount() même résultat.
    Mais je viens de tester en remplaçant Application.terminate par halt, et là ça marche.

  5. #5
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 74
    Points : 131
    Points
    131
    Par défaut
    On doit faire cette vérification en amont avant la création de la forme est avant le lancement de la boucle Run
    Dans le code du projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    begin
      if Paramstr(1)  = '' then
         Exit;
      RequireDerivedFormResource:=True;
      Application.Scaled:=True;
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

  6. #6
    Membre averti
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 306
    Points : 303
    Points
    303
    Par défaut
    Je ne pensais pas que l'on pouvait tester paramstr dans le fichier lpr.
    Merçi

  7. #7
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 175
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Citation Envoyé par sematimo Voir le message
    bonjour à tous
    J'ai une application à laquelle je passe un paramètre.
    Dans FormCreate je veux tester si un paramètre est présent, si pas de paramètre fin de l'application:
    Le mieux est de tester le paramètre dans FormActivate et d'utiliser la procédure Close, ce qui vous permet accessoirement d'indiquer à l'utilisateur pourquoi l'application doit se fermer, et éventuellement de l'écrire dans le log si l'application en tient un.

    bb

  8. #8
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 391
    Points : 4 356
    Points
    4 356
    Par défaut
    Bonjour,

    En l'occurrence je ferais plutôt un test ParamCount > 0 car cela me gène un peu de demander un ParamStr à une position qui peut ne pas exister (même si il est vraisemblable que ParamStr retourne '' si c'est bien écrit).

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  9. #9
    Membre averti
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 306
    Points : 303
    Points
    303
    Par défaut
    si la ligne de commande pour lancer l'application contient par erreur un espace en fin, l'espace sera considéré comme un paramètre
    si je ne me trompe pas paramstr(0) retourne le nom de l'application, paramstr(0) est-il compris dans paramcount?
    si oui paramcount est toujours > 0

  10. #10
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 391
    Points : 4 356
    Points
    4 356
    Par défaut
    Bonjour,

    Non, ParamCount ne donne que le nombre de paramètres effectifs (ie pas de paramètre => ParamCount = 0).

    Une ligne avec un espace blanc sans rien après ne devrait pas être considérée comme ayant un paramètre. En effet, les espaces ne sont pas des paramètres mais les séparateurs utilisés pour le parsing de la ligne de commande. Le parser ne devrait pas se laisser avoir par un espace ou plusieurs sans argument derrière. De même il ne devrait pas être perturbé par plusieurs blancs à la suite.

    Je n'ai pas vérifié, mais si c'est le cas, il suffit d'écrire if (ParamCount > 0) and (ParamStr(1) <> '').... L'évaluation courte (active par défaut) de l'expression booléenne évitera de tester ParamStr(1) <> '' si ParamCount <= 0. Par ailleurs, il faudrait signaler le problème à l'équipe FreePascal.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  11. #11
    Membre averti
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 306
    Points : 303
    Points
    303
    Par défaut
    Bonjour
    ParamCount > 0 est donc la meilleure option.
    merci

  12. #12
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 175
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Citation Envoyé par Guesset Voir le message
    Bonjour,

    En l'occurrence je ferais plutôt un test ParamCount > 0 car cela me gène un peu de demander un ParamStr à une position qui peut ne pas exister (même si il est vraisemblable que ParamStr retourne '' si c'est bien écrit).

    Salutations
    C'est implicite dans ma suggestion. Il faut toujours tester la taille d'un array ou d'une liste pour ne pas chercher un index inexistant qui va déclencher une exception.

    bb.

  13. #13
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 74
    Points : 131
    Points
    131
    Par défaut
    Si le paramètre n'existe pas une chaine vide est retournée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Function ParamStr(Param : Integer) : ansistring;
      begin
      {
        Paramstr(0) should return the name of the binary.
        Since this functionality is included in the system unit,
        we fetch it from there.
        Normally, pathnames are less than 255 chars anyway,
        so this will work correct in 99% of all cases.
        In time, the system unit should get a GetExeName call.
      }
        if (Param=0) then
          Result:=System.Paramstr(0)
        else if (Param>0) and (Param<argc) then
          Result:=Argv[Param]
        else
          Result:='';
      end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2016, 16h34
  2. Réponses: 1
    Dernier message: 26/02/2016, 10h48
  3. Comment tester du Digest sous Wamp avant de passer en ligne
    Par bruce-willis dans le forum Apache
    Réponses: 1
    Dernier message: 10/06/2011, 19h26
  4. comment tester le typed'un champ avant de le changer?
    Par korntex5 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/06/2007, 17h52
  5. [PHP-JS] Comment tester un champ avant de valider avec GET ?
    Par anis_el_madani dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2007, 20h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo