德尔福:展示一个TTimer

时间:2015-11-26 22:21:16

标签: delphi ttimer

是否可以在标签中显示TTimer的倒计时?就像立即将变量放在标题标题中一样。我正在考虑如何做,我试图在表格中进行可见的倒计时。

2 个答案:

答案 0 :(得分:3)

正如Ken White所说,TTimer没有'倒计时'。但是,当然可以在您的应用程序中实现“倒计时”。以下是一种实现此目的的方法示例。

  1. 创建一个新的VCL应用程序。

  2. 将一个名为FCount的私有整型变量添加到表单类中。

  3. 使用以下代码作为表单的OnCreate事件处理程序:

  4. procedure TForm1.FormCreate(Sender: TObject);
    begin
      FCount := 10;
      Randomize;
    end;
    
    1. 使用以下代码作为OnPaint事件处理程序:
    2. procedure TForm1.FormPaint(Sender: TObject);
      var
        R: TRect;
        S: string;
      begin
      
        Canvas.Brush.Color := RGB(Random(127), Random(127), Random(127));
        Canvas.FillRect(ClientRect);
      
        R := ClientRect;
        S := IntToStr(FCount);
        Canvas.Font.Height := ClientHeight div 2;
        Canvas.Font.Name := 'Segoe UI';
        Canvas.Font.Color := clWhite;
        Canvas.TextRect(R, S, [tfCenter, tfSingleLine, tfVerticalCenter]);
      
      end;
      
      1. 在表单中添加TTimer,并使用以下代码作为其OnTimer处理程序:
      2. procedure TForm1.Timer1Timer(Sender: TObject);
        begin
          if FCount = 0 then
          begin
            Timer1.Enabled := false;
            MessageBox(Handle, 'Countdown complete.', 'Countdown', MB_ICONINFORMATION);
            Close;
          end
          else
          begin
            Invalidate;
            dec(FCount);
          end;
        end;
        
        1. 在表单的Invalidate处理程序中调用OnResize方法。

        2. 运行该应用程序。

答案 1 :(得分:1)

让我们抓住FCount变量并保持简单。

当计数达到0时,计时器自动停止。

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCount := 10;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  label1.Caption := IntToStr(FCount);
  Dec(FCount);
  if FCount < 0 then begin
    FCount := 10;
    Timer2.Enabled := False;
  end;
end;

以下内容使用基于TThread类的方法,避免从Andreas Rejbrand's answer

中获取FCount变量
procedure TForm1.Button1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure
      var
        countFrom, countTo: Integer;
        evt: TEvent;
      begin
        countFrom := 10;
        countTo := 0;
        evt := TEvent.Create(nil, False, False, '');
        try
          while countTo <= countFrom do begin
            TThread.Synchronize(procedure
                begin
                  label1.Caption := IntToStr(countFrom);
                end);
            evt.WaitFor(1000);
            Dec(countFrom);
          end;
        finally
          evt.Free;
        end;
      end).Start;
end;