Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VirtualStringTree - Speicher freigeben (https://www.delphipraxis.net/184390-virtualstringtree-speicher-freigeben.html)

Bjoerk 23. Mär 2015 17:15

AW: VirtualStringTree - Speicher freigeben
 
Wie issn so?
Delphi-Quellcode:
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);
  Finalize(Data^);
end;

Zacherl 23. Mär 2015 17:30

AW: VirtualStringTree - Speicher freigeben
 
Zitat:

Zitat von Bjoerk (Beitrag 1294543)
Wie issn so?
Delphi-Quellcode:
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);
  Finalize(Data^);
end;

Das hat er doch in seinem ersten Post auch so stehen, nur dass er den Tree über VST statt über Sender referenziert. Das Problem sind wirklich die nicht validierten Nodes.

generic 24. Mär 2015 16:36

AW: VirtualStringTree - Speicher freigeben
 
Dein Record welcher die Daten hält, enthält diese lange Strings?

Wenn ja musst du diese per Hand freigegeben, da Delphi den Speicher des Records nicht selbst verwaltet und daher die String nicht freigeben kann.
Das habe ich damals auf dem 2. Stammtisch gezeigt mit FastMM. Vieleicht gibt es das Video noch irgendwo.
http://www.delphipraxis.net/712774-post4.html

Schnelle Abhilfe ist anstelle von String ein String[255] zu nehmen. (shortstring)
Oder du nimmst Objekte, welche allerdings auch von dir freigegeben werden müssen. Hier erkennt aber Delphi die Hughstrings.

Zacherl 24. Mär 2015 16:57

AW: VirtualStringTree - Speicher freigeben
 
Zitat:

Zitat von generic (Beitrag 1294658)
Dein Record welcher die Daten hält, enthält diese lange Strings?

Wenn ja musst du diese per Hand freigegeben, da Delphi den Speicher des Records nicht selbst verwaltet und daher die String nicht freigeben kann.

Ich verweise nochmal auf den Code im OnFreeNode Event :mrgreen:
Delphi-Quellcode:
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);
  Finalize(Data^);
end;
Das Finalize sorgt dafür, dass auch Strings, dynamische Arrays, etc. im verwendeten Record freigegeben werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz