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
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
Quelltext
1: 2:
| : Boolean > True, wenn Knoten eingefügt wurden. False, wenn der Node-Pfad schon enthalten ist. |
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: 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 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 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); if TV.Items.Count > 0 then 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 ReNode := aNode else begin Result := True; if assigned(ReNode) then aNode := ReNode; case AddType of AddTop : for zz := z to iCount do aNode := TV.Items.AddChildFirst(aNode,sL[zz]); AddSort : begin for zz := z to iCount do if TV.Items.Count = 0 then aNode := TV.Items.AddChild(aNode,sL[zz]) else begin if not (assigned(aNode)) then begin aNode := TV.Items[0]; while Assigned(aNode) and (AnsiCompareStr(aNode.Text,sL[zz]) < 0) do aNode := aNode.GetNextSibling;
if Assigned(aNode) then aNode := TV.Items.Insert(aNode,sL[zz]) else aNode := TV.Items.AddChild(aNode,sL[zz]); end else begin if aNode.Count > 0 then begin i := aNode.Count-1; aNode := aNode[0]; while (aNode.Index < i) and (AnsiCompareStr(aNode.Text,sL[zz]) < 0) do aNode := aNode.GetNextSibling;
if AnsiCompareStr(aNode.Text,sL[zz]) < 0 then aNode := TV.Items.Add(aNode,sL[zz]) else aNode := TV.Items.Insert(aNode,sL[zz]); end else aNode := TV.Items.AddChild(aNode,sL[zz]); end; end; end; AddBottom : for zz := z to iCount do aNode := TV.Items.AddChild(aNode,sL[zz]); end;
ReNode := aNode; Break; end;
if z < iCount then aNode := aNode.GetFirstChild; end; finally sL.Free; end; end; |
Die Aufrufmöglichkeiten
1. Node-Pfad in TreeView einfügen
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
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.
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.:
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 Christian S.: Beitragsformatierung überarbeitet.
Moderiert von jasocul: Beitrag überprüft am 21.09.2006