オブジェクトへアクセスするには、以下の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
ポイント
注意
オブジェクトのクラス名を利用してプロパティにアクセスする場合は、大文字と小文字を区別してプロパティ名を記述する必要があります。
NetCOBOLの*COMクラスを利用してアクセスする
NetCOBOLのCOM連携機能である*COMクラスを利用して、オブジェクトにアクセスすることができます。
この方法は、サードパーティによって提供されているコントロールのオブジェクトにアクセスする場合など、オブジェクトのクラス名がわからないときに使用します。アクセスするための手順を以下に示します。
フォーム環境部のリポジトリ段落(REPOSITORY)で*COMクラスを宣言します。
イベント手続きまたはフォームの作業場所節(WORKING-STORAGE)で、オブジェクトを取り出すためのデータを定義します。
イベント手続きまたはフォームの作業場所節で、*COMクラスのオブジェクト(COMオブジェクト)として参照するためのデータを定義します。
手続き中で、処理対象とするオブジェクトを取り出します。
"POWERCONVTOCOM"を呼び出し、オブジェクトをCOMオブジェクトに変換します。
COMオブジェクトを使って、オブジェクトにアクセスします。
最後に、使用したCOMオブジェクト用のデータにNULLを設定し、クリアします。
"POWERCONVTOCOM"は、オブジェクトをCOMオブジェクトとして扱えるようにするための、PowerCOBOLで用意している変換ルーチンです。また、COMオブジェクトをPowerCOBOLで扱えるようにするための変換ルーチンとして、"POWERCONVFROMCOM"があります。"POWERCONVTOCOM"および"POWERCONVFROMCOM"の記述形式を以下に示します。
POWERCONVTOCOMの書き方
CALL ”POWERCONVTOCOM” USING オブジェクト RETURNING COMオブジェクト
USAGE IS OBJECT REFERENCE POW-COBJECT
PowerCOBOLのプロパティやメソッドを使って取り出した、オブジェクトを示すデータ項目です。この変換ルーチンの入力となります。この引数を省略することはできません。データ部の定義では、"USAGE IS"を省略することができます。
USAGE IS OBJECT REFERENCE COMのクラス名
NetCOBOLで扱うことができるCOMオブジェクトを取り出すためのデータ項目です。この変換ルーチンの出力となります。この引数を省略することはできません。データ部の定義では、"USAGE IS"を省略することができます。COMのクラス名は、リポジトリ段落(REPOSITORY)でNetCOBOLの*COMクラスとして宣言したクラス名です。
ありません。PROGRAM-STATUSの値は不定となります。
POWERCONVTOCOMの使用例
たとえば、ツリービューコントロール上でノードが選択されている状態で、コマンドボタンコントロール(Btn-Rename)をクリックしたとき、選択中のノードに表示されている文字列を変更するには、以下のような手続きを作成します。
CLASS COM AS "*COM"
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 オブジェクト
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オブジェクトを設定する場合、以下のような手続きを作成します。
CLASS COM AS "*COM"
* Recordsetオブジェクトを示すCOMオブジェクト 01 COMRST OBJECT REFERENCE COM. * オブジェクトを取り出すための領域 01 PCMRST OBJECT REFERENCE POW-COBJECT.
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 …