![]() |
Delphi-Version: 2009
Funktion erweitern
Hallo DP,
ich hab folgende Funktion:
Delphi-Quellcode:
ich möchte gerne jetzt, dass die auch die unterordner einfüllt.
Procedure FülleOrdnerInTreeView(Pfad:String;TreeView:TTreeView;Node:TTreeNode;
Dateimaske:String;DateiendungAnzeigen:Boolean); var Files:TSearchRec; erg:Integer; DateiName:String; begin if (Pfad <> '') then //wenn kein Pfad angegeben dann abbrechen begin if Pfad[length(Pfad)] <> '\' then Pfad := Pfad + '\'; //wenn kein '\' dann hinzufügen erg := FindFirst(Pfad + Dateimaske, faAnyFile, Files); //erste Datei holen (Ergebnis <> 0 = nix gefunden) while erg = 0 do //wenn Datei gefunden weitersuchen begin Dateiname := Files.Name; if DateiendungAnzeigen=False then begin Delete(Dateiname,Pos('.',Dateiname),Length(Dateimaske)); end; TreeView.Items.AddChild(Node,Dateiname); erg := FindNext(Files); //nächste Datei suchen while ((Files.Name = '.') or (Files.Name = '..')) and (erg <> 0) do erg := FindNext(Files); //Filtert "." und ".." raus. end; FindClose(Files); //SearchRec freigeben TreeView.Items.Item[0].Expand(True); end; end; Wäre nett, wenn ihr mir helfen könnt. |
AW: Funktion erweitern
Baue dir eine der Funktionen aus der Code-Library um. Das ist nicht schwer:
![]() Edit: Irgendwie gehen die [cl]-Tags noch nicht richtig. |
AW: Funktion erweitern
Ich steh grad echt aufm Schlauch. :D
Wie bekomm ich folgendes in mein TreeView:
Code:
und so weiter.
--Dateien <--Hauptordner
+liste +zitate +-testdateien <--unterordner +test +test1 +datei <-- unterordner beendet weiter mit hauptordner Jemand ne Idee?? |
AW: Funktion erweitern
Zitat:
Und dann hast du z.B. ein Probleme mit Dateien, welche einen Punkt im Namen haben. (der letzte Punkt zählt als Trennung und nicht er erste, welchen Pos finden würde)
Delphi-Quellcode:
zu deiner Frage:
if not DateiendungAnzeigen then
Dateiname := ChangeFileExt(Dateiname, ''); - rufe deine Funktion rekursiv auf, bei Unterverzeichnissen - und gib den Node des übergeordneten TreeNodes mit, welcher dann als Parent für die neuen Nodes verwendet wird. - beim ersten Aufruf übergibst du den RootNode des TreeView |
AW: Funktion erweitern
vl. Hilft dir ja das hier:
Das teil durchsucht einen Ordner -Unterordner und legt dementsprechend Nodes an... EDIT: Das war das falsche... Hier also das richtige...
Delphi-Quellcode:
procedure TDirectorySearch.scan(path: string; tiefe:integer);
var SR:TSearchRec; tmparray:array of string; i:integer; tn:TTreeNode; begin SetLength(tmparray,0); if FindFirst(path+'*', faAnyFile, SR) = 0 then begin repeat if (SR.Attr and faDirectory = faDirectory) and not ((SR.Name=',') or (SR.Name='.') or (SR.Name='..')) then begin with fTreeView.Items.AddChild(fTreeView.Selected,sr.Name+'/') do begin tn:=fTreeView.Selected; Selected:=true; scan(path+sr.Name+'/',tiefe+1); fTreeView.Selected:=tn; end; end else if not ((SR.Name=',') or (SR.Name='.') or (SR.Name='..') or (SR.Name='.directory')) and ((AnsiLowerCase(extractfileext(sr.Name))='.mp3') or (AnsiLowerCase(extractfileext(sr.Name))='.ogg') or (AnsiLowerCase(extractfileext(sr.Name))='.aac') or (AnsiLowerCase(extractfileext(sr.Name))='.wav')) then begin SetLength(tmparray,Length(tmparray)+1); tmparray[High(tmparray)]:=sr.Name; end; until FindNext(SR) <> 0; end; if High(tmparray)>=0 then for i:=0 to High(tmparray) do begin fTreeView.Items.AddChild(fTreeView.Selected,tmparray[i]).MakeVisible; end; end; |
AW: Funktion erweitern
@Teekeks:
* nicht das ![]() * die For-Schleife brauchst du nicht mit diesem IF absichern (ist da schon eingebaut) * und mal sehn was du zum Rest sagst :)
Delphi-Quellcode:
@Muellermilchtrinker:
uses StrUtils;
procedure TForm1.scan(path: string); var SR: TSearchRec; tmparray: array of string; i: integer; s: string; begin SetLength(tmparray,0); if FindFirst(path+'*', faAnyFile, SR) = 0 then begin repeat if not AnsiMatchStr(SR.Name, [',', '.', '..']) then if SR.Attr and faDirectory = 0 then begin if AnsiMatchText(ExtractFileExt(SR.Name), ['.mp3', '.ogg', '.aac', '.wav']) then begin SetLength(tmparray, Length(tmparray) + 1); tmparray[High(tmparray)] := SR.Name; end; end else scan(path + SR.Name + '/'); until FindNext(SR) <> 0; FindClose(SR); end; for i := 0 to High(tmparray) do begin //die Titel in diesem Ordner... end; end;
Delphi-Quellcode:
procedure TForm1.scan(path: string; parent: TTreeNode = nil);
var SR: TSearchRec; s: String; begin SetLength(tmparray,0); if FindFirst(path + '*', faAnyFile, SR) = 0 then try repeat if (SR.Name <> '.') and (SR.Name <> '..') then if SR.Attr and faDirectory = 0 then begin TreeView1.Items.AddChild(parent, SR.Name); //s := SR.Name; //if not DateiendungAnzeigen then // s := ChangeFileExt(s, ''); //TreeView1.Items.AddChild(parent, S); end else scan(path + SR.Name + '/', TreeView1.Items.AddChild(parent, SR.Name)); until FindNext(SR) <> 0; finally FindClose(SR); end; end; scan('C:\'); |
AW: Funktion erweitern
Zitat:
Das ganze ist auch aus einem Projekt das ich schon seit gut einem Jahr nicht mehr bearbeite und nutze... |
AW: Funktion erweitern
Zitat:
Delphi-Quellcode:
Dann wird der Befehl c genau Max(b - a + 1, 0)× ausgeführt :mrgreen: Wenn also keine Dateien existieren, dann ist High(<empty array>) = -1 und damit ist -1 - 1 + 1 = -1 < 0 → es wird 0× ausgeführt.
for i := a to b do
c(); Man könnte es auch so ausdrücken:
Delphi-Quellcode:
Du siehst also, wenn a > b, dann wird die Schleife nie durchlaufen.
i := a;
while i ≤ b do begin c(); Inc(i); end; MfG Fabian PS: @Himi: Wozu zwei Proceduren? |
AW: Funktion erweitern
Die letzte Procedur von Himitsu funktioniert. Aber ich hab folgendes Problem. Hab die jetzt so abgeändert, aber bei den Unterordnern funktioniert der Filter nicht :(:
Delphi-Quellcode:
procedure TForm1.scan(path: string; parent: TTreeNode = nil;Maske:String='*.*';DateiendungAnzeigen:Boolean=true);
var SR: TSearchRec; s:string; tmparray: array of string; begin SetLength(tmparray,0); if FindFirst(path + '*', faAnyFile, SR) = 0 then try repeat if (SR.Name <> '.') and (SR.Name <> '..') then if SR.Attr and faDirectory = 0 then begin //TreeView1.Items.AddChild(parent, SR.Name); s := SR.Name; if not DateiendungAnzeigen then s := ChangeFileExt(s, ''); TreeView1.Items.AddChild(parent, S); end else scan(path + SR.Name + '/', TreeView1.Items.AddChild(parent, SR.Name),Maske,DateiendungAnzeigen); until FindNext(SR) <> 0; finally FindClose(SR); end; end; |
AW: Funktion erweitern
Wenn path sowieso nicht als konstanter Parameter deklariert ist, kannst Du ihn ja innerhalb der Routine ändern, also ggf. den Backslash anhängen. Nimm also als erste Zeile mal
Delphi-Quellcode:
rein und mach vor allem den Slash beim rekursiven Aufruf raus.
path := IncludeTrailingPathDelimiter(path);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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-2025 by Thomas Breitkreuz