简体   繁体   中英

Delphi : Show a TTimer

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.

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.

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM