§4 計算(1) 2 vb2005 | プログラミング実習 [Menu] | |
【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ドットのサイズで作成することにする。
メソッドの作成例として他にも考えられると思うが、2通りのものを示した。どちらがよいかの判断は難しい。
作成例(2)では呼び出し側のリストが短くなり効率的である。しかし、数値3を追加することになった場合、作成例(1)のメソッドは変更しなくて良いので保守性が高い。
このように、どのようなメソッドにするか、あるいはメソッドとしない場合も考えられるが、ケースバイケースであるので、プログラミングの経験を重ねるしかない。
§4 計算(1) 2 vb2005 | Copyright©2007 Hiroshi Masuda |