Hi,
frohes neues Jahr
Folgende Problemstellung: Ich habe eine Klassse TTestObjects:
Delphi-Quellcode:
type TTestObjects = class(TObject)
public
// z.B. "Kamel" oder "Auto" oder "Haus"
ItemCaption: string;
// Semikolon getrennte Liste, z.B. "Objekt;Mensch;Maschine"
Tags: string;
end;
var
FObjects: TList<TTestObjects>;
Diese Klasse ist über
FObjects
ansprechbar.
Ich möchte nun alle Objekte, gruppiert nach den einzelnen Tags, in einem TTreeView anzeigen lassen. Hat also ein Objekt 3 Tags, erscheint es unter 3 Nodes im TTreeView.
Delphi-Quellcode:
procedure UpdateList;
var
i, k, l: integer;
varItemAdded: boolean;
varStringArray: TStringDynArray;
varTreeNodeItem: TTreeNode;
begin
TreeView.Items.BeginUpdate;
TreeView.Items.Clear;
for i := 0 to FObjects.Count-1 do
begin
// Wurde ein Tag gesetzt?
if (trim(FObjects[i].tags) <> '') then
begin
varStringArray := SplitString(FObjects[i].tags, ';');
end
else
begin
setlength(varStringArray, 1);
varStringArray[0] := 'Untagged Objects';
end;
for k := 0 to length(varStringArray)-1 do
begin
// Leere Tags ignorieren
if varStringArray[k] = '' then Continue;
varItemAdded := False;
for l := 0 to TreeView.Items.Count -1 do
begin
if TreeView.Items[l].Text = varStringArray[k] then
begin
// Objekt zu bereits existierendem Tag hinzufügen
TreeView.Items.AddChild(TreeView.Items[l], FObjects[i].ItemCaption);
varItemAdded := True;
Break;
end;
end;
if not varItemAdded then
begin
// Neues Tag anlegen und Objekt hinzufügen
varTreeNodeItem := TreeView.Items.Add(nil, varStringArray[k]);
TreeView.Items.AddChild(varTreeNodeItem, FObjects[i].ItemCaption);
end;
end;
end;
TreeView.Items.EndUpdate;
end;
Der Code selbst funktioniert. Sobald die Anzahl der Objekte jedoch größer werden, gibt es Probleme mit der Performance. Wie kann man den Code optimieren?
Weitere Frage: Wie kann man verhindern, dass sich das TTreeView nach jeder Änderung zusammenklappt?
Danke & Viele Grüße