ページの先頭行へ戻る
NetCOBOL V12.2 PowerCOBOL ユーザーズガイド
FUJITSU Software

8.3.1 OpenFormメソッドを使用する

OpenFormメソッドを使用することにより、PowerCOBOLで作成した別のフォームを開くことができます。

OpenFormメソッドの書き方

OpenFormメソッドは、以下のように記述します。

  INVOKE  POW-SELF  ”OpenForm”
                USING  ”フォーム名”
                          [”DLL名”]
                          [フォーム識別ID]
                RETURNING  復帰値
POW-SELF

これから子フォームを開こうとしている親フォーム自身を表しています。POW-SELFの代わりに、親フォーム自身のフォーム名を使うこともできます。

フォーム名については、「4.7 プロジェクト構成要素の命名規則」を参照してください。

フォーム名

これから開こうとしている子フォームの名前を指定します。

DLL名

開こうとしている子フォームが別のDLL(モジュール)に含まれている場合、そのDLLファイル名を指定します。

フォーム識別ID

複数の子フォームを開き、それらのどれかが閉じられた場合に、親フォームのCloseChildイベントで閉じられた子フォームを識別するために使用するIDです。

復帰値

正常に子フォームを開くことができた場合は、0が設定されます。失敗した場合、0以外の値が設定されます。

OpenFormメソッドを使った複数ウィンドウの使用例

本節では、「第4章 アプリケーションを作成しよう」で作成したアプリケーションに新しくフォームを追加し、フォームの呼び出し方法のサンプルプログラムを作成します。このサンプルプログラムでは、表に入力できる商品が追加できるよう、以下の機能を追加しています。

アプリケーションは、以下の手順で作成します。

  1. モジュールに子ウィンドウとなる新しいフォームを追加し、名前を設定します。

  2. 追加した子ウィンドウを開くためのボタンを、呼び出し元のフォームに追加します。

  3. 呼び出し元のフォームに、フォームを開くための手続きを記述します。

  4. コントロールを新しいフォームの適切な位置に配置し、大きさを変更します。

  5. 新しいフォームの手続きを記述します。

ポイント

本節で作成するサンプルプログラムは、"SimpleForm\Table2.ppj"に格納されています。必要に応じて参照してください。

モジュールに新しいフォームを追加する

以下の操作により、モジュールに新しいフォームを追加し、名前を設定します。

  1. プロジェクトウィンドウのデザインツリーウィンドウで、モジュールを選択します。

  2. ポップアップメニューの[フォーム作成]コマンドを選択します。

  3. モジュールにCfFormN(Nは正数値)という名前でフォームが追加され、フォーム編集ウィンドウが表示されます。

  4. フォームのプロパティ設定ダイアログボックスを開き、[名前]を"AddForm"に変更します。

  5. [キャプション]を"商品の追加"に変更します。

呼び出し元のフォームを編集する

新しく作成したフォームを呼び出すために、以下の手順でフォームを編集します。

  1. MainFormのポップアップメニューで[開く]コマンドを選択し、フォーム編集ウィンドウを表示します。

  2. 下図のように、コマンドボタンコントロールをフォームの空いている位置に任意に配置します。

  3. 配置したコマンドボタンコントロールのプロパティ設定ダイアログボックスで、[キャプション]を"商品の追加"、[名前]を"BT-ADD"に変更します。

フォームを開くための手続きを記述する

新しく作成したフォームを開くために、以下の手続きを追加します。

WORKING-STORAGE

フォームの作業場所節(WORKING-STORAGE)に以下の定義を追加します。

   * 商品追加用フォームのID
    01  ADD-FORM-ID PIC S9(9) COMP-5 VALUE 1 GLOBAL.
BT-ADD-Click

[商品の追加]ウィンドウを開き、[商品の追加]ボタンを無効(淡色表示)にします。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01 ReturnValue  PIC S9(9) COMP-5.
    PROCEDURE       DIVISION.
   *    商品追加用のフォームを開きます。
        INVOKE POW-SELF "OpenForm" USING "AddForm" ADD-FORM-ID
                                   RETURNING ReturnValue
   *    フォームが開くことができたら、ボタンを無効にします。
        IF ReturnValue = 0 THEN
          MOVE POW-FALSE TO "Enabled" OF BT-ADD
        END-IF

ポイント

  • 商品の追加]ボタンを無効にするのは、ボタンが重複してクリックされることを防ぐためです。ボタンが重複してクリックされると、複数の[商品の追加]ウィンドウを表示しようとするため、処理の内容によっては、データに矛盾が生じたり、異常終了したりすることがあります。

  • このサンプルプログラムでは、OpenFormメソッドの第2引数(DLLの名前)を省略しています。DLLとして作成された他のモジュールに含まれるフォームを開く場合は、第2引数にDLL名を指定してください。OpenFormメソッドについての詳細は、『リファレンス』を参照してください。

MainForm-CloseChild

CloseChildイベントは、このフォーム中の手続きから開かれたフォームが閉じられた場合に発生します。したがって、BT-ADD-Clickイベントで開いた[商品の追加]ウィンドウ(AddForm)が閉じられたとき、ここに記述した手続きが実行されます。ここでは、[商品の追加]ウィンドウが閉じられたら、再び[商品の追加]ボタンがクリックできるよう、ボタンを有効にしています。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    LINKAGE         SECTION.
    01  POW-COOKIE  PIC S9(9) COMP-5.
    PROCEDURE       DIVISION POW-COOKIE.
   *    商品追加用フォームが閉じられたら、ボタンを有効にします。
        EVALUATE POW-COOKIE
        WHEN ADD-FORM-ID
          MOVE POW-TRUE TO "Enabled" OF BT-ADD
        END-EVALUATE

ポイント

