TStringList

toto93350 Messages postés 9 Date d'inscription dimanche 7 juin 2009 Statut Membre Dernière intervention 1 mai 2011 - 20 sept. 2010 à 09:55
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 3 oct. 2010 à 12:36
Bonjour
Dans le cadre d'un projet j'utilise de nombreuses StringList, et du coup les lignes de code TStringList.Free et TStringList.Clear sont légion.
Je désire donc simplifier mon code et recherche une méthode pour effacer mes StringList à l'instar de celle-ci :
If F.Components[i] Is TListBox Then TListBox(F.Components[i]).Clear;
J'ai consulté pas mal de forum ainsi que l'aide Delphi mais je n'ai rien trouvé à ce sujet.
Merci beaucoup pour votre aide.

11 réponses

beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
21 sept. 2010 à 09:35
bonjour,

uses
  Contnrs;

// à la création de la form
lst_obj: TObjectList;
lst_obj := TObjectList.Create(True;


// dans les différentes méthodes
lst_string: TStringList;
lst_string := TStringList.Create;
lst_obj.As(lst_string);

// à la destruction de la form
lst_obj.Free;


Peut-être que cela peut aider,
Luc.
0
Utilisateur anonyme
21 sept. 2010 à 10:30
@beckerich : je pense qu'il veut libérer toutes ses TStringList dans une procédure (Par exemple la procédure OnClose de sa fiche principale).

@toto93350 : Ce n'est pas si simple que cela. Tout dépend ou et comment sont déclarées tes TStringList.
0
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
21 sept. 2010 à 10:47
@Franky : je procède comme cela chez moi, j'ai une propriété TOjectList déclarée dans un objet global de mon application à laquelle je passe les objets créés dynamiquement pendant le déroulement du programme. A la destruction de l'objet global, les objets de la liste sont détruits.
Je n'ai pas de perte de mémoire comme cela et pas besoin de m'occuper de la libération des objets créés dynamiquement.

Luc.
0
toto93350 Messages postés 9 Date d'inscription dimanche 7 juin 2009 Statut Membre Dernière intervention 1 mai 2011
21 sept. 2010 à 11:31
Merci pour votre aide, ca marche à merveille et c'est exactement ce que je voulais.
A bientôt.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
21 sept. 2010 à 12:15
Ouais ben moi je trouve pas ca super pour plusieurs raisons :

1)Tu bouffes de la mémoire inutilement et en terme d'optimisation c'est pas top.
2)C'est prendre de mauvaises habitudes : tout objet doit être détruit en temps voulu. Normalement si un code est bien pensé/ficelé, on n'a pas besoin de faire appel à ce genre d'artifices.
3)Ensuite tu passes un objet dynamique dans un TOjectList global. Dans ce cas là autant créer directement l'objet en global sinon je ne vois pas l'intérêt et dans ce cas là le problème ne se pose plus.

Quitte à faire cela : autant utiliser un tableau

MyObjects:Array [0..X] Of TObject;


Et libérer dans le OnClose l'ensemble des objets

Var
  IndexObject:Integer;
Begin
  For IndexObject:=Low(MyObjects) To  High(MyObjects) Do
  MyObjects[IndexObject].Free;
end;
0
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
21 sept. 2010 à 13:09
@Franky : oui, tu as raison pour la mémoire.
Personnellement, je n'utilise cet objet global que pour les objets ayant une durée de vie pour toute l'application, je continue à créer/détruire les objets locaux le temps que j'en ai besoin.
Mon code, c'était juste pour répondre au message et donner une idée d'utilisation d'un objet fourni avec Delphi au lieu de réinventer la roue...

Salutations,
luc.
0
toto93350 Messages postés 9 Date d'inscription dimanche 7 juin 2009 Statut Membre Dernière intervention 1 mai 2011
23 sept. 2010 à 08:47
Bonjour,
L'analyse de Luc (objets locaux/objets ayant une durée de vie jusqu'à la fin de mon application) cadre bien avec mon projet.
Mais je garde sous la main la solution de Franky car mon application bouffe déjà pas mal de mémoire.
C'est cool, moi qui ne savais pas comment faire, maintenant j'ai deux solutions.
Encore merci à vous.
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
2 oct. 2010 à 11:15
Bonjour,

