被検者にテンキーを押してもらうことで行う視力検査のプログラムを作っています。切れ目を上下左右のどこに出すかは、自動で行えるようにしましたが、披検者の答えがあっているかを見るプログラムが旨くいきません。ご教授お願い致します。以下が私が考えたプログラムです。
Public Class Form1
Inherits System.Windows.Forms.Form
(省略)
'パソコン機種の選定 公式 解像度×2.54(インチ)×10(cm→㎜)/DPI×PCディスプレイ横幅(㎜)
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ItemList.SelectedIndexChanged
If ItemList.SelectedIndex = 0 Then
dblHaba = (1366 * 2.54 * 10) / (96 * 246)
End If
If ItemList.SelectedIndex = 2 Then
dblHaba = (1280 * 2.54 * 10) / (96 * 338)
End If
If ItemList.SelectedIndex = 3 Then
dblHaba = (1280 * 2.54 * 10) / (96 * 380)
End If
If ItemList.SelectedIndex = 4 Then
dblHaba = (1024 * 2.54 * 10) / (96 * 247)
End If
End Sub
'ランドル環の大きさを決める。(視力の値)
Private Sub ItemSiryoku_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ItemSiryoku.SelectedIndexChanged
Select Case ItemSiryoku.SelectedIndex
Case 0
dblSikaku = 1 / 0.1
Case 1
dblSikaku = 1 / 0.2
Case 2
dblSikaku = 1 / 0.3
Case 3
dblSikaku = 1 / 0.4
Case 4
dblSikaku = 1 / 0.5
Case 5
dblSikaku = 1 / 0.6
Case 6
dblSikaku = 1 / 0.7
Case 7
dblSikaku = 1 / 0.8
Case 8
dblSikaku = 1 / 0.9
Case 9
dblSikaku = 1 / 1
Case 10
dblSikaku = 1 / 1.2
End Select
End Sub
'ドーナッツ状の黒丸を出す
Private Sub btnKennsakaisi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKennsakaisi.Click
KeyPreview = True
Dim intKiremenohoukou, intSiryokuteizikaisuu As Integer '切れ目の方向,ランドルト環の出す回数
Dim g As Graphics = CreateGraphics()
g.PageUnit = GraphicsUnit.Millimeter
'ランドルト環表示
g.FillEllipse(Brushes.Black, CSng((117.5 - (5 / 2 * dblSikaku * 7.5 / 5)) * dblHaba), CSng((57.5 - (5 / 2 * dblSikaku * 7.5 / 5)) * dblHaba), CSng(7.5 * dblSikaku * dblHaba), CSng(7.5 * dblSikaku * dblHaba)) '黒丸
g.FillEllipse(Brushes.White, CSng((117.5 - (3 / 2 * dblSikaku * 7.5 / 5)) * dblHaba), CSng((57.5 - (3 / 2 * dblSikaku * 7.5 / 5)) * dblHaba), CSng(4.5 * dblSikaku * dblHaba), CSng(4.5 * dblSikaku * dblHaba)) '白丸
'自動でランドル環の視標を出す
Randomize()
intKiremenohoukou = Int(Rnd() * 4) + 1
If intKiremenohoukou = 1 Then '右
g.FillRectangle(Brushes.White, CSng((117.5 + 7.5 * dblSikaku / 5) * dblHaba), CSng((57.5 - 7.5 * dblSikaku / 10) * dblHaba), CSng(1.5 * 2 * dblSikaku * dblHaba), CSng(1.5 * dblSikaku * dblHaba))
intRandokireme = 9
ElseIf intKiremenohoukou = 2 Then '左
g.FillRectangle(Brushes.White, CSng((117.5 - 7.5 * 3 * dblSikaku / 5) * dblHaba), CSng((57.5 - 7.5 * dblSikaku / 10) * dblHaba), CSng(1.5 * 2 * dblSikaku * dblHaba), CSng(1.5 * dblSikaku * dblHaba))
intRandokireme = 10
ElseIf intKiremenohoukou = 3 Then '上
g.FillRectangle(Brushes.White, CSng((117.5 - 7.5 * dblSikaku / 10) * dblHaba), CSng((57.5 - 7.5 * 3 * dblSikaku / 5) * dblHaba), CSng(1.5 * dblSikaku * dblHaba), CSng(1.5 * 2 * dblSikaku * dblHaba))
intRandokireme = 11
ElseIf intKiremenohoukou = 4 Then '下
g.FillRectangle(Brushes.White, CSng((117.5 - 7.5 * dblSikaku / 10) * dblHaba), CSng((57.5 + 7.5 * dblSikaku / 5) * dblHaba), CSng(1.5 * dblSikaku * dblHaba), CSng(1.5 * 2 * dblSikaku * dblHaba))
intRandokireme = 12
End If
End Sub
'患者の答えがあっているかを見る
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
Dim intSeikaisuu As Integer
Select Case intRandokireme
Case 9
If e.KeyChar = "6" Then
intSeikaisuu = intSeikaisuu + 1
Else
End If
Case 10
If e.KeyChar = "4" Then
intSeikaisuu = intSeikaisuu + 1
Else
End If
Case 11
If e.KeyChar = "8" Then
intSeikaisuu = intSeikaisuu + 1
Else
End If
Case 12
If e.KeyChar = "2" Then
intSeikaisuu = intSeikaisuu + 1
Else
End If
End Select
End Sub
Module Module1
Public dblHaba, dblSikaku As Double '線と線の間の間隔, 視角
Public intRandokireme As Integer '乱数で発生したランドルト環
End Module
コードが長くなってしまい申し訳ありません。何卒宜しくお願い致します。
デバッグ作業の依頼ですか?
なんと大胆な!
患者の答えが合っているかを見るまでのコードは間違いなく動きます。KeyPressを使ってテンキーで2と4と6と8を使うと上手く↑←→↓を現せるのも分かるのです。2つを組み合わせようとすると上手くいかないのです。本当は、文章で書いてわかるようでそれが一番ご迷惑をかけず伺える方法だと思っています。しかし、上手く文章を書くことが出来ず、それならばいっそのことコードを全て公開したほうが的確な指摘を頂けるのではないかと思いました。お手数を掛けますが、重ねて宜しくお願い致します。
フォームでキーイベントを受け取るのであれば、
Form.KeyPreview プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.form.keypreview(VS.80).aspx
を確認してみてください。
Private Sub Form1_KeyPress の中の
Dim intSeikaisuu As Integer が
Form1_KeyPressが呼び出される度にリセットされてしまうだけでは。
これをフォームレベルで宣言すれば良いと思いますが。
ツイート | ![]() |