Salut à tous,
je vous prix de bien vouloir m'expliquer qu'est-ce que TObjectList et comment l'utiliser ?
merci infiniment !
Salut à tous,
je vous prix de bien vouloir m'expliquer qu'est-ce que TObjectList et comment l'utiliser ?
merci infiniment !
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
Et pour compléter, l'avantage de TObjectList c'est qu'il gère en interne la liberation des objets.
avec OwnsObjects=True : c'est très pratique et permet de faire un peu GarbageCollector !
Une autre utilisation intéressante est de créer une liste avec des objets typés :
Utilisation :
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;
Bloon
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;
C'est vrai que c'est pratique que la liste se charge de détruire ses composants.Envoyé par tourlourou
Je l'utilise souvent.
Salut,
Q : qu'est-ce que TObjectList
R : Comme une TStringList mais au lieu de chaine, tu as des objets
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
Re-Salut,
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.Q : qu'est-ce que TObjectList
R : Comme une TStringList mais au lieu de chaine, tu as des objets
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.
Pour le TreeView, on a Node.Data
Euh, les Objets d'une TStringList doivent être explicitement libéré contrairement au Object ajouté dans une TObjectList avec OwnsObjects à True (Par Défaut !)Et pour terminer la libération finale se fait par un simple ma_liste.free.
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???
Exact, car ma_liste.free met seulement fin à l'existance du tableau dynamique de pointeurs ce qui détruit uniquement les chaines.Euh, les Objets d'une TStringList doivent être explicitement libéré
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), ...
C'est quoi cet usage de "Collecteur de détritus" ? Je pige mal cette image.
Code : Sélectionner tout - Visualiser dans une fenêtre à part je m'en sert soit comme garbage collector uniquement, soit
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
... 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 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));
à un moment j'ai mis ce qui suit dans le Create de la Form
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;
Code : Sélectionner tout - Visualiser dans une fenêtre à part IniSpyManager := TIniSpyManager.Create();et à la libération de la form
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;
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 ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part IniSpyManager.Free();
Et pour terminer la libération finale se fait par un simple ma_liste.free.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.C'est quoi cet usage de "Collecteur de détritus" ? Je pige mal cette image.
Ce concept de garbage collector a été repris sous le framework dotnet et est pris en charge par le clr.
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager