Du machst ja scheinbar jetzt folgendes:
Delphi-Quellcode:
procedure TForm1.LoadNodes();
var
NodeData: PNodeData;
Node: PVirtualNode;
begin
Node := vst.AddChild(nil);
NodeData := vst.GetNodeData(Node);
NodeData^ := TNodeData.Create(); // Hier führst du einen Konstruktor einer Klasse aus
end;
Da du in dem Beispiel oben (das jeanicke im übrigen auch so nur mit Generics gezeigt hat) ein Objekt instanziiert hast, musst du das dann auch wieder freigeben.
Also erstellt du dir einen EventHandler für das OnFreeNode Event des VST.
Delphi-Quellcode:
procedure TForm1.vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
NodeData: PNodeData;
begin
NodeData := vst.GetNodeData(Node);
NodeData^.Free;
end;
Wenn du dazu noch ein Beispiel brauchst, dann sag bescheid. Dann schreib ich dir schnell eins oder schaue ob ich noch irgendwo eins finde.
Mich würde das auf jeden Fall interessieren
Habe bisher nie mit so riesigen Datenmengen gearbeitet und deshalb immer nur
AddChild
verwendet, aber die Methode mit dem nachträglichen Initialisieren klingt interessant.
Ich werde mal so ein Beispiel aufbauen. Aber wie jeanicke es ebenfalls schon erwähnt hat, brauchst du eine entsprechende Datenstruktur aus der du dir die Daten dann beim Initialisieren ziehen kannst. Sei es eine
Query oder eine eigene Klassenstruktur wo Objekte bspw. in einer ObjectList abgelegt sind.
Es ist etwas umständlicher zu programmieren, aber es zahlt sich bei der Geschwindigkeit und auch bei der Speicherauslastung aus. Besonders wenn man sehr viele Nodes hat die Children besitzen. Dann brauchst man bspw. die Children erst zu laden wenn der User explizit die Node aufklappen will.