OpenFormメソッドの書き方
OpenFormメソッドは、以下のように記述します。
INVOKE POW-SELF ”OpenForm” USING ”フォーム名” [”DLL名”] [フォーム識別ID] RETURNING 復帰値
これから子フォームを開こうとしている親フォーム自身を表しています。POW-SELFの代わりに、親フォーム自身のフォーム名を使うこともできます。
フォーム名については、「4.7 プロジェクト構成要素の命名規則」を参照してください。
これから開こうとしている子フォームの名前を指定します。
正常に子フォームを開くことができた場合は、0が設定されます。失敗した場合、0以外の値が設定されます。
OpenFormメソッドを使った複数ウィンドウの使用例
本節では、「第4章 アプリケーションを作成しよう」で作成したアプリケーションに新しくフォームを追加し、フォームの呼び出し方法のサンプルプログラムを作成します。このサンプルプログラムでは、表に入力できる商品が追加できるよう、以下の機能を追加しています。
[商品の追加]ボタンをクリックすると、商品の情報を追加するための、[商品の追加]ウィンドウが表示されます。
[商品の追加]ウィンドウが表示されると、[購入商品の入力画面]ウィンドウの[商品の追加]ボタンが無効になります。
[商品の追加]ウィンドウで[商品名]と[単価]を入力し、[追加]ボタンをクリックすると、商品ファイルに商品の情報が追加されます。
追加した商品は、[購入商品の入力画面]ウィンドウの表で使用することができるようになります。
[商品の追加]ウィンドウの[閉じる]ボタンをクリックすると、[商品の追加]ウィンドウが閉じます。
[商品の追加]ウィンドウが閉じられると、[商品の追加]ボタンが有効になります。
アプリケーションは、以下の手順で作成します。
モジュールに子ウィンドウとなる新しいフォームを追加し、名前を設定します。
追加した子ウィンドウを開くためのボタンを、呼び出し元のフォームに追加します。
呼び出し元のフォームに、フォームを開くための手続きを記述します。
コントロールを新しいフォームの適切な位置に配置し、大きさを変更します。
新しいフォームの手続きを記述します。
モジュールに新しいフォームを追加する
以下の操作により、モジュールに新しいフォームを追加し、名前を設定します。
プロジェクトウィンドウのデザインツリーウィンドウで、モジュールを選択します。
ポップアップメニューの[フォーム作成]コマンドを選択します。
モジュールにCfFormN(Nは正数値)という名前でフォームが追加され、フォーム編集ウィンドウが表示されます。
フォームのプロパティ設定ダイアログボックスを開き、[名前]を"AddForm"に変更します。
[キャプション]を"商品の追加"に変更します。
呼び出し元のフォームを編集する
新しく作成したフォームを呼び出すために、以下の手順でフォームを編集します。
MainFormのポップアップメニューで[開く]コマンドを選択し、フォーム編集ウィンドウを表示します。
下図のように、コマンドボタンコントロールをフォームの空いている位置に任意に配置します。
配置したコマンドボタンコントロールのプロパティ設定ダイアログボックスで、[キャプション]を"商品の追加"、[名前]を"BT-ADD"に変更します。
フォームを開くための手続きを記述する
新しく作成したフォームを開くために、以下の手続きを追加します。
開くフォームを識別するためのIDの定義(WORKING-STORAGE)
[商品の追加]ボタンをクリックしたときの手続き(BT-ADD-Click)
開いたフォームが閉じられたときの手続き(MainForm-CloseChild)
フォームの作業場所節(WORKING-STORAGE)に以下の定義を追加します。
* 商品追加用フォームのID 01 ADD-FORM-ID PIC S9(9) COMP-5 VALUE 1 GLOBAL.
[商品の追加]ウィンドウを開き、[商品の追加]ボタンを無効(淡色表示)にします。
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メソッドについての詳細は、『リファレンス』を参照してください。
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
新しいフォームにコントロールを配置する
新しく作成したフォームを開き、以下のコントロールを配置します。
スタティックテキストコントロールを4つ(CmStatic1~CmStatic4)
テキストボックスコントロールを3つ(CmText1~CmText3)
コマンドボタンコントロールを2つ(CmCommand1~CmCommand2)
各コントロールのプロパティ設定ダイアログボックスを使って、以下のようなフォームを作成します。
各コントロールのプロパティ設定ダイアログボックスでの設定内容を、以下に示します。
[スタティックテキスト]タブの[キャプション]を"追加する商品の情報を入力してください。"に変更します。
[共通]タブの[名前]を"ST-TITLE"に変更します。
[スタティックテキスト]タブの[キャプション]を"商品コード:"に変更します。
[共通]タブの[名前]を"ST-CODE"に変更します。
[スタティックテキスト]タブの[キャプション]を"商品名:"に変更します。
[共通]タブの[名前]を"ST-NAME"に変更します。
[スタティックテキスト]タブの[キャプション]を"単価:"に変更します。
[共通]タブの[名前]を"ST-PRICE"に変更します。
[テキストボックス]タブの[テキスト]をクリアします。
[テキスト属性]タブの[テキスト種別]を"1 - COBOL PICTURE属性"に変更します。
[PICTURE文字列]を"9(5)"に変更します。
[共通]タブの[名前]を"TX-CODE"に変更します。
[テキストボックス]タブの[テキスト]をクリアします。
[テキスト属性]タブの[テキスト種別]を"1 - COBOL PICTURE属性"に変更します。
[PICTURE文字列]を"N(10)"に変更します。
[共通]タブの[名前]を"TX-NAME"に変更します。
[テキストボックス]タブの[テキスト]を"0"に変更します。
[テキスト属性]タブの[テキスト種別]を"1 - COBOL PICTURE属性"に変更します。
[PICTURE文字列]を"\\\,\\9"に変更します。
[共通]タブの[名前]を"TX-PRICE"に変更します。
[コマンドボタン]タブの[キャプション]を"追加"に変更します。
[共通]タブの[名前]を"BT-ADD"に変更します。
[コマンドボタン]タブの[キャプション]を"閉じる"に変更します。
[共通]タブの[名前]を"BT-EXIT"に変更します。
新しいフォームの手続きを記述する
新しく作成したフォームに、以下の手続きを記述します。
使用するファイルの宣言(FILE-CONTROL)
レコードの定義(FILE)
作業用データの定義(WORKING-STORAGE)
フォームが開かれたときの手続き(AddForm-Opened)
[追加]ボタンをクリックしたときの手続き(BT-ADD-Click)
[閉じる]ボタンをクリックしたときの手続き(BT-EXIT-Click)
* 商品コードをキーとして、商品名および単価をもちます。 SELECT 商品ファイル ASSIGN TO "..\PRODUCTS.TBL" ORGANIZATION IS RELATIVE RELATIVE KEY IS 商品-キー ACCESS MODE IS RANDOM FILE STATUS IS FS.
FD 商品ファイル GLOBAL. 01 商品レコード. 02 商品-名 PIC N(10). 02 商品-単価 PIC 9(5).
01 商品-キー PIC 9(5) BINARY GLOBAL. 01 FS PIC XX GLOBAL.
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.
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
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. INVOKE POW-SELF "CloseForm"