![]() |
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);
|
AW: Funktion erweitern
Funktioniert leider immer noch nicht.
Die Maske funktioniert immer noch nicht bei den Unterordnern. Und wenn wir grad dabei sind: Hat jemand eine Idee wie ich den Pfad rausbekomm, wenn ich auf eine Datei vom Unterordner klick??? Hab das immer so gemacht:
Delphi-Quellcode:
Weiß jemand wie ich das dann hier bekomm mit den Unterordnern???
Dateipfad := Hauptpfad + TreeView1.Selected.Text
|
AW: Funktion erweitern
Dann zeig uns doch einmal die aktuelle Routine sowie den Aufruf, vielleicht sieht man da etwas.
|
AW: Funktion erweitern
Also meine aktuelle Routine sieht so aus:
Delphi-Quellcode:
Und so rufe ich auf:
procedure TForm1.scan(path: string; parent: TTreeNode = nil;Maske:String='*.*';DateiendungAnzeigen:Boolean=true);
var SR: TSearchRec; s:string; tmparray: array of string; begin path := IncludeTrailingPathDelimiter(path); 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;
Delphi-Quellcode:
Ich hab einfach mal ein Testprojekt gemacht, indem ich ein Editfeld (für den Pfad), ein Button und das TreeView hab. Ich klick auf den Button und dann liest der den Ordner vom Editfeld in das TreeView ein.
procedure TForm1.Button1Click(Sender: TObject);
begin scan(Edit1.Text,TreeView1.Items.Item[0],'*.txt',false); end; |
AW: Funktion erweitern
Und dabei wird die Maske ignoriert, sobald die erste Rekursion ins Spiel kommt? Passiert das auch, wenn Du den Defaultwert einmal entfernst?
|
AW: Funktion erweitern
Sobald die Rekursion kommt, wird die Maske entfernt.
Eigentlich wollt ich es zuerst ohne Defaultwert machen, aber da bekamm ich die Errormeldung, dass ein Defaultwert fehlt und dasselbe bei DateiendungAnzeigen. |
AW: Funktion erweitern
Das kann ja eigentlich nur bedeuten, dass Du beim ursprünglichen Aufruf nicht alle Parameter belegt hattest.
|
AW: Funktion erweitern
Ich hab aber alle Paramenter belegt und trotzdem kommt der Error.
|
AW: Funktion erweitern
Delphi-Quellcode:
So sollte es aber auch funktionieren, es sei denn, Du hast woanders noch eine gleichnamige Routine und beim Aufruf lässt sich nicht eindeutig zuordnen, welche gemeint ist.
procedure TForm1.scan(path: string; parent: TTreeNode;Maske:String;DateiendungAnzeigen:Boolean=true);
|
AW: Funktion erweitern
Hier mal die komplette Unit:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; TreeView1: TTreeView; procedure Button1Click(Sender: TObject); procedure scan(path: string; parent: TTreeNode = nil;Maske:String;DateiendungAnzeigen:Boolean=true); //hier kommt der Error //[DCC Fehler] Unit1.pas(15): E2238 Für 'Maske' ist ein Vorgabewert erforderlich private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.scan(path: string; parent: TTreeNode = nil;Maske:String;DateiendungAnzeigen:Boolean=true); //hier kommt auch der Error //[DCC Fehler] Unit1.pas(53): E2238 Für 'Maske' ist ein Vorgabewert erforderlich var SR: TSearchRec; s:string; tmparray: array of string; begin path := IncludeTrailingPathDelimiter(path); 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; procedure TForm1.Button1Click(Sender: TObject); begin scan(Edit1.Text,TreeView1.Items.Item[0],'*.txt',false); end; end. |
AW: Funktion erweitern
Lass die "nil"-Zuweisung davor weg. Sobald ein Default-Parameter definiert ist, müssen alle folgenden auch Default-Werte aufweisen.
|
AW: Funktion erweitern
Oder einfach diesen Parameter nach hinten verlagern.
Bei Verwendung einer Maske wird es schwieriger, denn die Verzeichnisse dürfen ja nicht über die Maskte gesucht werden. Also muß man entweder selber den Dateinamen mit der Maske vergleichen oder man sucht in zwei Schritten.
Delphi-Quellcode:
procedure TForm1.scan(path: string; Maske:String;DateiendungAnzeigen:Boolean=true;parent:TTreeNode=nil);
var SR: TSearchRec; s:string; begin path := IncludeTrailingPathDelimiter(path); if FindFirst(path + '*', faAnyFile, SR) = 0 then try repeat if (SR.Name <> '.') and (SR.Name <> '..') and (SR.Attr and faDirectory <> 0) then scan(path + SR.Name, Maske, DateiendungAnzeigen, TreeView1.Items.AddChild(parent, SR.Name)); until FindNext(SR) <> 0; finally FindClose(SR); end; if FindFirst(path + Maske, faAnyFile, SR) = 0 then try repeat if SR.Attr and faDirectory = 0 then begin s := SR.Name; if not DateiendungAnzeigen then s := ChangeFileExt(s, ''); TreeView1.Items.AddChild(parent, S); end; until FindNext(SR) <> 0; finally FindClose(SR); end; end; |
AW: Funktion erweitern
Hab das nil weggelassen und hat geklappt. Aber leider klappt der Filter immer noch nicht. Bei den Unterordnern klappt die Maske nicht mehr.
|
AW: Funktion erweitern
Maske: siehe meine letzer editierter Beitrag.
|
AW: Funktion erweitern
Hat funktioniert. Hat aber jemand noch ne Idee wie ich den Pfad wieder bekomme???
Hab des so gemacht:
Delphi-Quellcode:
Aber das klappt ja bei den Unterordnern nicht mehr. Jemand ne Idee???
Dateipfad := Hauptpfad + TreeView1.Selected.Text
|
AW: Funktion erweitern
Entweder su speicherst dir den kompletten Pfad in den Node.Data
oder du setzt dir den Pfad zusammen. in etwa so:
Delphi-Quellcode:
Dateipfad := '';
Node := TreeView1.Selected; while Assigned(Node) do begin Dateipfad := Node.Text + '\' + Dateipfad; Node := Node.Parent; end; Dateipfad := IncludeTrailingPathDelimiter(Hauptpfad) + ExcludeTrailingPathDelimiter(Dateipfad); |
AW: Funktion erweitern
hat jemand ne Idee wie ich dort den Hauptnode ignorieren kann???
|
AW: Funktion erweitern
Ungefähr so:
Delphi-Quellcode:
Dateipfad := '';
Node := TreeView1.Selected; while Assigned(Node) do begin if Node.Parent<>nil then begin Dateipfad := Node.Text + '\' + Dateipfad; Node := Node.Parent; end; end; Dateipfad := IncludeTrailingPathDelimiter(Hauptpfad) + ExcludeTrailingPathDelimiter(Dateipfad); |
AW: Funktion erweitern
das funktioniert leider nicht. das programm hängt sich dort auf :(
|
AW: Funktion erweitern
Ahh, Tatsache, mach es ohne das begin end;
Also so:
Delphi-Quellcode:
Dateipfad := '';
Node := TreeView1.Selected; while Assigned(Node) do begin if Node.Parent<>nil then Dateipfad := Node.Text + '\' + Dateipfad; Node := Node.Parent; end; Dateipfad := IncludeTrailingPathDelimiter(Hauptpfad) + ExcludeTrailingPathDelimiter(Dateipfad); |
AW: Funktion erweitern
Jetzt funktioniert alles. Nun kann ich mein Programm erweitern. :stupid:
|
AW: Funktion erweitern
oder die IF-Abfrage direkt in das While integriert:
Delphi-Quellcode:
Dateipfad := '';
Node := TreeView1.Selected; while Assigned(Node) and Assigned(Node.Parent) do begin Dateipfad := Node.Text + '\' + Dateipfad; Node := Node.Parent; end; Dateipfad := IncludeTrailingPathDelimiter(Hauptpfad) + ExcludeTrailingPathDelimiter(Dateipfad); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 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