第8章 プログラミングテクニック
8.3 複数ウィンドウをもつアプリケーションを作成する
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です。
復帰値
OpenFormメソッドを使った複数ウィンドウの使用例
本節では、「第4章 アプリケーションを作成しよう」で作成したアプリケーションに新しくフォームを追加し、フォームの呼び出し方法のサ ンプルプログラムを作成します。このサンプルプログラムでは、表に入力できる商品が追加できるよう、以下の機能を追加しています。
・ [商品の追加]ボタンをクリックすると、商品の情報を追加するための、[商品の追加]ウィンドウが表示されます。
・ [商品の追加]ウィンドウが表示されると、[購入商品の入力画面]ウィンドウの[商品の追加]ボタンが無効になります。
・ [商品の追加]ウィンドウで[商品名]と[単価]を入力し、[追加]ボタンをクリックすると、商品ファイルに商品の情報が追加されま す。
・ 追加した商品は、[購入商品の入力画面]ウィンドウの表で使用することができるようになります。
・ [商品の追加]ウィンドウの[閉じる]ボタンをクリックすると、[商品の追加]ウィンドウが閉じます。
・ [商品の追加]ウィンドウが閉じられると、[商品の追加]ボタンが有効になります。
アプリケーションは、以下の手順で作成します。
1. モジュールに子ウィンドウとなる新しいフォームを追加し、名前を設定します。
2. 追加した子ウィンドウを開くためのボタンを、呼び出し元のフォームに追加します。
3. 呼び出し元のフォームに、フォームを開くための手続きを記述します。
4. コントロールを新しいフォームの適切な位置に配置し、大きさを変更します。
5. 新しいフォームの手続きを記述します。
ポイント
本節で作成するサンプルプログラムは、"SimpleForm\Table2.ppj"に格納されています。必要に応じて参照してください。
モジュールに新しいフォームを追加する
以下の操作により、モジュールに新しいフォームを追加し、名前を設定します。
1. プロジェクトウィンドウのデザインツリーウィンドウで、モジュールを選択します。
2. ポップアップメニューの[フォーム作成]コマンドを選択します。
3. モジュールにCfFormN(Nは正数値)という名前でフォームが追加され、フォーム編集ウィンドウが表示されます。
4. フォームのプロパティ設定ダイアログボックスを開き、[名前]を"AddForm"に変更します。
5. [キャプション]を"商品の追加"に変更します。
呼び出し元のフォームを編集する
新しく作成したフォームを呼び出すために、以下の手順でフォームを編集します。
1. MainFormのポップアップメニューで[開く]コマンドを選択し、フォーム編集ウィンドウを表示します。
2. 下図のように、コマンドボタンコントロールをフォームの空いている位置に任意に配置します。
3. 配置したコマンドボタンコントロールのプロパティ設定ダイアログボックスで、[キャプション]を"商品の追加"、[名前]を"BT-ADD"
に変更します。
フォームを開くための手続きを記述する
新しく作成したフォームを開くために、以下の手続きを追加します。
・ 開くフォームを識別するためのIDの定義(WORKING-STORAGE)
・ [商品の追加]ボタンをクリックしたときの手続き(BT-ADD-Click)
・ 開いたフォームが閉じられたときの手続き(MainForm-CloseChild) 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つのフォームを開いただけなので、とくにこのパラメタを判定する必要はありませんが、例として記述して います。
新しいフォームにコントロールを配置する
新しく作成したフォームを開き、以下のコントロールを配置します。
・ スタティックテキストコントロールを4つ(CmStatic1~CmStatic4)
・ テキストボックスコントロールを3つ(CmText1~CmText3)
・ コマンドボタンコントロールを2つ(CmCommand1~CmCommand2)
各コントロールのプロパティ設定ダイアログボックスを使って、以下のようなフォームを作成します。
各コントロールのプロパティ設定ダイアログボックスでの設定内容を、以下に示します。
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)
・ フォームが開かれたときの手続き(AddForm-Opened)
・ [追加]ボタンをクリックしたときの手続き(BT-ADD-Click)
・ [閉じる]ボタンをクリックしたときの手続き(BT-EXIT-Click)
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