TTimerでストップウォッチを作る

Delphiで時間計測をしたい。
まず思い付くのは、TTimerを使うことです。

DelphiのTTimerは、
指定時間をカウントするコンポーネントです。

このコンポーネントは、単なるタイマーですから、
指定した時間にメソッドを呼び出す、
ただそれだけです。

これを時間計測に使う場合には、
何回メソッドが呼び出されたか、
という着眼点を持ちます。

下記のサンプルでは、以下の処理を行なっています。
  • is_ruuning : 計測しているかどうかのフラグです。
  • FormCreate: タイマーの時間間隔を設定しています。ミリ秒です。
  • Timer1Timer: 時間間隔ごとに呼び出されるメソッドの本体です。         秒を分に、分を時間に繰り上げしています。
  • panel_update: パネルに時間を描画しています。
  • timer_init: 計測時間を初期化しています。
  • Button1Click 計測をスタートします
  • Button2Click 計測をポーズします
  • Button3Click 計測をストップします

unit TimerAppForm ;

interface

  uses
    Winapi.Windows ,
    Winapi.Messages ,
    System.SysUtils ,
    System.Variants ,
    System.Classes ,
    Vcl.Graphics ,
    Vcl.Controls ,
    Vcl.Forms ,
    Vcl.Dialogs ,
    Vcl.ExtCtrls ,
    Vcl.StdCtrls ;

  type
    TForm1 = class( TForm )
      Button1 : TButton ;
      Button2 : TButton ;
      Button3 : TButton ;
      Panel1 : TPanel ;
      Timer1 : TTimer ;
      procedure FormCreate( Sender : TObject ) ;
      procedure Timer1Timer( Sender : TObject ) ;
      procedure Button1Click( Sender : TObject ) ;
      procedure Button2Click( Sender : TObject ) ;
      procedure Button3Click( Sender : TObject ) ;

      private
        is_ruuning : Boolean ;
        hour :       Integer ;
        min :        Byte ;
        sec :        Byte ;

        procedure timer_init ;
        procedure panel_update ;
      public

    end ;

  var
    Form1 : TForm1 ;

implementation

{$R *.dfm}

  procedure TForm1.FormCreate( Sender : TObject ) ;
  // ================================================
  //
  // ================================================
  begin
    Timer1.Interval := 1000 ;
    timer_init ;
  end ;

  procedure TForm1.Timer1Timer( Sender : TObject ) ;
  // ================================================  
  //
  // ================================================  
  begin
    if not is_ruuning then
      Exit ;

    sec := sec + 1 ;

    min := min + Trunc( sec div 60 ) ;
    sec := Trunc( sec mod 60 ) ;

    hour := hour + Trunc( min div 60 ) ;
    min  := Trunc( min mod 60 ) ;

    panel_update ;
  end ;

  procedure TForm1.panel_update ;
  // ================================================  
  //
  // ================================================  
   begin
    Panel1.Caption := Format( '%.2d:%.2d:%.2d' ,[ hour , min , sec ]) ;
    Panel1.Update ;

  end ;

  procedure TForm1.timer_init ;
  // ================================================  
  //
  // ================================================  
   begin
    is_ruuning := False ;

    hour := 0 ;
    min  := 0 ;
    sec  := 0 ;

    panel_update ;
  end ;
  
  procedure TForm1.Button1Click( Sender : TObject ) ;
  // ================================================  
  //
  // ================================================ 
   begin
    is_ruuning := True ;
  end ;

  procedure TForm1.Button2Click( Sender : TObject ) ;
  // ================================================  
  //
  // ================================================  
   begin
    is_ruuning := False ;
  end ;
  
  procedure TForm1.Button3Click( Sender : TObject ) ;
  // ================================================  
  //
  // ================================================  
   begin
    timer_init ;
  end ;

end.