Jak zamknąć program...

0

Cześć...

Jak zamknąć program poprzez naciśnięcie klawisza?
Niby prosta sprawa. Ale...

W programie mam taką prockę(która jest wykonywana od początku działania programu, aż do pewnego momentu. Po skończeniu wszystko działa, ale w trakcie działania nie) na której jest coś takiego:

//instrukcje
//odwołanie do procedury: proc

//instrukcje inne
//odwołanie do procedury: proc

i.t.d.
Teraz w procedurze proc występuje pętla:

repeat until

I gdy w onKeyPress wpisuje powiedzmy:

form1.free - wtedy program się zamyka, ale z błędem... Access Violation
application.terminate - NIC SIĘ NIE DZIEJE, program dalej działa(!)
form1.release - zamyka się również z błędem

Form1.close - i tu też NIC SIĘ NIE DZIEJE.

gdy próbowałem z action:=caFree też się nic nie działo albo był błąd(już nie pamiętam)

Jak mam zamknąć ten program poprzez naciśnięcie klawisza?

(próbowałem też coś takiego:

w onKeyPress

keyPressed:=true

i w procedurze proc:

repeat
if keyPressed=true then...

...
until

Ale bez rezultatów

0

Gdzie jest wywoływana ta procka? W OnCreate? czy gdzie?

0

Gdzie jest wywoływana ta procka? W OnCreate? czy gdzie?

ta (nazwijmy ją główna):
//instruckje
//odwołanie do procedury: proc

to jest zrobione tak, że w onCreate mam
timer1.enabled:=true

w tej procedurze "głównej" od razy jest timer1.enabled:=false;

0

A próbowałeś application.terminate??

0

a ja powiem inaczej... w wypadku WM_KEYDOWN dac PostQuitMessage(0); i juz

0

Wrzuć procedurę z pętlą do osobnego wątku. Oto przykład, w którym w OnCreate formy uruchamiana jest pętla wyświetlająca liczby na formie. Aplikację można zamknąć (naciskając dowolny klawisz) przed skończeniem pętli ponieważ pętla jest w osobnym wątku.

type
TLicznik = class (TThread) //klasa wątku
protected
procedure Execute; override;
end;

type
TForm1 = class(TForm) //klasa formy
Label1: TLabel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
private
Licznik:TLicznik; //deklaracja zmiennej o typie wątku (jako pole klasy formy)
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TLicznik.Execute; //procedura wątku
var
i: integer;
begin
FreeOnTerminate := True; //wymusza zwolnienie obiektu wątku po zakończeniu
for i:=0 to 100000 do
begin
Form1.Label1.Caption:=IntToStr(i);
Application.ProcessMessages; //żeby wymalowało po każdej zmianie labela
end;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Form1.Close; //zamknięcie aplikacj po dowolnym klawiszu
{jeśli na formie są jakieś komponenty mogące przyjmować focus, to nie zapomnij ustawić KeyPreview formy na True}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Licznik:=TLicznik.Create(False); //utworzenie wątku z uruchomieniem od razu (True utworzyłoby wątek zawieszony)
end;

0

Ojej... Ale ja na razie za bardzo nie znam się na programowaniu klas. Muszę o tym trochę poczytać

[dopisane]
PostQuitMessage nie działa... Nic się nie dzieje... Czyli ta klasa, którą proponuje pq, chyba jest jedynym wyjściem

0

Moze by zrobic cos takiego

Begin
case Key of
#13 : Application.terminate; {tu daj klawisz ktory bedzie zamykal np Enter czyli #13 w ASCII}
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0