計算機用コードと自動計算

タグの編集
投稿者 ももこ  (学生) 投稿日時 2011/9/7 13:31:15
初めて質問させていただきます。ももこと申します。学校でVB講義を取り、VB2010を勉強し始めて2週間です。
教授から課題を出され、来週までに提出しなければならないのですが、全く持ってどうすればいいのかわかりません。
課題はアメフトの試合の得点を自動計算させる、所謂プラスオンリーの計算機を作れというもの。
ただ条件があり、
・使うのはテキストボックス5個(4つは数字入力、1つは合計の表示用)のみ。もしかしたらテキストボックス4つで合計表示用はラベルかもしれませんが・・・。
・数字を入力した時点で自動的に計算するようにしなければなりません。
授業でやったのはハローワールド的なもの、主なコントロールの紹介、変数です。
取り合えずデザインまではやったものの、それからどうすれば良いのかさっぱり・・・。ボタンもないとすると、どこにどうコードを書いたら良いのかすらわかりません。
自分でいろいろ調べたり試してみたりしましたが全て駄目でした。どのイベントを使い、どの変数を宣言し、どうコードを書いたらよいのか、皆さんの力を貸してくれませんか?

また、ためしにボタンをつけてここの講義、初級・変数と型の項目を見ながら作ってみたのですが、どうもうまく動かないのです。4つのテキストに一気に数字を入力した場合、計算結果が必ず1になり、また1つ1つ計算させてもどこかで答えが1になるのです。一応コードを乗せておきますが、どこがおかしいのでしょうか?
Public Class Form1

    Private Sub culculatebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles culculatebtn.Click
        On Error Resume Next
        Dim A As Integer
        Dim B As Integer
        Dim C As Integer
        Dim D As Integer
        A = Qtr1Atxtbox.Text
        B = Qtr2Atxtbox.Text
        C = Qtr3Atxtbox.Text
        D = Qtr4Atxtbox.Text

        FinalScoreA.Text = A + B + C + D
    End Sub
End Class

補足ですが、授業はオンラインコースなので教科書はあるもののほぼ独学という形になってます。もちろん、教科書にはそんなやり方は載っていません。教授に聞こうにも「出来る手を尽くしてそれでもできなければメールしなさい」と最初に言われ、頼りづらく。加えて海外の学校のため教科書も全て英語です。日本語の本やサイトも参考にしてますが、変数に入ってからいまいち意味が良くわからなくなってきました。

投稿者 ももこ  (社会人) 投稿日時 2011/9/7 13:42:29
トピ主です。ボタンつき計算機がおかしい件は解決しました。答えラベルのフォントサイズが大きすぎたようでした。お恥ずかしい限りです。
投稿者 たかくん  (社会人) 投稿日時 2011/9/7 14:30:08
初めまして、コードで気になった事があります。

 Private Sub culculatebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles culculatebtn.Click
         On Error Resume Next
         Dim A As Integer
         Dim B As Integer
         Dim C As Integer
         Dim D As Integer
         A = CInt(Qtr1Atxtbox.Text)
         B = CInt(Qtr2Atxtbox.Text)
         C = CInt(Qtr3Atxtbox.Text)
         D = CInt(Qtr4Atxtbox.Text)

         FinalScoreA.Text = CStr(A + B + C + D)
     End Sub
 End Class

上記のように数字は文字に文字は数字に変換してあげましょうね。(文字変換ToString()でもよし)

それと...テキストボックスに入力と同時に計算ですがテキストボックスのイベントでKeyDownイベント

というのがあります。

入力されたものが数字かどうかをまず判定しますね。

そして数字でなければイベントを脱出します。

数字だけを採用して計算しましょう。

あとChangedイベントもあるので参考にしてください。

プログラミングはしっかり悩んで調べて自力で頑張ってみてください。

乗り越えた時は最高に楽しいですよ。



投稿者 れお  (社会人) 投稿日時 2011/9/7 23:25:58
OKWaveで質問してるでしょ?
マルポ。マルコポーロの略ですけど。

http://okwave.jp/qa/q6994801.html

ここに書いといたぞ。

れお先生は、もうじきネット界から去るんで、よく読んでおきなさい。
投稿者 もちだ  (社会人) 投稿日時 2011/9/8 09:59:21
テキストボックスに入力する以上、イベントはたかくん氏の方法が無難だと思います。
(Timerを使用して一定時間毎に自動計算も考えましたが条件は満たさない感じですね)

ちょっとしたヒントというかサンプルというか…。
このくらいの入力系なら作るときに考慮すれば大体のエラーを排除できるので、
On Error Resume Nextなどは使わない方がいいかな、とは思います。
そういう指示なら仕方ないですが、エラーが起こってるのに続行すれば当然正常では無いので
値は変わってきます。

で、変数を宣言したら、代入して合計するより前にテキストボックスの値が数値であるかを検証します。
文字や空白を計算に含めると期待通りに動かないと思いますので、
(たぶん実行するとエラーになると思います。On Error Resume Nextを使うとそれでも続行するので値が…)
たとえばIsNumeric関数あたりで数値かどうかの判定をし、数値でなければ0を入れておくなどの工夫をしてやります。

If IsNumeric(TextBox1.Text) = True Then
    '数値として使用できる場合はAにテキストボックスの値を入れる 
    A = CInt(TextBox1.Text)
Else
    '数値でないときは0を入れる 
    A = 0
End If

こんな感じでテキストボックス4箇所のチェックを行って、合計を表示すればいいのではないでしょうか。
投稿者 ももこ  (学生) 投稿日時 2011/9/19 16:12:17
大変遅くなりましたことをお詫び申し上げます。
他の授業や引越しの事でバタバタしておりました;
れお先生よくわかりましたね。情報収集はいろいろなところでやるべきだと思いやってました。
今回の質問については、Leaveイベントを使うということでした。先生が実際にこのコードを使いなさい、と提示してくれたんです。こんな感じで↓
 Private Sub Qtr1Atxtbox_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Qtr1Atxtbox.Leave
        ' Culculate Qtr1 score ofTeamA
        Try
            ' Declare the variables 
            Dim Qtr1A As Integer = Qtr1Atxtbox.Text
            Dim Qtr2A As Integer = Qtr2Atxtbox.Text
            Dim Qtr3A As Integer = Qtr3Atxtbox.Text
            Dim Qtr4A As Integer = Qtr4Atxtbox.Text
            ' Calculate the value
            FinalScoreA.Text = Qtr1A + Qtr2A + Qtr3A + Qtr4A
        Catch ex As InvalidCastException
            ' Handle a numeric exception
            MsgBox("Enter numeric value")
            With Qtr1Atxtbox
                .Focus()
                .SelectAll()
            End With
        End Try
    End Sub
これを4個分コピペして終了、でした。
皆さん本当に有難うございました。
投稿者 ぺぺたろう  (中学生) 投稿日時 2011/9/19 18:18:42
4個分コピペするより一つのハンドラを共有した方がすっきりすると思います