Ordner, Unterordner und Dateien in TreeView anzeigen?
Mit der folgenden Procedure hat man die Möglichkeit eine Verzichnisstruktur incl. Dateien in einer TreeView dazustellen:
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:
| type pNodeInfo = ^tNodeInfo; tNodeInfo = record Path: Boolean; Name: String; end;
Procedure FindFilesTree (aTree: tTreeView; aPath: String; aNode: tTreeNode; aWithFiles: Boolean); Var SearchRec: tSearchRec; NodeTmp: tTreeNode; Info: pNodeInfo; Begin aTree.Items.BeginUpdate;
If aPath [Length (aPath)] <> '\' Then aPath := aPath + '\';
If FindFirst (aPath + '*.*', faDirectory, SearchRec) = 0 Then Begin Repeat If (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') Then Begin If (SearchRec.Attr and faDirectory > 0) then Begin New (Info); Info^.Path := True; Info^.Name := aPath + SearchRec.Name;
aNode := aTree.Items.AddChildObject (aNode, SearchRec.Name, Info); End;
NodeTmp := aNode.Parent; FindFilesTree (aTree, aPath + SearchRec.Name, aNode, aWithFiles); aNode := NodeTmp; End Else If aWithFiles and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') Then Begin New (Info); Info^.Path := False; Info^.Name := aPath + SearchRec.Name;
aTree.Items.AddChildObject (aNode, SearchRec.Name, Info); End;
Until FindNext (SearchRec) <> 0;
FindClose (SearchRec); End;
aTree.Items.EndUpdate; End; |
Der Aufruf der Procedure
FindFilesTree ist relativ einfach. Der erste Parameter gibt die TreeView an in der die Nodes erstellt werden sollen. aPath ist der zweite Parameter und gibt das Verzeichnis an ab dem gesucht werden soll. Der dritte Paramater kann benutzt werden um die komplette Verzeichnisstruktur ab einer bestimmten Node hinzuzufügen. Ansonsten einfach nil angeben. Der letzte Parameter gibt an ob auch die Dateien in der TreeView angezeigt werden sollen.
Aufgerufen kann die Procedure z. B. so:
Delphi-Quelltext
1:
| FindFilesTree (TreeView1, 'c:\Eigene Dateien', nil, True); |
Damit man auch mit den erzeugten Nodes in der TreeView arbeiten kann wurde beim erstellen der Nodes immer ein Objekt mit "verlinkt". Über dieses Objekt kann man den kompletten Path (bei Dateien auch den Dateinamen) erfahren und man bekommt die Information ob es sich um ein Verzeichnis oder um eine Datei handelt.
Hier ein Beispiel für die Auswertung beim OnClick-Event der TreeView. Dafür benötigt man ein Label (Label1) und ein Memofeld (Memo1):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Procedure TForm1.TreeView1Click(Sender: TObject); Var Info: pNodeInfo; Begin If TreeView1.Selected <> nil then Begin Info := TreeView1.Selected.Data;
Label1.Caption := Info^.Name If Not Info^.Path Then Memo1.Lines.LoadFromFile(Info^.Name); End Else Label1.Caption := 'Kein Verzeichnis/Datei gewählt'; End; |