Zitat:
Hat es irgendeinen Grund, warum du die Objekte überhaupt in einer TObjectList ablegst? Ich persönlich gehe immer so vor, dass ich beim Einfügen einer Node mein Datenobjekt/Datenrecord mit Create erstelle und zuweise.
Ich bin mir noch nicht sicher, ob ich TObjectList behalte. Man hört von der einen Seite Zurufe "Ja, verwende es, dann verwaltest du den Speicher selber" und von der anderen Seite das Gegenteil.
Was ist denn jetzt
richtiger?
Mir ist nur wichtig, dass ich immer vollen Zugriff auf alle Daten habe. Daher dachte ich, wäre eine ObjectList nicht schlecht.
Zitat:
Zumindest früher hat der VST das definitiv nicht von alleine gemacht.
Kann ich nicht beurteilen. Ich gebe jedenfalls keinerlei Instanzen der in der ObjectListe enthaltenen Daten frei und habe keine Speicherlecks.
Zitat:
IndexOf ist nebenbei bemerkt keine sehr schnelle Operation und kann bei extrem vielen Nodes deine Performance schon ziemlich verschlechtern.
Ich gehe von nicht mehr als 100 und im aller schlechtesten Fall 200 Nodes ohne Children aus.
Delphi-Quellcode:
// ObjectList mit OwnObjects auf FALSE
procedure TForm2.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: TVSTData;
idx: Integer;
begin
Data := Node.GetData<TVSTData>;
idx := aVSTDataClasses.IndexOf(Data);
if idx > -1 then
aVSTDataClasses.Delete(idx);
Data.Free;
end;
Und so erzeuge ich meine Nodes
Delphi-Quellcode:
type
TVSTData = class(TObject)
Col1, Col2, Col3, Col4, Col5, sDescription: string;
Icon: Byte;
end;
TVSTDataClasses = TObjectList<TVSTData>;
var
aVSTDataClasses: TVSTDataClasses;
...
procedure TForm2.Button1Click(Sender: TObject);
var
aVSTData: TVSTData;
i: Integer;
begin
if not Assigned(aVSTDataClasses) then
aVSTDataClasses := TVSTDataClasses.Create(False);
for i := 0 to 5 do
begin
aVSTData := TVSTData.Create;
aVSTData.Col1 := IntToStr(i);
aVSTData.Col2 := IntToStr(Random(1000));
aVSTData.Col3 := IntToStr(Random(1000));
aVSTData.Col4 := IntToStr(Random(1000));
aVSTData.Col5 := IntToStr(Random(1000));
aVSTData.Icon := Random(ImageList2.Count - 1);
if i mod 3 = 0 then
aVSTData.sDescription := 'Das ist ein ganz langer String - ok so lang ist er nicht!'
else
aVSTData.sDescription := '';
aVSTDataClasses.Add(aVSTData);
end;
VST.RootNodeCount := aVSTDataClasses.Count;
end;