Abarbeitung einer Schleife durch den Anwender abbrechen |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
Wie kann ich innerhalb einer Schleife mit jedem Durchlauf beispielsweise ein OnClick Ereignis abfragen? Ich will die Berechnung die in dieser Schleife durchgeführt wird auf Knopfdruck abbrechen, falls die Berechnung zu lange dauert. Nur wird die Queue in der die Ereignisse zwischengelagert werden erst am Ende der Berechnung abgefragt. Gibt es eine Funktion, dass das Programm den Knopfdruck trotzdem während der Berechnung mitbekommt?
...in der Schleife sorgt dafür, dass auch während des Schleifendurchlaufes die Nachrichten an die Applikation verarbeitet werden. Du setzt also mit Deinen Abbruch-Button ein Flag und überprüfst dies dann in der Schleife:
var
blAbbruch : Boolean;
procedure TMainForm.Button1Click(Sender: TObject);
begin
blAbbruch := True;
end;
procedure Schleife;
begin
blAbbruch := False;
while ... and (not blAbbruch) do begin
Application.ProcessMessages;
...
end;
end;
Wenn die Schleife nicht besonders lange dauert, dann ist es zu empfehlen, Application.ProcessMessages nur bei jedem n-ten Durchlauf aufzurufen. Das erhöht die Geschwindigkeit und die Ereignisse können dennoch abgefragt werden.Es gibt auch noch folgende Alternative:
procedure Schleife;
begin
blAbbruch := False;
while ... do begin
if (GetAsyncKeystate(VK_ESCAPE)) <> 0 then
if MessageDlg('Wirklich abbrechen?', mtConfirmation,
[mbYes,mbNo], 0) = mrYes then
BREAK;
end;
...
end;
end;
Achten Sie darauf, dass der Anwender die Prozedur mit der Schleife während ihrer Abarbeitung kein weiteres Mal aufruft, z.B. durch deaktivieren des entsprechenden Buttons.