Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

作成したアプリケーションでは、同時に1人の社員の詳細だけを表示できます。そのため、同時に複数の社員の詳細を表示できる別のバージョンのアプリケーションも作成しました。
Image RemovedImage Added

コレクション

フォームの複数のインスタンスを表示するために、この定義ステートメントをWRKEMPに追加し、フォームのコレクションを作成しました。

     DEFINE_COM CLASS(#PRIM_KCOL) NAME(#DFORMS) COLLECTS(#FRMDETAIL) KEYEDBY(#EMPNO)

このステートメントは、#DFORMSというFRMDETAILのインスタンスのコレクションを定義します。フォーム・インスタンスは、社員番号で識別されます。
それから#DFORMSコレクションのインスタンスを参照するよう、コードを変更しました。フォーム・インスタンスを参照する構文は、以下のとおりです。 

...

     CollectionName<key>

詳細メニュー・オプションのコードは、以下のようになります。

...

     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.14.7 マルチフォーム・アプリケーション例のソース・コード

...

も参照してください。