Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ttreeview für verzeichnissstruktur der Festpladde (https://www.delphipraxis.net/920-ttreeview-fuer-verzeichnissstruktur-der-festpladde.html)

moin339 25. Sep 2002 19:07


ttreeview für verzeichnissstruktur der Festpladde
 
Moin!

Bin Delphi - Anfänger und habe eine Frage zu treeview:

Wie kann ich in ein treeview alle Verzeichnisse aller Laufwerke eines PC's einbringen?

Ich hoffe da gibt es eine einfache lösungm ;-)

ciao, Moin

Luckie 25. Sep 2002 19:15

Nicht von mir:
Zitat:

Ich schreibe jetzt mal über die Möglichkeit, Verzeichnisbäume in ein TreeView einzulesen.
Damit lässt sich z.B. ein Verzeichnisbaum besser in eine Programmoberfläche integrieren, als ein
'SelectDirectory' - Fenster.

Hier erst mal für die Ungeduldigen die Prozedur, weiter unten
findet ihr noch eine 'übersichtlichere', falls ihr nur
Verzeichnisse einlesen wollt'.
Code:
[b]procedure[/b] TForm1.Einlesen(Tree : TTreeView; Verzeichnis : [b]String[/b]; Eintrag : TTreeNode; Mit_Dateien : Boolean);
[b]Var[/b]
SearchRec  : TSearchRec;
EintragTemp : TTreeNode;
[b]begin[/b]
  Tree.Items.BeginUpdate;
  [b]If[/b] Verzeichnis[length(Verzeichnis)]<>'\' [b]then[/b]
    Verzeichnis:=Verzeichnis+'\';
  [b]If[/b] FindFirst(Verzeichnis+ '*.*', faDirectory, SearchRec)=0 [b]then[/b]
    [b]begin[/b]
      [b]repeat[/b]
        [b]If[/b] (SearchRec.Attr [b]and[/b] faDirectory = faDirectory)
         [b]and[/b] (SearchRec.[b]Name[/b][1] <> '.') [b]then[/b]
          [b]begin[/b]
            [color=#000080][i]//Eintrag ist ein Verzeichnis[/i][/color]
            [b]If[/b] (SearchRec.Attr [b]and[/b] faDirectory > 0) [b]then[/b]
              [color=#000080][i]//zum aktuellen Eintrag hinzufügen[/i][/color]
              Eintrag := Tree.Items.AddChild(Eintrag, SearchRec.[b]Name[/b]);
            [color=#000080][i]//Eintrag merken[/i][/color]
            EintragTemp := Eintrag.Parent;
            [color=#000080][i]//auf Untereinträge prüfen[/i][/color]
            Verzeichnisse_Einlesen(Tree,Verzeichnis + SearchRec.[b]Name[/b],Eintrag,Mit_Dateien);
            [color=#000080][i]//Eintrag wiederholen[/i][/color]
            Eintrag := EintragTemp;
          [b]end[/b]
        [b]else[/b]
          [color=#000080][i]//Eintrag ist eine Datei[/i][/color]
          [b]If[/b] Mit_Dateien [b]then[/b]
            [b]If[/b] SearchRec.[b]Name[/b][1] <> '.' [b]then[/b]
              Tree.Items.AddChild(Eintrag, SearchRec.[b]Name[/b]);
      [b]until[/b] FindNext(SearchRec)<>0;
      FindClose(SearchRec);
    [b]end[/b];
    Tree.Items.EndUpdate;
[b]end[/b];
Code:
[color=#000080][i]// TreeView1.Items.Clear;[/i][/color]
Verzeichnisse_Einlesen(TreeView1, 'C:\', [b]nil[/b], false);
oder wenn zum Beispiel 'C:\' als oberster 'Knoten' im TreeView stehen soll, dann:
[b]var[/b]
TN : TTreeNode;
....
....
[color=#000080][i]// TreeView1.Items.Clear;[/i][/color]
TN := [b]nil[/b];
TN := TreeView1.Items.AddFirst(TN, 'C:\');
Verzeichnisse_Einlesen(TreeView1, 'C:\', TN, false);
das gleiche geht natürlich auch z.B. mit 'D:\' oder anderen Laufwerksbuchstaben,
man kann auch nur beispielsweise einen Ordner durchsuchen lassen, wie im folgenden
Beispiel 'Eigene Dateien':
[b]var[/b]
TN : TTreeNode;
....
[color=#000080][i]// TreeView1.Items.Clear;[/i][/color]
TN := [b]nil[/b];
TN := TreeView1.Items.AddFirst(TN, 'C:\Eigene Dateien');
Verzeichnisse_Einlesen(TreeView1, 'C:\Eigene Dateien', TN, false);
Zitat:

Wenn ihr es jetzt schon ausprobiert hat, werdet ihr sicherlich merken, dass das Einlesen
recht lange dauert, so kann man die oben genannte Prozedur auch geringfügig verbessern
und vor allem übersichtlicher machen.:
Code:
[b]procedure[/b] TForm1.Verzeichnisse_Einlesen(Tree : TTreeView; Verzeichnis : [b]String[/b]; Eintrag : TTreeNode);
[b]Var[/b]
SearchRec  : TSearchRec;
EintragTemp : TTreeNode;
[b]begin[/b]
  Tree.Items.BeginUpdate;
  [b]If[/b] Verzeichnis[length(Verzeichnis)]<>'\' [b]then[/b]
    Verzeichnis:=Verzeichnis+'\';
  [b]If[/b] FindFirst(Verzeichnis + '*.*', faDirectory, SearchRec)=0 [b]then[/b]
    [b]repeat[/b]
      [b]If[/b] (SearchRec.Attr [b]and[/b] faDirectory > 0)
         [b]and[/b] (SearchRec.[b]Name[/b][1] <> '.') [b]then[/b]
        [b]begin[/b]
          Eintrag := Tree.Items.AddChild(Eintrag, SearchRec.[b]Name[/b]);
          EintragTemp := Eintrag.Parent;
          Verzeichnisse_Einlesen(Tree,Verzeichnis + SearchRec.[b]Name[/b],Eintrag);
          Eintrag := EintragTemp;
        [b]end[/b];
    [b]until[/b] FindNext(SearchRec)<>0;
  FindClose(SearchRec);
  Tree.Items.EndUpdate;
[b]end[/b];
Zitat:

Diese Prozedur kann nur zum Verzeichnisse einlesen verwendet werden.
Die Kommentare habe ich jetzt gelöscht, die stehen ja schon in der oberen Prozedur.
Sie wirken sich jedoch nicht auf die Geschwindigkeit aus, da sie der Compiler wegoptimiert.
Da das Ergebnis im TreeView optisch nicht soviel hergibt, weil keine Bildchen angezeigt werden, kann
man eine TImageList erstellen und dort das gewünschte Ordner-Symbol eintragen. Dann im OI beim TreeView
bei 'Images' noch auf den DropDown-Pfeil klicken, und die ImageList auswählen.
Und schon ist etwas Farbe im Spiel.

Erklärung zur Prozedur:
Falls es doch noch welche geben sollte, die eine kleine Erklärung haben wollen, beschreibe ich mal die Prozedur, in diesem Fall die kürzere der Beiden.
Das ganze basiert auf den Funktionen
FindFirst (sucht in einem verzeichnis nach dem ersten Vorkommen einer Datei mit den angegebenen Attributen)
FindNext (sucht nach dem nächsten Eintrag, der mit den Attributen von FindFirst übereinstimmt)
FindClose (beendet eine Suche und gibt den Speicher frei)
wenn ihr weitere Informationen darüber haben wollt', dann sucht mal in der Hilfe-Datei unter diesen Begriffen.
Wenn ein Verzeichnis gefunden wird ( If (SearchRec.Attr and faDirectory > 0) then ), dann wird dieses Verzeichnis ins Treeview eingetragen, und die Prozedur nochmal aufgerufen. Es handelt sich jedoch dabei nich um dieselbe Prozedur, sondern um die gleiche mit dem gleichen Namen. Dieser Aufruf hat den Zweck, auch nach Unterordnern zu suchen und diese einzutragen. Das ganze nennt man rekursives Aufrufen, vielleicht kann man sich das ja mal merken.
So, da ich hier nicht behaupten will, dass ich das alles alleine 'rausgefunden habe, sage ich euch die Quelle, von der ich das hier habe und zwar ist das Pics-Software <www.pics-software.de>
Also, wenn ihr noch Fragen oder irgendwas zu bemerken habt, dann mailt mir mal. Meine Email-Adresse findet ihr unter 'Profil' von
Siggi

moin339 25. Sep 2002 19:26

Danke

Hab in der Online-Hilfe nichts gefunden

CalganX 26. Sep 2002 15:33

Hi,
ich weiß jetzt nicht, welche Version du verwendest, aber in meiner gibt es TShellDir oder so ähnlich... Da ist das direkt drin...

Chris

Luckie 26. Sep 2002 15:45

erst ab d6.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz