KeyPressを使うには


のりがぁ=  2007-05-09 04:59:33  No: 136339

被検者にテンキーを押してもらうことで行う視力検査のプログラムを作っています。切れ目を上下左右のどこに出すかは、自動で行えるようにしましたが、披検者の答えがあっているかを見るプログラムが旨くいきません。ご教授お願い致します。以下が私が考えたプログラムです。
  
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

コードが長くなってしまい申し訳ありません。何卒宜しくお願い致します。


タカ  2007-05-09 06:28:43  No: 136340

デバッグ作業の依頼ですか?
なんと大胆な!


のりがぁ=  2007-05-09 06:57:53  No: 136341

患者の答えが合っているかを見るまでのコードは間違いなく動きます。KeyPressを使ってテンキーで2と4と6と8を使うと上手く↑←→↓を現せるのも分かるのです。2つを組み合わせようとすると上手くいかないのです。本当は、文章で書いてわかるようでそれが一番ご迷惑をかけず伺える方法だと思っています。しかし、上手く文章を書くことが出来ず、それならばいっそのことコードを全て公開したほうが的確な指摘を頂けるのではないかと思いました。お手数を掛けますが、重ねて宜しくお願い致します。


もげ  2007-05-09 17:30:10  No: 136342

フォームでキーイベントを受け取るのであれば、
Form.KeyPreview プロパティ  
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.form.keypreview(VS.80).aspx
を確認してみてください。


我龍院  2007-05-09 20:16:44  No: 136343

Private Sub Form1_KeyPress  の中の
Dim intSeikaisuu As Integer  が
Form1_KeyPressが呼び出される度にリセットされてしまうだけでは。
これをフォームレベルで宣言すれば良いと思いますが。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加