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

 Delphi Discussion :

TObjectList : question de debutant.


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut TObjectList : question de debutant.
    Bonjour

    Je découvre Delphi avec la version starter téléchargée voila une semaine.
    J ai pas mal lu de tutos et ai créé mon premier objet auquel j arrive à accéder..

    Mon pb est que quand je crée mon objet dans une TObjectList, là je ne comprends plus comment y accéder.

    Mon code :
    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
    24
    25
    26
    27
    28
    29
    type
      TBarre = class
        date: integer;
        Open: double;
        low: double;
        high: double;
        close: double;
        tg1: double;
        tg2: double;
        tp: double;
        sl: double;
        constructor Create(Adate: integer; AOpen, Alow, Ahigh, AClose, ATg1, Atg2,
          ATp, ASL: double);
      end;
     
     
    Constructor TBarre.Create(Adate: integer; AOpen, Alow, Ahigh, AClose, ATg1,
      Atg2, ATp, ASL: double);
    begin
      date := Adate;
      Open := AOpen;
      low := Alow;
      high := Ahigh;
      close := AClose;
      tg1 := ATg1;
      tg2 := Atg2;
      tp := ATp;
      sl := ASL;
    end;
    puis ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Barres := TObjectList.Create;
      Barres.OwnsObjects := true;
     
    for I := 0 to sl.Count - 1 do
      begin
     
        Barre := TBarre.Create(1,2,3,4,5,6,7,8,9);
        Barres.Add(Barre);
     
     
      end;
    Donc ma question est toute bête mais comment acceder par exemple à la valeur low de la 3 eme barre de ma liste ?

    J ai tenté barres[3].barre.low mais bien evidement ce n est pas ça.

    J'etais assez content de moi pour avoir reussi à creer des objets 'simples' et les utiliser, je pensais en avoir compris tous le mecanisme mais là je m aperçois que ce n est pas encore ça.
    Donc j ai besoin de votre aide
    merci
    stephane

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour et même bienvenue,

    Plutôt que de répondre directement je préfère vous renvoyer sur le blog de nostroyo
    https://www.developpez.net/forums/bl...nerics-delphi/

    NB par Delphi version Starter, j’espère qu'il s'agit plutôt de la version Communauty beaucoup plus complète et tout aussi gratuite
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Pour avoir un code plus "propre" je te conseil de passer les propriétés en strict private et d'ajouter des accesseurs.
    Sur une TObjectList par défaut le constructeur est a OwnnsObject = True du coup pas besoin de le spécifier.
    Si tu utilises une TObjectList ajoute le type que tu souhaites, TObjectList<TBarre>.Create;Après avoir regardé le tuto, tu as du comprendre que tu peux accéder à la valeur avec un Barres[i].low ou Barre[i].getLow avec un accesseur.

  4. #4
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut
    Merci d avoir pris le temps de me réponde.
    Effectivement la version que j ai installé est la version Communauty.

    J ai attentivement regardé le tuto.
    J'ai donc le code suivant.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    TBarre = class
      strict private
        Fdate: integer;
        FOpen: double;
        Flow: double;
        Fhigh: double;
        Fclose: double;
        Ftg1: double;
        Ftg2: double;
        Ftp: double;
        Fsl: double;
     
      public
        property date: integer read Fdate write Fdate;
        property open: double read FOpen write FOpen;
        property low: double read Flow write Flow;
        property high: double read Fhigh write Fhigh;
        property close: double read Fclose write Fclose;
        property tg1: double read Ftg1 write Ftg1;
        property tg2: double read Ftg2 write Ftg2;
        property tp: double read Ftp write Ftp;
        property sl: double read Fsl write Fsl;
     
        constructor Create(Adate: integer; AOpen, Alow, Ahigh, AClose, ATg1, Atg2,
          ATp, ASL: double);
      end;
     
     
    Constructor TBarre.Create(Adate: integer; AOpen, Alow, Ahigh, AClose, ATg1,
      Atg2, ATp, ASL: double);
    begin
      Fdate := Adate;
      FOpen := AOpen;
      Flow := Alow;
      Fhigh := Ahigh;
      Fclose := AClose;
      Ftg1 := ATg1;
      Ftg2 := Atg2;
      Ftp := ATp;
      Fsl := ASL;
    end;
    Je teste alors avec un click sur un bouton et là erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm2.Button1Click(Sender: TObject);
    var
      Barres: TObjectList<TBarre>;
      Barre: TBarre;
    begin
      Barres := TObjectList<TBarre>.Create;
      try
        Barres.Add(Barre.Create(1, 2, 3, 4, 5, 6, 7, 8, 9));
      Finally
        Barres.Free;
      end;
     
     
    end;
    l ' erreur pointe sur le constructeur.
    Mais si, immédiatement après barres.add je tape barre., j ai bien toute la liste de mes propriétés qui s affiche.
    si je tape Barre[0]. là plus rien !

    Je suis un peut etre un peu 'beta' mais c est mon initiation...
    Toutefois je crois comprendre que si la liste de mes propriétés s'affiche c est que le constructeur est correct et que l erreur doit provenir de ma TObjectList.

    Et là je ne comprends pas parce que j ai bien déclaré Barres: TObjectList<TBarre>.

    Donc, je me dis qu'en toute logique, l erreur devrait provenir de la ligne Barres.Add(Barre.Create(1, 2, 3, 4, 5, 6, 7, 8, 9));
    Mais quad je tape barres. j ai la liste qui s affiche, quand je valide le add j ai bien le type Tbarre qui s affiche....

    J ai encore besoin de vos lumières.

    Merci

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Barres.Add(TBarre.Create(1, 2, 3, 4, 5, 6, 7, 8, 9));
    C'est la classe qu'il faut utiliser.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour

    Dans votre vous détruisez votre liste Barres.Free; juste après l'avoir crée donc vous ne pouvez pas l'atteindre.

    ici j'ai reproduit votre code ( sans tester ) pour tenter de montrer ce qui se passe
    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 TForm2.Button1Click(Sender: TObject);
    var
      Barres: TObjectList<TBarre>;
      Barre: TBarre;
    begin
      Barres := TObjectList<TBarre>.Create;
      try
        Barres.Add(TBarre.Create(1, 2, 3, 4, 5, 6, 7, 8, 9));
        Showmessage(Format('avant finally alow %3.2f',[Barres[0].Alow]); // objet(s) existe encore
      Finally
        Showmessage(Format('après finally alow %3.2f',[Barres[0].Alow]); // objet(s) existe encore
        Barres.Free;
        try  
           Showmessage(Format('apres free alow %3.2f',[Barres[0].Alow]); // objet(s) n'existe plus lève une erreur
        except 
           Showmessage('Liste n''existe plus'); 
        end; 
      end;
    NOTE : essayez de ne pas utiliser de mots clés comme date,open et close qui peuvent prêter à confusion, exemple : quand je vois écrit date je m'attend à une date pas à un integer.


    Toujours sans tester
    ajoutez une variable privée à votre forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private 
       Barres: TObjectList<TBarre>;
    et par exemple, en fin de votre code des sections
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     initialization 
        Barres:= TObjectList<TBarre>.Create;
     finalization
        Barres.Free;
    end.
    réduisez votre code à sa plus simple expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm2.Button1Click(Sender: TObject);
    begin
        Barres.Add(TBarre.Create(1, 2, 3, 4, 5, 6, 7, 8, 9));
    end;
    et un autre bouton pour accéder au(x) éléments de la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm2.Button2Click(Sender: TObject);
    begin
     try  
           Showmessage(Format('Accès à l''objet d''indice 0 alow=%3.2f',[Barres[0].Alow]);
        except 
           Showmessage('Oops !'); 
        end;  
    end;
    resterait à vérifier s'il y a des fuites mémoire à la fin du programme en ajoutant ReportMemoryLeakOnShutDown:=true;soit dans le source du projet soit dans la section initialization
    vous pourrez alors tester ce qui se passe si vous oubliez le Barres.freede la section finalization
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    si je tape Barre[0]. là plus rien !
    La liste se nomme Barres...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut
    merci à tous,j ai enfin compris mon erreur.
    et acquis de bonnes pratiques.

  9. #9
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut Supprimer un objet de la liste
    Je me permets de rouvrir le post car il a trait directement à cette structure...Je ne sais pas si cela se fait... j avoue je débute en forum aussi

    J'essaie de supprimer un élément de la TObjectlist mais je n y parviens pas.

    Si je fais Barres[10].free et qu ensuite j affiche le contenu de Barres[10], il est toujours là et cela me déclenche une erreur opération de pointeur incorrecte à la fermeture de ma form.

    si je fais Barres[10]:=nil et que j essaie de l afficher au travers d un try/except, je vois bien que Barres[10] n existe plus mais si j'affiche le Barres.count, il est egal à Barres.count avant la suppression.
    (Là j ai bien compris que ce ne doit pas être la bonne façon de procéder étant donné que je dois utiliser try/except)

    Comment procéder correctement ?

    Merci de votre aide

    Stéphane

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    TObjectList, et c'est là un de ses avantages, a beaucoup de méthodes
    celle recherchées est tout simplement Delete
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut
    Merci.

  12. #12
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut
    Grace à vos conseils tout fonctionne à merveille toutefois j ai occasionnellement une erreur 'argument hors limite'
    je comprends ce que cela signifie mais je n arrive pas à comprendre précisément ici .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for I := 0 to Trades_In_Progress.Count - 1 do
      begin
        if Trades_In_Progress[I].Sens = 1 then
        begin
          if Trades_In_Progress[I].Tp >= prix_high then
          begin
           Trades_In_Progress.Delete(I);
          end
    selon ce que j ai compris de .delete() c est que ça supprime l élément dans la liste et 'remonte' le reste de la liste.
    dans mon cas précis cela supprime donc toujours le dernier élément et 'dans le pire des cas' la liste devrait avoir un compte de 0.

    Question : si Trades_In_Progress.Count= 0 apres un delete et qu'initialement il était à 1 est ce que rades_In_Progress.Count est 'actualisé' dans le FOR I, qu il passe à zero et que la prochaine boucle ne se fait pas ? (j espère que j ai été clair)

    Dans mon cas précis l'erreur se produit alors que rades_In_Progress.Count=14. Comment cela est-ce possible ?
    Je précise que je boucle sur une TstringListe et appelle différentes procédures au fil. La TstringList est remplie avec un fichier. Suivant le fichier que je lis, aucune erreur ne se déclenche.

    Pouvez vous m éclairer de vos lumières ?

    merci

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par NewUserDelphi Voir le message
    Pouvez vous m éclairer de vos lumières ?
    Désolé mais mes lumières commencent à baisser par manque de caféine ou par hypoglycémie ...
    plus sérieusement avec cette seule dernière partie de code, j'ai su mal à suivre
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut
    Je sais je suis pas le plus clair quand il s agit de détailler un problème...

    Pour expliquer cette partie de code :

    Je parcours une tstringlist avec des cotations boursières .
    Si les conditions pour l ouverture d un trade sont remplies j'ouvre ce trade en l ajoutant à Trades_In_Progress.

    Pour chaque nouvelle cotation je vérifie que j ai des trades en cours.
    Si tel est le cas je boucle sur ces trades pour vérifier si l un d entre eux répond aux conditions de fermeture.Si tel est le cas je le supprime de la liste avec Trades_In_Progress.Delete(I);

    Bon c est pour donner une idée de ce que je fais...

    Mais s il s agit d'être plus clair quant à argument hors limite... que devrais-je préciser. Comme je débute je ne sais pas trop quelles infos fournir et celles qui me semblent pertinentes ne le sont pas nécessairement...

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    Citation Envoyé par NewUserDelphi Voir le message
    Grace à vos conseils tout fonctionne à merveille toutefois j ai occasionnellement une erreur 'argument hors limite'
    je comprends ce que cela signifie mais je n arrive pas à comprendre précisément ici .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for I := 0 to Trades_In_Progress.Count - 1 do
      begin
        if Trades_In_Progress[I].Sens = 1 then
        begin
          if Trades_In_Progress[I].Tp >= prix_high then
          begin
           Trades_In_Progress.Delete(I);
          end
    selon ce que j ai compris de .delete() c est que ça supprime l élément dans la liste et 'remonte' le reste de la liste.
    dans mon cas précis cela supprime donc toujours le dernier élément et 'dans le pire des cas' la liste devrait avoir un compte de 0.

    Question : si Trades_In_Progress.Count= 0 apres un delete et qu'initialement il était à 1 est ce que rades_In_Progress.Count est 'actualisé' dans le FOR I, qu il passe à zero et que la prochaine boucle ne se fait pas ? (j espère que j ai été clair)

    Dans mon cas précis l'erreur se produit alors que rades_In_Progress.Count=14. Comment cela est-ce possible ?
    Je précise que je boucle sur une TstringListe et appelle différentes procédures au fil. La TstringList est remplie avec un fichier. Suivant le fichier que je lis, aucune erreur ne se déclenche.

    Pouvez vous m éclairer de vos lumières ?

    merci
    pour la suppression ton for doit etre dans l'autre sens
    car au moment ou tu supprime l’élément le nombre d'element dans la liste diminue et donc tu vas au delà des éléments présent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
      for I := Trades_In_Progress.Count - 1  downto 0  do
      begin
        if Trades_In_Progress[I].Sens = 1 then
        begin
          if Trades_In_Progress[I].Tp >= prix_high then
             Trades_In_Progress.Delete(I);
        end
        ...
      end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #16
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut
    MERCI.

    Donc si je comprends bien, et pour reprendre mon propos pas des plus clair, le Trades_In_Progress.Count ne se 'met pas à jour' il conserve la valeur qu il avait au moment du lancement de la boucle for.

    Je mets résolu pour de bon cette fois

  17. #17
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 930
    Points : 1 959
    Points
    1 959
    Par défaut
    Citation Envoyé par NewUserDelphi Voir le message
    MERCI.

    Donc si je comprends bien, et pour reprendre mon propos pas des plus clair, le Trades_In_Progress.Count ne se 'met pas à jour' il conserve la valeur qu il avait au moment du lancement de la boucle for.
    Non, je ne pense pas, c'est vérifiable en faisant du pas à pas avec le débogueur.

    Le problème est que tu vas manquer un élément en faisant une boucle incrémentale car par exemple, en supprimant le 4ième élément de la liste que vas t'il se passer au niveau de la liste ? Le 5ième élément va passer en 4ième position et ton index I va s'incrémenter et passer à 5, donc .... ?

  18. #18
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par NewUserDelphi Voir le message
    Donc si je comprends bien, et pour reprendre mon propos pas des plus clair, le Trades_In_Progress.Count ne se 'met pas à jour' il conserve la valeur qu il avait au moment du lancement de la boucle for.
    Si, il se met à jour mais au départ de la boucle, Trades_In_Progress.Count est affecté à une variable interne qui est décrémentée à chaque répétition jusqu'à atteindre 0. Cette variable, elle, n'évolue pas.

    Le compilateur génère effectivement ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Count := Trades_In_Progress.Count -1;
     
    repeat
    until Count = 0;
    Le debugger est trompeur à ce niveau puisqu'il nous remet le pointeur sur la ligne du for à chaque itération

  19. #19
    Membre régulier
    Homme Profil pro
    pas grand chose
    Inscrit en
    Septembre 2018
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : pas grand chose
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2018
    Messages : 131
    Points : 73
    Points
    73
    Par défaut
    Merci, j ai compris.

    Par contre une dernière question :

    Comment passer mon Trades_In_Progress en argument dans une fonction.

    Actuellement je passe son index en argument et cela fonctionne mais j imagine que je peux le passer 'en entier' et l'exploiter dans une procédure mais mes essais de déclaration avec TTrades_In_Progress comme type ne sont pas concluant. De plus, s'il est possible de le passer, comment appeler les différentes propriétés ?

    Merci de votre patience.

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Je reprend à partir des barres, j'ai été largué au moment l'introduction des Trades_ , je verrais bien une fonction du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function dosomething(aBarre : TBarre) : boolean;
    begin
    result:=aBarre.low>10;
    end;
    et en appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if dosomething(Barres[1]) then showmessage('La barre 1 est supérieure à 10');
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Questions de debutant (C : console application)
    Par Fredovsky dans le forum C
    Réponses: 3
    Dernier message: 23/03/2006, 12h59
  2. question de debutant sur les applets et la securité
    Par Invité dans le forum Applets
    Réponses: 2
    Dernier message: 27/01/2006, 14h10
  3. [C#] Question de debutant: methode "parent&quo
    Par bflash2k dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/01/2006, 15h37
  4. 2 questions de debutant
    Par New_programm_er dans le forum Ordinateurs
    Réponses: 6
    Dernier message: 29/12/2005, 08h32
  5. Vue parametrée (suite) - Question de debutant
    Par zorglob dans le forum Oracle
    Réponses: 1
    Dernier message: 28/12/2005, 11h28

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