Dadurch, dass ich an der Arbeit FastMM einsetzen musste, habe ich gerade mal meinen Usermanager auf Speicherlecks getestet. Sie sind Gott sei Dank nicht so gravieren, aber trotzdem unschön.
Folgende Situation:
Ich hole mir alle Benutzer und lege sie als Objekte im lParam Attribut der Treeviewnodes als Referenzen ab. So dass ich mir die Informationen zu jeden beliebigen Benutzer anzeigen lassen kann, ohne jedes mal die Informationen extra holen zu müssen. Fülle ich den Treeview neu, werden zuvor alle Einträge gelöscht. Dabei gehen natürlich die Referenzen verloren und ich habe Speicherlecks. Also muss ich den Treeview vor dem "neu" Füllen durchgehen und die Objekte freigeben:
Delphi-Quellcode:
// in lParam gepeicherte Objektreferenzen freigeben
hTVItem := TreeView_GetRoot(hTV);
hTVItem := Treeview_GetNextItem(hTV, hTVItem, TVGN_CHILD);
while hTVItem <> nil do
begin
hTVItem := TreeView_GetNextItem(hTV, hTVItem, TVGN_NEXT);
ZeroMemory(@TVItem, sizeof(TTVItem));
TVItem.hItem := hTVItem;
TVItem.mask := TVIF_PARAM or TVIF_TEXT;
if TreeView_GetItemW(hTV, TVItem) then
begin
if Assigned(TObject(TVItem.lParam)) then
TObject(TVItem.lParam).Free;
end;
end;
Das funktioniert auch ganz gut. Allerdings nur für die erste Ebene. Je nach Ansicht können die Objekte aber auch eine Ebene tiefer mit einem Item verknüpft sein. Ich muss den Treeview also rekursiv durchgehen. Und das ist der Punkt, an dem ich scheitere. Ich bräuchte mal eure Hilfe, um aus dem obigen Codeausschnitt eine Rekursivefunktion zu machen.