Abarbeitung einer Schleife durch den Anwender abbrechen
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?
Application.ProcessMessages;
…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.