Autor Beitrag
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 02.06.06 16:12 
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?" 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 user profile iconTino.

Die Funktionsvariablen
ausblenden 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
ausblenden Quelltext
1:
2:
: Boolean     > True, wenn der vollständige Node-Pfad gefunden wurde. 
                False, wenn nur ein Teil oder nichts gefunden wurde.


Die Funktion
ausblenden volle Höhe 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.
    ausblenden 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
    ausblenden 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.
    ausblenden 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.
ausblenden 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

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )