- - PR -
VB6.0 タイマーコントロールの『.Interval = 0』の使用上の注意について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-08 10:37
どなたかご教授ください。
VB6.0 で「タイマーコントロール」を使用する時のことです。 タイマーのイベントを破棄(未使用にする(二重起動防止))する場合にプロパティで、『.Interval = 0』だけでは何故だかもう一度イベントが発生した様な記憶があり、何かで調べた結果、『.Interval = 0』と共に『.Enabled = False』をペアにしてコーディングをする様になりました。(この「何か」を忘れています) いわゆる「おまじない」的なことだったかも知れませんが、社内にこのことを知らせたいと思っており、そのために、このことを正式?に推奨する様なページ等がどこかにありませんでしょうか? そもそも、この理解(使用)の仕方が間違っている場合はご指摘ください。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2007-11-08 10:49
っていうかTimer.Enabled=Falseだけでいいじゃん。 | ||||||||
|
投稿日時: 2007-11-08 11:02
それを言われると何も言えませんが、弊社では『.Interval = 0』でタイマーが止まるものと思っている開発者が多いので(本当は止まるはずでしょうけど)、
>そもそも、この理解(使用)の仕方が間違っている場合はご指摘ください。 でなければ、『.Enabled = False』だけにする理由となる材料が欲しかっただけです。 | ||||||||
|
投稿日時: 2007-11-08 11:10
以下、ぜんぶ推測です。私はこう思って長年 Timer コントロールを使っています、という例でしかありません。 ちなみに、 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/Vbcon/html/vbup2020.asp を読むと、
と書かれています。しかし、昔から Microsoft の VB 関係の仕様は実際に使ってみないと信用することができません。私は Interval は 1 <= x <= 65535 までが有効で、それ以外の値は使わないようにしてきました。 私は、Interval に 0 を入れると、無効にするのではなく、Timer コントロールが次回のタイマーが fire するタイミングを決定する際(これは今設定済みのタイマーが fire した後におこなわれる)に 0 だと、値を無効だとみなして fire しないようにするためのものではないかと推測しています。ですから、Interval = 0 にしても、今、予約済みのタイマーは取り消されないまま、fire する時刻を待っていて予約時刻が来れば fire してしまうのではないでしょうか。そして、その後は上述のように新たな予約がおこなわれないので、その後は fire しなくなるのではないでしょうか。 しかし、Interval = 1 を許して Interval = 0 を許さないのは汎用的ではないインターフェースです。また、タイマーの制御を Enabled のようなプロパティーでやるべきでしょうか?メソッドで制御すべきもののように思います。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2007-11-08 11:17
試しに VB5 でつぎのようなコードを書いて動かしてみました。
Command1 ボタンを押した時刻を T [秒]とすると、(T+10) [秒]に Print されますが、(T+15) [秒]に Command2 ボタンを押すと、(T+20) [秒]に再び Print されます。その後、Print はされなくなります。 この挙動から、前述の推測どおりだと思います。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2007-11-08 11:41
unibon さん誠にありがとうございました。お手数をお掛けいたしました。
「Timer1.Interval = 0」が、必ずしもタイマーを停止させる効果があるとは言えないことの証明であると理解しました。(Interval のタイミングが大いに関係する) お手すきの時に一つ教えてください。 unibon さんがご回答された、 >また、タイマーの制御を Enabled のようなプロパティーでやるべきでしょうか? >メソッドで制御すべきもののように思います。 この、メソッドで制御とは、どう言ったやり方でしょうか? VB6.0 の Timer コントロールにはプロパティしか無い様なのですが... (Timer とは別のやり方?) | ||||||||
|
投稿日時: 2007-11-08 13:03
これはただの Microsoft に対する愚痴でして、タイマーの有効・無効のようなタイミングがクリチカルな制御は、 Timer1.Enabled = True のようにプロパティーではなく、 Call Timer1.Enable(True) のようなメソッド(Sub/Function)呼び出しのほうが、良いのではないか、という意味です。 こうすれば Interval と Enabled の機能の違いもはっきりします。 もっとも、現状では Enabled プロパティーを使うしかありません。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2007-11-08 13:42
ぶさいくろう さん、unibon さん
早急なご回答ありがとうございました。 コーディング例と共に、Enabled プロパティーを使用することを社内にアナウンスしたと思います。 |