![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)? (В отдельном потоке) По замерам вроде как довольно точно секунду отбивает.
|
|
#5
|
||||
|
||||
|
Ну вообще-то таймер и так в отдельном потоке запускается. И я пока не встречал приложений, которые тормозили бы его настолько, что он время неверно отображал.
Кстати автору не нужны миллисекунды. Ему секундомер похоже нужен. |
|
#6
|
|||
|
|||
|
Таймер не тормозит. У приложения могут быть другие обработчики событий, которые могут тормозить, и события таймера будут приходить не вовремя.
|