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ż:
[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 ??