Customer + .NET GridView User Control サンプルでは、ActiveX コントロールとしてラップされた Windows Forms ユーザ・コントロールを示します。Dialog System は ActiveX コントロールをホストできるため、新しい Windows Forms ユーザ・コントロールは ActiveX コントロールとして公開されるようにビルドされます。このサンプルは、ユーザ・コントロールがどのようにホストされ、どのようにメソッドを起動させ、どのようにイベントを作動させるのかを示します。イベントは Dialog System アプリケーションで消費できます。
サンプルは、Dialog System の元の CustGrid サンプルに基づいています。サンプルには 2 つのプロジェクトがあり、その 1 つは元の CustGrid サンプルです。もう 1 つのプロジェクトには、COBOL で記述された単純な Windows Forms DataGridView ユーザ・コントロールのコードが含まれています。DataGridView コントロールは、Customer サンプル (Customer + .NET WPF User Control および Customer + WinForm) で使用されるコントロールに似ています。このサンプルでは、DataGridView は Windows Forms に含まれている WPF ユーザ・コントロールまたはコントロールではなく .NET ユーザ・コントロールです。
次の図の左側には、ネイティブ・コードと、スクリーンセットを処理する Dialog System があります。マネージ・コードは、ActiveX としてラップされる Windows Forms ユーザ・コントロールとともに右側にあります。この図は、マネージ・コードが含まれている COM 呼び出し可能ラッパ (COM Callable Wrapper; CCW) のインターフェースとなるネイティブ・コードも示しています。
CustGrid プロジェクトには、Dialog System の元の CustGrid プロジェクトと次のものが含まれます。
INVOKE RowSet "GetSelect" USING theRow RETURNING Numeric-Value INVOKE RowSet "Remove" USING Numeric-Value
ここで、 RowSet は、Windows Forms ユーザ・コントロールの COM インターフェースで定義されます。後述の『ControlInterface.cbl』を参照してください。
GridViewUserControl プロジェクトは、COM 相互運用性に登録されます。COMRegister() メソッドに加えて、ActiveX コンテナがこれをコントロールとして認識するように適切なエントリをレジストリに挿入します。このメソッドについては、後で詳しく説明します。
次のようにクラス・インターフェース、イベント・インターフェース、およびクラス自体を宣言すると、マネージ COBOL グリッド・ユーザ・コントロールが COM に公開されます。
プロジェクトには、実装を完了するために他のクラスも含まれています。
ControlInterface.cbl では、コントロールのメソッドとプロパティを COM に公開するインターフェースが定義されます。
interface-id MicroFocus.VisualCOBOL.ISampleGridView attribute Guid("5A0AED5B-7D47-48C9-9F95-DEE8BC2D4807"). method-id get property RowSet. ...
GridViewControl.cbl には、DataGridView コントロールの動作を定義するクラスが含まれています。その主なタスクは、古い ActiveX コントロールの動作を新しい DataGridView コントロールで再現することです。
GridViewControl.cbl に含まれているコードは次のとおりです。
SampleGridView クラスを定義します。このクラスは、Windows Forms UserControl クラスから継承され、ControlInterface.cbl で宣言された ISampleGridView インターフェースを実装します。また、シリアル化動作を制御できるようにする ISerializable インターフェースも実装します。
Class-id SampleGridView inherits type System.Windows.Forms.UserControl implements type System.Runtime.Serialization.ISerializable type MicroFocus.VisualCOBOL.ISampleGridView
クラスのシリアル化を可能にします。この属性は、クラスが ISerializable インターフェースを実装してシリアル化プロセスを制御する場合にも必要です。
attribute Serializable()
マネージ・クラスを COM に対して可視にします。つまり、クラスを COM に公開します。
attribute ComVisible(true)
COM オブジェクトの ProgID を指定します。これは、COM/ActiveX オブジェクトの識別に使用される人間可読形式のクラス識別子 (CLSID) です。
attribute ProgId ("MicroFocus.VisualCOBOL.SampleGridView")
早期バインドと遅延バインドをサポートするクラス・インターフェースを生成します。
attribute ClassInterface (type ClassInterfaceType::AutoDual)
COM に公開するデフォルト・インターフェースとして ISampleGridView インターフェースを指定します。
attribute ComDefaultInterface (type of MicroFocus.VisualCOBOL.ISampleGridView)
WindowsFormsControlLibrary1.dll ライブラリ (GridViewUserControl プロジェクトによってビルドされる) の COM イベント・ソースとして公開されるインターフェースとして IGridViewEvents を識別します。
attribute ComSourceInterfaces (type of GridViewUserControl.IGridViewEvents)
明示的な GUID を指定します。これにより、ビルドと登録を行うたびに新しい GUID が生成されることが回避されます。そのため、これはデバッグ段階で役立ちます。
attribute Guid("B33E4887-6BC0-4382-883B-EB0015F55D9B")
指定されたオブジェクトのレジストリにエントリを追加します。このメソッドは適切なエントリを設定してオブジェクトを ActiveX として登録するため、ActiveX コンテナはこれをコントロールとして認識します。これにより、Dialog System はインポート可能なコントロールの 1 つとして ActiveX をリストできるようになります。
Register for COM Interop プロジェクト・プロパティは、オブジェクトを COM として登録しますが、ActiveX としては登録しません。
指定されたオブジェクトのエントリをレジストリから削除します。
SampleGridView のインスタンスを作成します。
これは、コントロールのシリアル化の一部として使用されます。ただし、このサンプルには持続するものが何もないため、このメソッドは使用されません。
ISampleGridView インターフェースを実装し、行のインスタンスを作成します。
これにより、Windows Forms ユーザ・コントロールは DataGridView ユーザ・コントロールにアクセスできるようになります。
01 OrdersGridView type System.Windows.Forms.DataGridView. method-id. get property OrderGrid. procedure division returning thegrid as type DataGridView. set thegrid to self::OrdersGridView goback. end method.
セル編集イベントを処理して、FireOnChanged() を起動します。
method-id OrdersGridView_CellEndEdit final private. procedure division using by value sender as object e as type System.Windows.Forms.DataGridViewCellEventArgs. invoke self::FireOnChanged (e::RowIndex, e::ColumnIndex)
イベントのデリゲートを定義します。
01 OnRowSelected type RowSelectedEventHandler event public. 01 OnRowDeleted type RowDeletedEventHandler event public. 01 OnChanged type RowChangedEventHandler event public. ... delegate-id RowSelectedEventHandler. delegate-id RowDeletedEventHandler. delegate-id RowChangedEventHandler.
次のように、GridViewEvents.cbl はイベントのインターフェースを定義し、各イベントに COM ディスパッチ識別子 (DispId) を割り当てます。
method-id OnRowSelected attribute DispId(29). procedure division using by value row as binary-long, coln as binary-long. ... method-id OnRowDeleted attribute DispId(18). method-id OnChanged attribute DispId(6).
イベントは、GridViewControl.cbl 内の SampleGridView クラスで定義されたデリゲートに対応します。
このインターフェースはソリューションでは実装されないので注意してください。