Thema: Delphi Arbeiten mit TTreeView

Einzelnen Beitrag anzeigen

Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#1

Arbeiten mit TTreeView

  Alt 7. Jan 2016, 17:02
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

Geändert von Martin W ( 7. Jan 2016 um 17:06 Uhr)
  Mit Zitat antworten Zitat