|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Обратный отсчет в таймере
Здравствуйте,помоги пожалуйста переделать таймер.Нужен обратный отсчёт времени,но у меня не получается сделать.
Код:
begin sec := sec + 1; if sec = 60 then begin min := min + 1; sec := 0; end; if sec < 10 then Label2.Caption := '0' + IntToStr(sec) else Label2.Caption := IntToStr(sec); if min < 10 then Label1.Caption := '0'+IntToStr(min) else Label1.Caption := IntToStr(min); end; |
#2
|
||||
|
||||
Код:
uses DateUtils; var MyTime: TTime; procedure TForm1.FormCreate(Sender: TObject); begin MyTime := StrToTime('00:00:30'); end; procedure TForm1.Timer1Timer(Sender: TObject); begin MyTime := IncSecond(MyTime, -1); lblTime.Caption := TimeToStr(MyTime); end; Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. |
#3
|
|||
|
|||
Я не советую использовать таймер в таком режиме. Дело в том, что если интервал настроен, например, на 1000 мс, то события не обязательно будут приходить каждую секунду. Я советую интервал сделать почаще, напр., 100, а время брать из системы: Time() (в формате TDateTime) или timeGetTime() (системное время в миллисекундах). Итак, таймер (Interval=100, Enabled=false) используем только для обновления (Label2 внизу).
Timer.png Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Edit1: TEdit; Label1: TLabel; btnStart: TButton; Label2: TLabel; procedure btnStartClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } msStop, msRemain: Longword; public { Public declarations } end; var Form1: TForm1; implementation uses MMSystem; {$R *.dfm} procedure TForm1.btnStartClick(Sender: TObject); begin msRemain:= StrToInt(Edit1.Text) * 1000; msStop:= timeGetTime + msRemain; Label2.Caption:= IntToStr(msRemain div 1000); Timer1.Enabled:= true; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if timeGetTime > msStop then Timer1.Enabled:= false else begin msRemain:= msStop - timeGetTime; Label2.Caption:= IntToStr(msRemain div 1000); end; end; end. |
#4
|
||||
|
||||
А если в цикле со Sleep(1000)? (В отдельном потоке) По замерам вроде как довольно точно секунду отбивает.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Ну вообще-то таймер и так в отдельном потоке запускается. И я пока не встречал приложений, которые тормозили бы его настолько, что он время неверно отображал.
Кстати автору не нужны миллисекунды. Ему секундомер похоже нужен. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
Таймер не тормозит. У приложения могут быть другие обработчики событий, которые могут тормозить, и события таймера будут приходить не вовремя.
|