基本仕様 第 3 章 前の章 次の章

VB C# ALL プログラミング言語によるフィルタ (ここで選んだ言語で選別された説明や図だけが表示されます)

3. フックメソッド

.NET や Java のイベントは、 マウスやキーのアップ/ダウンなどハードウェアに密着したイベント体系になっています。 このような、いわばローレベルのイベント体系は、ユーザインタフェースを思い通りに制御するには都合がよいといえます。 しかし、ビジネスシーンに登場するイベント (たとえば注文を受けたとか月末のしめ) などとのギャップが大きいために、これらの間を埋めるためのプログラムを大量に必要とするのが普通です。

この問題の解決策を突き詰めていくと、 ハードウェアに密着したイベント体系よりも ビジネスシーンに登場するイベントに近いところでイベントを体系化すれば、 ギャップが小さくなる分だけ必要なプログラム量が少なくなることが分かります。 MANDALA.net のフックメソッド体系は、このような考えに基づいて設計されています。 つまり、.NET や Java のイベントハンドラがハードウェア側に近いとすれば、 フックメソッドは業務側に近い高いレベルにあるということができます。

この章には、フックメソッドについて、以下の順に記述してあります。

3.1 フックメソッド概説
   3.1.1 フックメソッドの書き方
   3.1.2 フックメソッドのパラメタ宣言列

3.2 項目フックメソッド
   3.2.1 データのチェックと表示に関するフックメソッド
   3.2.2 前処理と後処理に関するフックメソッド
   3.2.3 データ項目の意味や操作の案内に関するフックメソッド
   3.2.4 フォーカスの制御に関するフックメソッド
   3.2.5 その他のフックメソッド

3.3 フォーム対応のフックメソッド
   3.3.1 動作モードとその遷移に関するフックメソッド
   3.3.2 画面データの読込みに関するフックメソッド
   3.3.3 前処理と後処理に関するフックメソッド
   3.3.4 その他のフックメソッド
   3.3.5 補足説明 (その 1)
   3.3.6 補足説明 (その 2)
   3.3.7 補足説明 (その 3)


3.1 フックメソッド概説

フックメソッドは、普通の .NET や Java のイベントハンドラと同様に、 アプリ開発者が .NET や Java のメソッドとして記述するものです。 ここで 「記述するもの」 と言いましたが、 より正確には以下の説明のように新たな記述が必須というわけではありません。 すなわち、フックメソッドはソフトウェア部品として望ましい性質を備えているために、 すでに開発済のものが蓄積してあれば、 それをアプリ開発者がプロジェクトに組み込むだけで済む場合が多いので、 必ずしも新たに記述する (すなわちプログラミングする) 必要があるわけではありません。

フックメソッドという形態に標準化してプログラミングすることで、 実際にビジネスシーンに登場するイベントに近い分だけ プログラムが作りやすくなりますし、分かりやすくなります

ただしこの反面、フックメソッドでは細かなユーザインタフェースの制御がしにくくなります。 しかし、これはビジネス分野のアプリケーションではほとんど問題にならないことですし、 いざとなれば手作りイベントハンドラを混在させるという手段も用意されています。

問題があるかもしれない点としてもう一つ気になるのは、 ビジネスシーンに登場するイベントへの対応力かもしれません。 .NET や Java のローレベルのイベントハンドラは非常に細かなものなので、 それらを組み合わせることで、どのようなビジネスシーンにも対応できることが これまでの経験で分かっています。

これに対して、果たして、それほど細かくない MANDALA.net のフックメソッドを組み合わせることで、 どのようなビジネスシーンにも対応できるのかという点が気になるかもしれません。 これに関しては、これまでの経験では問題になっていないと申し上げる以外にありません。 理論的にこれでよいという証明はできないのですが、フックメソッドを組み合わせることで、 実際に様々なビジネスシーンにも対応できています。 今後、対応できないようなものに出くわす可能性がゼロとはいえません。 もしも、対応できないことが分かれば、現状のイベント体系に 新たなイベントを追加するという解決策もありますから心配はありません。

フックメソッドは、.NET や Java のイベントハンドラと比較してどこが異なるのか、その特徴を見てみましょう。

.NET や Java のイベントハンドラには、 操作性や制御に関係するプログラムと業務に関係するプログラムが混在しがちです。 これとは対照的に、 フックメソッドは、 操作性や制御に関係するプログラムが混在しにくいインタフェースになっています。 すなわち、業務に関係するプログラムだけを記述しやすいインタフェースになっているのです。 そして、操作性や制御に関係するプログラムを記述しなくてすむ分だけ、.NET や Java のイベントハンドラよりも、 フックメソッドの方が開発量が少なくてすむといえます。

.NET や Java のイベントハンドラは、各データ項目ごとに分かれていますが、 そのイベントハンドラの中に複数のデータ項目に関係するプログラムが混在することがあります。 これとは対照的に、フックメソッドは、 複数のデータ項目に関係するプログラムが混在しにくいインタフェースになっています。 すなわち、一つのデータ項目に関係するプログラムだけを記述しやすいインタフェースになっているのです。 ですから、フックメソッドは、各データ項目ごとに奇麗に分かれることになり、 再利用できる可能性が非常に高いといえます。

.NET や Java のイベントハンドラは再利用しにくかったのと比べて、 フックメソッドは再利用しやすいのです。

3.1.1 フックメソッドの書き方

フックメソッド名は、以下の例のように、 処理の対象を表す名前とアンダースコア "_" と フック名とを並べた形をしています。 ここで、処理の対象を表す名前 (すなわち一種のオブジェクト名) としては、 画面であれば画面略称を、項目であれば項目略称を、コントロールであればコントロール略称を用います (すなわち、プレフィックスを取り除いた名前を用います)。 また、フック名はそのフックメソッドの役割を象徴しており、 たとえば ErrorMsgCheck などのような名前になっています。 この役割をみれば、.NET や Java のハードウェアインタフェース依存のイベントよりも 業務プログラムに近づいたイベント体系になっていることがわかります。 なお、フック名としては英語名と日本語名がありますが、どちらを用いても同じですし、 アプリの中でこれらを混在して用いてもかまいません。

Friend Function Rensyuu_ErrorMsg(パラメタ宣言列) As Boolean
・・・


Friend Function CdBangou_Check(パラメタ宣言列) As Integer
・・・


Friend Function Rensyuu_エラー表示(パラメタ宣言列) As Boolean
・・・


Friend Function CdBangou_入力チェック(パラメタ宣言列) As Integer
・・・
internal bool Rensyuu_ErrorMsg( パラメタ宣言列 )
・・・


internal int CdBangou_Check( パラメタ宣言列 )
・・・


internal bool Rensyuu_エラー表示( パラメタ宣言列 )
・・・


internal int CdBangou_入力チェック( パラメタ宣言列 ) 
・・・
boolean Rensyuu_ErrorMsg( パラメタ宣言列 )
・・・


int CdBangou_Check( パラメタ宣言列 )
・・・


boolean Rensyuu_エラー表示( パラメタ宣言列 )
・・・


int CdBangou_入力チェック( パラメタ宣言列 ) 
・・・

上の例の中に、パラメタ宣言列 と書いてある部分ありますが、 これについては 「3.1.2 フックメソッドのパラメタ宣言」 をご参照ください。

フックメソッドにはフォーム対応のものとデータ項目対応のものがありますが、 特にデータ項目対応のデータ項目部品は再利用性が高い点に注目してください。 アプリ開発者は、以前に開発されたフックメソッドに何も変更を加えずにそのまま再利用したり、 場合によっては一部変更を加えて再利用したりするのが普通です。 ときとしてはフックメソッドのプログラムを新たに記述しなければならない場合もありますが、 それはそのデータ項目に対応するデータ項目部品が蓄積されていないときに限られます。 なお、データ項目部品の再利用性を高めるために、データ項目フックメソッドの中では、 特に許されている場合以外は他のデータ項目の値を変更することが禁止されています

一般に、業務プログラムは必要なフックメソッドを組み入れてから機械生成の指示を与えるとできあがります。 つまり、MANDALA.net に命じると、フックメソッドを糊付けしてアプリに仕立ててくれるわけです。 仕立てられた業務プログラムの中で、MANDALA.net は、 それぞれのフックメソッドの役割を果たすことが必要なときに、 それぞれのイベントを発生させて、フックメソッドを呼び出すことになります。 ですから、フックメソッドがそのフック名で象徴される 役割を担うようなプログラムになっていれば、全体として業務が遂行されることになります。

以下に、フォーム対応のものとデータ項目対応のものに分けて、 それぞれのフックメソッドの役割を一覧にします。

◇ 画面フックメソッド (各フック名とその役割)

Append (追加処理) 当画面のカレント画面データをファイルまたはデータベースに追加。
AppendChk (追加モード) 当画面を追加モードに移行してよいかどうかのチェック。
BeginPrg (実行開始処理) プログラムの開始時の当画面に関する初期設定処理。
Close (閉鎖) 当画面に関するファイルまたはデータベースのクローズなどの後処理。
Current (現画面) ファイルまたはデータベースから当画面の画面データの (再度) 読込みと画面への表示。
Delete (削除処理) 削除してよいかどうかのチェックの後に当画面の画面データをファイルまたはデータベースから削除。
ErrorMsg (エラー表示) 当画面へのエラーメッセージの表示。
First (先頭画面) 当画面に関する処理対象画面データ群の中の先頭の画面データの読込みと画面への表示。
Indicate (表示モード) 当画面を表示モードに移行してよいかどうかのチェック。
Init (前処理) 当画面に表示された画面データ (伝票データ) に関する前処理 (追加、表示および更新モードの場合だけ有効)。
Last (最終画面) 当画面に関する処理対象画面データ群の中の最終の画面データの読込みと画面への表示。
NextFh (次画面) 当画面に関する処理対象画面データ群の中のカレント画面データの次の読込みと画面への表示。
Open (開設) 当画面に関するファイルまたはデータベースのオープンなどの前処理。
Prev (前画面) 当画面に関する処理対象画面データ群の中のカレント画面データの一つ前の読込みと画面への表示。
SelectFh (選択モード) 当画面を選択モードに移行してよいかどうかのチェック、および処理画面対象データ群の決定とカレント画面データの指定。
Term (後処理) 当画面に表示された画面データ (伝票データ) に関する後処理 (追加および更新モードの場合だけ有効)。
Update (更新処理) 当画面のカレント画面データに関するファイルまたはデータベースの更新。
UpdateChk (更新モード) 当画面を更新モードに移行してよいかどうかのチェック。

以上のフック名は、「画面略称_フック名」 という順に並べることで、 フックメソッドの名前になります。

GetEvent (イベント処理) 指定された指示コントロールへの指示の受付けとその処理。

このフック名は、「コントロール略称_GetEvent」 という順に並べることで、フックメソッドの名前になります。

RelCheck (関係チェック) 指定された項目群に含まれるデータ項目間の関係チェック。

このフック名は、「項目群名_RelCheck」 という順に並べることで、 フックメソッドの名前になります。 なお、項目群名とは、いくつかのデータ項目の一まとまり (すなわち項目群) を識別するための名前であり、 画面略称や項目略称やコントロール略称と重ならないうに命名してください。

◇ データ項目フックメソッド (各フック名とその役割)

BeginPrg (実行開始処理) プログラムの開始時の当データ項目に関する初期設定処理。
Check (入力チェック) 当データ項目にインプットされたデータのチェックまたはその値の変更。
Close (閉鎖) 当データ項目に関するファイルまたはデータベースのクローズなどの後処理。
Derived (派生値) 他のデータ項目へのデータのインプットを契機とした、当データ項目への値の設定。
Furigana (振り仮名) 他のデータ項目へのデータのインプットを契機とした、当データ項目への値の設定。
Help (ヘルプ表示)  当データ項目に関するヘルプメッセージの表示。
Init (前処理) 画面データ (伝票データ) の中の当データ項目に関する前処理 (追加、表示および更新モードの場合だけに有効である)。
InitVal (初期値) 当データ項目への初期値の設定。
Master (マスタ保守) 当データ項目に関係するマスタファイルの更新プログラムの呼出し。
NextCtrl (次項目) 当データ項目の次にカーソルを移すコントロールの指定。
Open (開設) 当データ項目に関するファイルまたはデータベースのオープンなどの前処理。
Prompt (案内表示開始) 当データ項目に関する案内メッセージの表示。
RelInf (関連情報表示) 当データ項目に関係する情報を表示するプログラムの呼び出し。
Skip (スキップ) 当データ項目にフォーカスを留めるか次のデータ項目にスキップさせるかの判断。
SList (選択リスト) 当データ項目にインプットすべきデータの選択候補一覧 (選択リスト) の表示。
Term (後処理) 画面データ (伝票データ) の中の当データ項目に関する後処理 (追加および更新モードの場合だけに有効である)。
Unprompt (案内表示終了) 画面データ (伝票データ) の中の当データ項目に関する案内メッセージの消去。

以上のフック名は、「項目略称_フック名」 のような形に並べることで、フックメソッドの名前になります。

◇ フックメソッドの名前

フックメソッドの名前は、何に対応するものかによって、次の四つの形があります。 それぞれの形に関しては、その概要を上述してあり、さらに詳しい説明が 「フック一覧」 にあります。

特殊な用法ですが、上記の 項目略称_フック名、およびコントロール略称_フック名項目群名_フック名 に対応して、 次のような画面略称で修飾したフックメソッドの名前を用いることもできます。

このような画面略称で修飾したフックメソッドと修飾されていないものとがソース検索結果から同時に検出された場合に、 MANDALA.net による機械生成を施すと修飾された方が優先的に使用されるようになります。

この結果、画面略称で修飾する書き方を用いると次のことができます。

特定のフックメソッドの置換えとは、 複数のフックメソッドを含んだモジュールを一切変更せずに、 その中の特定のフックメソッドだけを置き換えることを意味します。 これは、次のようにして実現できます。 元のクラスは一切変更せずに、たとえば新たなクラスをプロジェクトに追加して、 その中に置き換えたいフックメソッドを記述して、 その名前を画面略称で修飾したものにする。 こうすると、画面略称で修飾されたものが優先的に使用されるので、 実質的に特定のフックメソッドを置き換えたことになります。

複数の MANDALA フォームから構成される大きなプロジェクトの場合、 複数の MANDALA フォームの中の同じ名前のデータ項目に対して共通のフックメソッドを使いたい場合もありますが、 そうしたくない場合もあります。 前者の場合、画面略称で修飾されないフックメソッド名を用いるようにしてください。 そして、後者の場合、すなわち複数の MANDALA フォームに同じ名前のデータ項目が含まれていて、 それぞれのデータ項目に対応するフックメソッドを異なるルーチンにしたい場合には、 画面略称で修飾されたフックメソッド名を用いるようにしてください。 こうすれば、どの MANDALA フォームに含まれているかに従って異なるものにできます。

3.1.2 フックメソッドのパラメタ宣言列

フックメソッドの中では、画面上の項目の値を参照して判定したり、計算したりすることが普通です。 このために、参照したい項目、およびそれが含まれる画面の FormBase インスタンスなどをフックメソッドのパラメタとして宣言します。 こうすることによって、それが参照できるようになります。

このように、パラメタ宣言に関しては、.NET や Java のイベントハンドラと MANDALA.net のフックメソッドとで違いがあります。
 .NET や Java のイベントハンドラのパラメタは、イベントの種類などによってその内容が固定的に決められています。 つまり、VB や C# がイベントハンドラを呼び出す際のインタフェースは、固定的だといえます。
 これに対して、MANDALA.net のフックメソッドのパラメタは、アプリ開発者が必要なものを宣言することになっています。 つまり、MANDALA.net がフックメソッドを呼び出す際のインタフェースは、アプリ開発者が指定できるようになっているのです。 このことによって、パラメタの宣言を見るだけで、そのフックメソッドが何を参照するのかを知ることができます。 ただし、フックメソッドの中で参照しないものまでもパラメタとして宣言すると、参照範囲がぼやけてしまいます。 ですから、パラメタとしては、フックメソッドの中で参照するものだけを宣言するようにしてください。

フックメソッドのインタフェースは、アプリ開発者が指定するのですが、 パラメタとして宣言できるのは、以下に示すパラメタ宣言のどれか一つ、またはこれらをカンマで区切って適当な順序に並べたものに限られています。 ここでは、このようなパラメタ宣言をカンマで区切って並べたもののことをパラメタ宣言列と呼ぶことにします。なお、パラメタ宣言が一つだけの場合も、パラメタ宣言が一つもない場合も便宜的にパラメタ宣言列と呼びます。

このようにパラメタ宣言列という言葉を定義すると、フックメソッドのパラメタの宣言部には、以下のようにパラメタ宣言列を記述すると言うことができます。

