Delphi: показать TTimer

Можно ли показать обратный отсчет TTimer в метке? Как мгновенно положить переменную в заголовок метки. Я думал о том, как я мог бы сделать, я пытаюсь сделать видимый отсчет в форме.

2 ответа

Решение

Как сказал Кен Уайт, TTimer не имеет "обратного отсчета". Тем не менее, конечно, можно реализовать "обратный отсчет" в вашем приложении. Ниже приведен пример одного из способов сделать это.

  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. Добавить 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. Запустите приложение.

Давайте возьмем 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;
Другие вопросы по тегам