Autor Beitrag
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 24.09.02 10:53 
Ordner, Unterordner und Dateien in TreeView anzeigen?

Mit der folgenden Procedure hat man die Möglichkeit eine Verzichnisstruktur incl. Dateien in einer TreeView dazustellen:
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:
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;

  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  If aPath [Length (aPath)] <> '\' Then
    aPath := aPath + '\';

  If FindFirst (aPath + '*.*', faDirectory, SearchRec) = 0 Then
    Begin
      Repeat
        // Wenn es sich um ein Verzeichnis handelt
        If (SearchRec.Attr and faDirectory = faDirectory)
          and (SearchRec.Name[1] <> '.')
        Then
          Begin
            If (SearchRec.Attr and faDirectory > 0then
              Begin
                New (Info);
                Info^.Path := True;
                Info^.Name := aPath + SearchRec.Name;

                // zum aktuellen Eintrag hinzufügen
                aNode := aTree.Items.AddChildObject (aNode, SearchRec.Name, Info);
              End;

            // Eintrag merken
            NodeTmp := aNode.Parent;
            // auf Untereinträge prüfen
            FindFilesTree (aTree, aPath + SearchRec.Name, aNode, aWithFiles);
            // Eintrag wiederholen
            aNode := NodeTmp;
          End
        Else
          // Eintrag ist eine Datei
          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;

      // solange weiter bis keine wieteren Dateien/Verzeichniss gefunden werden
      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:
ausblenden 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):
ausblenden 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;