2.13.4 複数のFRMDETAILインスタンスの表示

作成したアプリケーションでは、同時に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 マルチフォーム・アプリケーションの例のフォームのソース・コード 」も参照してください。