便利時計 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 

 

 

inserted by FC2 system