Hallo Michael, ja tobe Dich mal mit der ListBox aus. FindFirst, FindNext und FindClose ist ein sehr sehr langsames Mittel.
Ich bin gespannt wie dein Resultat endet.
Nach wie vor kannst Du Dir ja mal das ShellTreeView Demo von weiter oben anschauen und feststellen das es im Vergleich zum manuellen durchforsten eines Verzeichnisses ein gewaltiges plus an Geschwindigkeit gibt.
Zur Demonstration als Vergleich empfehle ich das Windows/System32 Verzeichnis laden zu lassen.
Hier hab ich ein Quelltext-Schnippsel von
stackoverflow für die ListBox Variante.
Delphi-Quellcode:
var
Form1: TForm1;
FilePath: TStringList;
implementation
{$R *.dfm}
procedure FindFiles(FilesList: TStrings; FilesPath: TStrings;
StartDir, FileMask: string);
var
SR: TSearchRec;
DirList: TStringList;
IsFound: Boolean;
i: integer;
begin
if StartDir[length(StartDir)] <> '\' then
StartDir := StartDir + '\';
IsFound := FindFirst(StartDir + FileMask, faAnyFile - faDirectory, SR) = 0;
while IsFound do
begin
FilesPath.Add(StartDir + SR.Name);
FilesList.Add(SR.Name);
IsFound := FindNext(SR) = 0;
end;
FindClose(SR);
DirList := TStringList.Create;
IsFound := FindFirst(StartDir + '*.*', faAnyFile, SR) = 0;
while IsFound do
begin
if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then
DirList.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
end;
FindClose(SR);
for i := 0 to DirList.Count - 1 do
FindFiles(FilesList, FilePath, DirList[i], FileMask);
DirList.Free;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FilePath.Free;
end;
procedure TForm1.sButton1Click(Sender: TObject);
begin
FilePath := TStringList.Create;
FindFiles(sListBox1.Items, FilePath, EditStartDir.Text, '*.*');
{FilePath is where full file path saved, EditStartDir is where to search}
end;
procedure TForm1.sListBox1Click(Sender: TObject);
begin
If sListBox1.ItemIndex > -1 then
sEdit2.Text := FilePath.Strings[sListBox1.ItemIndex];
end;
end.
Eine weitaus schnellere ListBox Methode wäre es so zu machen
Delphi-Quellcode:
var s: string;
begin
s := 'c:\windows\*.*'#0;
ListBox1.Perform(LB_DIR, DDL_READWRITE, LongInt(@s[1]));
end;
Viel Spass beim experimentieren!