AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Filter aus mehreren Endungen an Funktion übergeben!?
Thema durchsuchen
Ansicht
Themen-Optionen

Filter aus mehreren Endungen an Funktion übergeben!?

Ein Thema von torud · begonnen am 10. Jul 2003 · letzter Beitrag vom 11. Jul 2003
Antwort Antwort
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#1

Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 10. Jul 2003, 22:36
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.
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
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von RomanK
RomanK

Registriert seit: 7. Jun 2002
Ort: Kirchheim unter Teck
1.036 Beiträge
 
Delphi 7 Personal
 
#2

Re: Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 10. Jul 2003, 22:48
Hoi,
übergib der Procedure doch einach ein Dynamisches Array mit den verschieden Filtern und dann wird jeder Filter durchgegangen
Roman Keller
Krieg ist Gottes Art den Amerikanern Geographie beizubringen!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 10. Jul 2003, 22:59
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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 11. Jul 2003, 08:21
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
Danke
Tom
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 11. Jul 2003, 15:26
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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 11. Jul 2003, 21:01
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
Danke
Tom
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 11. Jul 2003, 22:53
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#8

Re: Filter aus mehreren Endungen an Funktion übergeben!?

  Alt 11. Jul 2003, 23:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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