Programowanie w języku Delphi » FAQ

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

  • 2006-02-20 11:39
  • 5 komentarzy
  • 1279 odsłon
  • Oceń ten tekst jako pierwszy
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

bartharnas 2008-03-28 19:57

[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'

Adam Boduch 2006-02-20 11:46

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

Coldpeer 2006-02-20 11:43

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

explosive 2004-09-22 22:48

o wlasnie! teraz mam juz program skonczony :)

Tomuslaw 2004-07-26 17:48

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