Entwickler-Ecke

Visual Component Library (VCL) - ...Node-Pfad (String) im TreeView suchen/selectieren?


Lannes - Fr 02.06.06 16:12
Titel: ...Node-Pfad (String) im TreeView suchen/selectieren?
Einen Knoten durch einen Node-Pfad (String) im TreeView suchen/selectieren

In dem Beitrag beschreibt user profile iconTino wie man
"...den Node-Pfad (als String) in einer TreeView ermitteln? [http://www.delphi-library.de/viewtopic.php?t=11506&start=0&postdays=0&postorder=asc&highlight=]" kann.

Wie man Knoten bzw. einen Node-Pfad in einen TreeView einfügt, beschreibt dieser [http://www.delphi-library.de/topic_NodePfad+String+ins+TreeView+einfuegenTreeView+fuellen_61300.html] 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 user profile iconTino.

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

Delphi-Quelltext
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 = 0then
    exit; //--- -- - > raus

  sL := TStringList.Create;
  try
    //Pfad splitten
    //alle Delimiter durch #13 (carriage return [CR]) ersetzen
    for z := 1 to Length(Path) do
      if Path[z] = Delimiter then
        Path[z] := #13;

    //interner Parser der Stringlist teilt Path in Token auf
    sL.Text := Path;

    //durch eventuelle doppelte oder abschließende Delimiter
    //erzeugte Leeritems in StringList löschen
    for z := sL.Count-1 downto 0 do
      if sL[z] = '' then
        sL.Delete(z);

    //suchen
    iCount := Pred(sL.Count);
    aNode := TV.Items[0];//beim ersten Knoten beginnen
    for z := 0 to iCount do//alle Token der StringList im TreeView suchen
    begin
      //solange noch Knoten in der Ebene vorhanden
      //und Knotentext ungleich gesuchten Token
      while Assigned(aNode) and (AnsiCompareStr(aNode.Text,sL[z]) <> 0do
        aNode := aNode.GetNextSibling;//nächster Knoten

      if Assigned(aNode) then//Knoten gefunden
      begin
        //Funktions-Rückgabeparameter setzen
        ReNode := aNode;
        //für nächsten Durchlauf in nächste TreeView-Ebene wechseln
        if z < iCount then
          aNode := aNode.GetFirstChild;
      end;
    end;

    if Assigned(aNode) then
      Result := True;//alle Token gefunden
  finally
    sL.Free;
  end;
end;


Die Aufrufmöglichkeiten
1. Suchen und wenn Knoten vollständig gefunden wurde, diesen selectieren.


2. Suchen und wenn Knoten vollständig gefunden wurde, diesen selectieren


3. Suchen und wenn Knoten vollständig gefunden wurde, diesen selectieren.


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 user profile iconChristian S.: Beitragsformatierung überarbeitet.
Moderiert von user profile iconjasocul: Beitrag geprüft am 21.09.2006