Es geht noch einmal deutlich schneller, wenn du mit Klassen statt mit Records arbeitest. Beim Hinzufügen wie du es jetzt machst wird der Record einmal bei der Übergabe an AddVSTStructure und einmal beim Zuweisen an den Knoten komplett kopiert.
Wenn du hingegen eine Klasse benutzt, wird nur der Pointer kopiert. Damit habe ich 1 Million Einträge in 2 Sekunden hinzugefügt. Komplettes Beispiel:
Delphi-Quellcode:
type
TTest = class
private
FTestProperty: string;
public
constructor Create(const AValue: string);
property TestProperty: string read FTestProperty write FTestProperty;
end;
TForm103 = class(TForm)
VirtualStringTree1: TVirtualStringTree;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: string);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
//...
procedure TForm103.Button1Click(Sender: TObject);
var
i: Integer;
begin
VirtualStringTree1.BeginUpdate;
try
for i := 1 to 1000000 do
VirtualStringTree1.AddChild(nil, TTest.Create('Knoten ' + IntToStr(i)))
finally
VirtualStringTree1.EndUpdate;
end;
end;
procedure TForm103.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
VirtualStringTree1.GetNodeData<TTest>(Node).Free;
end;
procedure TForm103.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: string);
begin
CellText := VirtualStringTree1.GetNodeData<TTest>(Node).TestProperty;
end;
{ TTest }
constructor TTest.Create(const AValue: string);
begin
FTestProperty := AValue;
end;
NodeCount für den Knoten setzen und später initialisieren geht natürlich noch schneller, ist aber meist auch etwas aufwendiger.