これまで数回にわたり、ダイアログボックスの使い方を紹介してきました。前回、前々回 は検索条件を入力することをイメージした画面を紹介しました。
このような画面では、必須項目があり、それを入力しないとダイアログボックスを閉じられない( = [OK]ボタンが通らない)というような機能が欲しくなります。
そこで、今回は、ダイアログボックスの入力チェックを紹介します。
実現方法
通常のフォームの場合、入力チェックは保存時(QuerySave イベント)に行います。ですが、ダイアログボックスの場合、文書を保存しないのでこのイベントは使えません。
利用するのは、画面の閉じる前に発生する QueryClose イベントとなります。単純に使用すると[キャンセル]ボタンで閉じるときにもチェックされてしまいます。これを回避するために、ダイアログボックス用の機能、NotesUIDocument クラスの DialogBoxCanceled プロパティを使用します。このプロパティは True の場合、[キャンセル]ボタンでダイアログが閉じられたということうを表します。
入力チェックの例
例えば上記画面で期間(From、To)とエリア(Area)を必須にしたいとします。そのスクリプトは次のようになります。
Sub QueryClose(Source As Notesuidocument, Continue As Variant) Dim ns As New NotesSession Dim ndb As NotesDatabase Dim nd As NotesDocument '[キャンセル]時はチェックなしで閉じる If Source.DialogBoxCanceled Then Exit Sub '[OK]時の入力チェック Set ndb = ns.CurrentDatabase Set nd = Source.Document '期間(From) If nd.From(0) = "" Then Msgbox "期間を入力して下さい。", 16, ndb.Title Call Source.GotoField("Form") Continue = False Exit Sub End If '期間(To) If nd.To(0) = "" Then Msgbox "期間を入力して下さい。", 16, ndb.Title Call Source.GotoField("To") Continue = False Exit Sub End If 'エリア(Area) If nd.Area(0) = "" Then Msgbox "エリアを選択して下さい。", 16, ndb.Title Call Source.GotoField("Area") Continue = False Exit Sub End If End Sub |
構造はいたって単純です。
QueryClose は Continue 引数に False に変更する(初期値は True)と、閉じる操作をキャンセルします。そこで、[キャンセル]ボタンの操作であれば、有無を言わさず閉じるよう Exit Sub しています。
その後、対象のフィールドを順にチェックして、未入力であれば、エラーメッセージを表示して、Continue を False にして、処理を終了しています。これで、入力に不足があった場合、[OK]で閉じることができなくなります。
プリビュー時の注意
入力チェックを記述してからプリビュー表示する場合は、注意が必要です。プリビューを閉じるとき、DialogBoxCanceled は False となるので、入力チェック処理が稼働します。すべて入力しないとプリビューが閉じれなくなります。
万一、フィールド名を書き間違えた場合、入力するすべがなく、永久ループに陥ります。こうなると Designer を強制終了するしかないので、十分注意してください。
最後に
ここまで記事を書き終えた時点で何となく既視感があったのでチェックしたところ、昨年 4 月に、全く同じタイトル『ダイアログボックスの入力チェック』で記事を書いていました...。
ダイアログボックス関連の話の流れで仕方がなかったとご理解ください。