Einen Knoten durch einen Node-Pfad (String) im TreeView suchen/selectieren
In dem Beitrag beschreibt
Tino wie man
"
...den Node-Pfad (als String) in einer TreeView ermitteln?" kann.
Wie man Knoten bzw. einen Node-Pfad in einen TreeView einfügt, beschreibt
dieser Beitrag.
Der Rückgabe-String ist dann beispielsweise
'c:\temp\usw\usw\xxx.txt' oder auch 'Gerd|Mustermann|Wohnhausen'.
Die folgende Funktion
FindTreeNodePath findet über einen solchen Node-Pfad den entsprechenden Knoten, also die Umkehrung der Funktion von
Tino.
Die Funktionsvariablen
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| TV: TTreeView; > In dem TreeView wird gesucht Path: String; > Der "Node-Pfad" Delimiter: Char; > Der Trenner z.B. '\' oder '|' var ReNode : TTreeNode; > Rückgabe-Parameter für den gefundene Knoten. Wurde der vollständige Node-Pfad nicht gefunden zeigt der Parameter entweder auf den letzten gefundenen Teil des Node-Pfads, oder wenn selbst die Root des Node-Pfads nicht im TreeView vorhanden ist auf nil. |
Der Funktionsrückgabewert
Quelltext
1: 2:
| : Boolean > True, wenn der vollständige Node-Pfad gefunden wurde. False, wenn nur ein Teil oder nichts gefunden wurde. |
Die Funktion
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| function FindTreeNodePath(TV: TTreeView; Path: String; Delimiter: Char; var ReNode : TTreeNode): Boolean; var sL : TStringList; z, iCount : Integer; aNode : TTreeNode; begin result := False; ReNode := nil;
if (Path = '') or (TV.Items.Count = 0) then exit; sL := TStringList.Create; try for z := 1 to Length(Path) do if Path[z] = Delimiter then Path[z] := #13;
sL.Text := Path;
for z := sL.Count-1 downto 0 do if sL[z] = '' then sL.Delete(z);
iCount := Pred(sL.Count); aNode := TV.Items[0]; for z := 0 to iCount do begin while Assigned(aNode) and (AnsiCompareStr(aNode.Text,sL[z]) <> 0) do aNode := aNode.GetNextSibling; if Assigned(aNode) then begin ReNode := aNode; if z < iCount then aNode := aNode.GetFirstChild; end; end;
if Assigned(aNode) then Result := True; finally sL.Free; end; end; |
Die Aufrufmöglichkeiten
1. Suchen und wenn Knoten vollständig gefunden wurde, diesen selectieren.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var ReNode : TTreeNode; Path : String; begin Path := 'c:\temp\usw\usw\xxx.txt'; if FindTreeNodePath(TreeView1,Path,'\',ReNode) then ReNode.Selected := True; |
2. Suchen und wenn Knoten vollständig gefunden wurde, diesen selectieren
und Meldung falls nicht vollständig gefunden
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var ReNode : TTreeNode; Path : String; begin Path := 'c:\temp\usw\usw\xxx.txt'; if FindTreeNodePath(TreeView1,Path,'\',ReNode) then ReNode.Selected := True else showmessage(Path +' nicht vollständig gefunden.'); |
3. Suchen und wenn Knoten vollständig gefunden wurde, diesen selectieren.
Falls nicht vollständig entsprechende Meldung und Selectierung des
letzten gefundenen Knotens.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var ReNode : TTreeNode; Path : String; begin Path := 'c:\temp\usw\usw\xxx.txt'; if FindTreeNodePath(TreeView1,Path ,'\',ReNode) then ReNode.Selected := True else if assigned(ReNode) then begin ReNode.Selected := True showmessage(Path +' nicht vollständig gefunden,'+#13#10 +'der letzte gefundene Knoten wurde selectiert.'); end else showmessage('Root von '+Path+' existiert nicht.'); |
Vorraussetzungen für die Nutzung
Die TreeVieweinträge müssen
nicht sortiert sein.
Die zu durchsuchende TreeView darf
nur eindeutige Knoten enthalten.
z.B.
Quelltext
1: 2: 3: 4: 5: 6:
| Gerd --Mustermann ----Wohnhausen Gerd --Mustermann ----Kleinkleckersdorf |
Der gesuchte Node-Pfad 'Gerd|Mustermann|Kleinkleckersdorf' wird nicht gefunden,
da die Funktion in den ersten Ast verzweigt. Im ersten Ast wird nur 'Gerd|Mustermann|Wohnhausen' gefunden und die Funktion gibt False zurück.
Moderiert von Christian S.: Beitragsformatierung überarbeitet.
Moderiert von jasocul: Beitrag geprüft am 21.09.2006