連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第4回 トラブルは水際で防げ〜入力時のチェックとエラー処理

羽山 博
2006/11/22
Page1 Page2 Page3 Page4

ゴミを入れても肥料は出てきません!

Back Issue
1
VB 6の皆さん、これはもうVB 2005使うしかないでしょ
2 コントロール配列がなくても大丈夫!
3 VB 2005の“My”の便利さに脱帽!

 今年は暖冬といわれているが冬は冬。すでにはんてんを引っ張り出して仕事をしているのだが、寒いのが冬の仕事なんだからそれもしかたがない。南半球は暖かいだろうなあ、と数年前に訪れたニュージーランドに思いをはせたりしている。ニュージーランドといえば、人間より羊の数の方が多い国、ラグビーのオール・ブラックスや、マオリ族のハカという踊りに由来する彼らのパフォーマンス、最近ではワインの産地というイメージのある国だ。

 さすがに農業の国だけあって、国内の農産物を保護するため、検疫の厳しい国としても有名で、食品の持ち込みに関してはかなりうるさい。小心者の私は、飛行機の中で食べていたお菓子を到着前にあわてて胃袋の中へ放り込んだという記憶がある。それでも、税関の職員に2度も呼び止められ、食品や植物の種などを所持していないかチェックされた(聞くところによると、インスタントの味噌汁なども豆が入っているのでダメらしい)。

 問題のあるモノがひとたび入り込むと、ひどい場合には農作物や家畜が壊滅的なダメージを被ることにもなりかねない。もっとも、それはニュージーランドの農業に限ったことではなく、どの国でも危機管理が厳しいのは同じ。とりわけ麻薬や武器の持ち込みに関しては厳重なチェックがなされる。麻薬を所持しているだけで死刑という国もあるぐらいだ。トラブルのもとは水際で防ぐというのが基本であり鉄則なのだ。

 ……と、そんなよもやま話をするまでもなく、コンピュータ処理の場合にも同じようなことがいえる。もはや使い古された言葉だが、GIGO(Garbage In Garbage Out=ゴミを入れてもゴミしか出てこない)というのは開発者の常識。コンピュータは生ゴミ処理機ではないので、ゴミ(不正なデータ)が紛れ込まないように細心の注意を払う必要がある。

 もっとも「不正」という言葉は、設計者の立場からの見方であって、ユーザーの責任(バカなユーザーがまたへんなことをしやがった!)のように受け取られてしまうのは本意ではないので、あまり使いたくはないのだが、それはまた別の話なのでここでは触れないこととしよう。

 そんなわけで、今回は、設計者が想定するデータとは異なる形式やサイズのデータが入力されたとき、それがシステムの中に入り込むのを防ぐ方法について、要するに、入力チェックやトラブルからの回復(エラー処理)について見ていきたい。当然のことながら、入力が受け付けられなかったことをユーザーに正しくフィードバックする必要もある。

サンプル・プログラム4 − データベース検索のためのダイアログ

 今回のサンプル・プログラムも、重要なポイントが分かるように、できるだけシンプルなものにした。章のタイトルには「データベース検索のための」とあるが、実際にはデータベースを検索するわけではなく、それ以前の入力チェックのみを扱ったものだ。ともあれ、まずは実行例を見ておこう(図1)。


図1 プログラムの完成イメージ
8桁の商品コードを入力すると、データベースから当該の行を検索し、商品名と在庫数を表示するようなプログラムを考える。ここでは、以下の入力時チェックをまず取り扱う。
  商品コードを入力し、[Tab]キーやマウスのクリックでほかの項目に進む。正しいコードが入力されると、データベースが検索されると商品名や在庫数が表示され、入力フォーカスは[払出数]のテキストボックスに進むものと考えてほしい。
  商品コードは8桁固定となっているので、桁数が異なる入力に対してはエラー・メッセージを表示する。このとき、桁数の異なるデータがそのまま処理されてしまわないように、入力フォーカスの移動をキャンセルし、入力した内容が選択された状態になるようにする。

 このようなダイアログ・ボックスには、いいかげんうんざりしているという人も多いかもしれない。なにしろ、どんな業務でも、どんなプログラムでも、この手の入力は必要不可欠であり、しかも、本来の処理の流れから離れた退屈なコードが延々と記述されることになるからだ。とはいえ、先ほど述べたように入力チェックは極めて重要。できるだけスマートかつ確実に、水も漏らさぬチェックができるようにしたい。少し先走りになるが、今回利用する「道具」を一通り見ておこう。

 Visual Basic 5までは入力チェックのための洗練された方法がなかった。そこで、コントロールがフォーカスを失ったときに発生するLostFocusイベントや、コントロールがフォーカスを得たときに発生するGotFocusイベントを使ってチェックを行っていた。私自身、イベントの連鎖に悩まされた記憶がある。やむを得ず、フラグを立ててイベントの連鎖を回避していたものだ。

 Visual Basic 6(以下VB 6)では、Validateイベントが利用できるようになり、入力チェックがかなり楽になった。……はずなのだが、白状すると私自身、以前のクセが抜けきらなかったせいか、相も変わらずGotFocus/LostFocusイベントを使い続けていた(どうもValidateイベントを使ったという記憶がない)。

 Visual Basic 2005(以下VB 2005)では、コントロールがフォーカスを失った後で発生するValidatingイベントと、その後に発生するValidatedイベントを利用した、きめ細かな入力チェックができるようになっている。なお、テキストボックスの場合、GotFocusイベントとLostFocusイベントは、VB 2005ではそれぞれEnterイベント、Leaveイベントとなっている*1