Friend Function フックメソッド名(ByVal fB As FormBase, _
    ByVal iB_項目略称 As ItemBase, _
    ByVal Cx_項目略称 As Integer) As Integer
internal int フックメソッド名( FormBase fB,
    ItemBase iB_項目略称,
    int Cx_項目略称 )
int フックメソッド名( FormBase fB,
    ItemBase iB_項目略称,
    int Cx_項目略称 )

パラメタ宣言列に含めることのできるパラメタ宣言には、以下があります。 これらのいくつかを選んでカンマで区切って適当な順序に並べるとパラメタ宣言列になります。 なお、可変部分を斜体 で示しているので、この部分は適当な文字列に変えてください。

ByVal 項目略称 As 型名
型名 項目略称
型名 項目略称
項目略称で示される項目の値を意味します。
ByRef 項目略称 As 型名
ref 型名 項目略称
項目略称で示される項目の値を意味します。 (これは、Check 系フックメソッドの中で自項目に対してだけで指定できるもので、 チェックした値を強制的に変更する場合に用います。)
型名 Di_項目略称
型名 di_項目略称
項目略称で示される項目の値を意味します。 (これは、Derived 系フックメソッドの中で用いた場合に派生元項目とみなされない他は、上記の書き方と同じです。)
ByVal Di_This As 型名
型名 Di_This
型名 di_this
このフッククラスに対応する項目の値 (自項目の値) を意味します。 (いくつかのフッククラスの親クラスの場合には、項目略称が定まらないのでこの書き方が便利です。)
ByRef Di_This As 型名
ref 型名 Di_This
このフッククラスに対応する項目の値 (自項目の値) を意味します。 (これは、Check 系フックメソッドの中で自項目に対してだけで指定できるもので、 チェックした値を強制的に変更する場合に用います。いくつかのフッククラスの親クラスの場合には、項目略称が定まらないのでこの書き方が便利です。)
型名 Su_項目略称
型名 Su_項目略称
項目略称で示される項目を合計した値を意味します。Su_ というプレフィックスの代わりに 計_ と書くこともできます。 (これは、ボディ部または拡張ボディ部の項目の場合だけ指定することができます。そして、この項目の型は、十進数または整数に限られます。)
型名 Ex_項目略称
型名 ex_項目略称
項目略称で示される項目の以前の値を意味します。Ex_ というプレフィックスの代わりに 前_ と書くこともできます。
ByVal Ex_This As 型名
型名 Ex_This
型名 ex_this
このフッククラスに対応する項目の以前の値 (自項目の以前の値) を意味します。 (いくつかのフッククラスの親クラスの場合には、項目略称が定まらないのでこの書き方が便利です。)
int Cx_項目略称
int cx_項目略称
項目略称で示される項目のインデックス (識別番号) を意味します。Cx_ というプレフィックスの代わりに 識_ と書くこともできます。 (セントラル側に配置するフックメソッドには、このパラメタ宣言を指定することができません。)
ByVal Cx_This As Integer
int Cx_This
int cx_this
このフッククラスに対応する項目のインデックス (自項目の識別番号) を意味します。 (いくつかのフッククラスの親クラスの場合には、項目略称が定まらないのでこの書き方が便利です。セントラル側に配置するフックメソッドには、このパラメタ宣言を指定することができません。)
Control Ct_項目略称
Control ct_項目略称
項目略称で示される項目に対応するコントロールを意味します。Ct_ というプレフィックスの代わりに 項_ と書くこともできます。 (セントラル側に配置するフックメソッドには、このパラメタ宣言を指定することができません。)
ByVal Ct_This As Control
Control Ct_This
JComponent ct_this
このフッククラスに対応する項目に対応するコントロール (自コントロール) を意味します。 (いくつかのフッククラスの親クラスの場合には、項目略称が定まらないのでこの書き方が便利です。セントラル側に配置するフックメソッドには、このパラメタ宣言を指定することができません。)
ItemBase iB_項目略称
ItemBase iB_項目略称
項目略称で示される項目の詳細情報識別子 (ItemBase インスタンス) を意味します。iB_ というプレフィックスの代わりに 詳_ と書くこともできます。
ByVal iB_This As ItemBase
ItemBase iB_This
ItemBase iB_This
このフッククラスに対応する項目の詳細情報識別子 (自項目の ItemBase インスタンス) を意味します。 (いくつかのフッククラスの親クラスの場合には、項目略称が定まらないのでこの書き方が便利です。)
FormBase fB
FormBase fB
この画面の詳細情報識別子 (自画面の FormBase インスタンス) を意味します。
Form My_Form
JFrame my_form
この画面のフォームインスタンス (自画面のインスタンス) を意味します。As Form の代わりに Fr_ というプレフィックスで始まるフォームのクラス名を用いて As フォームのクラス名 と書くこともできます。 (セントラル側に配置するフックメソッドには、このパラメタ宣言を指定することができません。)
int De_Index
int de_index
フォーカスされた項目 (ボディ項目または拡張ボディ項目) が含まれる明細行の明細行インデックス (0 から始まる) を意味します。 ただし、フォーカスがボディ部または拡張ボディ部にないときには -1 になります。 (これは、項目フックメソッド BeginPrg, BeginPrgALcl, Open, OpenALcl, Close, CloseBLcl 以外の項目フックメソッドの中で指定できます。 また、画面フックメソッド GetEvent, EachItem, RelCheck, RelCheckLC の中でも指定できます。)
int Cd_Error
int cd_error
入力された項目をチェックした結果のエラーコードを意味します。 (これは、項目フックメソッド Response および画面フックメソッド ErrorMsg の中だけで指定できます。)
string Ji_Furigana
String ji_furigana
振り仮名の文字列を意味します。 (これは、項目フックメソッド Furigana の中だけで指定できます。)
object Rm_Object
Object rm_object
ローカル・セントラル間で送受信されるリモートオブジェクト (<Serializable()> 指定をした Public Class) を意味します。 (これは、項目フックメソッド Central, Local および画面フックメソッド Central, Local の中だけで指定できます。)

パラメタ宣言の中の項目略称 としては、 MANDALA.net に制御されるヘッド部、ボディ部、拡張ボディ部、テール部の文字入出力コントロールの項目略称を指定します。 つまり、文字入出力コントロール名から先頭の 3 文字のプレフィックス "Hd_", "Bd_", "Ed_" または "Tl_" を取り除いた名前です。 あるいは、バーチャル項目名からプレフィックス "Hv_", "Bv_", "Ev_" または "Tv_" を取り除いた名前です。

パラメタ宣言の中の項目略称の型名 は、総括表のの指定に依存します。
 総括表に、コード名称メモ、または日付と指定した場合には、String または string とします。
 総括表に、真偽値と指定した場合には、Boolean または bool とします。
 総括表に、十進数と指定した場合には、WrpDecimal または Decimal または decimal とします。
 総括表に、整数と指定した場合には、WrpInteger または Integer または int とします。
 総括表に、Object と指定した場合には、Object または object とします。

パラメタ宣言の中の項目略称の型名 は、総括表のの指定に依存します。
 総括表に、コード名称メモ、または日付と指定した場合には、String とします。
 総括表に、真偽値と指定した場合には、Boolean または boolean とします。
 総括表に、十進数と指定した場合には、BigDecimal とします。
 総括表に、整数と指定した場合には、Integer とします。
 総括表に、Object と指定した場合には、Object とします。


3.2 データ項目フックメソッド概説

データ項目フックメソッドは、全部で 16 種類あります。 これらは、次の五つに分類して捉えると理解しやすいでしょう。

データ項目フックメソッドは、.NET や Java のコントロールに関するイベントハンドラと同様に、データ項目に対するイベントとして記述します。 なお、以下ではそのデータ項目のことを当データ項目と呼んでいます。

3.2.1 データのチェックと表示に関するフックメソッド

次の 2 種類のイベントは、データのチェックと表示に関するものであり、 特に先頭の二つは使用頻度が高いものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

Check (入力チェック) 当データ項目にインプットされたデータのチェックまたはその値の変更のために、 当データ項目へのデータのインプットが完結したときに呼び出される。
Derived (派生値) 当データ項目に関係する他のデータ項目 (派生元項目) に対するデータのインプットなどを契機として当データ項目に値を設定して表示するために、 派生元 (影響を与える元) のデータ項目の Check が済んだときに呼び出される。
Furigana (振り仮名) 当データ項目に関係する他のデータ項目 (派生元項目) に対するデータのインプットなどを契機として当データ項目に振り仮名を設定して表示するために、 派生元 (影響を与える元) のデータ項目へのインプットに応じて呼び出される。

Check (入力チェック) フックメソッドは、 アプリ操作者が入力項目に対してインプットしたデータのチェックを行います。 また、チェックした上でデータの値を変更することもできます。 チェックの結果がエラーの場合には、 これに続いて後述の ErrorMsg (エラー表示) フックメソッドが呼び出されます。

Derived (派生値) フックメソッドは、 原則としてアプリ側からある値を当データ項目に設定してディスプレイ画面に表示します。 これが呼び出されるのは、当データ項目に関係する他のデータ項目 (派生元項目) にアプリ操作者がデータをインプットした場合であることに注意してください。 なお、初期値派生の指定をした場合には、 当データ項目の派生元項目に対してフックメソッド初期値 (InitVal) による初期値の設定の際にも呼び出されます。

Furigana (振り仮名) フックメソッドは、 原則としてアプリ側からある振り仮名を当データ項目に設定してディスプレイ画面に表示します。 これが呼び出されるのは、当データ項目に関係する他のデータ項目 (派生元項目) にアプリ操作者がデータをインプットした場合であることに注意してください。

3.2.2 前処理と後処理に関するフックメソッド

次の 6 種類のイベントは、前処理と後処理に関するものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

BeginPrg (実行開始処理) 当データ項目に関するプログラムの開始時の初期設定処理のために、 プログラムの実行を開始して、画面を表示する直前に 1 回だけ呼び出される。
Open (開設) 当データ項目に関するファイルまたはデータベースのオープンなどの前処理のために、 画面を初めて表示した直後に 1 回だけ呼び出される。
Init (前処理) 各トランザクションの中の当データ項目に関する前処理のために、 入力トランザクションまたは表示トランザクションの処理を開始するとき (トランザクションごとに) に呼び出される。
InitVal (初期値) 当データ項目への初期値の設定のために、 入力トランザクションまたは表示トランザクションの処理を開始するときに (トランザクションごとに) 呼び出される。
Term (後処理) 各トランザクションの中の当データ項目に関する後処理のために、 入力トランザクションまたは表示トランザクションの処理を終えるときに (トランザクションごとに) 呼び出される。
Close (閉鎖) 当データ項目に関するファイルまたはデータベースのクローズなどの後処理のために、 プログラムの終了指示がなされたときに呼び出される。

Init (前処理) と InitVal (初期値) と Term (後処理) は、トランザクションごとの前処理や後処理をするためのフックメソッドであり、 トランザクションを処理するごとに呼び出されます 。

BeginPrg (実行開始処理) と Open (開設) と Close (閉鎖) は、 アプリケーションの前処理や後処理をするためのフックメソッドであり、 アプリケーションの開始や終了の時点に呼び出されます。 前処理のためには、BeginPrgOpen の二つがありますが、 前者は画面を表示する直前に、後者は画面を初めて表示した直後にそれぞれ 1 回だけ呼び出されます。 ファイルまたはデータベース関係の処理は、時間がかかるものもありますから、 そういう処理は何はともあれ画面を表示してから行うことをお勧めいたします。 さもないと、アプリ操作者が画面を見ることのできない不安な時間を長くすることになります。

これら前処理と後処理に関するフックメソッドのうち、 InitVal を除く 5 種類については、データ項目対応のものだけでなく、 画面フックメソッドもあります。したがって使い分けが問題になりますが、 特定のデータ項目固有の前処理や後処理は、 ここに説明のあるデータ項目フックメソッドを用いるのがよい。

3.2.3 データ項目の意味や操作の案内に関するフックメソッド

次の 4 種類のイベントは、データ項目の意味や操作の案内に関するものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

Help (ヘルプ表示) 当データ項目に関するヘルプメッセージの表示のために、 アプリ操作者から Help 指示がなされたときに呼び出される。
SList (選択リスト) 当データ項目にインプットすべきデータの選択候補一覧 (選択リスト) の表示のために、 アプリ操作者から当データ項目に対して SList 指示がなされたときに呼び出される。
Prompt (案内表示開始) 当データ項目に関する案内メッセージの表示のために、 当データ項目にフォーカスが移ってきたときに呼び出される。
Unprompt (案内表示終了) 当データ項目に関する案内メッセージの消去のために、 当データ項目から他のデータ項目にフォーカスが移るときに呼び出される。

Help (ヘルプ表示) と SList (選択リスト) は、 アプリ操作者から要求があった場合に動作する、いわば手動の案内です。 これとは対照的に、Prompt (案内表示開始) と Unprompt (案内表示終了) は、 アプリ操作者から特別の要求がなくても動作する、いわば自動の案内です。

3.2.4 フォーカスの制御に関するフックメソッド

次の 2 種類のイベントは、フォーカスの制御に関するものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

Skip (スキップ) フォーカスをスキップするかどうかの判断のために、 当データ項目にフォーカスが移ってきたときに呼び出される。
NextCtrl (次項目) 次にフォーカスを移すべきコントロールを指定するために、 当データ項目から他のデータ項目にフォーカスが移るときに呼び出される。

あらかじめフォーカスの動き方が固定的に決まっている場合には、 総括表のフォーカスパスの指定だけで済みます。 しかし、アプリの動作中にダイナミックにフォーカスの動き方を制御したい (変更したい) ような場合には、固定的な総括表のフォーカスパスの指定だけでは済みません。 そんなときには、これらのフックメソッドを使用するか、 またはダイナミックに総括表の内容を書き換えるメソッド fB.SetFocusLogically を使用してください。

Skip (スキップ) は、 当データ項目にフォーカスが移ってきたとき、 NextCtrl (次項目) は、 当データ項目からフォーカスが移るときに働きます。

3.2.5 その他のフックメソッド

次の 2 種類のイベントは、上記の四つの分類に入らないものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

Master (マスタ保守) 当データ項目に関係するマスタファイルの更新プログラムを呼出すために、 アプリ操作者から Master 指示がなされたときに呼び出される。
RelInf (関連情報表示) 当データ項目に関係する情報を表示するプログラムを呼出すために、 アプリ操作者から RelInf 指示がなされたときに呼び出される。

Master (マスタ保守) は、 ある入力項目にコードデータをインプットしようとしたケースにおいて、 そのコードが未登録の場合にその場でコードを登録するような場合に使うことを想定しています。

また、RelInf (関連情報表示) は、 ある入力項目にデータをインプットしようとしたケースにおいて、 インプットするデータを決定する上で参考になるような情報を 表示するために使うことを想定しています。


3.3 画面フックメソッド概説

画面フックメソッドは、全部で 20 種類あります。 これらは、次の四つに分類して捉えると理解しやすいでしょう。

画面フックメソッドは、.NET や Java のフォームに関するイベントハンドラと同様に、 画面に対するイベントとして記述します。 なお、以下ではそのフォーム (MANDALA フォーム) のことを当画面と呼んでいます。

一般に、画面フックメソッドは画面に対するイベントとして記述するのですが、 GetEvent (イベント処理) と RelCheck (関係チェック) の二つは例外です。 GetEvent は、 指示コントロールに対するイベントとして記述しますし、 RelCheck は、 項目群に対するイベントとして記述します。

3.3.1 動作モードとその遷移に関するフックメソッド

MANDALA.net を用いると、一つの画面でデータのエントリ (追加) 処理も照会 (表示) 処理も更新処理も削除処理も行うようなアプリを簡単に開発することができます。 このように多彩な芸当を自在に行わせる画面 (マルチ機能画面) にするには、 どの処理を行うべき (行える) 状態なのかを区別できなければなりません。 動作モードとは、このような処理に関する状態を意味しています。

動作モードには、追加,選択,表示,更新の 4 種類があります。それぞれの意味は、次の通りです。

追加モード データのエントリを受け付けて、 ファイルやデータベースにデータを追加する処理を行うべき状態。
選択モード データの表示や更新や削除に先立って、 ファイルやデータベースのデータを選択する処理を行うべき状態。
表示モード 選択されたファイルやデータベースのデータを画面に表示する処理を行うべき状態。
更新モード 選択されたファイルやデータベースのデータを画面に表示して、 データの更新や削除の受付け処理を行うべき状態。

ちなみに、動作モードは、MANDALA.net コード合成ツールによって機械生成される動作モードの表示域 (Tx_Mode というコントロール) に表示されますから、 アプリのデバッグの際にここを見ればどの動作モードになっているのか一目で分かります。

次の 7 種類のイベントは、動作モードの遷移に関するものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

AppendChk (追加モード) 追加モードへの移行の可否のチェックのために、 当画面を追加モードに変える指示 (AppendC 指示) がなされたときに呼び出される。
Append (追加処理) 当画面のカレント画面データをファイルまたはデータベースに追加するために、 当画面が追加モードの際にアプリ操作者からデータ登録の指示 (Execute 指示) がなされたときに呼び出される。
Select (選択モード) 選択モードへの移行の可否のチェックと処理対象画面データ群の決定と画面データ識別子の初期値の設定のために、 当画面を選択モードに変える指示 (SelectCm 指示) がなされたときに呼び出される。
Indicate (表示モード) 表示モードへの移行の可否のチェックのために、当画面を表示モードに変える指示 (Indicate 指示) がなされたときに呼び出される。
UpdateChk (更新モード) 更新モードへの移行の可否のチェックのために、 当画面を更新モードに変える指示 (UpdateC 指示) がなされたときに呼び出される。
Update (更新処理) 当画面のカレント画面データに関するファイルまたはデータベースの更新 (および追加・削除) のために、 当画面が更新モードの際にアプリ操作者からデータ登録の指示 (Execute 指示) がなされたときに呼び出される。
Delete (削除処理) 削除の可否のチェックを行い、 当画面のカレント画面データをファイルまたはデータベースから削除するために、 当画面が更新モードの際にアプリ操作者からデータ削除の指示 (DeleteCm 指示) がなされたときに呼び出される。

なお、動作モードの切換えのためには、 アプリ操作者が動作モードの切換えの指示を与えることができるように、指示コントロール (Cm_AppendC, Mn_AppendC, Cm_SelectCm, Mn_SelectCm, Cm_Indicate, Mn_Indicate, Cm_UpdateC, Mn_UpdateC など) を画面上に設けておくことが必要です。

◇ 動作モードの遷移に関する各フックメソッドの役割

Append (追加処理), Update (更新処理), Delete (削除処理) の各フックメソッドは、 ファイルまたはデータベースに対して、それぞれ追加、 更新 (および追加・削除)、削除の処理を行うべき状況になったときに呼び出されます。 つまり、画面上に意味のあるデータが整い、 アプリ操作者から (そのデータに関する何らかの処理を行うべく) Execute 指示または DeleteCm 指示がなされたときに呼び出されます。

これらのフックメソッドの役割としては、 単にファイルまたはデータベースの一つのレコードに関する追加、 更新 (および追加・削除)、削除の処理をすればよいのではありません。 画面の中のすべてのデータに対して必要に応じて追加、更新 (および追加・削除)、 削除の処理をすべきことに注意してください。 いわばこれらのフックメソッドの役割は、 それぞれ画面データ追加、画面データ更新 (および追加・削除)、 画面データ削除を行うということができます。

この三つのフックメソッドのうち Update フックメソッドの役割は、特に注意が必要です。 単にボディ部の各明細に関する更新処理をすればよいわけではなく、 各明細について更新・追加・削除の必要性を判断して適切な処理をしなければならないからです。 なぜ追加や削除の処理を必要とするのかというと、 アプリ操作者が明細を追加したり削除した後にデータ登録の指示 (Execute 指示) をする場合があるからです。

蛇足ですが、データベース系のツール (または第四世代言語) の中には、 明細の追加、更新、削除の処理を自動化しているものもあります。しかし、 画面全体のデータの整合性を無視して、画面上に一塊の意味あるデータが整う前に、 個々の明細ごとにデータの追加、更新、削除の処理をしてしまうものもあるので注意が必要です。 このような処理を行うとファイルまたはデータベースの一貫性が保てなくなり、 ビジネス分野においては実用に供せるとはいえません。

◇ 動作モードの遷移

動作モードは、アプリ画面がどの処理を行うべき (行える) 状態なのかを表しています。 動作モードには、追加,選択,表示,更新の 4 種類があります。

プログラムが開始したときに、最初にどの動作モードになるのかは、 アプリの型と動作モードの遷移に関するフックメソッドの内容によって決まります。

具体的にいうと、アプリの型が 「データエントリ」 または 「データエントリ更新」 の場合には、プログラムの開始時に追加モードになります。

また、アプリの型が 「データ照会」 または 「データ更新」 の場合には、 プログラムの開始時に選択モードになります。 ただし、選択モードになったということは、アプリ操作者に意識させるアプリもありますし、 意識させないアプリもあります。 アプリ側からアプリ操作者にどのデータを表示する (またはどのデータを表示して更新する) のかを問い合わせるようにプログラムしておけば、 アプリ操作者は選択モードになったことが分かります。 しかし、あらかじめ決めてあるデータを表示するように (表示して更新できるよう) プログラムしておけば、アプリ操作者は一時的に選択モードになったことに気が付かず、 プログラムの開始と同時に表示モードまたは更新モードになったと思うことでしょう。

動作モードの遷移は、アプリ操作者の指示と動作モードの遷移に関するフックメソッドの内容によって決まります。

アプリ操作者が追加,選択,表示,更新のいずれかの動作モードに移ることを指示した場合には、 それぞれ AppendChk (追加モード), Select (選択モード), Indicate (表示モード), UpdateChk (更新モード) の各フックメソッドが呼び出されます。 これらのメソッドの中では 「アプリ操作者の指示通りにするかしないか」 を選ぶことができます。

なお、アプリ操作者があいまいな指示 (たとえば、追加モードからデータの選択をせずに直接、 表示モードや更新モードに移行するような指示) をしないように、 MANDALA.net はこれらの遷移を禁止しています。

動作モードの遷移は、アプリ操作者の指示に従うだけでなく、 あらかじめプログラムしておくこともできます。

具体的にいうと、Append (追加処理), Select (選択モード), Update (更新処理), Delete (削除処理) の各フックメソッドの処理を終えるときに、 戻り値によって次にどの動作モードになるのかを指定できます。

たとえば、追加モードから選択モードに移った場合に、 選択モードの後に表示モードにするのか更新モードにするのかは、 Select フックメソッドの戻り値で指定できます。

3.3.2 画面データの読込みに関するフックメソッド

次の 5 種類のイベントは、画面データの読込みに関するものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

First (先頭画面) 処理対象画面データ群の中の先頭の画面データを読み込んで表示するために、 当画面の先頭の画面データに移れという指示 (First 指示) がなされたときに呼び出される。
NextFh (次画面) 処理対象画面データ群の中のカレント画面データの次を読み込んで表示するために、 当画面の次の画面データに移れという指示 (NextCm 指示) がなされたときに呼び出される。
Current (現画面) カレント画面データをファイルまたはデータベースから (再度) 読み込んで表示するために、 当画面のカレント画面データを読み込むことが必要なときに呼び出される。
Prev (前画面) 処理対象画面データ群の中のカレント画面データの一つ前を読み込んで表示するために、 当画面の一つ前の画面データに移れという指示 (Prev 指示) がなされたときに呼び出される。
Last (最終画面) 処理対象画面データ群の中の最終の画面データを読み込んで表示するために、 当画面の最終画面のデータに移れという指示 (Last 指示) がなされたときに呼び出される。

表示モードおよび更新モードの場合には、まず画面上にデータを表示することが普通ですが、 これは Current (現画面) フックメソッドが行います。 すなわち、Select (選択モード) フックメソッドによって決定された画面データを Current フックメソッドが読み込んで表示することになります。 この後は、アプリ操作者の指示に従って、たとえば次の画面に移るように指示されれば NextFh (次画面) フックメソッドが呼び出されるというように、 それぞれ該当するフックメソッドが呼び出されて、 指示された画面データを読み込んでは画面に表示することになります。

これらのフックメソッドでは、 単にファイルまたはデータベースの 1 レコードを読み込むのではなく、 画面上に表示すべきデータをすべて読み込んで画面上に表示すべきことに注意してください。 たとえば、ボディ部をもつ画面の場合には、 ボディ部の各明細に表示すべきデータをすべて読み込んで画面上に表示することが必要です。

◇ 処理対象画面データ群と画面データ識別子

ここで処理対象画面データ群と呼ばれる概念を導入します。 これは、画面データの読込みに関するフックメソッドが「読込みの対象にする画面データ」の集合であり、 ある方法で順序づけられているものとします。 順序づけの方法は、ダイナミックに変化してもかまいませんが、 とにかくある時点をとると順序が決まるようにしてください。

この概念を用いて表現すると、 Select (選択モード) フックメソッド によって処理対象画面データ群が決定されるので、 First (先頭画面) フックメソッドの役割はその中の先頭の画面データ (一般に画面データは複数のレコードからなるかもしれません) を読み込むことですし、Last (最終画面) フックメソッドの役割はその中の最終の画面データを読み込むことだということができます。

また、ここで画面データ識別子と呼ばれる概念を導入します。 これは、処理対象画面データ群のうち、 画面に表示されるべき画面データを指し示すポインタです。

これらの概念を用いて表現すると、フックメソッド Current (現画面), NextFh (次画面), Prev (前画面) の各フックメソッドが読み込むべき画面データは、 それぞれこのポインタの指す画面データそのもの、その次の画面データ、 その一つ前の画面データであるということになります。 そして、フックメソッド Select フックメソッドの主な役割は、 処理対象画面データ群の決定、 および画面データ識別子にある値 (初期値) を設定することによって、 画面に表示すべき画面データを明確にすることであるといえます。

3.3.3 前処理と後処理に関するフックメソッド

次の 5 種類のイベントは、前処理と後処理に関するものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

BeginPrg (実行開始処理) プログラムの開始時の当画面の初期設定処理のために、 プログラムの実行を開始して画面を表示する直前 に 1 回だけ呼び出される。
Open (開設) 当画面に関するファイルまたはデータベースのオープンなどの前処理のために、 画面を初めて表示した直後に 1 回だけに呼び出される。
Init (前処理) 当画面に表示された画面データ (伝票データ) に関する前処理のために、 入力伝票または表示伝票の処理を開始するときに (画面データごとに) 呼び出される。
Term (後処理) 当画面に表示された画面データ (伝票データ) に関する後処理のために、 入力伝票または表示伝票の処理を終えるときに (画面データごとに) に呼び出される。 なお、呼び出されるのは Append または Update の後である。
Close (閉鎖) 当画面に関するファイルまたはデータベースのクローズなどの後処理のために、 プログラムの終了指示がなされたときに呼び出される。

Init (前処理) と Term (後処理) は、 画面データ (伝票データ) ごとの前処理や後処理をするためのフックメソッドであり、 新たな画面データ (伝票データ) を処理するごとに呼び出されます 。

BeginPrg (実行開始処理) と Open (開設) と Close (閉鎖) は、 アプリの前処理や後処理をするためのフックメソッドであり、 アプリの開始や終了の時点に呼び出されます。 前処理のためには、BeginPrgOpen の二つがありますが、 前者は画面を表示する直前に、後者は画面を初めて表示した直後にそれぞれ 1 回だけ呼び出されます。 ファイルまたはデータベース関係の処理は、 時間がかかるものもありますから、 そういう処理は何はともあれ画面を表示してから行うことをお勧めいたします。 さもないと、アプリ操作者が画面を見ることのできない不安な時間を長くすることになります。

これら 5 種類の前処理と後処理に関するフックメソッドついては、 画面対応のものだけでなく、データ項目フックメソッドもあります。 したがって使い分けが問題になりますが、 特定のデータ項目固有の前処理や後処理に関係しない場合は、 ここに説明のある画面フックメソッドを用いるのがよい。

3.3.4 その他のフックメソッド

次の 3 種類のイベントは、上記の三つの分類に入らないものです。 それぞれのフックメソッドの役割と呼び出されるタイミングは以下の通りです。

GetEvent (イベント処理) 指定された指示コントロールへの指示の受付けとその処理のために、 アプリ操作者がボタンまたはメニューをクリックするというような (指示コントロールへの指示があった) ときに呼び出される。
RelCheck (関係チェック) 指定された項目群に含まれるデータ項目間の関係チェックのために、 そのいずれかのデータ項目の値の変更が確定したときに呼び出される。
ErrorMsg (エラー表示) 当画面にエラーメッセージを表示するために、 Check または RelCheck でエラーが検出されたときに呼び出される。

GetEvent (イベント処理) フックメソッドは、 ある指示コントロールに対するイベントとして記述します。 このフックメソッドは、その指示コントロールにアプリ操作者がクリックなどの指示を与えたときに呼び出されて、 その指示に対応する処理を行います。

RelCheck (関係チェック) フックメソッドは、 ある項目群に対するイベントとして記述します。 このフックメソッドは、 その項目群に含まれるいずれかのデータ項目の値の変更が確定したときに呼び出されて、 それらの項目間の関係チェックを行います。 チェックの結果エラーの場合には、 これに続いて ErrorMsg フックメソッドが呼び出されます。

ErrorMsg (エラー表示) フックメソッドは、 ある画面に対するイベントとして記述します。 このフックメソッドは、Check (入力チェック) または RelCheck でエラーが検出されたときに呼び出されて、 その画面のステータス表示域などにエラーメッセージを表示します。

3.3.5 補足説明 (その 1)

ここには、動作モードの遷移とイベントの発生のタイミングについての補足説明がしてあります。 一般にこの辺りには、 (他の第四世代言語においても) 理解をはばむ敷居があるようです。 その理由は、マルチ機能画面との関係で、少しばかり複雑にみえるからかもしれません。 しかし、その原理は単純です。

この敷居を越えるには、イベントの発生のタイミングに関する説明を読むだけでなく、 実例を眺めながらその意味を考えることが効果的です。

画面部品のフックメソッドの各々が呼び出されるタイミングについては、 サンプルアプリ Fr_Rensyuu3 をご参照ください。 これを .NET 統合開発環境のもとで実行させると、出力ウィンドウに画面フックメソッドのメッセージが時々刻々と表示されるようになっています。 画面対応のフックイベントがどのような場合に発生するのかプログラムを操作しながら出力ウィンドウを見ることで理解を増すことができます。

◇ データエントリの処理

一つの画面アプリでデータの追加、参照、更新など複数の機能を行うことができるマルチ機能画面を理解するには、まずは単機能の理解から始めるのがよいでしょう。

単機能の中でも、データエントリの処理が最も単純です。 この処理の流れの主要部分は、画面データのインプットが確定した段階でアプリ操作者がデータ登録の指示 (Execute 指示) をするところから始まります。 アプリ操作者が Execute 指示を与えると、 MANDALA.net によって必要なデータがすべて整っているかどうかチェック (画面データ完備チェック) がなされ、 このチェックに合格するとフックメソッド Append (追加処理) が呼び出されます。 Append の中では、 その役割に従って、画面データをファイルまたはデータベースに追加する処理を行えばよいわけです。

ということなのですが、次のように捉える方がより適切です。 すなわち、Append フックメソッドは、 画面データの追加処理を役割とするルーチンなので、 追加処理が必要な場合には必ず呼び出されるようになっているのだと考えてください。

なお、追加モードに移る前には、 (動作モードの移行の可否についてアプリにお伺いをたてるために) フックメソッド AppendChk (追加モード) が呼び出されるようになっています。

これらを総合すると次のようにいうことができます。 まず AppendChk が呼び出され、 この AppendChk では動作モードの移行を許可するのが普通ですから、追加モードになります。 そして、Execute 指示がなされる度に画面データ完備チェックがなされ、 それに合格すると Append が呼び出されます。

実際にトレースで呼出し順を確認して、その意味をご理解ください。

Append フックメソッドの中では、 まず画面の各項目の内容をデータ書出し用領域に転送して、 次にデータ書出し用領域の内容をデータベースなどに追加することが必要です。 画面の各項目からデータ書出し用領域への転送処理は、 メソッド transferToDB で行うことをお勧めいたします (Update フックメソッドの場合と同様です)。

メソッド transferToDB の中では、 次の getValue 系メソッドを用いて、 画面の各項目からデータ書出し用領域への転送処理を行います。

    fB.getValue(ii_項目略称)

    fB.getValue(ii_項目略称, 明細行インデックス)
    fB.getValue(ii_項目略称);

    fB.getValue(ii_項目略称, 明細行インデックス);
    fB.getValue(ii_項目略称);

    fB.getValue(ii_項目略称, 明細行インデックス);

これらの getValue 系メソッドは、 画面項目の値をレコード項目に転送するものであり、 MANDALA.net によって機械生成されます。 すなわち、「画面略称」で指定された画面の中の「項目略称」で指定されたコントロールの値を戻り値として返します。 なお、ボディ部や拡張ボディ部の項目については、 どの明細行かを示すためにパラメタ「明細行インデックス」が必要です。

