作成したアプリケーションでは、同時に1人の従業員の詳細だけを表示できます。そのため、同時に複数の従業員の詳細を表示できる別のバージョンのアプリケーションも作成しました。
コレクション
フォームの複数のインスタンスを表示するために、この定義ステートメントをWRKEMPに追加し、フォームのコレクションを作成しました。
DEFINE_COM CLASS(#PRIM_KCOL) NAME(#DFORMS) COLLECTS(#FRMDETAIL) KEYEDBY(#EMPNO)
このステートメントは、#DFORMSというFRMDETAILのインスタンスのコレクションを定義します。フォーム・インスタンスは、従業員番号で識別されます。
それから#DFORMSコレクションのインスタンスを参照するよう、コードを変更しました。フォーム・インスタンスを参照する構文は、以下のとおりです。
CollectionName<キー>
詳細メニュー・オプションのコードは、以下のようになります。
EVTROUTINE HANDLING(#MDetails.Click)
SET COM(#dforms<#empno>) formowner(#com_owner)
invoke #dforms<#empno>.showform
set com(#dforms<#empno>) employee(#empno)
invoke #dforms<#empno>.GetInfo
ENDROUTINE
すべてのフォーム・インスタンスの参照
FRMDETAILのOKPressedイベントのイベント・ルーチンは、コレクション内の任意の詳細フォームを参照するように変更する必要があります。
EVTROUTINE HANDLING(#dforms<>.OKPressed)
execute getlist
ENDROUTINE
OKPressedイベントが詳細フォームのいずれかから通知されると、GETLISTサブルーチンが実行されます。このコードから見ると、すべてのインスタンスが参照されるとコレクションのキー値は指定されません。インスタンスは#dforms<>です。
最後に、メイン・フォームが閉じられたときにFRMDETAILフォームのすべてのインスタンスが閉じられるよう、WRKEMPのClosingイベントのイベント・ルーチンを追加しました。
EVTROUTINE HANDLING(#COM_OWNER.Closing)
invoke #dforms<>.CloseForm
ENDROUTINE
同じ結果になるこれ以外の方法は、FRMDETAILのFormStyleをOwnedに設定することです。この設定は、フォームが他のフォームのメンバー・フォームの場合、オーナー・フォームが閉じられたときに閉じられることを指定します。
「2.13.7 マルチフォーム・アプリケーション例のソース・コード 」も参照してください。