AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ttreeview für verzeichnissstruktur der Festpladde
Thema durchsuchen
Ansicht
Themen-Optionen

ttreeview für verzeichnissstruktur der Festpladde

Ein Thema von moin339 · begonnen am 25. Sep 2002 · letzter Beitrag vom 26. Sep 2002
Antwort Antwort
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#1

ttreeview für verzeichnissstruktur der Festpladde

  Alt 25. Sep 2002, 18:07
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 25. Sep 2002, 18: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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#3
  Alt 25. Sep 2002, 18:26
Danke

Hab in der Online-Hilfe nichts gefunden
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 26. Sep 2002, 14: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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 26. Sep 2002, 14:45
erst ab d6.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz