Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Object-Pascal / Delphi-Language (https://www.delphipraxis.net/35-library-object-pascal-delphi-language/)
-   -   Delphi Schleife per Tastendruck unterbrechen (https://www.delphipraxis.net/98300-schleife-per-tastendruck-unterbrechen.html)

shmia 24. Aug 2007 15:20


Schleife per Tastendruck unterbrechen
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz