Delphi: показать TTimer
Можно ли показать обратный отсчет TTimer в метке? Как мгновенно положить переменную в заголовок метки. Я думал о том, как я мог бы сделать, я пытаюсь сделать видимый отсчет в форме.
2 ответа
Как сказал Кен Уайт, 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
обработчик.Запустите приложение.
Давайте возьмем 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
класс, который избегает захватывать 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;