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: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116:
| { 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: } procedure TForm1.Einlesen(Tree : TTreeView; Verzeichnis : String; Eintrag : TTreeNode; Mit_Dateien : Boolean); Var SearchRec : TSearchRec; EintragTemp : TTreeNode; begin Tree.Items.BeginUpdate; If Verzeichnis[length(Verzeichnis)]<>'\' then Verzeichnis:=Verzeichnis+'\'; If FindFirst(Verzeichnis+ '*.*', faDirectory, SearchRec)=0 then begin repeat If (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then begin //Eintrag ist ein Verzeichnis If (SearchRec.Attr and faDirectory > 0) then //zum aktuellen Eintrag hinzufügen Eintrag := Tree.Items.AddChild(Eintrag, SearchRec.Name); //Eintrag merken EintragTemp := Eintrag.Parent; //auf Untereinträge prüfen Verzeichnisse_Einlesen(Tree,Verzeichnis + SearchRec.Name,Eintrag,Mit_Dateien); //Eintrag wiederholen Eintrag := EintragTemp; end else //Eintrag ist eine Datei If Mit_Dateien then If SearchRec.Name[1] <> '.' then Tree.Items.AddChild(Eintrag, SearchRec.Name); until FindNext(SearchRec)<>0; FindClose(SearchRec); end; Tree.Items.EndUpdate; end; { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Aufruf z.B. mit: } // TreeView1.Items.Clear; Verzeichnisse_Einlesen(TreeView1, 'C:\', nil, false); oder wenn zum Beispiel 'C:\' als oberster 'Knoten' im TreeView stehen soll, dann: var TN : TTreeNode; .... .... // TreeView1.Items.Clear; TN := nil; 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': var TN : TTreeNode; .... // TreeView1.Items.Clear; TN := nil; TN := TreeView1.Items.AddFirst(TN, 'C:\Eigene Dateien'); Verzeichnisse_Einlesen(TreeView1, 'C:\Eigene Dateien', TN, false); { 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: } procedure TForm1.Verzeichnisse_Einlesen(Tree : TTreeView; Verzeichnis : String; Eintrag : TTreeNode); Var SearchRec : TSearchRec; EintragTemp : TTreeNode; begin Tree.Items.BeginUpdate; If Verzeichnis[length(Verzeichnis)]<>'\' then Verzeichnis:=Verzeichnis+'\'; If FindFirst(Verzeichnis + '*.*', faDirectory, SearchRec)=0 then repeat If (SearchRec.Attr and faDirectory > 0) and (SearchRec.Name[1] <> '.') then begin Eintrag := Tree.Items.AddChild(Eintrag, SearchRec.Name); EintragTemp := Eintrag.Parent; Verzeichnisse_Einlesen(Tree,Verzeichnis + SearchRec.Name,Eintrag); Eintrag := EintragTemp; end; until FindNext(SearchRec)<>0; FindClose(SearchRec); Tree.Items.EndUpdate; end; { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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 } |