Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 00:15
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.
  Mit Zitat antworten Zitat