Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.358 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: VirtualStringTree - Speicher freigeben

  Alt 23. Mär 2015, 03:21
Erstens würde ich diese Art der Datenhaltung nicht empfehlen. Ich nutze dafür lieber Klassen, das ist deutlich einfacher, da du nicht mit Pointer spielen musst. Und die kann ich dann abseits des VST in Listen oder einem Dictionary halten und auch dort ggf. freigeben. Beispiel:
Delphi-Quellcode:
VST.AddChild(nil, TMyExample.Create('blub');

// NodeDataSize muss auf SizeOf des Objekts stehen, sprich entspricht der Größe eines Pointers (NativeUInt).
Beim Auslesen habe ich im Büro dann eine Helperfunktion geschrieben, die wir nun standardmäßig für die VST nehmen:
Delphi-Quellcode:
  TExampleVirtualStringTreeHelper = class helper for TBaseVirtualTree
  private
  public
    function Get<T: class>(Node: PVirtualNode): T;
  end;

// ...

function TExampleVirtualStringTreeHelper.Get<T>(Node: PVirtualNode): T;
var
  ResultData: Pointer;
begin
  ResultData := GetNodeData(Node);
  if Assigned(ResultData) and (TObject(ResultData^) is T) then
    Result := T(ResultData^)
  else
    Result := nil;
end;
Nun kann man einfach so das Objekt wieder auslesen:
Delphi-Quellcode:
VST.Get<TMyExample>(Node)
// du bekommst so direkt das Objekt
oder, wenn man eine entsprechende Helperfunktion schreibt:
Delphi-Quellcode:
function TExampleVirtualStringTreeHelper.TryGet<T>(Node: PVirtualNode; out Value: T): Boolean;
...

if VST.TryGet<TMyExample>(Node, MyExample) then
  ShowMessage(MyExample.Value);
Zu deinem Beispiel:
Finalize solltest du nie aufrufen müssen, da die VST sich um den Speicher kümmert.
Es wird aber in der Regel so sein, dass der Speichermanager den Speicher nicht ans System freigibt, so dass du im Taskmanager nichts davon siehst. Intern wird der aber bei neuen Speicheranforderungen benutzt.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (23. Mär 2015 um 03:26 Uhr)
  Mit Zitat antworten Zitat