@Francky : euh désolé mais ta solution "bouffera" plus de mémoires que celle de beckerich ...
(enfin pas plus mais j'explique)

Ben oui , un TObjectList c'est (un peu) une liste chainée, à chaque nouveau élément placer dans la liste, il y a un lien(pointer) qui va pointer (!) sur l'élément suivant. L'avantage c'est que quand tu créé ta liste, quand il n'y a rien dedans ben y'a rien en mémoire (hormis l'object TObjectList forcement). Donc au fur et à mesure que tu remplis ta liste, ton occupation mémoire augmente.

Quand tu déclare un tableau, tu alloue en mémoire de la place mais celle-ci se fait en 'bloc' ...
Pour un tableau de 5 caractères (ben tu as en mémoire 5 cases de suite qui sont réservées pour ce tableau).

Pour une liste , ca ne se fait forcement pas comme ça puisque tu ne connais pas le nombre d'élément à insérer dedans à l'avance ...

L'avantage d'une liste en générale par rapport à un tableau c'est que si tu veux mettre 1000000 enregistrement dans ta liste, no problemo (en passant les problèmes de RAM ) ,
avec un tableau ça peut déjà dans certain cas poser problème (parce que il faudra qu'il y ai en mémoire la place pour allouer ton tableau ET que cette place soit un gros bloc libre qui se suit, sinon pas possible ! )

En plus avec les TObjectList tu peux même facilement faire des tris, des insertions, des décalages et tout ça est presque totalement gérer nativement par la classe, avec les tableaux tu es bon pour le faire toi même ! (Et tu peux te retrouver avec des belles conneries parfois )

Puis encore un désavantage des tableaux, c'est que quand tu arrives à la limitte de ton tableau (plus de place)
ben tu fais quoi ?!

Alors il y moyen de faire un tableau dynamique puis d'allouer plus de mémoire quand il en faut ... c'est se compliquer la vie pour pas grand chose , et en plus c'est ce que fait le TObjectList

Donc moi je dirais que la solution du TObjectList est la meilleure

PS : désolé si il y des fautes d'orthographes mais je suis sur un PC anglais donc tu mes mots sont soulignées en rouges, ça n'aide pas beaucoup à la relecture !

Nicolas
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
2 oct. 2010 à 11:24
Oups, j'ai oublié de présenter un autre avantage de TObjectList , par rapport au post de Francky sur le deuxième point

2)C'est prendre de mauvaises habitudes : tout objet doit être détruit en temps voulu. Normalement si un code est bien pensé/ficelé, on n'a pas besoin de faire appel à ce genre d'artifices.

Ben avec un TObjectList, tu peux faire appel à MaListeObjet.Pack (de tête mais consulte l'aide pour plus de précision) et tous les objects mis à nil dans ta liste seront retirés de la liste

Donc tu peux , quand tu le décides, faire un nettoyage de printemps dans ta liste

Nicolas
0
Utilisateur anonyme
2 oct. 2010 à 18:44
@Nico : Oui sauf que là à priori le nombre et le type de TObject est déjà connu à l'avance et incrémenter de 1 la borne supérieur de ton intervalle pour ton tableau, ce n'est pas si fastidieux que cela (Si tu en as qu'un biensur).

Ensuite le trie ici n'a pas lieu d'etre ,pas pour ce genre de chose

Le désavantage d'un TOjbectList c'est qu'il inclue des propriétés et que ces dernières jouent en terme de taille de l'exe et aussi en terme de mémoire et que la majeure partie de ces propriétés n'ont aucune utilité içi. C'est à mon avis un artifice un peu lourd pour l'utilisation qu'on en fait ici .


Donc tu peux , quand tu le décides, faire un nettoyage de printemps dans ta liste
Je dis pas le contraire mais normalement si tu crée un objet soit il est en local et dans ce cas là il est détruit à la fin de ta procédure/fonction, soit il l'est en global et dans ce cas là ce n'est vraiment pas difficile que de le détruire à la fermeture de ton application. Bref pour moi c'est pas une méthode que je conseille.
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
3 oct. 2010 à 12:36
Oui dans ce cas si c'est peut être de l' "oververkill" mais cette solution à le mérite d'être facilement "implémentable" (si tu vois ce que je veux dire) et surtout plus facilement ... hum je ne sais pas ... plus orienté object

Mais je pense que chacun à ces habitudes de programmation ... maintenant je ne peux plus me passer des listes, quant aux tableaux je m'en sers surtout s'ils sont multidimensionnels

Enfin tu l'auras compris j'ai donné les pour et les contres, toi aussi, mais au final ça reste un choix très subjectif
0
Rejoignez-nous