便利時計 VB6
前へ 目次へ 次へ 

デジタル時計らしく

 時刻表示されている文字は、普通の文字でデジタルという雰囲気がない。ここでは次のような0〜9と区切りの11枚の絵を使って表示することを考える。絵を変えればどんな形の文字でも表示させることができる。

(Download dtokei.lzh 2.39kB)

 数字はそれぞれd0.gif〜d9.gifと区切りはdd.gifというファイル名でプログラムと同じフォルダに用意されているものとする。ひとつの数字の大きさは32×32ドット、区切りは16×32ドットである。


フォームとコントロールを準備する

 新規フォームを用意し、プロパティを次のように設定する。

 Caption … 便利時計2、  MaxButton … False、  MinButton … False

 表示用のイメージ(imgTime) コントロール配列
   (オブジェクト名) … imgTime、  Picture … d0.gif
   (0)  Index … 0、  Left … 120、  Top … 360
   (1)  Index … 1、  Left … 600、  Top … 360
   (2)  Index … 2、  Left … 1320、  Top … 360
   (3)  Index … 3、  Left … 1800、  Top … 360
   (4)  Index … 4、  Left … 2520、  Top … 360
   (5)  Index … 5、  Left … 3000、  Top … 360

 区切り用のイメージ(Image1)
   (オブジェクト名) … imgTime1、  Picture … dd.gif、  Left … 1080、  Top … 360
 区切り用のイメージ(Image2)
   (オブジェクト名) … imgTime2、  Picture … dd.gif、  Left … 2280、  Top … 360

 イメージは読み込んだ画像ファイル(d0.gifなど)の大きさになり、HeightとWidthプロパティは自動的に設定される。

 数字用のイメージ(imgNum) コントロール配列
   (オブジェクト名) … imgNum、  Visible … False
   (0)  Index … 0、  Picture … d0.gif     (5)  Index … 5、  Picture … d5.gif
   (1)  Index … 1、  Picture … d1.gif     (6)  Index … 6、  Picture … d6.gif
   (2)  Index … 2、  Picture … d2.gif     (7)  Index … 7、  Picture … d7.gif
   (3)  Index … 3、  Picture … d3.gif     (8)  Index … 8、  Picture … d8.gif
   (4)  Index … 4、  Picture … d4.gif     (9)  Index … 9、  Picture … d9.gif

 数字用のイメージはVisibleプロパティをFalseにして、実行時に表示されないようにしているので適当な位置に配置すればよい。

 ラベル(lblDate)
   (オブジェクト名) … lblDate、  Left … 120、  Top … 120
   Caption … 0000/00/00(xx)、  AutoSize … True、  Font … フォント=MS ゴシック

 タイマー(Timer1)
   (オブジェクト名) … Timer1、  Interval … 1000

 テキスト(txtJikan)
   (オブジェクト名) … txtJikan、  Height … 270  、Left … 120、  Top … 1200、  Width … 375
   Text … (なし)

 テキスト(txtFun)
   (オブジェクト名) … txtFun、  Height … 270  、Left … 840、  Top … 1200、  Width … 375
   Text … (なし)

 ラベル(Label1)
   (オブジェクト名) … Label1、  Left … 280、  Top … 960
   Caption … アラーム、  AutoSize … True

 ラベル(Label2)
   (オブジェクト名) … Label2、  Left … 600、  Top … 1320
   Caption … 時、  AutoSize … True

 ラベル(Label3)
   (オブジェクト名) … Label3、  Left … 1320、  Top … 1320
   Caption … 分、  AutoSize … True

・プログラムリスト
 まずは、時刻表示だけプログラムする。

Option Explicit     '宣言を強制する

Private Sub Form_Load()
    lblDate.Caption = Format(Date, "yyyy/mm/dd(aaa)")   '日付表示
    TimeHyouji
End Sub

Private Sub Timer1_Timer()
    TimeHyouji
End Sub

Private Sub TimeHyouji()
    Dim d1 As Integer, jikan As String, n As Integer

    lblDate.Caption = Format(Date, "yyyy/mm/dd(aaa)")   '日付表示
    jikan = Format(Time, "hhmmss")      '時間取得 #1
    For n = 0 To 5
        d1 = Val(Mid(jikan, n + 1, 1))      '時間1けたずつ取得 #2
        imgTime(n).Picture = imgNum(d1).Picture    '対応する画像を記憶させる #3
    Next n
