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:
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.
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"
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 :)
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;
???