...og så skal du selvfølgelig også huske at behandle messages mens din handling kører, så den knap rent faktisk registrerer klikket. Hvis du ikke har smidt den handling ud i en separat tråd (det bør du nok), så kræver det en Application.ProcessMessages på et passende tidspunkt.
Jeg er ikke sikker på at jeg forstår. Eller stiller spm. korrekt.
Jeg her en proc der gennemsøger drev/mapper/undermapper efter filer. Hvis jeg søger på C: tager søgningen nogle minutter. men hvis jeg kommer i tanke om at jeg vil ændre søgekrit skal søgningen først stoppes.???
destructor TSerachThread.Destroy; begin inherited Destroy; end;
procedure TSerachThread.Execute; begin if not Assigned(FOnFileFound) then Exception.Create(Self.ClassName + ': No callback procedure defined !!!');
if WantAllDirs then Recurse (FPath) else Recurse (FPath, 0, FPath, 0); end;
procedure TSerachThread.Recurse(const aPath: String; FilesInDir: Integer; Tmp: String; Attr: Integer); var FSearchRec : TSearchRec; Res : integer; begin Res := FindFirst (aPath + FFileMask, faAnyFile, FSearchRec);
while (Res = 0) and (not Terminated) do begin if (FSearchRec.Name[1] <> '.') and (FSearchRec.Attr and FAttr > 0 ) then begin if FSearchRec.Attr and (faAnyFile-faDirectory) <> 0 then begin inc(FilesInDir); if (FilesInDir = 0) then FOnFileFound (Tmp, FSearchRec); end;
procedure TSerachThread.Recurse(const aPath: String); var FSearchRec : TSearchRec; Res : integer; begin Res := FindFirst (aPath +FFileMask, faAnyFile, FSearchRec);
while (Res = 0) and (not Terminated) do begin if (FSearchRec.Name[1] <> '.') and (FSearchRec.Attr and FAttr > 0 ) then begin if FSearchRec.Attr and (faAnyFile-faDirectory) <> 0 then FOnFileFound (aPath + FSearchRec.Name, FSearchRec); end;
Res := FindNext (FSearchRec); end;//while
FindClose (FSearchRec);
if (FRecurse) and (not Terminated ) then begin Res := FindFirst (aPath + FDirMask, faAnyFile, FSearchRec);
while (Res = 0) and (not Terminated ) do begin if (FSearchRec.Name[1] <> '.') and (FSearchRec.Attr and faDirectory <> 0) then begin if FSearchRec.Attr and FAttr <> 0 then FOnFileFound (aPath + FSearchRec.Name, FSearchRec);
Recurse (aPath + FSearchRec.Name+'\'); end;//if
Res := FindNext (FSearchRec); end;//while FindClose (FSearchRec); end;//if end;
procedure TSerachThread.SetPath(const Value: String); begin FPath := IncludeTrailingBackslash(Value); end;
procedure TSerachThread.Start; begin Resume; end;
procedure TSerachThread.Stop; begin Terminate; end;
borrisholt: Jeg har haft store problemer med at få resume til at virke. Bruger jeg Suspended := false virker det fint. Har du testet ovenstående?
Desuden burde IncludeTrailingBackslash erstattes med IncludeTrailingPathDelimiter og indføjes i kaldet til Recurse - sådan bare for konsekvensens skyld. Ellers ligner det noget jeg kunne have lavet :-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.