◇ データの表示や更新の前処理

次に、データの表示や更新の処理を見てみましょう。 これらの処理は、データエントリの処理よりも少し複雑です。 なぜなら、どのデータを表示または更新するのかを決めなければならないからです。 このために、まずデータを選択するためのフックメソッド Select (選択モード) が呼び出されるようになっています。 なお、実際に Select が呼び出されるタイミングについては、 アプリの型の指定、またはアプリ操作者の SelectCm 指示によって若干異なります。

Select フックメソッドの役割は、 どの画面データを表示するのかを選択することです。 たとえば、サンプルアプリ Fr_Rensyuu3 では、 CD 番号が CA32-1278 なのか、CT32-5210 なのか、TOCT-6978 なのか、 これらの「どれ」に関する画面データを表示 (または更新) するのかを選択しています。 この例では、アプリ側からアプリ操作者に問い合わせて、選択してもらっていますが、 場合によっては問い合わせをせずに勝手に選択してしまうようなアプリもあることでしょう。 とにかく、Select フックメソッドではある一つの画面データを選択して、 それを記録しておくわけです。この記録のためのデータ項目を画面データ識別子と呼んでいます。 なお、画面データ識別子としてどういう形態で記録するのかは、アプリに任されています。

ところで画面に表示されるのは、必ずしも一つのレコードだというわけではなく、 一般には複数のレコードから寄せ集めたデータ (これを画面データと呼んでいます) であることが普通です。 ですから、単に一つのレコードを示すポインタ (レコードポインタ) ではなく、 画面データ識別子であるという言い方をしているわけです。

こう言ってはみても、普通、画面データは、 あるキーとなるデータが決まると芋づる式にどんなデータを寄せ集めればよいのか決まるものです。 ですから、そのキーとなるデータを画面データ識別子とすればよいわけです。

Fr_Rensyuu3 では、CD 番号が CA32-1278 なのか、CT32-5210 なのか、 TOCT-6978 なのかを画面データ識別子としています。 つまり、これらは、画面に表示される寄せ集めのデータを代表するものであり、 その画面データに関する複数のレコードを指し示しているというわけです。

どのデータを表示または更新するのかを、アプリ側からアプリ操作者に問い合わせる方法には、 次の 2 種類があります。

その一つは、Fr_Rensyuu3 のように、 Select フックメソッドの中から呼出したダイアログボックス (選択リストなどのフォーム) で行う方法です。

この場合には、データを表示した後に、 表示モードに変更するか、更新モードに変更するかは、 Select フックメソッドの戻り値により指定することができます。

もう一つは、Select フックメソッドの後に、 選択モードにしてキー情報のインプットを受け付ける方法です。

こうしたければ、Select フックメソッドの戻り値を 1 にして、 選択モードに変えてください。こうすると、 選択モードでインプット可能な項目 (一つまたは複数のキー項目) がインプット可能になります。

キー情報のインプットが終わって、選択モードから、 表示モードまたは更新モードに変更されるのは、Execute 指示によります。

なお、Execute 指示には、 明の Execute 指示暗の Execute 指示があります。 いずれも「画面上にデータが整い区切りがついた」という意味の指示です。 この指示がなされると、まず画面データ完備チェックが行われます。 そして、この完備チェックでデータが完備していると判定された場合だけ、 この指示は有効になります。 こう判定されないと、この指示は無効になり、何の指示もなかったことになります。

明の Execute 指示とは、 アプリ操作者がボタン Cm_Execute をクリックすること、あるいはメニュー項目 Mn_Execute をクリックすることか、 これに相当する操作 (対応するショートカットキーの押下) をすること、 あるいは Execute に対応づけられたファンクションキーを押下することを意味します。

暗の Execute 指示とは、 フォーカスが画面の中のインプット可能なデータ項目うちの最終位置にあるときに Enter キーを押下すること、 またはテール部にインプット可能なデータ項目が存在しないケースにおいてボディ部のカレント明細 (レコード) のデータ項目がすべて初期状態のときに (つまりカレント明細に何もインプットしていないときに) 必須入力項目上で Enter キーを押下することを意味します。

Execute 指示により、選択モードから、 表示モードまたは更新モードのどちらに変更されるのかは、次のようにして決まります。

データ照会型アプリなら、選択モードから表示モードに変更されます。

データ更新型アプリなら、選択モードから更新モードに変更されます。

◇ データの表示処理

フックメソッド Current (現画面) の役割は、画面データ識別子で指し示された画面データを読み集めて画面に表示することです。 ですから、必要であればいろいろなレコードを読み込んで画面に表示することになります。

これが基本ですから、画面データを表示する場合には、 Select (選択モード) フックメソッドの後に表示モードになって、Current フックメソッドが呼び出されるわけです。 なお、表示モードに移る前には、 (動作モードの移行の可否についてアプリにお伺いをたてるために) フックメソッド Indicate (表示モード) フックメソッドが呼び出されるようになっています。

また、表示モードでデータを表示中に Execute 指示がなされると、 それは次の画面データへの移動の指示だとみなされ、 次の画面データを読み込むためにフックメソッド NextFh (次画面) が呼び出されます。

これらを総合すると次のようにいうことができます。 まず Select が呼び出された後に Indicate が呼び出され、 この Indicate では動作モードの移行を許可するのが普通ですから、表示モードになります。 そして、画面データを読み集めるために Current が呼び出されます。 この後は、Execute 指示がなされる度に NextFh が呼び出されるということができます。

実際にトレースで呼出し順を確認して、その意味をご理解ください。

◇ データの更新の処理

データの表示と同様に、 画面データの更新のためには、 Select (選択モード) フックメソッドの後に更新モードになって Current (現画面) フックメソッドが呼び出されます。 なお、更新モードに移る前には、 (動作モードの移行の可否についてアプリにお伺いをたてるために) フックメソッド UpdateChk (更新モード) が呼び出されるようになっています。

また、更新モードで Execute 指示がなされると、 それは画面データの更新・追加・削除の指示だとみなされ、 まず必要なデータがすべて整っているかどうかチェック (画面データ完備チェック) がなされ、 このチェックに合格するとフックメソッド Update (更新処理) が呼び出されます。 Update の中では、 その役割に従って、画面データを基にデータベースを更新・追加・削除する処理を行えばよいわけです。

これらを総合すると次のようにいうことができます。 まず Select が呼び出された後に UpdateChk が呼び出され、 この UpdateChk では動作モードの移行を許可するのが普通ですから、更新モードになります。 そして、画面データを読み集めるために Current が呼び出されます。 この後は、Execute 指示がなされる度に画面データ完備チェックがなされ、 それに合格すると Update が呼び出されます。

実際にトレースで呼出し順を確認して、その意味をご理解ください。

Update フックメソッドの中では、 まず画面の各項目の内容をデータ書出し用領域に転送して、 次にデータ書出し用領域の内容に従ってデータベースなどを更新することが必要です。 画面の各項目からデータ書出し用領域への転送処理は、 メソッド transferToDB で行うことをお勧めいたします (Append フックメソッドの場合と同様です)。

メソッド transferToDB の中では、 次の getValue 系メソッドを用いて、 画面の各項目からデータ書出し用領域への転送処理を行います。

    fB.getValue(ii_項目略称)

    fB.getValue(ii_項目略称, 明細行インデックス)
    fB.getValue(ii_項目略称);

    fB.getValue(ii_項目略称, 明細行インデックス);
    fB.getValue(ii_項目略称);

    fB.getValue(ii_項目略称, 明細行インデックス);

これらの setValue 系メソッドは、 画面項目の値をレコード項目に転送するものであり、 MANDALA.net によって機械生成されます。 すなわち、「画面略称」で指定された画面の中の「項目略称」で指定されたコントロールの値を戻り値として返します。 なお、ボディ部や拡張ボディ部の項目については、 どの明細行かを示すためにパラメタ「明細行インデックス」が必要です。

3.3.6 補足説明 (その 2)

ここには、画面データの読込みに関するフックメソッドについての補足説明がしてあります。 これらのフックメソッドの役割は、 処理対象画面データ群の中の特定の画面データを読み込んで画面に表示することです。 どの画面データを読み込むべきかは、各フックメソッドによって異なります。

Current (現画面) フックメソッドの役割は、 前項の説明のとおり、画面データ識別子で指し示された画面データを読み込んで画面に表示することです。

