![]() |
TVirtualTreeView gibt nicht alles frei
Hallo,
ich nutze einen VirtualStringTree im Spaltenmodus. Datenrecord:
Delphi-Quellcode:
Procedure zum Füllen mit Daten:
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;
Delphi-Quellcode:
Procedure zum freigeben der Daten:
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;
Delphi-Quellcode:
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.
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; 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 |
Re: TVirtualTreeView gibt nicht alles frei
Um's mit den Worten des Entwicklers (Mike) zu erklären:
Zitat:
Gruss |
Re: TVirtualTreeView gibt nicht alles frei
Zitat:
Hintergrund: Bei 50000 und mehr Knoten dauert mir die Freigabe per "Fxyz := ''" oder "Finalize(NodeData^)" zu lange. Kann ich also das Freigeben auslassen, wenn ich stattdessen die Strings mit fester Länge deklariere, z.B. FName : String[50] ? (Es wäre auch keine großartige Speicherverschwendung, weil alle Zeichenketten eh ungefähr gleiche Länge haben werden) edit: ok, im VirtualTreeView-Doc steht: Zitat:
nochmal edit: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz