便利時計 VB6 |
キッチンタイマー
便利時計にキッチンタイマーのような機能を追加する。タイマーは59分59秒まで設定できるようにする。
分用スクロールバー(VScroll1)
(オブジェクト名) … VScroll1、 Height … 280 、Left … 2160、 Top … 1200、 Width
… 180
Max … 0、 Min … 59
秒用スクロールバー(VScroll2)
(オブジェクト名) … VScroll2、 Height … 280 、Left … 3000、 Top … 1200、 Width
… 180
Max … 0、 Min … 59
スクロールバーのMaxとMinプロパティーで最大値と最小値が設定できる。この範囲以外の値には設定できなくなる。分と秒ともに59秒までなので範囲を0〜59としている。ここで、Max(最大値)を0に、Min(最小値)に59を設定している。逆のようであるが、このようにしておくとスクロールバーの上のボタンをクリックすると値が増え、下のボタンをクリックすると減るようにすることができる。試しに逆に設定してみるとよい。スクロールバーの値はValueプロパティで参照できる。
テキスト(txtTfun)
(オブジェクト名) … txtTfun、 Height … 270 、Left … 1800、 Top … 1200、 Width
… 375
Text … (なし)
テキスト(txtTbyou)
(オブジェクト名) … txtTbyou、 Height … 270 、Left … 2640、 Top … 1200、 Width
… 375
Text … (なし)
スタート用ボタン(cmdStart)
(オブジェクト名) … cmdStart、 Height … 270 、Left … 3480、 Top … 1200、 Width
… 615
Caption … Start
ラベル(Label4)
(オブジェクト名) … Label4、 Left … 1800、 Top … 960
Caption … タイマー、 AutoSize … True
ラベル(Label5)
(オブジェクト名) … Label5、 Left … 2400、 Top … 1320
Caption … 分、 AutoSize … True
ラベル(Label6)
(オブジェクト名) … Label6、 Left … 3240、 Top … 1320
Caption … 秒、 AutoSize … True
タイマー用の分と秒はキーボードからも入力できるし、スクロールバーでも入力できるようにしている。
・プログラムリストT
Option Explicit '宣言を強制する Dim TFlag As Integer 'タイマー用フラグ Private Sub cmdStart_Click() TFlag = 1 'タイマー作動 End Sub Private Sub Form_Load() lblDate.Caption = Format(Date, "yyyy/mm/dd(aaa)") '日付表示 TimeHyouji '初期化 TFlag = 0 txtTfun.Text = " 0" txtTbyou.Text = " 0" VScroll1.Value = 0 VScroll2.Value = 0 End Sub
Form_Loadプロシージャにタイマー用のデータの初期化を追加している。また、タイマー作動用にフラグ(変数)TFlagを用意している。TFlagが0でタイマー未動作、1で動作中とする。
タイマースタート用のボタン(cmdStart)をクリックすると変数TFlagを1に設定してタイマーを動作させる。
Private Sub txtTbyou_Change() Dim byo As Integer byo = Val(txtTbyou.Text) If byo < 0 Or byo > 59 Then txtTbyou.Text = "0" byo = 0 End If VScroll2.Value = byo End Sub Private Sub txtTfun_Change() Dim fun As Integer fun = Val(txtTfun.Text) If fun < 0 Or fun > 59 Then txtTfun.Text = "0" fun = 0 End If VScroll1.Value = fun End Sub
タイマー用の分と秒のテキストボックスに値を入力(修正)したときに処理されるプロシージャである。両方とも変数などの名前が違うだけで処理は同じである。
テキストに入力された値が0〜59の範囲にあるかどうかを判定して、範囲外であれば0にしている。最後に対応するスクロールバーの値も変更している。
Private Sub VScroll1_Change() txtTfun.Text = Str(VScroll1.Value) End Sub Private Sub VScroll2_Change() txtTbyou.Text = Str(VScroll2.Value) End Sub
タイマー用の分と秒のスクロールバーで値を入力したときに処理されるプロシージャである。両方とも変数などの名前が違うだけで処理は同じである。
スクロールバーはMinとMaxプロパティで設定した範囲以外の値にはならないので、値のチェックは不要である。
実行して、分や秒にデータを入力したりスクロールバーで値が0〜59の範囲で変わることを確認する。
・プログラムリストU
Private Sub Timer1_Timer() Dim alarm As String Dim m As Integer, s As Integer '分秒用 lblDate.Caption = Format(Date, "yyyy/mm/dd(aaa)") '日付表示 TimeHyouji 'アラーム alarm = Right("0" & txtJikan.Text, 2) & Right("0" & txtFun.Text, 2) '時間+分 If Format(Time, "hhmm") = alarm Then Beep End If 'タイマー If TFlag = 1 Then 'タイマー作動 m = VScroll1.Value s = VScroll2.Value s = s - 1 '1秒減 #1 If s = -1 Then '#2 s = 59 m = m - 1 '1分減 End If If m = 0 And s = 0 Then TFlag = 2 'アラーム設定 End If VScroll1.Value = m VScroll2.Value = s End If If TFlag > 1 And TFlag < 12 Then 'アラーム TFlag = TFlag + 1 Beep ElseIf TFlag >= 12 Then TFlag = 0 End If End Sub
タイマー動作中(TFlag=1のとき)の処理では、1秒ごとにこのプロシージャが呼び出されるので、(#1)秒を1減じている。0秒から1減じたとき、すなわち(#2)秒が-1になったときは、分を1減じて秒は59にしなければならない。変数mとsを用意してスクロールバーの値を記憶させているが、これば秒が-1になるため、VScroll2をそのまま使うと範囲外のためエラーとなるからである。
分、秒ともに0になったときに変数TFlagを2にして、アラームを鳴らす。ここでは、変数TFlagが2〜11までの10回Beep音を鳴らすようにしている。
タイマーのエラー処理
タイマーの時間設定をしないでスタートボタンをクリックするとエラーになる。これは秒が0であるから秒を59にして分から1減じる。分も0であるから-1となり、スクロールバーの範囲外の値になるのでエラーとなる。
ここでは、分、秒ともに0のときはスタートボタンをクリックしてもタイマーが動作しないようにする。
・プログラムリスト
Private Sub cmdStart_Click() If VScroll1.Value > 0 Or VScroll2.Value > 0 Then TFlag = 1 'タイマー作動 End If End Sub
分と秒のどちらかが0でなければタイマーをスタート(TFlag=1)させる。
タイマーの考察
次図のタイマーのグラフは縦棒の間隔が1秒で、縦棒の位置でTimer1_Timerプロシージャが呼び出される位置である。タイマーを7秒に設定し、次図のようなタイミングでスタートボタンをクリックしたとする。図からもわかるように7秒にはならない。
解決のひとつの方法として、タイマー用にもう一つタイマーオブジェクト(Timer2)を配置し、スタートボタンのクリックでTimer2を動作させるようにすれば、図のような問題は起こらない。
しかし、VisualBasicのタイマーコントロール自身が正確ではない。
時刻表示は、Timer1(約1秒間隔)を利用して、コンピュータの時間を表示しているので、秒飛びの現象は起こるが、時刻的には狂いがない。(コンピュータの時刻が正確ならば。)これに対して、タイマーはTimer1の動作間隔で1秒ずつ減じている。Timer1は先にも確認したように実際には1.04〜1.1秒間隔で動作している。例えば、Timer1が1.05秒間隔で動作しているとし、タイマーを20秒と設定すると20*1.05=21、すなわち、20秒で1秒の誤差が生じることになる。
解決方法としては、コンピュータの時間を利用して、スタートボタンをクリックしたときのコンピュータの時間からの経過時間で、またはクリックしたときの時間と現在の時間との差を利用してタイマーを処理するようにすれば改善される。もう一つの方法としては、関数Timerを利用することである。
しかし、ここではこのままとしておく。関数Timerは次のストップウォッチで利用してみよう。
Copyright © 2001 Hiroshi Masuda |