Delphi FAQ

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

Adam Boduch

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:

FAQ

10 komentarzy

"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 :)

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

@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ę :-)

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.

Dec(I); // komenda Dec jest równoznaczna I:= I - 1;

wydaje mi się, że to nie to samo... dec jest szybsze.

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

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

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 :)

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