soerensen3 hat geschrieben:Dabei sollte man aber berücksichtigen, dass man auch nicht die Suche abbrechen kann oder das Programm auf normalen Weg beenden kann (zumindest nicht flüssig).
Das habe ich gerade mal probiert, an einem alten Projekt, das mithilfe von ImageMagick alle jpgs im Verzeichnis analysiert und ab einer bestimmten Grenzgröße verkleinert. Die Form enthält u.a. einen Run-Button und einen Close-Button. Die Bearbeitungsschleife ist innerhalb der OnClick-Prozedur des Run-Buttons.
Dazu habe ich der Form eine Boolsche Variable namens "Running" spendiert, diese bei OnCreate auf false initialisiert und folgenden Code in die RunBtnClick-Prozedur eingefügt:
Code: Alles auswählen
procedure TForm1.RunBtnClick(Sender: TObject);
var
cnt : integer;
{...}
begin
Running := not Running;
if Running then RunBtn.Caption := '&Stop'
else begin
RunBtn.Caption := '&Ok';
exit;
end;
Application.ProcessMessages;
{...}
Cnt := -1;
try
for i := 0 to FileList.Count - 1 do
begin
if not Running then break;
inc(cnt);
if cnt = 100 then
begin
Application.ProcessMessages;
cnt := 0;
end;
{...}
finally
{...}
Running := false;
RunBtn.Caption := '&Ok';
end;
(Haltet Euch bitte nicht mit Detailkritik auf, das geht bestimmt eleganter, ich hab das wirklich nur ganz auf die Schnelle hingerotzt...)
Das funktioniert völlig problemlos, die Ausführung stoppt nach einem Stop-Click zuverlässig, sobald infolge der cnt=100-Bedingung ein ProcessMessages aufgerufen wird. Was interessanterweise während der Abarbeitung der Schleife nicht funktioniert, ist der Close-BitBtn (der einfach via Kind auf bkClose gestellt ist). Ich vermute, der fragt noch irgendein CanClose-Flag ab, das habe ich jetzt nicht weiter untersucht.
Gruß Rüdiger
Edit: Aufräumaktion im Finally-Block hinzugefügt, so kann's verwendet werden ("Running: Boolean;" muß dann noch in die Formdeklaration eingesetzt werden).