サンプル:Dialog System アプリケーション用 ActiveX としての Windows Forms コントロール

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 があります。.NET COBOL コードは、ActiveX としてラップされる Windows Forms ユーザー コントロールとともに右側にあります。この図は、.NET COBOL コードが含まれている COM 呼び出し可能ラッパー (COM Callable Wrapper; CCW) のインターフェイスとなるネイティブ コードも示しています。

注:

このサンプルでは、コントロールはグリッド コントロールの完全な実装ではなく、アプリケーションも完全な実装ではありません。サンプルは、原理だけを示すように設計されています。

CustGrid プロジェクト

CustGrid プロジェクトには、Dialog System の元の CustGrid プロジェクトと次のものが含まれます。

  • CustGrid.gs はスクリーンセットであり、現在は元の ActiveX グリッド コントロールではなく DataGridView コントロールが含まれています。以前と同様に、Dialog System はコールアウトとコールバックを使用してネイティブ コードの gridctrl.cbl と通信します。
  • GridCtrl.cbl は、DataGridView コントロールによって生成されたイベントを処理し、以前に ActiveX コードを起動していた場合と同じ方法で COM コードを起動します。たとえば、Delete-A-Row Section は、次のように行削除イベントを処理して COM コードを起動します。
      INVOKE  RowSet  "GetSelect"  USING  theRow  RETURNING  Numeric-Value
      INVOKE  RowSet  "Remove"  USING  Numeric-Value

    ここでは、RowSet は、Windows Forms ユーザー コントロールの COM インターフェイスで定義されます。後述の「ControlInterface.cbl」のセクションを参照してください。

GridViewUserControl プロジェクト

GridViewUserControl プロジェクトは、COM 相互運用に登録されます。COMRegister() メソッドに加えて、ActiveX コンテナーがこれをコントロールとして認識するように適切なエントリをレジストリに挿入します。このメソッドについては、後で詳しく説明します。

次のようにクラス インターフェイス、イベント インターフェイス、およびクラス自体を宣言すると、.NET COBOL グリッド ユーザー コントロールが COM に公開されます。

  • ControlInterface.cbl 内の MicroFocus.VisualCOBOL.ISampleGridView クラス インターフェイス
  • GridViewControl.cbl 内の SampleGridView クラス
  • GridViewEvents.cbl 内の IGridViewEvents イベント インターフェイス

プロジェクトには、実装を完了するために他のクラスも含まれています。

  • UserDataGridViewRow クラス (行を処理するためのメソッドが含まれている)
  • RowSet クラス (グリッドの行を処理するためのメソッドが含まれている)
  • CalendarColumn クラス (データ グリッドで使用するカレンダー エディター列を実装する)

ControlInterface.cbl

ControlInterface.cbl では、コントロールのメソッドとプロパティを COM に公開するインターフェイスが定義されます。

  interface-id  MicroFocus.VisualCOBOL.ISampleGridView
      attribute  Guid("5A0AED5B-7D47-48C9-9F95-DEE8BC2D4807").
  method-id  get  property  RowSet.
  ...

GridViewControl.cbl [code]

GridViewControl.cbl には、DataGridView コントロールの動作を定義するクラスが含まれています。その主なタスクは、古い ActiveX コントロールの動作を新しい DataGridView コントロールで再現することです。

GridViewControl.cbl に含まれているコードは次のとおりです。

Class-id SampleGridView

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
						
attribute Serializable()

クラスのシリアル化を可能にします。この属性は、クラスが ISerializable インターフェイスを実装してシリアル化プロセスを制御する場合にも必要です。

  attribute Serializable()
attribute ComVisible(true)

.NET クラスを COM に対して可視にします。つまり、クラスを COM に公開します。

 attribute ComVisible(true)
attribute ProgId

COM オブジェクトの ProgID を指定します。これは、COM/ActiveX オブジェクトの識別に使用される人間可読形式のクラス識別子 (CLSID) です。

  attribute ProgId
      ("MicroFocus.VisualCOBOL.SampleGridView")
attribute ClassInterface

早期バインドと遅延バインドをサポートするクラス インターフェイスを生成します。

  attribute ClassInterface
      (type ClassInterfaceType::AutoDual)
attribute ComDefaultInterface

COM に公開するデフォルト インターフェイスとして ISampleGridView インターフェイスを指定します。

  attribute ComDefaultInterface
      (type of MicroFocus.VisualCOBOL.ISampleGridView)
attribute ComSourceInterfaces

WindowsFormsControlLibrary1.dll ライブラリ (GridViewUserControl プロジェクトによってビルドされる) の COM イベント ソースとして公開されるインターフェイスとして IGridViewEvents を識別します。

  attribute ComSourceInterfaces
      (type of GridViewUserControl.IGridViewEvents)
attribute Guid

明示的な GUID を指定します。これにより、ビルドと登録を行うたびに新しい GUID が生成されることが回避されます。そのため、これはデバッグ段階で役立ちます。

  attribute Guid("B33E4887-6BC0-4382-883B-EB0015F55D9B")
COMRegister()

指定されたオブジェクトのレジストリにエントリを追加します。このメソッドは適切なエントリを設定してオブジェクトを ActiveX として登録するため、ActiveX コンテナーはこれをコントロールとして認識します。これにより、Dialog System はインポート可能なコントロールの 1 つとして ActiveX をリストできるようになります。

プロジェクト プロパティの [Register for COM Interop] は、オブジェクトを COM として登録しますが、ActiveX としては登録しません。

COMUnregister()

指定されたオブジェクトのエントリをレジストリから削除します。

New()

SampleGridView のインスタンスを作成します。

GetObjectData()

これは、コントロールのシリアル化の一部として使用されます。ただし、このサンプルには持続するものが何もないため、このメソッドは使用されません。

イベント処理メソッド
  • FireOnChanged() - OnChanged イベントを処理します。
  • FireRowSelected() - OnRowSelected イベントを処理します。
  • FireRowDeleted() - OnRowDeleted イベントを処理します。
  • OnRowEnter() - FireRowSelected() メソッドを起動します。
Get property RowSet

ISampleGridView インターフェイスを実装します。行のインスタンスを作成します。

Get property OrderGrid

これにより、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.
						
OrdersGridView_CellEndEdit()

セル編集イベントを処理して、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

次のように、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 クラスで定義されたデリゲートに対応します。

このインターフェイスはソリューションでは実装されないので注意してください。