是否可以在标签中显示TTimer的倒计时?就像立即将变量放在标题标题中一样。我正在考虑如何做,我试图在表格中进行可见的倒计时。
答案 0 :(得分:3)
正如Ken White所说,TTimer
没有'倒计时'。但是,当然可以在您的应用程序中实现“倒计时”。以下是一种实现此目的的方法示例。
创建一个新的VCL应用程序。
将一个名为FCount
的私有整型变量添加到表单类中。
使用以下代码作为表单的OnCreate
事件处理程序:
procedure TForm1.FormCreate(Sender: TObject);
begin
FCount := 10;
Randomize;
end;
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;
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;
在表单的Invalidate
处理程序中调用OnResize
方法。
运行该应用程序。
答案 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;