Я не советую использовать таймер в таком режиме. Дело в том, что если интервал настроен, например, на 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.