Programowanie w języku Delphi » FAQ

Jak po upływie 30 sek. zamknąć program

Potrzebne komponenty


TTimer: Zakładka: System, nazwa: Timer1
TLabel: Zakładka: Standard, nazwa Label1

Deklarujemy zmienną globalną:
var
  Form1: TForm1; //Ta zmienna już jest...
  I : Integer = 30; //Zapamiętaj: Nie można dodać takiego zapisu do funkcji, ponieważ dostaniesz komunikat "Cannot initialize local variables" co oznacza "Nie można zainicjować zmiennych lokalnych".

I = czas który pozostał do końca

Ustawiamy Interval naszego Timer1 na 1000 (30 000 milisekund / 1000 = 30 sekund; 1 sekunda = 1000 milisekund).

Kod programu


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := 'Do zakończenia programu pozostało: ' + IntToStr(I); // wyświetlamy postęp
  Dec(I); //Komenda Dec jest szybsza od "i := i - 1"
  if I <= 0 then Application.Terminate; // zamykamy program gdy zmienna "I" będzie równa lub mniejsza od 0 
end;



Poprawiony kod programu


const
  TimeLimit = 30;
 
var
  ProgramStarts: Cardinal;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  ProgramStarts := GetTickCount;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var ProgramWorking: Cardinal;
begin
  ProgramWorking := GetTickCount - ProgramStarts;
  if ProgramWorking >= TimeLimit * 1000 then Application.Terminate 
    else timeleftLbl.Caption := 'Pozostało ' + IntToStr(ProgramWorking div 1000) + ' sekund';
end;



Zobacz także:

10 komentarzy

Lardux 2009-11-05 12:29

No to jeszcze ja dodam swoje 3 grosze, w chwili gdy zacznie się odliczanie i zostanie np 25 sekund, złap za okno programu (belkę) w celu przesunięcia okna z jednego miejsca na pulpicie, na inne, przesuń to okno, ale nie puszczaj lewego przycisku myszy, trzymaj je minute, program będzie działał jeszcze 25 sekund od puszczenia lewego przycisku myszy, co jest oczywiście błędem... popracuj nad tym ;p

Patryk27 2009-10-28 19:48

@Piga
Lepiej poczytaj o Dec...
Dec jest szybsze od "standardowego" zapisu; i := i - 1;
Wywołaj sobie 10 000 000 razy Dec oraz tyle samo razy i := i - 1;
Zobaczysz różnicę :-)

Piga 2009-03-30 01:08

vecco --> że co ???? dec jest szybsze ? hahahah xD ... Dec(i) a i:=i-1 to jest zupełnie to samo bo to ta sama funkcja tylko inaczej zapisana.

like_prog --> a jak myślisz dlaczego kolega, który stworzył ten artykuł wstawił taką linijke kodu:
Label1.Caption := 'Do zakończenia programu pozostało: ' + IntToStr(I); ??????? no chyba bo to żeby było widać odliczanie czasu do zakończenia programu więc twój komentarz był niby dobry ale w tym przykładzie akurat zbędny.

vecco 2009-03-15 10:12

<quote>
Dec(I); // komenda Dec jest równoznaczna I:= I - 1;
</quote>
wydaje mi się, że to nie to samo... dec jest szybsze.

like_prog 2009-01-27 10:15

zal
Poprostu ustawiamy interwał czasowy na 30 s ( 30000 ) i w zdarzeniu timera ustawiamy close;

Mnich TT 2008-09-12 15:21

"sochalewski, TTimer wykonuje się już podczas pierwszych chwil programu, więc program od razy się zamknie"

"ja uzylbym prostszego sposobu:
ustawil interval na 30000 i w OnTimer wpisal Close xD"

kompromis ?

w timerze
var
 x:boolean;
begin
 if x then close;
 x:=true;
end;

program zamknie się po 30 sekundach ale nie będzie wiadomo kiedy dane 30 sekund minie, tak samo da sie ze sleepami zrobić robiąc pętle z sleepami po 1000 ms i application.processmessages przed sleepami żeby zapobiegało "zamarzaniu" programu :)

Autre 2008-09-07 18:41

sochalewski, TTimer wykonuje się już podczas pierwszych chwil programu, więc program od razy się zamknie

sochalewski 2007-02-20 14:38

ja uzylbym prostszego sposobu:
ustawil interval na 30000 i w OnTimer wpisal Close xD

kult 2003-05-21 21:40

Johny pewnie że nie lepiej, spróbuj w czasie wykonywania tego polecenia nacisnąć np. jakiś przycisk ;) no i nie dowiesz się ile zostało czasu do zakończenia aplikacji :)

Johny 2003-03-09 14:40

A nie lepiej :
sleep(30000);
close;
???