Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Noch ein problem mit der Suchfunktion. (https://www.delphipraxis.net/5598-noch-ein-problem-mit-der-suchfunktion.html)

MoDHellwalker 12. Jun 2003 15:07


Noch ein problem mit der Suchfunktion.
 
Ich hab die suchfunktion aus der Code library genommen. funktioniert soweit auch ganz gut. aber wenn ich einen dateinamen eingebe sucht er nicht mehr in unterverzeichnisen. was kann ich da tun???
mfg hellwalker

Stanlay Hanks 12. Jun 2003 15:10

Das is ein Tut aus dem "easy delphi helper"
da steht auch drin, wie man nach unterverzeichnissen sucht:

Suchen

MoDHellwalker 12. Jun 2003 15:32

hmm
ich hab alles so gemacht wie es da steht aber wenn ich den gesuchten dateinamen in eine editfeld eingebe sucht er nich in den unterordnern (außer wenn ich *.* eingebe)

Christian Seehase 12. Jun 2003 15:39

Moin ModHellwalker,

ich hab' das mal eben etwas abgwandelt.
Das Problem ist, dass die Prozedure sofort aussteigt, wenn sie nichts passendes mehr findet.

Das hier ist jetzt zwar auch noch nicht der Weisheit letzter Schluss, da der zu suchende Dateiname exakt (von Gross-/Kleinschreibung mal abgesehen) angegeben werden muss, also keine Wildcards erlaubt sind, aber ansonsten geht's.

Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string; Recurse: Boolean = True);

var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  if Mask = '' then
    Mask := '*.*';
  if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory = faDirectory then
      begin
        if Recurse then
        begin
          if (SR.Name <> '.') and (SR.Name <> '..') then
            FindAllFiles(RootFolder + SR.Name, Mask, Recurse);
        end;
      end else begin
        if AnsiUpperCase(SR.Name) = AnsiUpperCase(Mask) then begin
          Form1.Memo1.Lines.Add(RootFolder + SR.Name);
        end;
      end;
      Application.ProcessMessages;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;

MoDHellwalker 12. Jun 2003 15:54

hmm
auf jeden fall schon mal besser. aber das mit den * und den ? muss ich noch hinbekommen dass es auch funktioniert

MoDHellwalker 12. Jun 2003 16:21

ich habs
mika hat mir geholfen. thx mika :hello:

Christian Seehase 12. Jun 2003 16:27

Moin ModHellwalker,

könntest Du dann auch noch bitte die Lösung präsentieren?
Vermutlich ist die noch für andere interessant.
Danke.

MoDHellwalker 12. Jun 2003 16:38

ups
das vergesse ich immer (egal in welchem forum) *ggg*.
die lösung:
man macht erst ne procedure zum scannen der verzeichnisstruktur und such dann in der gescannten verzeichnisstruktur (zumindest wenn ich das richtig verstanden habe).
Delphi-Quellcode:
procedure Scan(const Path, FileMask: string; FileList: TStrings);
var
  SR: TSearchRec;
begin
  if FindFirst(Path + FileMask, faAnyFile and not (faDirectory or faVolumeID), SR) = 0 then
  try
    repeat
      FileList.Add(ExpandSlash(Path)+SR.Name);
      Application.ProcessMessages;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;

  if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
  try
    repeat
      if (SR.Attr and faDirectory <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then
         Scan(Path + SR.Name + '\', FileMask, FileList);
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;

procedure FindFiles(const Path, FileMask: string; FileList: TStrings);
begin
  if Assigned(FileList) and (Path <> '') then
  try
    FileList.BeginUpdate;
    Scan(ExpandSlash(Path), FileMask, FileList);
  finally
    FileList.EndUpdate;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 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