Zusätzlich wäre es schon, wenn mir mal jemand den Vorschlag mit der Objektliste erklären könnte.
Danke schon mal. Gruß Jens
Ich mache es mal anhand von deinem Beispiel. Ist doch ganz einfach:
Du definiert die eine ObjectList. Da ich Delphi 2007 habe, nehme ich zwangsläufig die einfache TOjectList aus der
Unit Contnrs;
Delphi-Quellcode:
type
TForm1 = class(TForm)
vstKunden: TVirtualStringTree;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
KundenList:TObjectList; // <-----
public
{ Public-Deklarationen }
end;
Beim Einlesen des Trees passiert folgendes:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
CustomerNode, BuildingNode, SystemNode: PVirtualNode;
Daten: PRKundenDaten;
fk:TOCustomers;
fo:TOBuilding;
fs:TOSystems;
begin
vstKunden.NodeDataSize := SizeOf(TRKundenDaten);
KundenList:=TObjectList.create; // <--- Instanz der ObjectList erzeugen;
// Besser wäre es, alles ab hier in eine eigene Methode auszulagern,
// damit man das Einlesen des Trees vom Erzeugen des Liste trennen kann.
// Vielleicht soll der Tree ja wärend der Lebenszeit des Form nochmal neu eingelesen werden.
vstKunden.BeginUpdate;
try
vstKunden.Clear;
//CustomerNode := vstKunden.AddChild(nil); wozu soll das gut sein?
//vstKunden.InvalidateNode(CustomerNode);
for I := 0 to 10 do
begin
BuildingNode := vstKunden.AddChild(nil);
Daten := vstKunden.GetNodeData(BuildingNode);
fk := TOCustomers.Create; // <---- Datenobjekte erzeugen
fo := TOBuilding.Create; // Wahrscheinlich brauchst du nur ein Objekt pro Node,
fs := TOSystems.Create; // das dann die verschiedenen Node-Typen verwalten kann.
// Das ist aber ein anderes Thema
Daten^.FKundedaten := fk; // <---- Datenobjekte dem VST übergeben
Daten^.FObjektdaten := fo;
Daten^.FSystemdaten := fs;
KundenList.Add(fk); // <---- Datenobjekte der Liste hinzufügen
KundenList.Add(fo); // Die Objekte gehören jetzt der ObjectList
KundenList.Add(fs);
end;
vstKunden.SortTree(0, sdAscending, True);
finally
vstKunden.EndUpdate;
end;
end;
Zum Schluss musst du nur die ObjectList wieder freigeben. Damit werden automatisch auch die darin enthaltenen Objekte freigegeben. Der VST muss sich um nichts mehr kümmern.
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
KundenList.free;
end;