第8章 プログラミングテクニック
8.2 オブジェクトを使ったアプリケーションを作成する
PowerCOBOLでは、コントロールだけでなく、オブジェクトについても手続き上で扱うことができます。
たとえば、ツリービューコントロールを構成するノードオブジェクト、リストビューコントロールを構成するリストアイテムオブジェクトやツー ルバーコントロールのボタンオブジェクトなどにアクセスし、それらのプロパティを操作することができます。
また、オブジェクトをイベントの引数として受け取ることもできます。
8.2.1 オブジェクトへアクセスするには
オブジェクトへアクセスするには、以下の3つの方法があります。
・ コントロールと同様にアクセスする方法
・ オブジェクトのクラス名を利用してアクセスする方法
・ NetCOBOLの*COMクラスを利用してアクセスする方法
コントロールと同様にアクセスする
フォーム(Form)オブジェクトは、コントロールと同様にアクセスすることができます。たとえば、フォームのキャプションを変更する場合 は、以下のように記述できます。
MOVE "新キャプション名" TO "Caption" OF POW-SELF
この形式では、POW-SELFの代わりにフォーム名を指定することもできます。
フォーム以外のオブジェクトは、コントロールの構成要素になっています。コントロールは、これらの構成要素となるオブジェクトを指し 示すプロパティをもっています。このプロパティを使って、COBOLの集団項目内のデータにアクセスするように、修飾を用いてオブジェ クトにアクセスします。
たとえば、ツリービューコントロールの2番めのルートノード(最上位階層にある項目)に表示されている文字列を参照する場合は、以下 のように記述します。
MOVE "Text" OF "Root"(2) OF ツリービューコントロール名 TO 転記先
また、スタティックテキストコントロールのフォントサイズを20に変更する場合は、以下のように記述します。
MOVE 20 TO "Size" OF "Font" OF スタティックテキストコントロール名
ポイント
各コントロールがもつオブジェクトの種類、およびオブジェクトがもつプロパティやメソッドについての詳細は、『リファレンス』を参照して ください。
オブジェクトのクラス名を利用してアクセスする
オブジェクトに対応するクラス名をUSAGE句で宣言したデータに、オブジェクト自体を格納することにより、そのデータを利用してオブ ジェクトにアクセスすることができます。
PowerCOBOLでは、以下のクラス名が利用できます。
オブジェクトの種類 クラス名
カラム(Column) POW-CCOLUMN
フォント(Font) POW-CFONT リストアイテム(ListItem) POW-CLISTITEM ノード(Node) POW-CNODE
その他 POW-COBJECT
たとえば、ツリービューコントロールのノードにアクセスする場合、以下のように記述します。
WORKING-STORAGE SECTION.
01 WK-ROOT-NODE USAGE IS OBJECT REFERENCE POW-CNODE.
01 WK-CHILD-NODE USAGE IS OBJECT REFERENCE POW-CNODE.
01 WK-COUNT-NUM PIC S9(9) COMP-5.
PROCEDURE DIVISION.
* ツリービューコントロールの2番めのルートノードを取り出します MOVE "Root"(2) OF ツリービューコントロール名 TO WK-ROOT-NODE * 2番めのルートノードの3番めの子ノードを取り出します
MOVE "Child"(3) OF WK-ROOT-NODE TO WK-CHILD-NODE
* 子ノードの表示文字列を変更し、その配下にあるノード数を求めます MOVE "新テキスト" TO "Text" OF WK-CHILD-NODE
MOVE "Count" OF WK-CHILD-NODE TO WK-COUNT-NUM
ポイント
各コントロールがもつオブジェクトの種類、およびオブジェクトがもつプロパティやメソッドについての詳細は、『リファレンス』を参照して く だ さ い 。 ま た 、 そ の 他 の 使 用 例 に つ い て は 、 オ ブ ジ ェ ク ト を も つ コ ン ト ロ ー ル の サ ン プ ル プ ロ グ ラ ム ("\TreeView
\TreeView.ppj"や"ListView\ListView.ppj"など)を参照してください。
注意
オブジェクトのクラス名を利用してプロパティにアクセスする場合は、大文字と小文字を区別してプロパティ名を記述する必要がありま す。
NetCOBOLの*COMクラスを利用してアクセスする
NetCOBOLのCOM連携機能である*COMクラスを利用して、オブジェクトにアクセスすることができます。
この方法は、サードパーティによって提供されているコントロールのオブジェクトにアクセスする場合など、オブジェクトのクラス名がわか らないときに使用します。アクセスするための手順を以下に示します。
1. フォーム環境部のリポジトリ段落(REPOSITORY)で*COMクラスを宣言します。
2. イベント手続きまたはフォームの作業場所節(WORKING-STORAGE)で、オブジェクトを取り出すためのデータを定義します。
3. イベント手続きまたはフォームの作業場所節で、*COMクラスのオブジェクト(COMオブジェクト)として参照するためのデータを 定義します。
4. 手続き中で、処理対象とするオブジェクトを取り出します。
5. "POWERCONVTOCOM"を呼び出し、オブジェクトをCOMオブジェクトに変換します。
6. COMオブジェクトを使って、オブジェクトにアクセスします。
7. 最後に、使用したCOMオブジェクト用のデータにNULLを設定し、クリアします。
"POWERCONVTOCOM"は、オブジェクトをCOMオブジェクトとして扱えるようにするための、PowerCOBOLで用意している変換ルー
チンです。また、COMオブジェクトをPowerCOBOLで扱えるようにするための変換ルーチンとして、"POWERCONVFROMCOM"があ ります。"POWERCONVTOCOM"および"POWERCONVFROMCOM"の記述形式を以下に示します。
POWERCONVTOCOMの書き方
CALL ”POWERCONVTOCOM”
USING オブジェクト
RETURNING COMオブジェクト オブジェクト
PowerCOBOLのプロパティやメソッドを使って取り出した、オブジェクトを示すデータ項目です。この変換ルーチンの入力となりま す。この引数を省略することはできません。データ部の定義では、"USAGE IS"を省略することができます。
COMオブジェクト
USAGE IS OBJECT REFERENCE COMのクラス名
NetCOBOLで扱うことができるCOMオブジェクトを取り出すためのデータ項目です。この変換ルーチンの出力となります。この引数 を省略することはできません。データ部の定義では、"USAGE IS"を省略することができます。COMのクラス名は、リポジトリ段落 (REPOSITORY)でNetCOBOLの*COMクラスとして宣言したクラス名です。
復帰値
ありません。PROGRAM-STATUSの値は不定となります。
POWERCONVTOCOMの使用例
たとえば、ツリービューコントロール上でノードが選択されている状態で、コマンドボタンコントロール(Btn-Rename)をクリックしたとき、選 択中のノードに表示されている文字列を変更するには、以下のような手続きを作成します。
REPOSITORY
CLASS COM AS "*COM"
Btn-Rename-Click
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WK-TEXT PIC X(100).
* オブジェクトを取り出すための領域
01 PCMNODE USAGE IS OBJECT REFERENCE POW-COBJECT.
* *COMクラスを使ってアクセスするためのノード用のCOMオブジェクト 01 COMNODE USAGE IS OBJECT REFERENCE COM.
PROCEDURE DIVISION.
* 指定された文字列を取り出します。
MOVE "Text" OF CmText11 TO WK-TEXT
* ツリービューコントロールで選択中のノードオブジェクトを取り出します。
MOVE "SelNode" OF TreeView TO PCMNODE
* COM連携機能を利用して、NODEオブジェクトにアクセスします。
IF PCMNODE NOT = 0 THEN
* *COMクラスを使ってアクセスできるように、
* ノードオブジェクトを変換します。
CALL "POWERCONVTOCOM" USING PCMNODE RETURNING COMNODE
* 指定された文字列を選択中のノードオブジェクトのラベルに設定します。
INVOKE COMNODE "SET-TEXT" USING WK-TEXT * 使用したCOMオブジェクトをクリアします。
SET COMNODE TO NULL END-IF
ポイント
- この例題では、PowerCOBOLが提供するツリービューコントロールを使っています。したがって、PCMNODEをPOW-CNODE 型のオブジェクトとして宣言することもできますが、POWERCONVTOCOMの利用方法を示すために、POW-COBJECTを使っ ています。
POW-CNODEを使って宣言した場合、COMオブジェクトに変換しないで、ノードオブジェクトを操作できますが、POW-COBJECT を使って宣言した場合、オブジェクトを操作するにはPOWERCONVTOCOMでCOMオブジェクトに変換する必要があります。
また、最後にCOMオブジェクトをクリアする必要があります。
- "SET-TEXT"メソッドは、NetCOBOLが用意しているメソッドで、対象となるCOMオブジェクトの"TEXT"プロパティに引数の値を
設定することを示しています。詳細は、『NetCOBOL ユーザーズガイド』を参照してください。
- ここで作成したサンプルプログラムは、"ComClass\AccessToObject.ppj"に格納されています。必要に応じて参照してください。
POWERCONVFROMCOMの書き方
CALL ”POWERCONVFROMCOM”
USING COMオブジェクト RETURNING オブジェクト COMオブジェクト
USAGE IS OBJECT REFERENCE COMのクラス名
NetCOBOLで扱うことができるCOMオブジェクトを示すデータ項目です。この変換ルーチンの入力となります。この引数を省略する ことはできません。データ部の定義では、"USAGE IS"を省略することができます。COMのクラス名は、リポジトリ段落(REPOSITORY)
でNetCOBOLの*COMクラスとして宣言したクラス名です。
オブジェクト
USAGE IS OBJECT REFERENCE POW-COBJECT
PowerCOBOLのプロパティやメソッドで利用するために取り出した、COMオブジェクトを示すデータ項目です。この変換ルーチンの 出力となります。この引数を省略することはできません。データ部の定義では、"USAGE IS"を省略することができます。
復帰値
ありません。PROGRAM-STATUSの値は不定となります。
POWERCONVFROMCOMの使用例
たとえば、ADOデータソースコントロールのRecordsetプロパティに、COMオブジェクトとして作成されたRecordsetオブジェクトを設定す る場合、以下のような手続きを作成します。
REPOSITORY
CLASS COM AS "*COM"
MainForm-WORKING-STORAGE
* Recordsetオブジェクトを示すCOMオブジェクト 01 COMRST OBJECT REFERENCE COM.
* オブジェクトを取り出すための領域
01 PCMRST OBJECT REFERENCE POW-COBJECT.
Btn-Connect-Click
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
* 作成したRecordsetオブジェクトをPowerCOBOLのオブジェクト形式に変換します。
CALL "POWERCONVFROMCOM" USING COMRST RETURNING PCMRST * ADOデータソースコントロールのRecordsetプロパティに設定します。
INVOKE CmADODataSource1 "SETREF-Recordset" USING PCMRST …
8.2.2 オブジェクトをイベントの引数として受け取るには
オブジェクトを引数として受け取るイベント手続きを編集する場合、手続きを記述する前に、連絡節の修正が必要です。たとえば、ツ リービューコントロールのノードがクリックされた場合に発生するNodeClickイベントでは、次のような手続きが初期値として生成されま す。
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.