時間を加えたタイピング

☆タイマーオブジェクトの使い方
■フォーム上にタイマー、ラベル、コマンドボタン2個を配置する。↓
     

■貼り付けたタイマーオブジェクトをダブルクリックしコードを表示させる。


■コードを書き換える。↓
Private Sub Timer1_Timer()
   Label1.Caption = "A"
End Sub


(解説)Timer1_TImerが実行されるとLabel1.Captionに"A"が代入される

■開始ボタンを押しプログラムを実行しても何も表示されないことを確認。またタイマーオブジェクトは実行中は表示されない。↓


■タイマオブジェクトを1クリックし、画面の右中段のオブジェクトプロパティのIntervalを1000にする。↓


(解説)IntervalとはTimerイベントが発生する時間。数値はミリ単位で設定。この場合1秒になる。

■開始ボタンを押しプログラムを実行する。↓


(解説)1秒後にLabel1がAに変わる。

■コードを書き換える。↓
'変数secを整数系で宣言
Dim sec As Integer
Private Sub Timer1_Timer()
   sec = sec + 1
   Label1.Caption = sec
End Sub


■開始ボタンを押しプログラムを実行する。↓


(解説)1秒ごとにTimer1_Timer()が実行され1足されていることが分かる。図では8秒経過している。

■オブジェクトプロパティのIntervalを100に変更しプログラムを実行すると0.1秒ごとに1足されて表示される。

☆タイマーオブジェクトでストップウォッチを作成
■オブジェクトプロパティのIntervalを0に戻す。

■Command1、Command1をダブルクリックしコードを書き換える。↓
'変数secを倍精度浮動小数点型で宣言(小数点も入れることが出来る)
Dim sec As Double

Private Sub Timer1_Timer()
   sec = sec + 0.1
   Label1.Caption = sec
End Sub

'Command1をクリックしたとき実行される
Private Sub Command1_Click()
   
'Timer1のインターバルを0.1秒にする
   Timer1.Interval = 100
End Sub

Private Sub Command2_Click()
   
'Timer1のインターバルを無くす
   Timer1.Interval = 0
End Sub

■開始ボタンを押しプログラムを実行する。↓


(解説)Command1をクリックすると0.1秒ごとに+0.1されていく。その後Command2をクリックすると数値が止まる。

■このタイムオブジェクトはかなり精度が悪いため精度の問われるところでは使用きない。ちなみに精度は1/20秒までとされている。

∵ダウンロード file1.zip

■タイムオブジェクトを右クリックから「削除」を選び削除する


☆Time関数(PCの時計)を使いストップウォッチを作成

(解説)速度調整アプリを使用しても操作できないストップウォッチを作成。

■コードを書き換える。↓
Private Sub Form_Load()
   Label1.Caption = Time
End Sub


(解説)Timeとは現在時間が入っている関数。(変数ではない)

■プログラムを実行すると現在の時刻が表示される↓


(解説)現在時刻が3時41分31秒だったのでこのように表示された。

■2行目のコードを
Label1.Caption=Hour(Time)と書き換えて実行すると時間(h)だけが表示される

■Minute(Time)だと分、Second(Time)だと秒が表示される。

■コードを書き換える。↓
Private Sub Form_Load()
'今日の0時0分0秒からの時間(秒)をLabel1.Captionに代入。
Label1.Caption = Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600
End Sub


■プログラムを実行し確認する。

■コードを書き換える。↓
Dim sec As Double

Private Sub Command1_Click()
   '今の時間を変数secに代入する
   sec = Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600
End Sub

Private Sub Command2_Click()
   'さっきの時間から今の時間を引く
   Label1.Caption = Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600 - sec
End Sub


■プログラムを実行しCommand1を押した後、数秒置いてCommand2を押す。↓


(解説)図では11と表示されている。これはCommand1をクリックして11秒後にCommand2をクリックしたことになる。

■このままだと日付が変更されたとき結果がマイナスになるのでコードを書き換える。↓
Dim sec As Double

Private Sub Command1_Click()
   '今の時間を変数secに代入する
   sec = Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600
End Sub

Private Sub Command2_Click()
   '日付が変わったとき(開始時間が終了時間より大きいとき)
   If sec > Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600 Then
      '一日は86400秒ということでそれを足して代入
      Label1.Caption = 86400 + Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600 - sec
   Else
      Label1.Caption = Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600 - sec
   End If
End Sub


■プログラムを実行しCommand1ボタンを押し数秒後にCommand2を押す。

(解説)結果はさっきと変わらないかもしれないが日付が変わったときのバグが修正されている。

∵ダウンロード file2.zip


☆APIのtimeGetTimeを使いストップウォッチを作成。

(解説)APIとはシステムを動かすDLLを呼び出す仕組みをいう。WindowsOSもAPIで動いている。
(解説)timeGetTimeでは時間を1ms精度で表示してくれる。ずれはほぼ無いとされる。

■プロジェクトエスクプローラ内で右クリックし「追加」-「標準モジュール」をクリックし開くを押す。
    

■Module1にコードを書き込む。↓
'APIのtimeGEtTimeの標準モジュール(特に理解しなくて良い)
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

■Form1のコードを書き換える。↓
(解説)標準モジュールとはフォームを持たないコードです。APIを使用するときは、ここに使用の旨を宣言しておく


'変数msecを倍精度浮動小数点型で宣言(小数点も入れることが出来る)
Dim msec As Double

Private Sub Command1_Click()
   '今のtimeGetTimeを変数msecへ代入。CDblはtimeGetTimeをDouble型に変換する関数
   msec = CDbl(timeGetTime)
End Sub

Private Sub Command2_Click()
   'さっきの時間から今の時間を引く、そして表示する
   Label1.Caption = CDbl(timeGetTime) - msec
End Sub


■開始ボタンを押しプログラムを実行する。まずCommand1をクリックし、数秒後にCommand2を押す↓


■すると押すまでの時間が表示される。。図では2551と表示されているので2551ms。つまり2.551秒となる。何度かやってみよう。

∵ダウンロード file3.zip


☆テキストを使ったタイピングで時間を測定
■フォーム上を次のようにする。↓


■コードを書き換える。(前回の標準モジュールは消さないこと)↓
Dim msec As Double

Private Sub Form_Load()
   Label1.Caption = "あいうえお"
   msec = CDbl(timeGetTime)
End Sub

Private Sub Command1_Click()
   'もしラベルとテキストが同じ時
   If Label1.Caption = Text1.Text Then
      'フォームがロードされた時間からコマンドボタンを押すまでの時間をボタンに表示。timeGetTimeはミリ秒で表示されるので1000で割る
      Command1.Caption = (CDbl(timeGetTime) - msec) / 1000
   End If
End Sub

(解説)時間の測定にはtimeGetTimeを使用している

■プログラムを実行する。テキストに「あいうえお」と入力しコマンドボタンを押すと時間がボタンに表示される。


(解説)ラベルとテキストが同じとき時間が表示され、違うときは何も表示されない。

∵ダウンロード file4.zip


☆タイムの不正を防ぐタイピング

(解説)速度調整アプリ(AlquadeLiteなど)を使用されると簡単にタイムの不正が行われる。そこでTime関数(PCの時計)のタイムは調整できないことを利用して不正を防ぐ

■コードを書き換える。↓
Dim msec As Double
Dim sec As Double

Private Sub Form_Load()
   Label1.Caption = "あいうえお"
   msec = CDbl(timeGetTime)
   sec = Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600
End Sub

Private Sub Command1_Click()
   
'もしラベルとテキストが同じ時
   If Label1.Caption = Text1.Text Then
     
 'timeGetTimeの時間を変数jikan1に代入
      jikan1 = (CDbl(timeGetTime) - msec) / 1000
      
'Time関数によって出した時間をjikan2に代入
      jikan2 = Second(Time) + Minute(Time) * 60 + Hour(Time) * 3600 - sec
        
 '変数jikan1と変数jikan2と同じ時(Intは整数化させる関数)
         If Int(jikan1) = jikan2 Then
     
    'フォームがロードされた時間からコマンドボタンを押すまでの時間を表示。timeGetTimeはミリ秒で表示されるので1000で割る
         Command1.Caption = jikan1
      End If
   End If
End Sub

(解説)getTimeGetによって出力された時間とTime関数(PCの時計)によって出力された時間が同じ時、タイムを表示する。速度調整アプリを使用して実行するとタイムは表示されない。

∵ダウンロード file5.zip

☆標準モジュールの削除の仕方
■画面右上のプロジェクトエクスプローラのModule1を右クリックし、解放させる。(これで標準モジュールを解放できる)↓