Показать сообщение отдельно
  #3  
Старый 05.06.2013, 12:19
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

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