このイベントのパラメタ(POW-COOKIE)には、OpenFormメソッドのパラメタで指定した、フォームの識別IDが渡ってきます。このパラメタは、2つ以上のフォームをOpenFormメソッドで開いた場合に、どのフォームが閉じられたかを判定するために使用します。このサンプルプログラムでは、1つのフォームを開いただけなので、とくにこのパラメタを判定する必要はありませんが、例として記述しています。

新しいフォームにコントロールを配置する

新しく作成したフォームを開き、以下のコントロールを配置します。

各コントロールのプロパティ設定ダイアログボックスを使って、以下のようなフォームを作成します。

各コントロールのプロパティ設定ダイアログボックスでの設定内容を、以下に示します。

CmStatic1のプロパティ設定
  • [スタティックテキスト]タブの[キャプション]を"追加する商品の情報を入力してください。"に変更します。

  • [共通]タブの[名前]を"ST-TITLE"に変更します。

CmStatic2のプロパティ設定
  • [スタティックテキスト]タブの[キャプション]を"商品コード:"に変更します。

  • [共通]タブの[名前]を"ST-CODE"に変更します。

CmStatic3のプロパティ設定
  • [スタティックテキスト]タブの[キャプション]を"商品名:"に変更します。

  • [共通]タブの[名前]を"ST-NAME"に変更します。

CmStatic4のプロパティ設定
  • [スタティックテキスト]タブの[キャプション]を"単価:"に変更します。

  • [共通]タブの[名前]を"ST-PRICE"に変更します。

CmText1のプロパティ設定
  • [テキストボックス]タブの[テキスト]をクリアします。

  • [テキスト属性]タブの[テキスト種別]を"1 - COBOL PICTURE属性"に変更します。

  • [PICTURE文字列]を"9(5)"に変更します。

  • [共通]タブの[名前]を"TX-CODE"に変更します。

CmText2のプロパティ設定
  • [テキストボックス]タブの[テキスト]をクリアします。

  • [テキスト属性]タブの[テキスト種別]を"1 - COBOL PICTURE属性"に変更します。

  • [PICTURE文字列]を"N(10)"に変更します。

  • [共通]タブの[名前]を"TX-NAME"に変更します。

CmText3のプロパティ設定
  • [テキストボックス]タブの[テキスト]を"0"に変更します。

  • [テキスト属性]タブの[テキスト種別]を"1 - COBOL PICTURE属性"に変更します。

  • [PICTURE文字列]を"\\\,\\9"に変更します。

  • [共通]タブの[名前]を"TX-PRICE"に変更します。

CmCommand1のプロパティ設定
  • [コマンドボタン]タブの[キャプション]を"追加"に変更します。

  • [共通]タブの[名前]を"BT-ADD"に変更します。

CmCommand2のプロパティ設定
  • [コマンドボタン]タブの[キャプション]を"閉じる"に変更します。

  • [共通]タブの[名前]を"BT-EXIT"に変更します。

新しいフォームの手続きを記述する

新しく作成したフォームに、以下の手続きを記述します。

FILE-CONTROL
   *    商品コードをキーとして、商品名および単価をもちます。
        SELECT 商品ファイル ASSIGN TO "..\PRODUCTS.TBL"
          ORGANIZATION IS RELATIVE
          RELATIVE KEY IS 商品-キー
          ACCESS MODE  IS RANDOM
          FILE STATUS  IS FS.
FILE
    FD  商品ファイル GLOBAL.
    01  商品レコード.
      02  商品-名    PIC N(10).
      02  商品-単価  PIC 9(5).
WORKING-STORAGE
    01  商品-キー   PIC 9(5) BINARY GLOBAL.
    01  FS           PIC XX   GLOBAL.
AddForm-Opened
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01  W-CODE      PIC S9(8) COMP-5.
    PROCEDURE       DIVISION.
   *    現在のレコード数を求め、次の商品コードを決定します。
        OPEN INPUT 商品ファイル
        MOVE 1 TO W-CODE
        PERFORM WITH NO LIMIT
          MOVE W-CODE TO 商品-キー
          READ 商品ファイル
          INVALID KEY
          PERFORM 最終レコード到達
          END-READ
          ADD 1 TO W-CODE
        END-PERFORM
        .
    最終レコード到達.
        MOVE W-CODE TO "Text" OF TX-CODE
        CLOSE 商品ファイル
   *    最初の入力箇所にフォーカスを設定します。
        INVOKE TX-NAME "SetFocus"
        EXIT PROGRAM.
BT-ADD-Click
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
   *    入力内容をチェックします。
        IF "Text" OF TX-NAME = SPACE THEN
          INVOKE POW-SELF "DisplayMessage" USING 
          "商品名を入力してください。"
          EXIT PROGRAM
        END-IF
        IF "Text" OF TX-PRICE = 0 THEN
          INVOKE POW-SELF "DisplayMessage" USING 
          "単価を入力してください。"
          EXIT PROGRAM
        END-IF
   *    商品ファイルをオープンします。
        OPEN I-O 商品ファイル
   *    入力された商品の情報を商品ファイルに追加します。
        MOVE "Text" OF TX-CODE  TO 商品-キー
        MOVE "Text" OF TX-NAME  TO 商品-名
        MOVE "Text" OF TX-PRICE TO 商品-単価
        WRITE 商品レコード
   *    商品ファイルをクローズします。
        CLOSE 商品ファイル
   *    商品コードの値を加算します。
        ADD 1 TO "Text" OF TX-CODE
   *    入力領域をクリアします。
        MOVE SPACE TO "Text" OF TX-NAME
        MOVE 0 TO "Text" OF TX-PRICE
BT-EXIT-Click
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
        INVOKE POW-SELF "CloseForm"