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 :

Parcours d'une TObjectList avec for .. in


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut Parcours d'une TObjectList avec for .. in
    Bonjour,
    Je veux parcourir un objet de type TObjectList avec la boucle for ... in, voici le bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TListnerAppForPrincipalApp.btStopAllThreadClick(Sender: TObject);
    var
      vShedule: TScheduledEvent;
    begin
      for vShedule in EventList do
      begin
        if vShedule.Running then
          vShedule.Stop;
      end;
    end;
    j'ai le message d'erreur suivant : E2010 Types incompatibles : 'TScheduledEvent' et 'Pointer'

    j'ai essayé d'utiliser une variable locale de type pointeur sur la même variable de parcours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TListnerAppForPrincipalApp.btStopAllThreadClick(Sender: TObject);
    var
      vShedule: TScheduledEvent;
      vItem: Pointer Absolute vShedule;
    begin
      for vItem in EventList do
        begin
          if vItem.Running then
            vItem.Stop;
        end;
    end;
    J'ai eu alors ce message d'erreur : E1019 La variable de contrôle de boucle FOR doit être une variable locale simple
    C'est ici que je ne trouve pas de réponse car vItem est de type pointeur en local.
    Alors, comment parcourir mon EventList qui est de type TObjectList avec la boucle for ... in

    Merci d'avance
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    EventList est-elle de type TObjectList<TScheduledEvent>?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    for in est pour les Generics
    Est-ce bien une TObjectList Generics ? et non celle de l'unité Contnrs ?
    Est-ce même une TObjectList et pas un simple TList (unité Classes) car Pointer c'est une TList
    Ne pas confondre Classes.TList et TList<>

    En XE2

    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
    procedure TZooThomVCLMainForm.pnl1Click(Sender: TObject);
    type
      TButtonList = System.Generics.Collections.TObjectList<TButton>;
    var
      bl: TButtonList;
      I: Integer;
      b: TButton;
    begin
      bl := TButtonList.Create(False);
      try
        bl.Add(btn1);
        bl.Add(btn2);
        bl.Add(btn3);
     
        for b in bl do
          ShowMessage(b.Caption);
     
      finally
        bl.Free();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    @ShaiLeTroll:
    Si on utilise un TObjectList non générique, on obtient bien le message E2010 Types incompatibles : 'TScheduledEvent' et 'Pointer'.
    Je m'attendais à un message
    E2010 Types incompatibles : 'TScheduledEvent' et 'TObject', mais non.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  5. #5
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Salut

    EventList est de type TSchEventList et en définition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     TSchEventList = class(TObjectList)
    TObjectList n'est pas celle la générique dans Generics.Collections.TObjectList, mais c'est dans l'unité Contnrs.

    Merci
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Si ce n'est pas une liste générique, ce n'est pas possible d'utiliser le for in de cette façon.

    Tu peux utiliser cela, mais c'est dommage de se passer des génériques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TListnerAppForPrincipalApp.btStopAllThreadClick(Sender: TObject);
    var
      vShedule: TScheduledEvent;
      vSchedulePointer:Pointer;
    begin
      for vSchedulePointer in EventList do
      begin
        vShedule:=TScheduledEvent(vSchedulePointer);    if vShedule.Running then
          vShedule.Stop; end;
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Le "For..in" n'est pas réservé aux génériques (voir exemple ci-dessous avec TStringList).
    Sinon, la solution peut se voir comme suit:

    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
     
    var
      Liste: TStringList;
      S: string;
      Events: TSchEventList;
      Event: TScheduledEvent;
      Obj: Pointer;
    begin
      Liste := TStringList.Create;
      Liste.Add('Titi');
      for S in Liste do
        ShowMessage(S);
      Liste.Free;
     
      Events := TSchEventList.Create;
      Events.Add('Toto');
      for Obj in Events do
      begin
        ShowMessage(TScheduledEvent(Obj).Name);
      end;
      Events.Free;
    end;
    Bon w_e !

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Le "For..in" n'est pas réservé aux génériques (voir exemple ci-dessous avec TStringList).
    Sinon, la solution peut se voir comme suit:
    Effectivement, Papy a bien raison !
    Je ne bosse sur Delphi XE2 que depuis quelques mois et j'ai commis une erreur !
    Je pensais que le for in était lié à IEnumerable<T> et IEnumerable mais c'est bien plus flou que cela !

    - Les types primitifs reconnus par le compilateur, tels que les tableaux, les ensembles ou les chaînes
    - Les types qui implémentent IEnumerable
    - Les types qui implémentent le modèle GetEnumerator comme documenté dans le Guide du langage Delphi
    Le "for in" est réservé au classe implémentant une méthode GetEnumerator pour la RTL classique comme la TStringList mais sans implémenter IEnumerable
    Pour la RTL generics, les collections héritent de TEnumerable<> qui implémente GetEnumerator mais toujours pas de trace de IEnumerable

    Faudrait voir ce que donne de coder un GetEnumerator et si le compilateur le détecte !
    Et que se passe-t-il si l'un fait un code tout foireux ?!

    Je ne sais pas comment ils ont bricolés ça !
    Mais GetEnumerator pue de la magie intégrée au compilateur !
    Un sujet traitait des for in sur des énumérations,
    il me semble que cela n'a été très optimisé !

    Cela n'utilise quasiment jamais l'interface IEnumerable, pas de type ancêtre, pas directive de compilation !
    C'est pas très beau ce qu'on commit les développeurs RTL !

    Du coup, on a un truc bien vilain !
    La TObjectList hérite de la TList
    La TObjecList NE défini PAS de GetEnumerator
    La TList a défini un GetEnumerator de type TListEnumerator avec Current de type Pointer
    La TObjectList hérite donc du GetEnumerator en élément de Pointer !

    D'où " E2010 Types incompatibles : 'TScheduledEvent' et 'Pointer' "
    CQFD !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Bonjour,

    Il fallait donc parcourir mon TObjectList avec une variable de type pointeur sans pointer sur mon objet TScheduledEvent avec le mot réservé Absolute.
    Merci Shail pour toutes ces précieuses explications, je comprends maintenant pourquoi il fallait parcourir un TObjectList 'classique' avec un pointeur avec la boucle for .. in

    Merci aussi pour tout le monde

    Bonne journée.
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Effectivement, Papy a bien raison !
    Je ne bosse sur Delphi XE2 que depuis quelques mois et j'ai commis une erreur !
    Je pensais que le for in était lié à IEnumerable<T> et IEnumerable mais c'est bien plus flou que cela !
    je n'ai pas regardé moi même mais voici un article intéressant sur le sujet

    http://delphi.about.com/od/oopindelp...iterations.htm
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Je note que le code proposé par Papy214 compile bien avec XE2, mais pas avec Delphi 7.

    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
    program StringList_02;
     
    {$APPTYPE CONSOLE}
     
    uses
    {$IFDEF VER150}
      Classes, Dialogs;
    {$ENDIF}
    {$IFDEF VER230}
      System.Classes, Vcl.Dialogs;
    {$ENDIF}
     
    var
      Liste: TStringList;
      s: string;
     
    begin
      Liste := TStringList.Create;
      Liste.Add('Titi');
      for s in Liste do // Opérateur non applicable à ce type d'opérande (Delphi 7)
        ShowMessage(s);
      Liste.Free;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  12. #12
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Je note que le code proposé par Papy214 compile bien avec XE2, mais pas avec Delphi 7.

    Normal ! Le for..in n'existait pas encore dans cette version

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Normal ! Le for..in n'existait pas encore dans cette version
    Bon, j'ai perdu une occasion de me taire.

    Merci pour la précision.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  14. #14
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bon, j'ai perdu une occasion de me taire.
    Mais non ... Si mes souvenirs sont bons, c'est arrivé avec Delphi 2005.

    Et comme disait ma grand-mère: "Tout le monde peut se tromper, comme disait le hérisson en descendant d'une brosse à cheveux"

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 22/08/2007, 12h18
  2. [batch] parcours fichier texte avec "for /f"
    Par cbv38 dans le forum Windows
    Réponses: 1
    Dernier message: 07/07/2006, 11h40
  3. [SQL Server] parcourir une Table avec un FOR
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2006, 11h49
  4. Ksh, problème avec une simple boucle for
    Par herzleid dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2006, 14h45

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