Bonjour,
J'ai encore un truc à m'arracher les cheveux, heureusement qu'ils repoussent vite !
Je veux récupérer des noms de dossiers et des noms de fichiers depuis un TShellTreeView pour les insérer dans une TListbox, enfantin me direz-vous.
Oui, c'est ce que je croyais, j'ai donc attaqué avec 4 lignes juste pour voir si l'idée fonctionnait, ce qui est le cas, mais mal, car je ne peux pas libérer les TStringList's créées...
La preuve :
J'ai lancé le projet et j'ai cliqué sur 3 nœuds, à la clôture j'ai gagné 9 unfreed memory block.
J'ai recommencé avec 4 clics et là, 12 unfreed memory blocks, donc 1 clic = 3 unfreed blocks et voilà le code ultra-simple à l'origine de cette embrouille :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function TForm1.ListDirectory(SelectedNode {as FolderSource}: string): TStrings; var sl: TStringList; begin sl:= TStringList.Create; sl.Add(SelectedNode); // pour test Result := sl; // ok // sl.Destroy; //sl.Free; //l'un comme l'autre = erreur end;
En pas à pas, ça se produit au end; de fin de fonction.
La manière d'appeler cette fonction :
Ça fonctionne, les données que j'attends se retrouvent bien dans la listbox, c'est juste ces fuites qui me perturbent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 procedure TForm1.stvClick(Sender: TObject); begin lbFonts.Items := ListDirectory(stv.GetPathFromNode(stv.Selected)); // GetPathFromNode returns the path (including the file name) // from the file system that a particular node represents. end;
Quelque chose d'énorme doit m'échapper, mais je ne vois pas quoi...
Ce que je vois, par contre, dans l'aide et que je ne comprend pas, c'est l'absence de Free, mais comme vous le voyez dans le code, un essai avec Destroy retourne la même erreur.
J'ai jeté un œil à la pile d'appel, mais c'est ardu (dernière entrée en haut) :
Alors, si quelqu'un a une idée, merci de la poster...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #0 SYSTEM$_$TOBJECT_$__$$_INHERITSFROM$TCLASS$$BOOLEAN at :0 #1 fpc_do_is at :0 #2 ?? at :0 #3 ASSIGN(0x7ffff60b2200, 0x7ffff60b4e00) at gtk2int.pas:612 #4 SETITEMS(0x7ffff5734ef0, 0x7ffff60b4e00) at include/customlistbox.inc:587 #5 STVCLICK(0x7ffff6403790, 0x7ffff5730f10) at unit1.pas:139 <-- c''est bien la ligne qui appelle la fonction ListDirectory sur l''événement stvClick. avant c''est pas intéressant
Partager