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

Langage Delphi Discussion :

Expression illégale dans une boucle


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Expression illégale dans une boucle
    Bonjour,

    je suis en train d'apprendre le Delphi, je travail avec delphi 2005 perso, pour win32, et je construit un petit programme qui permet de sauvegarder des fichiers. Je me heurte à une erreur, je ne sait pas comment m'en sortir.

    Je veux récuperer le parametre de la ligne de commande, puis le comparer aux différentes sections d'un .ini, et si cela correspond, lancer une action. J'ai ceci comme code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          cl:=getcommandline;
          path:='"'+application.exename+'" ';
          for i:=0 to 10 do
            if  cl=path+parametre.strings[1] then
              begin
                {action}
               end;
    Et lors de l'export, j'ai une erreur à la ligne if, il me dit expression illégale dans l'opérateur. Mes maigres connaissances, mes recherches ne m'ont pas apporté de réponse. Si quelqu'un acceptait de me filer un petit coup de main... Merci à vous

  2. #2
    Membre régulier

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Points : 124
    Points
    124
    Par défaut
    Tes information s sont maigres pour pouvoir t'aider...

    Ta variable cl est de quel type ?

    Mais à vu de nez ton erreur doit venir de ta concaténation....

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Oui, évidement, il en manque un bout conséquent... donc, le tout:

    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
    18
    19
    procedure TForm1.FormCreate(Sender: TObject);
    var prog, path, cl : String;
          parametre: Tstrings;
     
    begin
        if FileExists('FS_MultiConfig.ini') then
        begin
          cl:=getcommandline;
          path:='"'+application.exename+'" ';
          FIni:=TiniFile.Create(ExtractFilePath(Application.ExeName)+'FS_MultiConfig.ini');
          ComboBox2.Items.Add('Profils');
          FIni.ReadSections(ComboBox2.Items);
          parametre:= ComboBox2.items;
     
          for i:=0 to 10 do
            if  cl=path+parametre.strings[0] then
              begin
                {action}
               end;
    J'ai tester le if en remplacant parametre.Strings[i] par 'mon_parametre', et dans ce cas, ça marche...

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Si tu essaies ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      cl:=getcommandline;
      path:='"'+application.exename+'" ';
      for i:=0 to 10 do
        if  cl=(path+parametre.strings[1]) then
        begin
          {action}
        end;
    (Ajoute des parenthèses)

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  5. #5
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Déjà d'un manière générale utilise plutôt un TStringList qu'un TStrings. Le type TStrings est plutôt destiné à être hérité et possède des classes abstraites qui peuvent parfois poser problème (Clear par exemple).

    D'ailleurs la fonction Get liée à la propriétés strings est déclarée avec abstract et virtual... Il n'y a donc pas d'implémentation de Get pour la classe TStrings

    Avec TStrings.Strings[i] tu appelles donc implicitement une fonction qui n'a pas d'implémentation et parametre.strings[0] ne renvoie rien

    Vala j'espère ne pas avoir sorti un tissu d'âneries, mais en théorie change en parametre en TStringList et ça fonctionnera
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci de vos réponses, tout d'abord.
    J'ai modifié le Tstrings, et rajouté les parenthéses, mais rien n'y fait. Lors de la compil, j'ai une erreur du débogeur, qui me donne ce message:




    Et là, je suis bloqué.

  7. #7
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    bizarre...

    Chez moi l'accès à Strings sur un TStringList fonctionne après avoir récupéré le contenu d'un TComboBox...

    Bon c'est un moyen de contournement mais en fait tu n'as pas besoin de ta variable parametre, autant utiliser directement ComboBox2.Items[i].

    Le compilateur t'indique la ligne du If lors de l'exception ?
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Effacé..je ne suis pas certain de mon affirmation

  9. #9
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Citation Envoyé par Bestiol
    Déjà d'un manière générale utilise plutôt un TStringList qu'un TStrings. Le type TStrings est plutôt destiné à être hérité et possède des classes abstraites qui peuvent parfois poser problème (Clear par exemple).

    D'ailleurs la fonction Get liée à la propriétés strings est déclarée avec abstract et virtual... Il n'y a donc pas d'implémentation de Get pour la classe TStrings

    Avec TStrings.Strings[i] tu appelles donc implicitement une fonction qui n'a pas d'implémentation et parametre.strings[0] ne renvoie rien

    Vala j'espère ne pas avoir sorti un tissu d'âneries, mais en théorie change en parametre en TStringList et ça fonctionnera
    Pas d'accord, c'est contraire au polymorphisme !
    L'affirmation serait vraie dans le cas d'une instanciation de TStrings ; or, ici on parle de copie de référence. En outre une telel instanciation serait vivement critiquée par le compilateur (avertissement).

    Le contexte d'utilisation de la TStrings est donc légal car la propriété items est de type TStrings et non pas TStringList (qui est effectivement un descendant de TStrings), c'est un peu surprenant au départ mais cela s'explique par les dérivations du composant TCustomComboBox (en TDBComboBox par exemple). TComboBox utilise en interne un objet TCustomComboBoxStrings qui est aussi un descendant direct de TStrings et qui est complétemejnt implémenté (cf le source dans l'unité StdCtrls).

    Compris ?

    Désolé pour le coup des parenthèses, je n'ai peut-être pas assez réfléchi.
    Comment Bestiolm arrive au résultat de sa dernière réponse ?

    Ceci dit je n'ai pas de réponse pour le comportement de ton code.
    As-tu activé le signalement des avertissement et des conseils à la compilation ? Si oui, est-ce que le compilateur te donne des éléments ?

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par Bestiol
    Déjà d'un manière générale utilise plutôt un TStringList qu'un TStrings. Le type TStrings est plutôt destiné à être hérité et possède des classes abstraites qui peuvent parfois poser problème (Clear par exemple).

    D'ailleurs la fonction Get liée à la propriétés strings est déclarée avec abstract et virtual... Il n'y a donc pas d'implémentation de Get pour la classe TStrings

    Avec TStrings.Strings[i] tu appelles donc implicitement une fonction qui n'a pas d'implémentation et parametre.strings[0] ne renvoie rien
    Déclarer un objet en Tstrings ne pose aucun problème, au contraire, cela permet d'utiliser les méthodes génériques de TStrings, mais il ne faut pas l'instancier en TStrings puisque c'est une classe virtuelle, mais l'instancier une classe fille comme par ex Tstringlist.

    Dans son cas, le plus simple est d'utiliser une tstrings (encore qu'il puisse directement utiliser combox2.items) car il récupére la référence combox2.items qui est un tstrings.

  11. #11
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    J'ai testé l'utilisation directe de ComboBox2.Items, cela semble déplacer le problème, mais pas le solutionner.

    Citation Envoyé par e-ric
    Ceci dit je n'ai pas de réponse pour le comportement de ton code.
    As-tu activé le signalement des avertissement et des conseils à la compilation ? Si oui, est-ce que le compilateur te donne des éléments ?

    cdlt

    e-ric
    Oui, ils sont activés, mais je suis un peu paumé dans les fenètres. Laquelle serai utile pour vous apporter qq chose?

    Lorsque je dit au programme de continuer, apparait ensuite une fenètre violation de ntdll.dll

  12. #12
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    C'est pas simple ton problème!

    Pour obtenir l'affichage des messages, fais un clic droit sur l'éditeur de code, un menu popup apparaît tu choisis alors l'options ''Voir les messages', s'il y a des messages tu les verras. Leur examen est souvent très utile.

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  13. #13
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci. Je vais voir cela demain, une bonne nuit comme conseil...

  14. #14
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Tu m'as l'air de vouloir te compliquer la vie pour rien, utilise plutot paramStr() à la place de getCommandLine()
    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
    18
    19
    20
    21
    22
    23
     
    var
      i: integer;
      FIni: TInifile;
    begin
    if FileExists('FS_MultiConfig.ini') then
        begin
          FIni:=TiniFile.Create(ExtractFilePath(Application.ExeName)+'FS_MultiConfig.ini');
          FIni.ReadSections(ComboBox2.Items); // ReadSections vide d'abord le combobox avant de rajouter ses enregistrements donc faut rajouter ton item après
          ComboBox2.Items.Insert(0, 'Profils'); // tu insers ton item à la position 0
     
          for i:=0 to ComboBox2.Items.Count-1 do  // tu fais un test sur le nombre d'enregistrements -1 du combobox, évite de mettre des valeurs en dur si elles peuvent changée
            //tu testes la position du paramètre de la ligne de commande, si il est différent de -1 c'est qu'il est présent dans la liste
            //paramStr(1) contient le 1er paramètre de la ligne de commande
            if  ComboBox2.Items.IndexOf(paramStr(1)) <> -1 then
              begin
                {action}
                break; // tu sors de la boucle pour ne pas répéter ton action
               end;
          end;
     
          FIni.Free;
    end;
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  15. #15
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Citation Envoyé par Bestiol
    Déjà d'un manière générale utilise plutôt un TStringList qu'un TStrings. Le type TStrings est plutôt destiné à être hérité et possède des classes abstraites qui peuvent parfois poser problème (Clear par exemple).

    D'ailleurs la fonction Get liée à la propriétés strings est déclarée avec abstract et virtual... Il n'y a donc pas d'implémentation de Get pour la classe TStrings

    Avec TStrings.Strings[i] tu appelles donc implicitement une fonction qui n'a pas d'implémentation et parametre.strings[0] ne renvoie rien

    Vala j'espère ne pas avoir sorti un tissu d'âneries, mais en théorie change en parametre en TStringList et ça fonctionnera
    Il ne faut pas créer d'objet TStrings, c'est-à-dire qu'il ne faut pas écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // A NE PAS FAIRE !
    sl := TStrings.Create;
    Par contre, en tant que paramètre d'une fonction, il est très fortement conseillé de déclarer un TStrings, ce qui permettra de passer n'importe quel objet d'un type dérivé de TStrings :

    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
    procedure truc(strings : TStrings);
    begin
      strings.Clear;
    end;
    ...
    var
      strings : TStringList
    begin
      strings := TStringList.Create;
      truc(strings);
      strings.Free;
      // ou encore :
      truc(memo1.Lines);
      ...
    end;
    C'est un des fondements de la POO : déclarer des classes abstraites (TStrings) mais utiliser des sous-classes concrètes (TStringList). Le code est alors réutilisable puisque je pourrai appeler ma fonction truc avec n'importe quel objet qui hérite de TStrings. Le mécanisme des méthodes virtuelles (le polymorphisme) s'occupe de tout.

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  16. #16
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci, lil_jam63, ça marche très bien! Et merci à tous les autres, de vos explications et de vos réponses. (Je mentirais en disant que j'ai tout compris du premier coup, mais j'ai un peu de temps devant moi, je vais bosser... 8) )

  17. #17
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    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
    procedure truc(strings : TStrings);
    begin
      strings.Clear;
    end;
    ...
    var
      strings : TStringList
    begin
      strings := TStringList.Create;
      truc(strings);
      strings.Free;
      // ou encore :
      truc(memo1.Lines);
      ...
    end;
    Dans le livre Delphi 7 studio, il est indiqué de déclaré une var en TStrings et non en Tstringlist. mais d'utiliser dans tous les cas Le create de la classe Tstringlist :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      strings : TStrings
    begin
      strings := TStringList.Create;
    Quel est la bonne méthode ?

  18. #18
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Il faut déclarer un TStrings si tu ne connais pas le type réel de l'objet, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      sl : TStrings;
    begin
      sl := memo1.Lines;
      ...
    end;
    Par contre si tu sais que tu vas utiliser un TStringList, tu peux déclarer un TStrings, mais tu peux aussi déclarer un TStringList :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      sl1 : TStrings;
      sl2 : TStringList;
    begin
      sl1 := TStringList.Create;
      sl2 := TStringList.Create;
      ...
    end;
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

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

Discussions similaires

  1. [langage] incrementation de variable dans une boucle
    Par mimilou dans le forum Langage
    Réponses: 15
    Dernier message: 16/04/2004, 13h23
  2. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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