Hallo,
zuersteinmal, du kannst über die Eigenschaft
Level abfragen auf welcher Ebene sich der aktuell berachtete Knoten befindet. tTreeItems bietet dir mit GetFirstNode eine Möglichkeit den ersten Knoten des Baumes zu suchen. Bei tTreeItem kannst du mit GetFirstChild und GetNextChild sowie mit GetNext und natürlich den genannten GetNextSibling navigieren. Mit einer Kombiation dieser Funktionen kannst du sicherlich viel Geziehlter suchen als mit deinen Schleifen. Zum einen kannst du deine suche Reursiv gestalten, was sich bei Bäumen immer anbietet, auch kannst du, wenn du in einer Sackgasse belandet bist kannst du die suche an der Stelle einfacher abbrechen.
Folgende Funktion ist nicht getestet (da ich keine lust habe mit einen Beispielbaum auf zu bauen) aber ich hoffe sie Funktiniert und ist schneller als deine variante, sehe es ansonsten als Konzeptstudie

:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function FindNodeOnLevel(aParentNode: tTreeNode; aCaption: String; aLevel: Integer): tTreeNode; var ActNode : tTreeNode; begin Result := nil; if (aParentNode <> nil) and (aParentNode.HasChildren) and (aParentNode.Level < aLevel) then begin ActNode := aParentNode.getFirstChild; while (ActNode <> nil) and (Result = nil) do begin if (ActNode.Level < aLevel) and (ActNode.HasChildren) then Result := FindNodeOnLevel(ActNode, aCaption, aLevel) else if (ActNode.Level = aLevel) and (AnsilowerCase(ActNode.Text) = AnsiLowerCase(aCaption)) then Result := ActNode; ActNode := aParentNode.GetNextChild(ActNode); end; end; end; |
Wie du (wenn du dich ein wenig reingedacht erkennst) sucht diese Rekursiv nach einen Knoten mit einer bestimmten Bezeichnung (G&K Schreibung egal) auf einer Bestimmten ebene (Hauptknoten haben Level 0). Hierbei werden Knoten die auf einem Level welches größer ins als das gesuchte nciht beachtet und sobalt der Knoten gefunden wurde wird auch nicht mehr weiter gesucht. Wird der Knoten nicht gefunden (nicht existent) liefert die Funktion
NIL zurück.
Ein Aufruf könnte so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); var SearchNode : tTreeNode; begin SearchNode := FindNodeOnLevel(TreeView1.Items.GetFirstNode, 'Gesucher Text', 4); end; |
Noch ein kleiner hinweis zur Geschwindigkeit. Wenn du etwas an den Items änders (z.B. auch beim Baum aufbauen) kannst du das erheblich beschleunigen, wenn du vorher
TreeView1.Items.BeginUpdate; aufrufen und hinterher
TreeView1.Items.EndUpdate; aufrufen, das verhindert, dass nach jeder änderung der Baum neu gezeichnet wird. Aus sicherheitsgründen sollte das in einer Try Finally konstruktion geschehen, damit der Baum bei einem Fehler nicht tot bleibt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| TreeView1.Items.BeginUpdate; try finally TreeView1.Items.EndUpdate; end; |
So, ich hoffe das bringt dich weiter.
Klabautermann