Jak po upływie 30 sek. zamknąć program
Potrzebne komponenty
TTimer: Zakładka: System, nazwa: Timer1TLabel: 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
@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.
<quote>
Dec(I); // komenda Dec jest równoznaczna I:= I - 1;
</quote>
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 :)
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