Delphi : Show a TTimer

1.8k views Asked by At

Is it possible to show the countdown of a TTimer in a Label ? Like instantly putting the variable in the Label Caption. I was thinking about how I could do, I'm trying to do a visible countdown in the Form.

2

There are 2 answers

0
Andreas Rejbrand On BEST ANSWER

As Ken White said, a TTimer doesn't have a 'countdown'. However, of course it is possible to implement a 'countdown' in your application. The following is an example of one way of doing this.

  1. Create a new VCL application.

  2. Add a private integer variable named FCount to your form class.

  3. Use the following code as your form's OnCreate event handler:

 

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCount := 10;
  Randomize;
end;
  1. Use the following code as your OnPaint event handler:

 

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. Add a TTimer to your form, and use the following code as its OnTimer handler:

 

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. Call the Invalidate method in the form's OnResize handler.

  2. Run the application.

2
fantaghirocco On

Let's grab the FCount variable and keep the things simple.

Here the timer stops itself when the count reaches 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;

The following uses an approach based on the TThread class which avoids to grab the FCount variable from the Andreas Rejbrand's answer

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;