-2

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

4

2 回答 2

3

正如 Ken White 所说,aTTimer没有“倒计时”。但是,当然可以在您的应用程序中实现“倒计时”。以下是执行此操作的一种方式的示例。

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

  2. 添加一个名为FCount您的表单类的私有整数变量。

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

  2. 运行应用程序。

于 2015-11-26T22:45:17.320 回答
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 的答案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;
于 2015-11-27T13:59:35.997 回答