その場合、入力チェック用の関数などを作ってチェックをすると思います。
その場合の構造の提案です。
例としてMS Accessで考えてみます(なんでもいいんですが)
■仕様
- 会員ID、会員名、会員住所の必須入力チェックを行う。
- 入力チェックは、入力項目のエラーがあったら、それ以降の項目のチェックは行わない。
- エラーのあった項目にフォーカスをあてる
■画面イメージ
会員ID [ ]
会員名 [ ]
会員住所 [ ]
■ロジック
Private Sub 登録_Click()If 入力チェック() Then
' エラー
Exit Sub
End If
' 登録処理をここに実装
End Sub
' True..エラーなし False..エラーあり
Private Function 入力チェック() As Boolean
Dim msg As String
Dim error_item as Control
Do
'
' 会員ID必須入力チェック
If IsNull(会員ID) Then
msg = "会員IDは、必須入力です"
Set error_item = 会員ID
Exit Do
End If
'
' 会員名必須入力チェック
If IsNull(会員名) Then
msg = "会員名は、必須入力です"
Set error_item = 会員名
Exit Do
End If
'
' 会員住所必須入力チェック
If IsNull(会員住所) Then
msg = "会員住所は、必須入力です"
Set error_item = 会員住所
Exit Do
End If
Loop Until True
if msg = "" Then
入力チェック = False
Else
入力チェック = True
MsgBox msg, vbExclamation Or vbOkOnly, "入力エラー"
error_item.SetFocus
End If
End Function
■ポイントと解説
あまり考えないと、各項目エラーチェックをするかどうかを以前の項目でエラーがあったかのフラグを立ててチェックを行うと思います。ですが
エラーがあったら、エラーメッセージのセットとエラーのあった項目の保存をしてエラーチェックを一気に抜け、仕様のとおり、それ以降の項目チェックを行いません。
ロジックの赤字のところがポイントです。
Do Loopは、ループがしたいわけではなく、それ以降のロジックを実行したくないためにブロック構造を作り出すために使っています。
メリットとしては、以下のことがあります。
- 各入力項目は、他のエラー状態を考える必要がない
(ということは、入力チェックをする項目が増えた場合は、そのことだけを記述すればよい) - フォーカスのセッとメッセージ表示トロジックが1箇所にまとめられる
- 余計な変数を作る必要がない(弱い理由ですが)
これで、ちょっと改造しやすくて、わかりやすいプログラムができるのではないでしょうか?
0 件のコメント:
コメントを投稿