Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Filter aus mehreren Endungen an Funktion übergeben!? (https://www.delphipraxis.net/6443-filter-aus-mehreren-endungen-funktion-uebergeben.html)

torud 10. Jul 2003 21:36


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:
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;
Mit folgendem Aufruf übergebe ich die Paramter.
Delphi-Quellcode:
GetFilesInDirectory(ed_path.Text,'*.*htm*',CheckListBox1.Items,True);
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 ?

Vielen Dank für Eure Hilfe
Tom

RomanK 10. Jul 2003 21:48

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

Christian Seehase 10. Jul 2003 21:59

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:
  1. Eine Schleife, in der die einzelnen Masken bei FindFirst einsetzt
  2. Eine Schleife, bei der in FindFirst mit *.* gesucht wird, und immer wenn eine Datei gefunden wurde, wird geprüft, ob die Datei der Maske entspricht.

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]

torud 11. Jul 2003 07:21

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

Christian Seehase 11. Jul 2003 14:26

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:
  1. TStringList (TStrings)
  2. array of const (siehe z.B. die Funktion Format)

torud 11. Jul 2003 20:01

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

Christian Seehase 11. Jul 2003 21:53

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.

Gast 11. Jul 2003 22:14

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 06:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz