![]() |
Filter aus mehreren Endungen an Funktion übergeben!?
Hallo Wissende,
ich nutze folgende kleine Procedure, um alle möglichen Dateien in einer Checklistbox auflisten zu lassen. Bisher bin ich aber leider auf einen Dateityp begrenzt.
Delphi-Quellcode:
Mit folgendem Aufruf übergebe ich die Paramter.
procedure TMainForm.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean);
var SR: TSearchRec; begin if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then ADirectory:=ADirectory+'\'; if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0) then begin repeat if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then AList.Add(ADirectory+SR.Name) until FindNext(SR)<>0; FindClose(SR); end; if ARekursiv then if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then begin repeat if (SR.Name<>'.') and (SR.Name<>'..') then GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True); until FindNext(SR)<>0; FindClose(SR); end; end;
Delphi-Quellcode:
In diesem Beispiel werden nur htm, html, shtml und dhtml-Dateien in der Checklistbox aufgelistet. Wie kann ich der Procedure aber mitteilen, dass ich zum Beispiel gern alle pas, htm und asp-Dateien aufgelistet haben möchte ?
GetFilesInDirectory(ed_path.Text,'*.*htm*',CheckListBox1.Items,True);
Vielen Dank für Eure Hilfe Tom |
Re: Filter aus mehreren Endungen an Funktion übergeben!?
Hoi,
übergib der Procedure doch einach ein Dynamisches Array mit den verschieden Filtern und dann wird jeder Filter durchgegangen |
Re: Filter aus mehreren Endungen an Funktion übergeben!?
Moin Tom,
oder, als Ergänzung zu Roman, überleg Dir ein Trennzeichen für die einzelnen Masken (z.B. Pipe | ), so dass Du sie leicht wieder auseinandernehmen kannst. Dann hättest Du zwei Möglichkeiten:
Ersteres dürfte leichter zu machen sein, da Du Dir hierbei keine Gedanken über die Auswertung der Wildcards machen musst. Allerdings hat die erste Variante auch einen entscheidenden Nachteil: Einen rekursive Suche wird erschwert, da ja die meisten Directories, kaum der Maske entsprechen dürften. [EDIT] Ausserdem hab' ich den Thread mal verschoben. Mit Datenbanken hat das irgendwie nicht wirklich was zu tun ;-) [/EDIT] |
Re: Filter aus mehreren Endungen an Funktion übergeben!?
Hallo Ihr 2,
also erstmal Danke für Eure Mühe. @Roman Ich werde also mal mit Arrays etwas versuchen. Aber leider weiss ich nicht wirklich, wie ich das anstellen soll. Ich weiss schon, was ein Array ist, aber leider nicht, wie ich ihn dynamisch gestalte. Und dann ist mir in dem Falle noch unklar, ob die procedure dann automatisch den Array durchkaut, bis alle Filter durchgegangen wurden sind, oder ob ich da noch was in der procecdure machen muss!? @Chris Ich habe keine Ahnung was Wildcards sind. Ich weiss nur, dass es manchmal schon etwas länger dauert, wenn ich nur diesen Filter vorgebe *.*htm* und dann rekursiv direkt von C:\ aus suchen lasse. Nun frage ich mich, wie lange es dann dauern soll, wenn ich mehrere Filter übergebe? Irgendwie muss da doch was elegenteres und schnelleres drin sein. Oder ? Habt Ihr Tipps oder Erfahrungen? Danke nochmals Tom |
Re: Filter aus mehreren Endungen an Funktion übergeben!?
Moin Tom,
Wildcards sind * und ?. Zu dynamischen Arrays solltest Du hier, und in der OH einiges finden. Ob Du jetzt ein Array nimmst, wie Roman es vorgeschlagen hat, oder einen String, spielt keine Rolle. Du musst selber dafür Sorge tragen, dass die Masken der Reihe nach verarbeitet werden. Die beiden Möglichkeiten hatte ich ja schon beschrieben. Mir fallen übrigens noch zwei Möglichkeiten ein, die Masken zu übergeben:
|
Re: Filter aus mehreren Endungen an Funktion übergeben!?
Hailo,
also ich habe mich nun für die version mit dem Array entschieden. Allerdings habe ich den nicht dynamisch gemacht, weil ich in diesem Forum irgendwann mal gelesen habe, dass das nicht so gut wäre. Ich dimensioniere ihn einfach gross genug und fertig. Ich muss halt hoffen, dass der/die User es nicht übertreiben mit dem Einbinden von Dateifiltern. Danke Tom |
Re: Filter aus mehreren Endungen an Funktion übergeben!?
Moin Tom,
dynamische Arrays können auf die Performance drücken, wenn Du bei jedem Element, das dazukommt die Grösse mit SetLength änderst. Wird die Grösse von Anfang an grosszügig ausgelegt, und nur im Notfall erweitert, ergibt sich das Problem allerdings nicht. Man muss dann nur irgendwo die Anzahl der belegten Elemente, oder den letzten belegten Eintrag (Anzahl-1) mitführen, da high(array) ja nicht das letzte benutzte Element indiziert. |
Re: Filter aus mehreren Endungen an Funktion übergeben!?
Wie es die API macht. Eine kurze Geschichte in drei Saetzen von P. Latform S.D.K.:
'Maske1'#0'Maske2'#0 [...] 'letztemaske'#0#0 Mit while kannste dann durch den String (als PChar) gehen ... PChars enden bekanntlich mit #0, deshalb weisst du, dass wenn ein PChar mit #0 beginnt die Masken zuende sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 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