Mit folgender Funktion kann man lange laufende Schleifen oder Abläufe per Tastendruck unterbrechen.
Wenn man die
ESC-Taste oder die
Pause-Taste drückt, dann wird dem Benutzer eine Frage gestellt,
die er mit Ja oder Nein beantworten kann.
Bei Ja wird abgebrochen, bei Nein läuft das Programm weiter.
Delphi-Quellcode:
function EscPressed(
const Msg:
string):Boolean;
begin
// Aus der WinAPI-Doku zu GetAsyncKeyState:
// if the function succeeds, the return value specifies whether the key was pressed
// since the last call to GetAsyncKeyState, and whether the key is currently up or down.
// If the most significant bit is set, the key is down, and if the least significant bit is set,
// the key was pressed after the previous call to GetAsyncKeyState.
// The return value is zero if a window in another thread or process currently has the keyboard focus
Result := ((GetAsyncKeyState(VK_ESCAPE)
and $8001) <> 0)
or
((GetAsyncKeyState(VK_PAUSE)
and $8001) <> 0);
if Result
then
begin
Result := (Dialogs.MessageDlg(Msg, mtConfirmation, [mbYes,mbNo], 0) = mrYes);
end;
end;
// muss vor dem Benutzen von EscPressed() aufgerufen werden
procedure ResetEscPressed;
begin
GetAsyncKeyState(VK_ESCAPE);
GetAsyncKeyState(VK_PAUSE);
end;
Beispiel 1 zur Anwendung:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
begin
ResetEscPressed;
for i := 0 to 10000000 do
begin
Caption := inttostr(i);
if EscPressed('Schleife abbrechen ?') then Break;
end;
end;
Beispiel 2:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
ResetEscPressed;
BerechneSteuerVorteil1;
if EscPressed('
Berechnung der Nachsteuer abbrechen ?')
then Abort;
// stille Exception auslösen, damit man auch aus tief geschachtelten Funktionen rauskommt
BerechneNachsteuer;
if EscPressed('
Berechnung Zinsausfall abbrechen ?')
then Abort;
BerechneZinsausfall;