Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

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