Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

nonVCL Treeview rekursiv durchgehen

  Alt 3. Jul 2007, 23:37
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat