ここから本文です

初心者です。VB6のプログラムについて教えてください。いま、ランプを点灯させて、...

kaz********さん

2009/6/2920:36:37

初心者です。VB6のプログラムについて教えてください。いま、ランプを点灯させて、
その後、人がキー等入力をした時の反応の速さを時間で表わす反応速度測定ソフトの作製の続きです。

現在の段階はスタートボタン(cmdStart)を押すと、3秒後にランプが点灯し、その後ストップボタン(cmdStop)を押すと、その反応速度が0.000秒台で表示されます。
ところで、これを5回繰り返してその平均を、最終的にその人の平均反応速度としたいと思います。それで反応時間の表示ラベルを5つ作成したので、5回測定するとします。それで、このラベルをコントロール配列にし、lblTime(1)~lblTime(5)まで作成し、For・・・Next文を使用してFor i = 1 To 5 Step 1にし、lblTime(i).Captionに順次貼り付ければ、5回計測し表示できると考えましたが、最後に書くような問題が発生しました。以下になります。

Option Explicit

Dim swT As Single 'ストップウォッチ用スタート時間
Dim i As Integer

Private Sub cmdStart_Click()

cmdStop.SetFocus
'3秒タイマー
Dim startTime As Integer
Dim nowTime As Integer
Dim diftime As Integer

For i = 1 To 5 Step 1

startTime = Second(Time)

Do Until diftime >= 3
nowTime = Second(Time)
diftime = nowTime - startTime

Loop

'ボックスの塗り潰し
FillColor = QBColor(2)
FillStyle = 0
Line (1560, 2700)-(3255, 3350), , B

swT = Timer

Next i
End Sub

Private Sub cmdStop_Click()
'反応時間の測定
Dim resTime As Single

For i = 1 To 5 Step 1

resTime = Timer - swT
lblTime(i).Caption = Format(resTime, "0.000") '反応時間の表示
If resTime = 0 Then 'フライングの場合
MsgBox ("フライング(False Start)です。")
Beep
End If

Next i

cmdStart.SetFocus

'ボックスの塗り消し
FillColor = QBColor(15)
FillStyle = 0
Line (1560, 2700)-(3255, 3350), , B
End Sub

になります。ところが、このソースだと、1回の計測結果でlblTime(1)~lblTime(5)まで一遍に全部同じ表示をしてしまいます。それを、何度も繰り返すことはできます。そこで、lblTime(1)→lblTime(2)→・・・lblTime(5)と順次表示したいのですが、
For・・・Next文とlblTime(i).Captionをうまく使用できていないようで、lblTimeに順次貼り付けられません。
どこがおかしいのでしょうか?宜しくお願い致します。

補足マサアキさん、ありがとうございます。おかげでソフト完成しました。さすがです。最後にもし、できたら Lib "winmm" とはどういう意味か教えて頂けないでしょうか?もし時間がありましたら、宜しくお願いします。

閲覧数:
1,053
回答数:
1
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

mas********さん

編集あり2009/7/214:50:12

>For・・・Next
そもそもFor・・・Next文でやろうとするならAPIを使わないと無理です。
> diftime
この変数、代入してるだけで何の意味も持ちませんね・・・。
>startTime = Second(Time)
厳しいようですが、
VBの関数は精度に疑問点が多々残るので使うべきではありません。

APIを利用したサンプルコード:
Private Declare Function timGetTime Lib "winmm" () As Long
Dim i as Long
Dim StartTime as Long
Dim

Private Sub Form_Load()
i=0
cmdStop.Enabled=False
End Sub

Private Sub cmdStart_Click()
'↓やらないとバグを発生させる操作が可能になってしまいます。
cmdStop.Enabled=True
cmdStop.SetFocus
cmdStart.Enabled=False
i=i+1
StartTime=timeGetTime

Do
If timeGetTime-StartTime>=3000 then Exit Do
DoEvents
Loop

'ボックスの塗り潰し
FillColor = QBColor(2)
FillStyle = 0
Line (1560, 2700)-(3255, 3350), , B

End Sub

Private Sub cmdStop_Click()

If timeGetTime-StartTime<=3000 Then
MsgBox ("フライング(False Start)です。")
Else
lblTime(i).Caption = Format(cSng(timGetTime-StartTime-3000)/1000, "0.000") '反応時間の表示
End If
Beep
cmdStart.Enabled=True
cmdStart.SetFocus
cmdStop.Enabled=False

'ボックスの塗り消し
FillColor = QBColor(15)
FillStyle = 0
Line (1560, 2700)-(3255, 3350), , B
End Sub


これでいいはずですが、検証はしてません。
※コンパイル後のマシンコード(0と1の数列)まで考えて
(自分に可能な限り)最適化してあります。

頭文字は小文字なのに途中で大文字を使うハンガリアン記法は
大文字・小文字の統一性が無く、多くのプログラミングの文法にそぐわないので
(頭文字が大文字なら全体が大文字、小文字なら全体が小文字)嫌う人が多いです。

>できたら Lib "winmm" とはどういう意味か教えて頂けないでしょうか?
Windowsには「ダイナミックリンクライブラリ(DLL)」というものがあり、そこにAPIの関数群が記録されています。
※APIとはOSの標準機能(関数)をプログラムから扱う概念の事です。
winmmというのは「winmm.dll(確か大文字ですが)」というライブラリファイルであり、
「Lib "winmm"はライブラリ「winmm」から関数を取り込む」と考えて基本的に相違ありません。
ちなみにwinmmは「WindowsMultiMedia」の略だと思われます。
取り込んだ関数が「timeGetTime(OS起動からの時間をミリ秒単位で取得する関数)」となります。

質問した人からのコメント

2009/7/2 22:58:39

驚く ありがとうございました。大学生で、VBもCもやるんですね。就職にはこの不況でも苦労しないかな?がんばってください。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる