オートメーションサーバを利用するための手続きは、以下のように記述します。
REPOSITORY句の記述
オートメーションサーバを作成するには、フォームのREPOSITORY句に、NetCOBOLの*COMクラスを以下のように宣言しておく必要があります。
MainForm-REPOSITORY
CLASS COM AS "*COM"
作業場所節の記述
フォームの作業場所節には、オートメーションサーバとして利用するActiveXコントロールのProgIDと、オートメーションサーバとして作成されたオブジェクトを識別するためのデータを、以下のように宣言します。
MainForm-WORKING-STORAGE
* オートメーションサーバとして開くActiveXコントロールのProgID 01 FORM-NAME PIC X(64) GLOBAL VALUE "PcobSampleActiveX.SelectColorControl.1". * オートメーションサーバとして作成される*COMクラスのオブジェクト 01 SUB-FORM OBJECT REFERENCE COM GLOBAL.
フォームを最初に開いたときの手続き
フォームを開いたとき、フォームの背景色の初期値として赤を設定します。
MainForm-Opened
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. * フォームの背景色の初期値として赤を設定します。 MOVE POW-COLOR-RED TO "BackColor" OF POW-SELF
ボタンをクリックしたときの手続き
[色の選択]ボタンをクリックした場合、ActiveXコントロールをオートメーションサーバとして作成し、色を選択するためのウィンドウを表示します。色が選択され、ウィンドウが閉じられたら、フォームの背景色を変更します。
CmCommand1-Click
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 BACK-COLOR PIC S9(9) COMP-5. PROCEDURE DIVISION. * フォームへの操作ができないように、無効状態にします。 MOVE POW-FALSE TO "Enabled" OF POW-SELF * フォームの現在の背景色を求めます。 MOVE "BackColor" OF POW-SELF TO BACK-COLOR * ActiveXコントロールをオートメーションサーバとして作成します。 INVOKE COM "CREATE-OBJECT" USING FORM-NAME RETURNING SUB-FORM * フォームの現在の背景色でActiveXコントロールの選択色を初期化します。 INVOKE SUB-FORM "SelectColor" USING BACK-COLOR * 作成したオートメーションサーバを開きます。 INVOKE SUB-FORM "DoModal" * 選択された色を求めます。 INVOKE SUB-FORM "GET-SELECTEDCOLOR" RETURNING BACK-COLOR * オートメーションサーバを解放します。 SET SUB-FORM TO NULL * 選択された色をフォームの背景色に設定します。 MOVE BACK-COLOR TO "BackColor" OF POW-SELF * フォームを有効にし、クリックしたボタンにフォーカスを戻します。 MOVE POW-TRUE TO "Enabled" OF POW-SELF INVOKE CmCommand1 "SetFocus"
モジュールをビルドし、作成したアプリケーションを実行してみてください。[色の選択]ボタンをクリックすると、ActiveXコントロールが別ウィンドウに表示されます。色を選択し、ウィンドウを閉じると、呼び出し元のフォームの背景色が変更されます。
ポイント
この手続きでは、"GET-SELECTEDCOLOR"メソッドを使って、選択された色を求めています。これは、"GET-プロパティ名"という形式でメソッドを呼び出すと、対象となるオブジェクトのプロパティの値を取得することができるNetCOBOLのオブジェクト機能を利用しています。
NetCOBOLの*COMクラスを使ったプログラミングについての詳細は、『NetCOBOL ユーザーズガイド』を参照してください。
ActiveXコントロールをオートメーションサーバとして作成(CREATE-OBJECT)しただけでは、ウィンドウとして表示されません。DoModalメソッドを呼び出すことによりGUIをもつウィンドウとして表示されます。
また、表示されたウィンドウを閉じただけでは、オートメーションサーバはWindowsのメモリ上に残っています。解放する場合には、オブジェクト参照用の変数に対してNULLを設定してください。
注意
CREATE-OBJECTメソッドを呼び出したあと、DoModalメソッドでGUIとして表示されるまでのあいだ、オブジェクトのプロパティへのアクセスおよびメソッドの呼び出しはできますが、イベントは発生しません。
たとえば、ウィンドウが表示されている状態で、オプションボタンコントロールのValueプロパティにPOW-TRUEが設定されるとオプションボタンコントロールのClickイベントが発生します。しかし、このサンプルプログラムのActiveXコントロールでは、SelectColorメソッドの呼び出しによってValueプロパティにPOW-TRUEを設定しても、オプションボタンコントロールはウィンドウの要素として表示されていませんので、Clickイベントは発生しません。
したがって、オートメーションサーバを利用してアプリケーションを作成する場合は、イベントを発生することを前提にした手続きを記述しないようにしてください。
NetCOBOLの*COMクラスを使ってオートメーションサーバを作成した場合、そのウィンドウからイベントを受け取ることができないため、呼び出し元のフォームでは、ウィンドウが閉じられたかどうかを認識できません。したがって、このサンプルプログラムではDoModalメソッドを使って、ウィンドウが閉じられるまで呼び出し元のフォームの処理が中断されるようにしています。Activateメソッドを使用してウィンドウを表示させると、ウィンドウが閉じられたことを認識することができないため、オブジェクトを解放(NULLを設定)するタイミングを特定できません。