*1 テキストボックスにはLostFocusイベントとGotFocusイベントはないが、それらがまったくなくなったわけではない。また、イベント発生の順序も、キーボードでの操作かマウスでの操作かによって異なる。さらには、フォーカスが移動するメソッドを使った場合も、その種類によってイベント発生の順序が異なる。

 一般的には、以下のような順序になる。

■キーボードの操作の場合

Enter → GotFocus → (ここで入力などの操作をした後、[Tab]キーなどで次のコントロールに移動) → Leave → Validating →Validated → LostFocus

■マウスの操作の場合

Enter → GotFocus → (ここで入力などの操作をした後、マウスで別のコントロールに移動) → LostFocus → Leave → Validating →Validated

■フォームをデザインする

 Validatingイベントの利用は後のお楽しみということにして、フォームのデザインから始めよう。フォームに必要な要素はラベル、テキストボックス、ボタンの3つだけ。ただし、図1の実行結果には表示されていないものもあるので、[デザイナ]ウィンドウですべてのコントロールを選択した状態の図を示しておく(図2)。


図2 フォーム上に配置するコントロール
図中の赤丸数字は次に示す表1の項目と対応付けるためのもの(タブオーダーではない)。 商品名を表示するためのラベル、 在庫数を表示するためのラベル、 警告のメッセージを表示するためのラベルには、いずれもテキストが設定されていない。

番号 コントロール プロパティ 設定値
フォーム Name frmInventory
Text 在庫確認・払出
AcceptButton btnOK
CancelButton btnCancel
FromBorderStyle FixedDialog
MaximizeBox False
MinimizeBox False
ラベル Name Label1
Text 商品コード(&C):
ラベル Name Label2
Text 商品名:
ラベル Name Label3
Text 在庫数:
ラベル Name Label4
Text 払出数(&S):
ラベル Name lblAlert
ForeColor Red
ラベル Name lblName
ラベル Name lblAmount
テキストボックス Name txtCode
ImeMode Disable
テキストボックス Name txtQuantity
ImeMode Disable
ボタン Name btnCancel
Text キャンセル
ボタン Name btnOK
Text OK
表1 コントロールに設定するプロパティとその値の一覧
赤丸数字は図2で示している各コントロールに対応している。

 主なプロパティの一覧は表1に示したとおり。図2の画面上に示した赤丸数字と対応付けて、一通り確認しておくといいだろう。

 注意すべき点がいくつかあるがさほど難しくはない。まず、フォームのAcceptButtonプロパティ。これは、[Enter]キーを押したときに選択されるボタンを指定する。いわゆるデフォルト・ボタンである。これにはbtnOKコントロール、つまり[OK]ボタンを指定する。一方のCancelButtonプロパティは[Esc]キーを押したときに選択されるボタン。こちらはbtnCancelコントロール、つまり[キャンセル]ボタンを指定しておけばよい。

 txtCodeコントロールとtxtQuantityコントロールのImeModeプロパティはDisabledに設定しておく。IMEの状態をプログラムの方で変更しておけば、ユーザーが異なる種類のデータを入力してしまうのを自然な形で防ぐことができる。ユーザーにとっても、入力文字種があらかじめ決められているので、操作がしやすくなる。簡単なことだが、効果は絶大だ。

 ただし、これは入力チェックのための機能ではなく、あくまでも入力の利便性を高めるための機能なので、不正なデータを完ぺきに除外できるわけではない。いくらImeModeプロパティをDisabledにして、IMEをオンにできなくしても[貼り付け]の操作を使って日本語文字を入力することはできる。従って、入力されたデータをチェックすることは絶対に必要だ。

 それ以外では、lblAlertコントロールのForeColorプロパティをRedにしておくことぐらい。これはエラー・メッセージを赤い文字で表示するためである。

 以上でフォームのデザインは終了。実はこのほかにも設定の必要なプロパティがあるのだが、そのあたりが今回の話のキモとなるところなので、コードを書きながら追って説明していこう。


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第4回 トラブルは水際で防げ〜入力時のチェックとエラー処理
  1.サンプル・プログラム4 − データベース検索のためのダイアログ
    2.Validatingイベントを使って入力チェック
    3.構造化例外処理を使おう
    4.統一感のある構造化例外処理とFinallyの落とし穴
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH