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: So 11.06.06 23:11 
Node-Pfad (String) im TreeView einfügen oder TreeView mit einer Liste von Node-Pfaden füllen

In dem Beitrag (Link) beschreibe ich wie man einen Node-Pfad (String) im TreeView suchen und den entsprechenden Knoten selectieren kann.

Die Funktion AddTreeNodePathDupIgnore geht einen Schritt weiter und fügt, wenn ein Node-Pfad nicht gefunden wurde, die entsprechenden Knoten in das TreeView ein.
Die Funktion kann auch zum schnellen Erzeugen einer Baumdarstellung im TreeView genutzt werden,
sollte eine Liste mit Node-Pfaden vorliegen.

Die Funktionsvariablen
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
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 gefundenen oder eingefügten Knoten.
                          Er zeigt entweder auf den gefundenen Knoten 
                          oder auf den eingefügten Knoten.
AddType: TAddType       > Wo soll eingefügt werden
                          AddTop    > am Anfang der entsprechenden Knotenebene
                          AddSort   > einsortieren
                          AddBottom > an das Ende der entsprechenden Knotenebene


Der Funktionsrückgabewert
ausblenden Quelltext
1:
2:
: Boolean     > True, wenn Knoten eingefügt wurden. 
                False, wenn der Node-Pfad schon enthalten ist.


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:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
//Type deklarieren, kann direkt vor der Funktion erfolgen
type TAddType = (AddTop,AddSort,AddBottom);

function AddTreeNodePathDupIgnore(TV: TTreeView;
                                  Path: String;
                                  Delimiter: Char;
                                  var ReNode : TTreeNode;
                                  AddType: TAddType): Boolean;
var sL : TStringList;
    aNode : TTreeNode;
    z,iCount,zz,i : Integer;
begin
  Result := False;
  aNode := nil;
  ReNode := nil;
  sL := TStringList.Create;
  try
    //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 Path-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);

    iCount := Pred(sL.Count);
    if TV.Items.Count > 0 then//min 1 Knoten vorhanden
      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
        //Funktions-Rückgabeparameter setzen
        ReNode := aNode
      else
      begin
        //Knoten nicht gefunden, also in TreeView einbauen
        Result := True;//Funktions-Rückgabewert setzen
        if assigned(ReNode) then//min Root wurde gefunden
          aNode := ReNode;//ausgehend vom letzten gefundenen Knoten
        case AddType of
        //alle nicht gefundenen Path-Token als Child einfügen
          AddTop :
            for zz := z to iCount do
              aNode := TV.Items.AddChildFirst(aNode,sL[zz]);
            //alle nicht gefundenen Path-Token einsortieren
          AddSort :
            begin
              for zz := z to iCount do
                if TV.Items.Count = 0 then//TreeView ist noch leer
                  aNode := TV.Items.AddChild(aNode,sL[zz])
                else
                  begin
                    if not (assigned(aNode)) then//in Root-Nodes suchen
                    begin
                      aNode := TV.Items[0];
                      while Assigned(aNode) and (AnsiCompareStr(aNode.Text,sL[zz]) < 0do
                        aNode := aNode.GetNextSibling;

                      if Assigned(aNode) then//Einfügestelle gefunden
                        aNode := TV.Items.Insert(aNode,sL[zz])
                      else//nicht gefunden, also anhängen
                        aNode := TV.Items.AddChild(aNode,sL[zz]);
                    end
                    else//in weiteren Ebenen(Level) suchen
                    begin
                      if aNode.Count > 0 then//nur suchen wenn Child-Node vorhanden sind
                      begin
                        i := aNode.Count-1;
                        aNode := aNode[0];//auf ersten Child-Node setzen
                        while (aNode.Index < i) and (AnsiCompareStr(aNode.Text,sL[zz]) < 0do
                          aNode := aNode.GetNextSibling;

                        if AnsiCompareStr(aNode.Text,sL[zz]) < 0 then
                          //Einfügestelle nicht gefunden
                          aNode := TV.Items.Add(aNode,sL[zz])
                        else
                          //Einfügestelle gefunden
                          aNode := TV.Items.Insert(aNode,sL[zz]);
                      end
                      else//kein Child-Node vorhanden
                        aNode := TV.Items.AddChild(aNode,sL[zz]);
                    end;
                  end;
            end;
            //alle nicht gefundenen Path-Token als Child anfügen
          AddBottom :
            for zz := z to iCount do
              aNode := TV.Items.AddChild(aNode,sL[zz]);
        end;{case}

        ReNode := aNode;//Funktions-Rückgabeparameter setzen
        Break;//beenden der Path-Token-Such-Schleife
      end;{else}

      if z < iCount then//beim letzten Path-Token nicht
        aNode := aNode.GetFirstChild;
    end;{for}
  finally
    sL.Free;
  end;
end;


Die Aufrufmöglichkeiten
1. Node-Pfad in TreeView einfügen
    ausblenden Delphi-Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    var ReNode : TTreeNode;
        Path : String;
    begin
      Path := 'c:\temp\usw\usw\xxx.txt';
      AddTreeNodePathDupIgnore(TreeView1,Path,'\',ReNode,AddSort);
    end;


2. Node-Pfad in TreeView einfügen und selectieren
    und falls vorhanden selectieren und Meldung ausgeben
    ausblenden Delphi-Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    11:
    var ReNode : TTreeNode;
        Path : String;
    begin
      Path := 'c:\temp\usw\usw\xxx.txt'
      if AddTreeNodePathDupIgnore(TreeView1,Path,'\',ReNode,AddSort) then
        ReNode.Selected := True
      else
      begin
        ReNode.Selected := True
        showmessage(Path+' ist schon vorhanden');
      end;


3. Node-Pfade aus einer Liste(z.B. im Memo) in TreeView einfügen
    Angenommen in einem Memo ist folgende Liste enthalten:
    c:\temp\usw1\mehr\xxx.txt
    c:\temp\usw1\mehr\xxx.txt
    c:\temp\usw2\mehr\xxx.txt
    c:\temp\usw2\mehr1\xxx.txt
    Die Node-Pfade können dann mittels einer Schleife in die Knoten des TreeView integriert werden.
    ausblenden Delphi-Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    var z : Integer;
        ReNode : TTreeNode;
    begin
      TreeView1.Items.BeginUpdate;

      for z := 0 to Pred(Memo1.Lines.Count) do
        AddTreeNodePathDupIgnore(TreeView1,Memo1.Lines[z],'\',ReNode,AddSort);

      TreeView1.Items.EndUpdate;


Vorraussetzungen für die Nutzung
Die TreeVieweinträge müssen nicht sortiert sein.

Das Ziel-TreeView darf nur eindeutige Knoten enthalten.
z.B.:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
Gerd
--Mustermann
----Wohnhausen
Gerd
--Mustermann
----Kleinkleckersdorf

Wird nun der Node-Pfad 'Gerd|Mustermann|Kleinkleckersdorf' an die Funktion übergeben,
wird er in den ersten Ast integriert, da die Funktion in den ersten gefundenen Ast verzweigt.

Moderiert von user profile iconChristian S.: Beitragsformatierung überarbeitet.
Moderiert von user profile iconjasocul: Beitrag überprüft am 21.09.2006

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


Zuletzt bearbeitet von Lannes am Mo 26.06.06 15:52, insgesamt 1-mal bearbeitet