End Sub

 時刻表示は、1けたずつ対応する画像を表示用のイメージに与える必要があるので、サブプロシージャTimeHyoujiとして作成している。最初に処理されるForm_LoadプロシージャとTimer1_TimerプロシージャからTimeHyoujiサブプロシージャを呼び出している。

 (#1)変数jikanにコンピュータの時間を関数Formatを使って区切り文字なしで記憶させる。例えば、現在12時23分34秒だとすれば、変数jikanには"122334"と記憶される。
 時分秒で6けたあるのでFor文で6回繰り返している。変数nは0〜5として、このnが各けたのimgTime(0)〜imgTime(5)に対応する。
 (#2)変数jikanの先頭から関数Midで1けたずつ取り出し、関数Valで数値に変換して、変数d1に記憶させる。
 (#3)変数d1に記憶させた数値をimgNumの数字画像に対応させているので、imgNumの画像をimgTimeに記憶させている。


目覚まし機能

 目覚まし機能は、前のものと同じである。したがってプログラムも同じである。

・プログラムリスト

Option Explicit     '宣言を強制する

Private Sub Form_Load()
    lblDate.Caption = Format(Date, "yyyy/mm/dd(aaa)")   '日付表示
    TimeHyouji
End Sub

Private Sub Timer1_Timer()
    Dim alarm As String

    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
End Sub

Private Sub TimeHyouji()
    Dim d1 As Integer, jikan As String, n As Integer

    jikan = Format(Time, "hhmmss")      '時間取得
    For n = 0 To 5
        d1 = Val(Mid(jikan, n + 1, 1))      '時間1けたずつ取得
        imgTime(n).Picture = imgNum(d1).Picture    '対応する画像を記憶させる
    Next n
End Sub

 タイマーは1秒ごとに呼び出されるようにしてあるが、時々、秒表示が飛んでしまうこともある。この例も前の例でも同じ現象が起こる。なぜだろうか?


秒の表示が飛ぶ理由

 新規フォームを用意し、ラベルとタイマーコントロールをひとつずつ配置する。コントロールの位置と大きさは適当でよい。

 ラベル(Label1)
   (オブジェクト名) … Label1

 タイマー(Timer1)
   (オブジェクト名) … Timer1、  Interval … 1000

・プログラムリスト

Private Sub Timer1_Timer()
    Static ss As Single
    
    Label1.Caption = Timer - ss
    ss = Timer
End Sub

 関数Timerは午前0時(真夜中)から経過した秒数を表すSingle型の値を返却する。
 ラベルに現在のタイマーと前回呼び出されたときのタイマーの差(Timer - ss)を表示している。表示後、タイマーの値を変数ssに記憶させる。変数ssはstaticで宣言しているので、プログラムが終了するまで記憶している値を保持する(値を持ち続ける)。

 実行すると、1秒後には変数ssが0なので午前0時から現在までの秒数が表示され、2秒後からは前回(1秒後)のTimer1_Timerを呼び出してから今回の時間差が表示される。
 おおよそ、1.03〜1.1秒の間で時間差が表示される(NEC Valuestar VC733J/3 PentiumV733MHz)。TimerオブジェクトのIntervalプロパティを1000(ミリ秒)に設定したが、正確に1秒にはなっていない。このため秒の表示が飛ぶのである。タイマーのIntervalプロパティを900程度にしておけば秒飛びが防げる。あるいは、Intervalプロパティの値をいろいろ変えて、ほぼ1秒になるようにするのも1方法である。

Static
 プロシージャ内で宣言された変数は、プロシージャ内だけで有効である。
 Dimで宣言された変数は、プロシージャが呼び出されるごとに変数の領域を用意する。したがって、前回のプロシージャ呼び出しで記憶した値は消えている。
 Staticで宣言された変数(静的変数という)は、プロシージャの呼び出しに関係なく、プログラムが終了するまで、変数の領域が確保されたままになる。したがって、前回のプロシージャ呼び出しで記憶した値はそのまま記憶している。
 ここでは、前回の色を変更したボタンの番号を記憶させている。


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system