数回にわたってダイアログボックスの作り方についてまとめてきました。今回のその一連の記事の最後になります。
画面の作り方から始まり、初期値の与え方、入力チェックなど、実際のアプリ作成で必要となる手法を紹介しました。自由自在に作れるようになってくると、同じダイアログボックスを他のフォームや他のアプリで使いまわしたくなります。そこで、今回は、再利用についてまとめたいと思います。
ダイアログ再利用の例
例えば、下図のような部門選択ダイアログがあったとします。この画面をアプリ A、B、C で使うことを想像してください。各フォームでは、部と課のフィールド名が違います。特に、アプリ C では、1 つのフォームで 2 つの部門を必要としています。
このような場合どのように作るべきでしょうか?
@DialogBox で作ることを前提にすると、アプリ A と B では、部と課のフィールド名が違うダイアログフォームを作ることになります。アプリ C に至ってはフィールド名が異なるダイアログフォームを 2 種類用意する必要があります。
これでは、似て非なるフォームが多数生成され、煩雑で非効率で、将来のメンテナンス性は悪いと言わざるを得ません。しかし、この問題は、LotusScript の DialogBox メソッドを使えば、解決できます。
ダイアログフォームの修正
まずはダイアログ用のフォームを汎用的となるよう修正します。フォーム名には ”汎用” とわかるよう ”Std” を付け、フィールドには "dlg" と接頭文字を付加しています。
ポイントはメッセージ欄です。作成時の計算結果として dlgMsg フィールドを配置、初期値にメッセージを記述します。また、作成時の計算結果を指定するとフィールドの背景を透明にでき、メッセージを自然に表示できます。
[選択]ボタンの修正
続いて、呼び出し側のコードを次の通り書きなおします(最初の図のアプリ A の報告書フォームの場合)。
現在の文書 dlgCur とは別に、ダイアログボックス用の新規文書 ndDlg を作成しています。[OK]でダイアログを閉じると If 文に入り、選択結果を現在の文書に反映しています。
Sub Click(Source As Button) Dim ns As New NotesSession Dim ndb As NotesDatabase Dim ndDlg As NotesDocument 'ダイアログ用文書 Dim nuiw As New NotesUIWorkspace Dim nuid As NotesUIDocument Dim ndCur As NotesDocument '編集中の文書 Dim sTitle As String '編集中の文書の取得 Set nuid = nuiw.CurrentDocument Set ndCur = nuid.Document 'ダイアログ文書の準備 Set ndb = ns.CurrentDatabase Set ndDlg = ndb.CreateDocument 'タイトルのセット sTitle = "報告部門" '初期値のセット ndDlg.dlgMsg = sTitle & "を選択してください。" 'メッセージ If True = nuiw.DialogBox("dlgStdSetDept", True, True, , , , , sTitle & "の選択", ndDlg) Then '選択結果を反映 ndCur.Dept = ndDlg.dlgDept ndCur.Func = ndDlg.dlgFunc End If End Sub |
少々回りくどいコードに見えるかもしれませんが、別フォームで利用する場合を考えれば、この構造の良さがわかります。
例えば、アプリ B、問い合わせ管理フォームの場合は次のようになります。
Sub Click(Source As Button) ・・・ 'タイトルのセット sTitle = "問い合わせ部門" '初期値のセット ndDlg.dlgMsg = sTitle & "を選択してください。" 'メッセージ If True = nuiw.DialogBox("dlgStdSetDept", True, True, , , , , sTitle & "の選択", ndDlg) Then '選択結果を反映 ndCur.ReqDept = ndDlg.dlgDept ndCur.ReqFunc = ndDlg.dlgFunc End If End Sub |
ダイアログを一切変更することなく別のフォームでも利用出ることがわかります。
まとめ
社内のアプリ数が増え、メンテナンスすべきコード量が増えてくると、今回のような共通化、効率化が必要となってきます。共通部品を作成し揃えておくと、開発工数の削減だけでなく、アプリの構造がレイヤー分けされ、開発作業の分業化ができるようになります。アプリ開発者はアプリの仕様に専念できるので、エンドユーザに対してより良い活動をする時間が確保できます。
なお、今回の記事には、バグが潜んでいます。何かわかりますか?
共通化に伴い、ダイアログフォーム内のフィールド名を変更しました。その結果 ”課” 用のキーワードの式が正常動作しなくなるのです。忘れず修正しましょう。
@DbLookup("Notes":"NoCache"; ""; "vFunc"; dlgDept; 2) |
似て非なる設計要素を作るとこのようなバグが発生しやすくなります。これを抑制するためにも共通化をおススメします。
0 件のコメント:
コメントを投稿