Jak przerwać działanie pętli naciśnięciem klawisza

Adam Boduch

W wielu aplikacjach (np. programach graficznych) znajdują się opcje wykorzystujące w znacznym stopniu, moc obliczeniową procesora, wykonując jakieś skomplikowane obliczenia. Wówczas należałoby dać możliwość przerwania takiego procesu - np. poprzez naciśnięcie klawisza Esc.

Aby najłatwiej to zrealizować, w każdej iteracji pętli należy sprawdzać czy nie został spełniony dany warunek, który będzie oznaczać przerwanie pętli. W tym celu, możemy wygenerować zdarzenia OnKeyDown, w którym, po naciśnięciu klawisza Esc - zmieniamy wartość zmiennej globalnej Aborted na True.

var
  Form1: TForm1;
  Aborted : Boolean;   // <-- nowa zmienna

implementation

{$R *.DFM}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
// jezeli nacisniemy ESC
  if Key = 27 then Aborted := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
begin
  Aborted := False;
  for i := 0 to 100000 do
  begin
    Application.ProcessMessages; // <-- konieczna linia
    Sleep(50);
    if Aborted then Break;
  end;
end;

end.

W pętli, w każdej jej iteracji należy sprawdzić wartość zmiennej Aborted - jeżeli posiada wartość True - przerywamy działanie pętli.

Właściwość KeyPreview, formularza należy zmienić na True.

Zobacz też:

5 komentarzy

[Error] Unit1.pas(24): Undeclared identifier: 'FormKeyDown'
[Error] Unit1.pas(24): ';' expected but '(' found
[Error] Unit1.pas(26): '(' expected but ';' found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Tak, a konkretnie dlatego, ze w typem parametru jest Word a nie Char :)

Tomuslaw: hasha (#) przez numerem odpowiadającym danemu znakowi (ASCII) dajesz w OnKeyPress - zdarzenie OnKeyDown odróżnia to, że # nie ma :)

o wlasnie! teraz mam juz program skonczony :)

a nie powinno być #27, a nie 27 ??