Einzelnen Beitrag anzeigen

Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#1

TVirtualTreeView gibt nicht alles frei

  Alt 3. Dez 2004, 12:52
Hallo,

ich nutze einen VirtualStringTree im Spaltenmodus.

Datenrecord:

Delphi-Quellcode:
type
  PTreeData = ^TTreeData;
  TTreeData = record
    FName : String;
    FPrivat : String;
    FMobile : String;
    FWork : String;
    FOther : String;
    FFax : String;
    FEmail : String;
    FHomepage : String;
    FOrganisation : String;
    FPosition : String;
    FStreet : String;
    FZIP : String;
    FCity : String;
    FState : String;
    FCountry : String;
    FNotes : String;
    fLuid : string;
  end;
Procedure zum Füllen mit Daten:
Delphi-Quellcode:
procedure TframeContacts.LoadContacts;
var Data: PTreeData;
    Node : PVirtualNode;
    i : integer;
begin
  vstContacts.BeginUpdate;
  try
    vstContacts.Clear;
    for i := 0 to PIM.RecordCount - 1 do
    begin
      Node := vstContacts.AddChild(nil);
      Data := vstContacts.GetNodeData(Node);
      Data^.FName := PIM.fvCard[i].FirstName + #32 + PIM.fvCard[i].Name;
      Data^.FPrivat := PIM.fvCard[i].TelHome;
      Data^.FMobile := PIM.fvCard[i].TelCell;
      Data^.FWork := PIM.fvCard[i].TelWork;
      Data^.FOther := PIM.fvCard[i].TelOther;
      Data^.FFax := PIM.fvCard[i].TelFax;
      Data^.FEmail := PIM.fvCard[i].Email;
      Data^.FHomepage := PIM.fvCard[i].URL;
      Data^.FOrganisation := PIM.fvCard[i].Organisation;
      Data^.FPosition := PIM.fvCard[i].Title;
      Data^.FStreet := PIM.fvCard[i].Street;
      Data^.FZIP := PIM.fvCard[i].ZIP;
      Data^.FCity := PIM.fvCard[i].City;
      Data^.FState := PIM.fvCard[i].State;
      Data^.FCountry := PIM.fvCard[i].Country;
      Data^.FNotes := PIM.fvCard[i].Note;
      Data^.fLuid := PIM.fvCard[i].Luid;
    end;
  finally
    vstContacts.EndUpdate;
  end;
end;
Procedure zum freigeben der Daten:

Delphi-Quellcode:
procedure TframeContacts.vstContactsFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  Data: PTreeData;
begin
  Data:=vstContacts.GetNodeData(Node);
  if Assigned(Data) then begin
    Data.FName := '';
    Data.FPrivat := '';
    Data.FMobile := '';
    Data.FWork := '';
    Data.FOther := '';
    Data.FFax := '';
    Data.FEmail := '';
    Data.FHomepage := '';
    Data.FOrganisation := '';
    Data.FPosition := '';
    Data.FStreet := '';
    Data.FZIP := '';
    Data.FCity := '';
    Data.FState := '';
    Data.FCountry := '';
    Data.FNotes := '';
    Data.fLuid := '';
  end;
end;
Ich lasse den Treeview mit Daten füllen und beim Destroy des Frames TframeContacts wird alles freigegeben auch. Theoretisch auch die Nodes. Leider nur theoretisch. Mit dem Taskmanager überwacht wird schnell erkenntlich, dass mit jedem Füllen/Freigeben rund 30KB nicht freigegeben werden.
Lasse ich das Erstellen der Nodes weg (TframeContacts.LoadContacts wird auskommentiert) wird jedes mal der Speicher beim Destroy des Frames auf dem Ursprungswert zurückgesetzt - sprich es wird alles was auf dem Frame war wieder freigegeben.
Fazit: Die Daten der Nodes werden nicht freigegeben. Wieso? Die Procedure TframeContacts.vstContactsFreeNode wird korrekt aufgerufen, wenn man das Programm im Einzelschritt durchgeht.

[EDIT]Ich weiß warum nicht alle Nodes freigegeben werden. Es sind 78 Zeilen im VirtualTreeView - die Procedure FreeNode wird aber nur insgesamt 19 mal aufgerufen. 59 Datensätze verbleiben also im Speicher.
Wieso ist das so?[/EDIT]

Gruss
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat