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.