§4 計算(1) 2 vb2005 プログラミング実習 [Menu]
 back next 

【4】 入力データの検査

 数値1と数値2に入力された数字の文字列が、数値として正しいものであるかを検査する。正しいものでなければ、エラーメッセージを示して、再入力できるようにする。

(11) 加算の処理を次のように修正する。数値1だけを検査する。

    Private Sub TasuButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TasuButton.Click
        Dim x1 As Double, x2 As Double
        If IsNumeric(Data1.Text) Then        '数字の文字列の検査
            x1 = Val(Data1.Text)
        Else
            MsgBox("Error")        'メッセージを表示する
            Exit Sub                 'メソッドを抜ける
        End If
        x2 = Val(Data2.Text)
        Kotae.Text = Str(x1 + x2)
    End Sub
 IsNumeric関数は数字の文字列を検査する関数である。数値として正しいものであればTrue、正しくなければFalseを返却する。検査をする関数の名前は、Isで始まるものが多い。これは、"Is this OK ?" のIsである。
 Exit Sub命令は、ここでメソッドの処理を中断する命令である。

(12) プログラムを実行する。数値1と数値2を入力して、[加算]ボタンをクリックする。

結果 数値1に数字以外の文字を入力して、[加算]ボタンをクリックするとエラーメッセージが表示される。
 エラーメッセージのダイアログで、[OK]ボタンをクリックして、再度、正しい数字を入力することになる。このとき、カーソルが数値1の入力欄にあるようにすると、再入力がしやすくなる。次に、その処理を追加する。

(13) 加算の処理に次のように追加する。
 エラーメッセージで[OK]ボタンをクリックした後、カーソルが数値1の入力欄にあるようにする。

    Private Sub TasuButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TasuButton.Click
        Dim x1 As Double, x2 As Double
        If IsNumeric(Data1.Text) Then
            x1 = Val(Data1.Text)
        Else
            MsgBox("Error")
            Data1.Focus()            'カーソルをData1オブジェクトに設定する
            Data1.SelectAll()      'すべてのデータを選択状態にする
            Exit Sub
        End If
        x2 = Val(Data2.Text)
        Kotae.Text = Str(x1 + x2)
    End Sub
 Focusメソッドは、オブジェクトにフォーカスを設定する。
 フォーカスとは、選択されていて入力可能である状態を表す。(図参照)
 SelectAllメソッドは、入力されているデータを選択状態にする。この状態で入力すると上書き入力になるので消す手間が省ける。

(14) プログラムを実行する。数値1に数字以外の文字を入力して、[加算]ボタンをクリックする。

結果 エラーメッセージのダイアログで、[OK]ボタンをクリックすると、数値1の入力欄が選択状態になる。


 If Isnumeric(Data1.Text) Then は、If Isnumeric(Data1.Text) = True Then と同じ意味である。If文の書き方は複数考えることができる。次の2つのプログラムは、どちらも同じ働きをする。
    If IsNumeric(Data1.Text) Then
        x1 = Val(Data1.Text)
    Else
        MsgBox("Error")
        Data1.Focus()
        Data1.SelectAll()
        Exit Sub
    End If
    If IsNumeric(Data1.Text) = False Then
        MsgBox("Error")
        Data1.Focus()
        Data1.SelectAll()
        Exit Sub
    Else
        x1 = Val(Data1.Text)
    End If

(15) 数値2の入力欄(Data2)についても、数値1の入力欄と同じように数字の検査やデータの選択状態などの処理を追加する。

(16) [減算]、[乗算]、[除算]の処理を追加してプログラムを完成せよ。また、プログラム終了確認の処理も追加する。

 

【5】 メソッドの作成

 [加算]、[減算]、[乗算]、[除算]の処理をよく見比べると、最後の計算式「Kotae.Text = Str(x1 + x2)」以外は同じである。この部分をDataCheckメソッドとして作成する。

○ メソッド作成例(1)

    Private Sub TasuButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TasuButton.Click
        Dim x1 As Double, x2 As Double
        If DataCheck(Data1) Then
            x1 = Val(Data1.Text)
        Else
            Exit Sub
        End If
        If DataCheck(Data2) Then
            x1 = Val(Data2.Text)
        Else
            Exit Sub
        End If
        Kotae.Text = Str(x1 + x2)
    End Sub
 
    Private Function DataCheck(ByVal obj As TextBox) As Boolean
        If IsNumeric(obj.Text) Then    '数字検査
            DataCheck = True        '数字OK (返却値設定)
        Else
            MsgBox("Error")         '数字Erorr
            obj.Focus()
            obj.SelectAll()
            DataCheck = False      '返却値設定
        End If
    End Function
 作成したメソッドDataCheckは、数字検査とエラー処理を担当する。OKのときはTrue、エラーのときはFalseを値として返却する。このように、値を返却するメソッドはSubではなく「Function」として作成する。定義部の意味は次の通りである。
Private Function  DataCheck (ByVal  obj As TextBox )  As Boolean
 メソッド名  引数 返却値の型
 メソッドの返却値は「メソッド名=値」という形で記述する。
 DataCheck(Data1)としてメソッドを呼び出すと、()内のオブジェクトData1はメソッドで引数のobjで受け取る。メソッドの中ではobj=Data1ということになる。
 引数objの型をTextBox型としているが、obj As Objectとすることもできる。しかし、このメソッドではオブジェクトのTextBoxだけしか扱わないのでTextBox型としている。


○ メソッド作成例(2)

    Private Sub HikuButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HikuButton.Click
        Dim x1 As Double, x2 As Double
        If DataCheck2() Then
            x1 = Val(Data1.Text)
            x2 = Val(Data2.Text)
            Kotae.Text = Str(x1 - x2)
        End If
    End Sub
 
    Private Function DataCheck2() As Boolean
        If IsNumeric(Data1.Text) = False Then
            MsgBox("Error")
            Data1.Focus()
            Data1.SelectAll()
            DataCheck2 = False    '返却値設定
            Exit Function          'メソッドを抜けて呼び出し元に戻る
        End If
        If IsNumeric(Data2.Text) = False Then
            MsgBox("Error")
            Data2.Focus()
            Data2.SelectAll()
            DataCheck2 = False    '返却値設定
            Exit Function          'メソッドを抜けて呼び出し元に戻る
        End If
        DataCheck2 = True    '返却値設定
    End Function
 作成したメソッドDataCheck2は、2カ所の入力欄の数字検査とエラー処理を担当する。

(17) 作成例(1)または作成例(2)のどちらか一方のメソッドを使ってプログラムを修正する。


○ ボタンの表示

 ボタンのプロパティに"Image"プロパティがある。これまでボタンには機能を表す文字を表示してきたが、画像で示すこともできる。
 +、−、×、÷、4つの画像を用意して、ボタンの表示を画像に変更する。画像は32×32ドットのサイズで作成することにする。

  1. ボタンのTextプロパティを削除する。
  2. ボタンのImageプロパティの ... をクリックして、画像をリソースファイルに登録する。
  3. ボタンのSizeプロパティを「32,32」に設定する。
  4. ボタンのAutoSizeプロパティをTrueに設定する。
    → Sizeプロパティが38,38に変わる。このサイズが32×32ドットの画像に必要なサイズである。AutoSizeプロパティをFalseに戻して、Sizeプロパティを38,38に設定しても良い。

 

 メソッドの作成例として他にも考えられると思うが、2通りのものを示した。どちらがよいかの判断は難しい。
 作成例(2)では呼び出し側のリストが短くなり効率的である。しかし、数値3を追加することになった場合、作成例(1)のメソッドは変更しなくて良いので保守性が高い。
 このように、どのようなメソッドにするか、あるいはメソッドとしない場合も考えられるが、ケースバイケースであるので、プログラミングの経験を重ねるしかない。



 back next 
 §4 計算(1) 2 vb2005 Copyright©2007 Hiroshi Masuda 
inserted by FC2 system