まず思い付くのは、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.