8.6.3 MTHROUTINEで使用するDEFINE_MAP
MTHROUTINEコマンドを使用してユーザー定義メソッドを作成する場合、オプションにDEFINE_MAPステートメントを指定すると、このメソッドが受け取ることのできる入力値と戻す出力値を指定することができます。
例 1
フォーム上の社員に関する詳細情報を取り出すメソッドを定義できます。このメソッドは、以下のように、社員番号(#curemp)を入力値として受け取り、トランザクション番号(#trnno)を返します。
mthroutine name(GetInfo)
define_map for(*input) class(#empno) name(#curemp)
define_map for(*output) class(#STD_NUM) name(#trnno)
change #empno #curemp.value
fetch fields(#detflds) from_file(pslmst) with_key(#empno)
change #STD_NUM '#STD_NUM + 1'
set com(#trnno) value(#STD_NUM)
endroutine
次に、このフォームのオーナー・フォームから、このメソッドを実行するように指示を出すことができます。#empnoフィールドの現在値を渡し、トランザクション番号を受け取ります。トランザクション番号の値がオーナー・フォームのフィールド#TRANSAに割り当てられます。
EVTROUTINE HANDLING(#MOVETO.Click)
invoke #frmdetail.GetInfo curemp(#empno) trnno(#transa)
ENDROUTINE
例 2
この例のフォームでは、プッシュ・ボタンのClickイベントからLoadFormメソッドを呼び出し、表示されるフォームの名前を渡して、作成されたフォーム・インスタンスへの参照を返します。
このソース・コードをフォーム・コンポーネントにコピー・アンド・ペーストして、コンパイルしてください。フォームを実行します。さらに、このフォームを使用して他のフォームのインスタンスの作成および表示を行うには、表示する名前を指定してロードボタンをクリックします。入力するフォーム名は、直前に作成したフォームの名前である必要があります。
BEGIN_COM HEIGHT(123) LEFT(296) TOP(120) WIDTH(209)
DEFINE_COM CLASS(#STD_OBJ.Visual) NAME(#STD_OBJ) CAPTION('Form to Load:') DISPLAYPOSITION(1) HEIGHT(19) LABELTYPE(Caption) LEFT(8) MARGINLEFT(80) PARENT(#COM_OWNER) TABPOSITION(1) TOP(8) WIDTH(161)
DEFINE_COM CLASS(#PRIM_PHBN) NAME(#PHBN_1) CAPTION('Load') DISPLAYPOSITION(2) LEFT(16) PARENT(#COM_OWNER) TABPOSITION(2) TOP(45)
* form collection counter and form collection
define #FormTot Reffld(#STD_NUM) default(0)
DEFINE_COM CLASS(#PRIM_KCOL) NAME(#FORMS) COLLECTS(#PRIM_FORM) KEYEDBY(#STD_NUM) STYLE(Collection)
define #Position Reffld(#STD_NUM) default(1)
EVTROUTINE HANDLING(#PHBN_1.Click)
Change #FormTot '#FormTot + 1'
* call the LoadForm method, pass it the name of the form to be instantiated and return a reference to it.
Invoke #COM_OWNER.LoadForm FormName(#Std_Obj) FormReference(#Forms<#FormTot>)
ENDROUTINE
Mthroutine LoadForm
* receive the name of the form and return a reference of the form instance which has been created
Define_map *input #Std_Obj #FormName
Define_map *output #prim_form #FormReference pass(*by_Reference)
*Create an instance of the named form and set reference to it
Set_Ref #FormReference (*Create_from #FormName.Value)
Set #FormReference Left(#Position) Top(#Position)
Change #Position '#Position + 10'
Invoke #FormReference.ShowForm
Endroutine
END_COM