|
Delphi2010 タイマー(Timer) 2010/10/26 |
前回は[Win32]内の「XPManifest」(XPマニフェスト)について見ました。[Win32]内の「ShellResources」(シェルリソース)については、アニメーション(Animate)のページで記載しましたので[Win32]内のコンポーネントの説明は前回で終了、今回からは、[System]内のコンポーネントについてみていきます。それでは[System]内の最初にある「Timer」(タイマー)について見てみます。タイマーは Delphi6 にもあります。
「テスト19」として新規作成しておきます(フォルダ「019」)。
タイマーは、タイマー割り込みを行うプログラムを作成する場合に利用します。タイマー割り込みは、何かをしている最中に、ある決めた時間になったら、今作業している内容を一旦中断して、他の割り込み作業を行います。その割り込み作業が終わったら、元の作業を再開します。「何かの作業中」でなく「何の作業もしていない間(アイドル中)」でも構いません。それでは取り合えずタイマーを配置してみます。1つ目ですので Nameプロパティは「Timer1」となります。あと、ラベルも1つ追加しておきます。タイマーは非ビジュアルコンポーネントですので、下記のTimer1はアイコンで、その時計的な絵が画面に表示される訳ではありません。
<オブジェクトインスペクタ>にて、タイマー Timer1 の Enabledプロパティを「False」にしておきます。タイマーはこの Enabled プロパティが「True」になっているとカウントを行います。
デザイン時に指定していると、どのタイミングからタイマーがスタートしたのかが分からないのでプログラムでタイマー開始するようにします(※使用(ロード)するコンポーネント、ウインドウが多ければ多いほど、画面が表示されるまでの時間が掛かる)。フォーム Form1 が表示された時に発生するOnShowイベントハンドラを記述します。
OnShow欄でダブルクリック
↓
「procedure TForm1.FormShow(Sender: TObject);」
が作成されるのでそこにイベントハンドラを記述
procedure TForm1.FormShow(Sender: TObject);
begin
Label1.Caption := '' ;
Timer1.Interval := 1000 ;
Timer1.Enabled := True ;
end; |
タイマーの Intervalプロパティは、タイマーのカウンタで、ミリ秒単位で指定します。「1000」=1000ミリ秒=1秒、です。フォームが表示(Show)されてから1秒後にタイマーイベントを発生させる、という意味になります。
次に、タイマー Timer1 の OnTimerイベントハンドラを記述します。タイマーがカウントダウンされて、カウンタが「0」になった時に、このイベントハンドラが実行されます。
OnTimer欄でダブルクリック
↓
「procedure TForm1.Timer1Timer(Sender: TObject);」
が作成されるのでそこにイベントハンドラを記述
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False ; // タイマーを停止
Label1.Caption := TimeToStr(Now);
Timer1.Interval := 1000 ;
Timer1.Enabled := True ; // タイマー再開
end; |
タイマー発生時のイベントハンドラ内でタイマーイベントが発生してしまわないように、必ず、タイマーを停止させてから、処理内容を記述して、最後にタイマーを再開するようにします。
あと、タイマーが終了する・させる前には必ず、タイマーを停止させるようにしておきます。フォームを閉じる際=プログラム終了時には一応お約束として、タイマーを停止させるようにしておきます。
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Timer1.Enabled := False ; // タイマーを停止
end; |
それでは、保存・コンパイル(再構築)・実行をします。
というようなデジタル時計が表示されます。1秒毎にタイマー割り込みが発生して、タイマーイベントが発生し、時計内容を更新していますので、時計が動作しているように見えます。
タイマーのカウンタ=Intervalプロパティでは、ミリ秒単位、という事になっていますが、現実には余り小さい数値は厳密でないかもしれません。このタイマー自身がそれほど精度の高いものではない、という事もありますし、他に実行しているアプリケーションの絡みで若干ずれてしまう事もありますし、タイマーイベント処理中はタイマーを切っている訳ですから、どうしてもその処理の時間が掛かってしまうため、超厳密にタイマーを刻むっていう事は難しいです。このタイマー自体の精度は、0.1秒単位程度に考えておいた方が無難です。現実問題的には、この程度のタイマー割り込みでも十分に利用価値は高いです。
それでは<オブジェクトインスペクタ>を見ていきます。。。
新しく変わった所というのは、別段、無さそうですね。
なお、タイマー割り込みのイベントハンドラ内で処理すべき内容は、なるべく短く単純なものにせねばならない、というお決まりは、DOS時代の常駐プログラム(TSR)を作っていた人々にとっては当然的なものなのですが、まぁ、WindowsでのRADアプリ開発では、そこまでシビアに深刻に考える必要もないでしょう。
また、複数の処理をタイムシェアリング的に、同時っぽく実行、というような事でタイマー割り込みを使うのはあまりオススメはしません。複数のプログラムを作成してそれらを実行させる方が簡単ですし、マルチスレッドなプログラミングをした方が良いかもしれません。※私自身、マルチスレッドなプログラムを作った事はありませんけれども。
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/10/25
2010/10/26
▼2010/10/27
シェアウェア
Script!World
データベース
|