Bonjour tout le monde, je viens d'effectuer une recherche sur le forum, mais malheureusement je n'ai pas trouvé de discussion qui traitait de mon problème. Celui est très simple, comment libérer la mémoire associé à une structure dans un Treenode. Voici un exemple de code :
1- ) Je crée un record, et utilise un pointeur afin de créer ou de récupérer des informations :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 DDonnees = record Nom : String; Ville : String; CodePostal : String; IDLieu : String; end; PDonnees = ^DDonnees;
2- ) Lors de la creation du TreeView, j'utilise la propriété data du treenode afin de rattacher des informations. Voici un exemple de création de noeud :
Je passe tout les blabla d'affectation d'image etc... L'essentiel est que cela fonctionne très bien, pas de problème pour la création, ni pour le parcours du Treeview ni pour récupérer les valeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Procedure TBlabla.AjoutNoeud; Var PointeurNoeud : PDonnees; Begin New(PointeurNoeud); PointeurNoeud.Nom := 'Essai'; PointeurNoeud.Ville := 'Strasbourg'; PointeurNoeud.CodePostal := '67000'; PointeurNoeud.IDLieu := 'STRA01'; NoeudCree := TreeView1.Items.AddChildObject(NoeudParent, PointeurNoeud.Nom+ ' - ' + PointeurNoeud.IDLieu, PointeurNoeud); End;
Le problème vient lorsque je ferme la fenêtre. D'après la doc, les structures de données liées à un noeud ne sont pas libérées automatiquement, il faut donc avant la fermeture de la fenêtre libérer toutes les structures. J'ai essayé à l'aide de l'instruction dispose, mais lorsque je regarde le gestionnaire des tâches, la consommation en mémoire de mon programme reste élevée par rapport à ce qu'il consommait avant le peuplement du treeview.
Voici le code exécuté à la fermeture de la Form
Si quelqu'un a une solution a proposé je suis preneur. Cela fait plusieurs jours que je me casse la tête la dessus sans résultat probant.
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 If (RzTreeView1.Items.Count > 0) Then Begin // Libération des informations des noeuds Noeud := RzTreeView1.Items[RzTreeView1.Items.Count-1]; While(Noeud <> nil) Do Begin Noeud1 := Noeud.GetPrev; Dispose(Noeud.Data); Noeud.Free; Noeud := Noeud1; End; End; // Réinitialisation arborescence RzTreeView1.Items.Clear;
Consommation mémoire avant chargement Treeview : 13252 Ko.
Consommation mémoire TreeView chargé : 14812 Ko.
Consommation mémoire après avoir fermé la fenêtre : 14780 Ko.
Pour info, je travail à partir d'une base de données, et je classe environ 3000 enregistrements dans le Treeview. Le record servant à stocker les infos pour un noeud est composé d'une vingtaine de string.
En pièce jointe se trouve un copie d'écran permettant de voir a quoi ressemble l'arborescence.
Merci à tous.
-----------------------------
(bouton # )
Partager