Home » Tipps & Tricks » System » Tastatur und Maus » Abarbeitung einer Schleife durch den Anwender abbrechen

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.