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 : Comment l'utiliser ?


Sujet :

Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut TObjectList : Comment l'utiliser ?
    Salut à tous,
    je vous prix de bien vouloir m'expliquer qu'est-ce que TObjectList et comment l'utiliser ?

    merci infiniment !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 717
    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 717
    Points : 25 613
    Points
    25 613
    Par défaut
    Comme une TStringList mais au lieu de chaine, tu as des objets, et avant de venir ici tu fais F1, c'est pas difficile comme objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Machin := TTruc.create();
    List.Add(Machin);
    Bidule := TTruc(List.items[...]).Chose

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Et pour compléter, l'avantage de TObjectList c'est qu'il gère en interne la liberation des objets.

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    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 885
    Points : 11 404
    Points
    11 404
    Billets dans le blog
    6
    Par défaut
    avec OwnsObjects=True : c'est très pratique et permet de faire un peu GarbageCollector !

  5. #5
    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
    Une autre utilisation intéressante est de créer une liste avec des objets typés :

    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
    43
    44
    45
    46
    47
    48
    uses Contnrs;
     
    type
      TTruc = class
      public
        libelle : string;
        constructor Create(pLibelle : string);
      end;
     
      TListeDeTrucs = class(TObjectList)
      private
        function GetItem(Index: Integer): TTruc;
        procedure SetItem(Index: Integer; const Value: TTruc);
      public
        function Add(AObject: TTruc): Integer;
        procedure Insert(Index: Integer; AObject: TObject);
        // idéalement, redéfinir toutes les méthodes qui renvoient un TObject
        property Items[Index: Integer]: TTruc read GetItem write SetItem; default;
      end;
     
    { TTruc }
     
    constructor TTruc.Create(pLibelle: string);
    begin
      libelle := pLibelle;
    end;
     
    { TListeDeTrucs }
     
    function TListeDeTrucs.Add(AObject: TTruc): Integer;
    begin
      result := inherited Add(AObject);
    end;
     
    procedure TListeDeTrucs.Insert(Index: Integer; AObject: TObject);
    begin
      inherited Insert(index, AObject);
    end;
     
    function TListeDeTrucs.GetItem(Index: Integer): TTruc;
    begin
      result := TTruc(inherited GetItem(index));
    end;
     
    procedure TListeDeTrucs.SetItem(Index: Integer; const Value: TTruc);
    begin
      inherited setItem(index, value);
    end;
    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      l : TListeDeTrucs;
      i : integer;
    begin
      l := TListeDeTrucs.Create(true);
      l.Add(TTruc.Create('coucou'));
      l.Add(TTruc.Create('titi'));
      l.Add(TTruc.Create('toto'));
      for i := 0 to l.count - 1 do
        showMessage(l.items[i].libelle);
      l.Free;
    end;
    Bloon

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 681
    Points : 7 114
    Points
    7 114
    Par défaut
    Citation Envoyé par tourlourou
    avec OwnsObjects=True : c'est très pratique et permet de faire un peu GarbageCollector !
    C'est vrai que c'est pratique que la liste se charge de détruire ses composants.
    Je l'utilise souvent.


  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Q : qu'est-ce que TObjectList

    R : Comme une TStringList mais au lieu de chaine, tu as des objets

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 717
    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 717
    Points : 25 613
    Points
    25 613
    Par défaut
    Ouais, je trouvais que sa question démontrait une absence de recherche personnelle, en plus ce que j'ai écrit est n'est pas exacte, une TStringList c'est une liste de chaine auquel on peut associé des objets, donc c'est encore plus poussé que la TObjectList que l'on peut retrouver d'ailleurs dans les listes Components et Controls ...

    Je remercie Bloon d'avoir implémenté le TTRuc

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-Salut,

    Q : qu'est-ce que TObjectList

    R : Comme une TStringList mais au lieu de chaine, tu as des objets
    Pourquoi "au lieu de chaine" : Je dirais plus exactement qu'une TStringList peut contenir à la fois des chaines ET des objets en utilisant directement l'instruction ma_liste.AddObject('chaine',objet) alors que pour associer un libellé-chaine à un objet avec le TObjectList il faut ajouter du code.

    De plus comme la chaine et l'objet ont le même indice dans la TStringList on peut retrouver directement l'indice avec ma_liste.Find('chaine' ... et/ou ma_liste.IndexOf('chaine' ... ou ma_liste.IndexOfObject(objet) puis en utilisant cet indice on peut accéder directement aux objects avec la propriéte Objects : Exemple avec un bitmap comme objet : Canvas.draw(20,20,tBitMap(ma-liste.Objects[i]));

    Et en prime avec ma_liste.Sort on peut classer les chaînes de la liste en ordre croissant.

    Et pour terminer la libération finale se fait par un simple ma_liste.free.

    En fait il faudrait rebaptiser les TStringList en TStringAndObjectsList histoire d'appeler un chat un chat.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 717
    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 717
    Points : 25 613
    Points
    25 613
    Par défaut
    Pour le TreeView, on a Node.Data

    Et pour terminer la libération finale se fait par un simple ma_liste.free.
    Euh, les Objets d'une TStringList doivent être explicitement libéré contrairement au Object ajouté dans une TObjectList avec OwnsObjects à True (Par Défaut !)

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    mon message de 14h04 était incomplet ... mais le temps d'achever le suivant à 15h06 vous aviez déjà réagi ... donc mille excuses s'il y a redondance avec le vôtres.

    Par contre comme je mets les TStringList un peu à toutes les sauces je n'ai pas encore trouvé l'intérêt réel du TObjectList.

    Avec TStringList on peut faire beaucoup de choses avec peu de lignes de code alors qu'avec TObjectList j'ai l'impression qu'il faut beaucoup de lignes de code pour faire peu de choses ... non???

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Euh, les Objets d'une TStringList doivent être explicitement libéré
    Exact, car ma_liste.free met seulement fin à l'existance du tableau dynamique de pointeurs ce qui détruit uniquement les chaines.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 717
    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 717
    Points : 25 613
    Points
    25 613
    Par défaut
    Je l'utilise assez peu, on a plus souvent des TStringList dans des ListBox ou autre, et j'utilise souvent la propriétés objects...

    ensuite, la TObjectList, est souvent remplacer par une collection, ou sinon, j'utilise bcp de TComponent, que j'appele genre TBiduleManager, ça contient plein de méthode de classe (un singleton est utilisé en interne) et ça gère souvent comme Owner d'un ensemble de Bidule, j'utilise le TComponent surtout pour le Owner et le published, si je n'ai pas besoin de publication, j'utilise une TObjectList mais c'est rare, car je passe souvent alors par une TList et Pointer de Structure (je fais de faux objet souvent)

    alors la TStringList on l'utilise tel que avec un composant VCL, la TObjectList souvent on l'a surcharge pour éviter les transtypages des objets si la liste ne contient que de TBidule ...

    je n'ai que deux codes sur quelques millions de ligne que j'ai écrit (en 7 ans) qui utilise une TObjectList, lol, et je m'en sert soit comme garbage collector uniquement soit parce que j'ai pas une le temps de faire une TCollection ^_^

    En fait, je vois pas mal de code où au lieu d'utiliser une TObjectList j'ai pris une TList car de toute façon faut caster l'Object ou le Pointer en Objet Typé exploitable et ça dans des objets genre TXMLNode, THierarchieNode, TFindPathNode (algo de recherche de chemin), ...

  14. #14
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    je m'en sert soit comme garbage collector uniquement, soit
    C'est quoi cet usage de "Collecteur de détritus" ? Je pige mal cette image.

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 717
    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 717
    Points : 25 613
    Points
    25 613
    Par défaut
    Le "Garbage Collector" c'est un concept Java, tu créés tes objets mais tu ne les libères jamais explicitement, la machine virtuelle sait quand elle doit libérer et le pré-compilo fait déjà du nettoyage lorsqu'il génère les. class puisqu'un objet ne peut pas survivre en dehors du bloc de déclaration (en java tu peux déclarer un peu partout c'est comme si en delphi tu pouvais mettre var à chaque begin ...

    Voici un code qui illustre parfaitement ce cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       edtimport.Text := GetPub_eXistenZ('TIMER', 'IMPORT', '12', TIniSpy.Create(IniSpyManager, edtimport));
       edtexport.Text := GetPub_eXistenZ('TIMER', 'EXPORT', '12', TIniSpy.Create(IniSpyManager, edtexport));
       edDelaiValide.Text := GetPub_eXistenZ('DELAI', 'VALIDE', '30', TIniSpy.Create(IniSpyManager, edDelaiValide));
       edDelaiNonValide.Text := GetPub_eXistenZ('DELAI', 'NONVALIDE', '90', TIniSpy.Create(IniSpyManager, edDelaiNonValide));
    ... j'ai comme cela, plus de 40 Objet créé, ... au lieu de me prendre la tête à gérer la libération d'objet le constructeur c'est ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor TIniSpy.Create(AManager: TIniSpyManager; AControl: TControl);
    begin
       inherited Create();
     
       FControl := AControl;
       AManager.Add(Self);
    end;
    à un moment j'ai mis ce qui suit dans le Create de la Form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      IniSpyManager := TIniSpyManager.Create();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       TIniSpyManager = class(TObjectList)
       private
          procedure CreateVisualSpy(const SpyIndex: Integer);
       public
          procedure CheckSpy(Show: Boolean);
       end;
    et à la libération de la form

    j'ai

    Comme c'est une ObjectList, par défaut sa libération cela libère les objets, c'est le même principe quand tu fais "TEdit.Create(Self);" le Owner libére le Edit ...

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Et pour terminer la libération finale se fait par un simple ma_liste.free.
    C'est quoi cet usage de "Collecteur de détritus" ? Je pige mal cette image.
    ma_liste est une tstringlist. Free supprime les entrées dans la liste mais ne libére pas les objets associées. Leur libération doit être explicite et codée par le programmeur contrairement à la TObjectList qui a la faculté à l'instars d'un ramasse miette de gérer la libération des objets qui lui sont confiés.

    Ce concept de garbage collector a été repris sous le framework dotnet et est pris en charge par le clr.

  17. #17
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Merci à tous les deux.

    Pigé. En fait vous appelez par "collector de détritus" ou par "ramasse miettes" un truc qui nous laisse créer des objets et qui nous libère de la corvée de nettoyage en le faisant à notre place.

    Donc un "+" pour la TObjectList que TStringlist n'a pas.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/02/2005, 15h39
  2. [Optimisation] Comment bien utiliser le StringBuffer?
    Par mathieu dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2004, 15h22
  3. Comment bien utiliser ce forum ?
    Par Alcatîz dans le forum Pascal
    Réponses: 0
    Dernier message: 21/04/2004, 17h37
  4. [scrapbook] comment l'utiliser ?
    Par Didier 69 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 16/04/2004, 18h28
  5. [INDY] -> IdIdentServer comment l'utiliser ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 9
    Dernier message: 06/08/2003, 17h00

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