是否可以在 Label 中显示 TTimer 的倒计时?就像立即将变量放入标签标题中一样。我在想我该怎么做,我试图在表单中做一个可见的倒计时。
问问题
1365 次
2 回答
3
正如 Ken White 所说,aTTimer
没有“倒计时”。但是,当然可以在您的应用程序中实现“倒计时”。以下是执行此操作的一种方式的示例。
创建一个新的 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;
- 将 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;
Invalidate
在表单的OnResize
处理程序中调用该方法。运行应用程序。
于 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 回答