なお、Current フックメソッドは、 アプリ操作者が Cancel 指示を与えたときにも呼び出されます。 なぜなら、Cancel 指示によってインプットしたデータをすべて無効にして 最初の画面データに戻すには、 画面データ識別子で指し示された画面データを再度読み込んで画面に表示することが手っ取り早いからです。

Current フックメソッドと同様に、 First (先頭画面), NextFh (次画面), Prev (前画面), Last (最終画面) もそれぞれ役割が決まっており、 次の場合に呼び出されます。

NextFh (次画面) フックメソッドの役割は、 画面データ識別子で指し示された次の画面データを読み込んで画面に表示することです。 アプリ操作者が次の画面を表示したいということで、NextCm 指示を与えたときに、 NextFh フックメソッドが呼び出されます。 また、表示モードで Execute 指示がなされた場合などにも NextFh フックメソッドが呼び出されます。 要するに、次の画面データを表示することが必要になったときに呼び出されるわけです。

Last (最終画面) フックメソッドの役割は、 処理対象画面データ群の中の最終の画面データを読み込んで画面に表示することです。 アプリ操作者が最終画面を表示したいということで、Last 指示を与えたときに、 Last が呼び出されます。 それから、最終のレコードが表示されているときに次の画面に移れとアプリ操作者から NextCm 指示があった場合には、 一応次の画面を表示しにいきますが (つまり NextFh フックメソッドが呼び出されますが)、 それがエラーになった場合には、 最終画面を再表示するために Last フックメソッドが呼び出されます。

Prev (前画面) フックメソッドの役割は、 画面データ識別子で指し示された一つ前の画面データを読み込んで画面に表示することです。 アプリ操作者が一つ前の画面を表示したいということで、Prev 指示を与えたときに、 Prev フックメソッドが呼び出されます。

First (先頭画面) フックメソッドの役割は、 処理対象画面データ群の中の先頭の画面データを読み込んで画面に表示することです。 アプリ操作者が先頭画面を表示したいということで、First 指示を与えたときに、 First フックメソッドが呼び出されます。 それから、先頭のレコードが表示されているときに一つ前の画面に移れとアプリ操作者から Prev 指示があった場合には、一応一つ前の画面を表示しにいきますが (つまり Prev フックメソッドが呼び出されますが)、 それがエラーになった場合には、先頭画面を再表示するために First フックメソッドが呼び出されます。

Current (現画面), First (先頭画面), NextFh (次画面), Prev (前画面), Last (最終画面) の各フックメソッドの中では、 まずデータベースなどからデータをデータ読込み領域に読み込んで、 次にデータ読込み領域の内容を画面の各項目に転送することが必要です。 データ読込み領域への読込み処理は、それぞれのデータベースのアクセス法を用いて行ってください。 そして、データ読込み領域から画面の各項目への転送処理は、 メソッド transferFromDB で行うことをお勧めいたします。

メソッド transferFromDB の中では、次の setValue 系メソッドを用いて、 データ読込み領域から画面の各項目への転送処理を行います。

    fB.setValue(ii_項目略称, データ読込み領域の項目)

    fB.setValue(ii_項目略称, 明細行インデックス, データ読込み領域の項目)
    fB.setValue(ii_項目略称, データ読込み領域の項目);

    fB.setValue(ii_項目略称, 明細行インデックス, データ読込み領域の項目);
    fB.setValue(ii_項目略称, データ読込み領域の項目);

    fB.setValue(ii_項目略称, 明細行インデックス, データ読込み領域の項目);

これらの setValue 系メソッドは、 レコード項目の値を画面項目に転送するものであり、 MANDALA.net によって機械生成されます。 すなわち、パラメタ「データ読込み領域の項目」で指定された項目の値を「画面略称」で指定された画面の中の「項目略称」で指定されたコントロールに転送します。 なお、ボディ部や拡張ボディ部の項目については、 どの明細行かを示すためにパラメタ「明細行インデックス」が必要です。

3.3.7 補足説明 (その 3)

フックメソッドの役割を尊重してプログラミングをすると、 都合のよい処理が MANDALA.net によって自動的になされた上に、 フックメソッドが都合よく呼出されて業務処理を行うことになります。 しかし、フックメソッドの役割を無視してプログラミングをすると、 MANDALA.net によって自動的になされる処理が不都合だと感じられるかもしれません。

ですから、MANDALA.net が不都合な処理をしていると感じられた場合には、 フックメソッドの役割を尊重したプログラミングになっているかどうかの見直しをいただくことがよいと思います。

このように、基本的にはフックメソッドの役割を尊重することが重要なのですが、 各フックメソッドが呼出される間に MANDALA.net によって自動的になされる処理に関する知識があった方が MANDALA.net をうまく使いこなせるというご意見がよせられましたので、それについての概要をご説明いたします。

BeginPrg フックメソッドが呼出される前に、 表示例のクリアがなされます。テキストボックスやコンボボックスなどを MANDALA コントロールにする場合には、画面のデザイン時に表示例を設定することをお勧めしています。 こうすると画面の完成形の感じがつかみやすくなるなど何かと好都合です (マニュアル 「MANDALA.net 入門の手引き」 の表示例に関する説明を参照)。 そして、設定した表示例は、BeginPrg フックメソッドが呼出される前に、クリアされるようになっています。

BeginPrg フックメソッドと Open フックメソッドの間で、画面の表示がなされます。

BeginPrg フックメソッドの前に表示例がクリアされていますから、 ここでは、表示例のクリアされた画面が表示されることになります。

Open フックメソッドと Select フックメソッドの間では、 選択モードでキー情報のインプットを受け付けるために、画面の初期化処理がなされます。

一般に画面の初期化処理は、表示例のクリア処理のように単純ではありません。 各データ項目ごとに InitVal フックメソッドが呼出されて、各データ項目の初期値が表示されることになります。 なお、InitVal フックメソッドが組み込まれていないデータ項目は、Nothing 値に初期化されます。

UpdateChk フックメソッドと Current フックメソッドの間では、 データをデータベースから読み込む前の画面の初期化処理がなされます。 なお、画面の初期化処理に関しては、前述の説明をご参照ください。

特に、データをデータベースから読み込む前の画面の初期化処理については、 ヘッド部のデータ項目についてだけ初期化を抑止する (初期化しないようにする) ことも可能です。 すなわち、フォームオプションの設定というダイアログボックスの中のヘッド部初期化抑止の指定をすることで抑止できます。

ヘッド部にキー情報をインプットして、 そのキー情報で特定されるレコードをボディ部などに読み込んで表示するようなことがよく行われています。このような場合、 Current, First, Last, NextFh, Prev の各フックメソッドを呼出す前に、画面内の全項目が初期化されてしまうと、 ヘッド部のデータを再度設定しなければならず、面倒です。 そのような場合には、このヘッド部初期化抑止の指定をすることで、 ヘッド部のデータ項目の初期化をしないようにすることができます。

すなわち、このの指定をすると、Current, First, Last, NextFh, Prev の各フックメソッドを呼出す前には、 ヘッド部のデータ項目の初期化をしないようにすることができます (ボディ部や拡張ボディ部やテール部のデータ項目は初期化されます)。

Append フックメソッドが呼出される前に、 追加モードで情報のインプットを受け付けるために、画面の初期化処理がなされます。

一般に画面の初期化処理は、表示例のクリア処理のように単純ではありません。 各データ項目ごとに InitVal フックメソッドが呼出されて、 各データ項目の初期値が表示されることになります。 なお、InitVal フックメソッドが組み込まれていないデータ項目は、Nothing 値に初期化されます。

Current フックメソッドが呼出された直後に、 インプットのエミュレーション処理 (再計算処理) がなされます。

インプットのエミュレーション処理とは、 画面の中のインプット可能な全項目に関する Check フックメソッドが呼出されて、手操作でインプットしたのと同じ状態にすることです。 なお、Check がフックメソッドが呼出されることによって、 それに付随する RelCheck フックメソッドや Derived フックメソッドも呼出されます。

インプットのエミュレーション処理がなされた後に、 更新モードであれば、画面には更新すべきデータが表示されるので、 アプリ操作者は目指すデータを見ることができるようになります。 そして、画面にはカーソルが現れますから、変更したい項目にカーソルを移動させて、 その項目の内容を変更できるようになります。

インプットのエミュレーション処理がなされた後に、表示モードであれば、 画面には照会すべきデータが表示されるので、 アプリ操作者は目指すデータを見ることができるようになります。 そして、画面からカーソルが消えます。ですから、データを変更することができません。