Delphi : 显示一个 TTimer

Delphi : Show a TTimer

是否可以在 Label 中显示 TTimer 的倒计时?就像立即将变量放入标签标题中一样。我在想我该怎么做,我正在尝试在表格中做一个可见的倒计时。

正如 Ken White 所说,TTimer 没有 'countdown'。但是,当然可以在您的应用程序中实现 'countdown'。以下是执行此操作的一种方法的示例。

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

  2. 将名为 FCount 的私有整数变量添加到您的表单 class。

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCount := 10;
  Randomize;
end;
  1. 使用以下代码作为您的 OnPaint 事件处理程序:

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 处理程序:

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. 在表单的 OnResize 处理程序中调用 Invalidate 方法。

  2. 运行 应用程序。

让我们获取 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 class 的方法避免从

中获取 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;