Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi VirtualTreeView und Freigabe (https://www.delphipraxis.net/213908-virtualtreeview-und-freigabe.html)

H.Bothur 17. Okt 2023 14:59

VirtualTreeView und Freigabe
 
Moin,

sorry mal wieder für eine Dummy-Frage:

Ich habe in meinem Programm unter anderen ein VirtualTreeView mit 500 Einträgen.
Wenn ich mein Programm beende muss ich dann alles wieder freigeben ?

Und wenn ja - so:

Delphi-Quellcode:
var
  Data: PTreeData;
  i: integer;
begin
  for i := 0 to VST.Count -1 do
  begin
    Data := VST.GetNodeData(Node);
    if Assigned(Data) then Data.FCaption:='';
  end;
end;
Gruss
Hans

Blup 17. Okt 2023 15:34

AW: VirtualTreeView und Freigabe
 
Der Record selbst wird automatisch freigegeben.
Aber wenn der Record auf Strings, dynamische Arrays, Objekte, Interfaces referenziert oder auf weitere Daten verweist, muss man sich um deren Freigabe selbst kümmern.
Dafür gibt es das Ereignis OnFreeNode:
Delphi-Quellcode:
procedure TMyForm.MyTreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
  var lData := PTreeData(Sender.GetNodeData(Node));
  lData.MyString := nil;
  lData.MyArray := nil;
  lData.MyObject.Free;
  lData.MyInterface := nil;
end;

himitsu 17. Okt 2023 15:52

AW: VirtualTreeView und Freigabe
 
Wenn der Record via Generics vom VST behandelt wird, dann sollten die managed Typen darin von alleine freigegeben werden. (Interfaces, Strings, dynamische Arrays, Variants und CustomManagedRecords, außer natürlich von Objekt-Instanzen)

Erstellst du den Speicher (z.B. Delphi-Referenz durchsuchenNew), dann mußt du auch den Speicher freigeben.


Alternativ, anstatt Records eben mit DatenObjekten ... ich glaub der VST hatte irgendwo sowas, wie ein OwnsObjects.

mytbo 17. Okt 2023 17:10

AW: VirtualTreeView und Freigabe
 
Zitat:

Zitat von H.Bothur (Beitrag 1528264)
Wenn ich mein Programm beende muss ich dann alles wieder freigeben ?

Es kommt darauf an, wem die Daten gehören. Wenn du sie im Virtual TreeView vorhältst, so:
Delphi-Quellcode:
procedure ...VTVFreeNode(pmSender: TBaseVirtualTree; pmNode: PVirtualNode);
var
  data: PTreeData;
begin
  data := pmSender.GetNodeData(pmNode);
  if data <> Nil then
    Finalize(data^);
end;
Um was sich System.Finalize alles kümmert, kannst du in der Hilfe nachlesen. Alles andere musst du aufräumen. Wie man Daten extern vorhält und Virtual TreeView nur zur Anzeige verwendet, habe ich dir hier gezeigt.

Bis bald...
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz