サンプル:Dialog System Application の WPF User Control

Customer + .NET WPF GridView User Control サンプルの CustGridWPF.sln では、Dialog System アプリケーションによって使用される WPF ユーザー コントロールを示します。このサンプルは、WPF ユーザー コントロールがどのようにホストされ、どのようにメソッドを起動させ、どのようにイベントを作動させるのかを示します。イベントは Dialog System アプリケーションで消費できます (次の図を参照)。

このサンプルで示される WPF については、重要なポイントが 2 つあります。

サンプルは、Dialog System の元の CustGrid サンプルに基づいています。サンプルには 2 つのプロジェクトがあり、その 1 つは元の CustGrid サンプルです。もう 1 つのプロジェクトには、COBOL で記述された単純な WPF DataGrid コントロールのコードが含まれています。DataGrid コントロールは、Customer サンプル (Customer + .NET User Control および Customer + .NET WinForm) で使用されるコントロールに似ています。このサンプルでは、DataGrid は WPF ユーザー コントロールです。

注:

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

WPFCustGrid プロジェクト

WPFCustGrid プロジェクトには、Dialog System の元の CustGrid プロジェクトが含まれています。

CustGrid.gs はスクリーンセットであり、現在は元の ActiveX グリッド コントロールではなく DataGrid コントロールが含まれています。以前と同様に、Dialog System はコールアウトとコールバックを使用してネイティブ コードの gridctrl.cbl と通信します。

GridCtrl.cbl は、DataGrid コントロールによって生成されたイベントを処理し、以前に ActiveX コードを起動していた場合と同じ方法で COM コードを起動します。例えば、Delete-A-Row Section は、次のように行削除イベントを処理して COM コードを起動します。

  INVOKE RowSet "GetSelect" USING theRow RETURNING Numeric-Value
  INVOKE RowSet "Remove" USING Numeric-Value

ここでは、RowSetControlInterface.cbl (後で説明) 内の WPF ユーザー コントロールに対する COM インターフェイスで定義されます。

WPFGridViewUserControl プロジェクト

WPFGridViewUserControl プロジェクトには、2 つのユーザー コントロール (WPF と Windows Forms) が含まれています。WPF ユーザー コントロールは Windows Forms ユーザー コントロール (後で ActiveX コントロールとしてラップされる) としてホストされるため、これらのコントロールはどちらも必要です。コンテンツは実際には WPF コントロールですが、Customer + .NET User Control サンプルの場合と同様に Windows Forms ユーザー コントロールとして処理されます。

この 2 つのコントロールを確認するには、次のファイルをダブルクリックします。

  • WPFUserControl.xaml - プロパティは、コントロールが DataGrid 型の WPF コントロールであることを示します。XAML は DataGrid の定義を示します。[Document Outline] では、このコントロールは DataGrid として表示されます。[Document Outline] は [View > Other Windows] から使用できます。
  • GridViewControl.cbl [Design] - プロパティは、コントロールが Windows.Forms.ElementHost 型であることを示します。[Document Outline] では、このコントロールは ElementHost 型の GridHost として表示されます。[Toolbox] の [WPF Interoperability] では、この型のコントロールは ElementHost としてリストされます。

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

  • CustomerOrder.cbl 内の CustomerOrder クラス (データ ブロック内の CustomerOrder グループ項目にマッピングされる)
  • ControlInterface.cbl 内の MicroFocus.VisualCOBOL.IWPFSampleGridView クラス インターフェイス
  • GridViewControl.cbl 内の WPFSampleGridView クラス
  • GridViewEvents.cbl 内の IWPFGridViewEvents イベント インターフェイス
  • RowSet.cbl 内の RowSet クラス (グリッドの行を処理するためのメソッドが含まれている)

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

ControlInterface.cbl

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

  interface-id  MicroFocus.VisualCOBOL.IWPFSampleGridView
      attribute  Guid("77BECD4D-5504-442D-9DDA-A78C30ADF6A9")
      attribute  InterfaceType(type  ComInterfaceType::InterfaceIsDual)
      attribute  ComVisible(true).
  method-id  get  property  RowSet.
  ...

GridViewControl.cbl [code]

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

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

WPFSampleGridView

WPFSampleGridView クラスを定義します。このクラスは、Windows Forms UserControl クラスから継承され、ControlInterface.cbl で宣言された IWPFSampleGridView インターフェイスを実装します。また、シリアル化動作を制御できるようにする ISerializable インターフェースも実装します。

  Class-id WPFSampleGridView
      inherits type System.Windows.Forms.UserControl
      implements  
        type System.Runtime.Serialization.ISerializable
        type MicroFocus.VisualCOBOL.IWPFSampleGridView
attribute Serializable()

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

  attribute Serializable()
attribute ComVisible(true)

マネージ クラスを COM に対して可視にします。そのクラスを COM に公開します。

  attribute ComVisible(true)
attribute ProgId

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

  attribute ProgId("WPFSampleGridView")
attribute ClassInterface

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

  attribute ClassInterface(type ClassInterfaceType::None)
attribute ComDefaultInterface

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

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

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

  attribute ComSourceInterfaces (type of  
        MicroFocus.VisualCOBOL.IWPFGridViewEvents)
attribute Guid

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

  attribute Guid("E0A41600-4531-4E55-9B24-6D2F1CF8B106")
CustomerOrder オブジェクトの ObservableCollection

CustomerOrder オブジェクトの監視可能コレクションを作成します。これにより、ユーザー インターフェースの変更時 (ユーザーがデータを編集する際など) にバッキング データを更新できます。

 *> Create an observable collection of CustomerOrder
 *> objects so that the data grid receives notifications
 *> such as add, delete in order to refresh the list
  01 _customerOrders 
      type ObservableCollection[type CustomerOrder]
      value new ObservableCollection[type CustomerOrder]
      public
      property as "CustomerOrders".
SampleGridView クラス

SampleGridView クラスは、次のメソッドとデリゲート定義を提供します。

COMRegister()

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

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

COMUnregister()

COMRegister() メソッドの逆のメソッド。

New()

これらのメソッドは、WPFSampleGridView のインスタンスを作成します。デフォルトの New() メソッドは、適切なメソッド(OnSelectionChanged()、OnCellEditEnding()、および OnSourceUpdated()) を起動してインスタンスを初期化し、指定されたデータを追加します。

OnSourceUpdated()

OnSourceUpdated イベントを処理し、更新された行を確認して、FireOnChanged() メソッドを起動します。

OnCellEditEnding()

OnCellEditEnding イベントを処理して、FireOnChanged() メソッドを起動します。

OnSelectionChanged()

OnSelectionChanged イベントを処理し、行を確認して、FireRowSelected() メソッドを起動します。

GetObjectData()

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

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

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

Get property OrderGrid

これにより、Windows Forms ユーザー コントロールは WPF DataGrid ユーザー コントロールにアクセスできるようになります。

  method-id. get property OrderGrid.
  procedure division returning thegrid as 
        type System.Windows.Controls.DataGrid.
    set thegrid to self::wpfUserControl1::OrdersGrid
WPFSampleGridView_Load()

セル編集イベントを処理します。

  method-id OrdersGridView_CellEndEdit final private.
  procedure division using by value 
      sender as object 
      e as type System.EventArgs.
デリゲート定義

イベントのデリゲートを定義します。

  01 OnRowSelected type RowSelectedEventHandler event public.
  01 OnRowDeleted type RowDeletedEventHandler event public.
  01 OnChanged type CellEditEndingHandler event public.
	 ...
  delegate-id RowSelectedEventHandler.
  delegate-id RowDeletedEventHandler.
  delegate-id CellEditEndingHandler.

GridViewEvents.cbl

IWPFGridViewEvents.cbl は、イベントのインターフェイスを定義します。インターフェースには、呼び出し元を遅延バインドに制限する ComInterfaceType.InterfaceIsIDispatch 属性があります。

  interface-id MicroFocus.VisualCOBOL.IWPFGridViewEvents
      attribute Guid("3DC45DA1-A580-4280-A2DB-7B6A266032AE")
      attribute InterfaceType
         (type ComInterfaceType::InterfaceIsIDispatch)
      attribute ComVisible(true).

次のように、インターフェースは各イベントのメソッドを定義し、各イベントに COM ディスパッチ識別子 (DispId) を割り当てます。

  method-id OnRowSelected attribute DispId(29).
  ...
  method-id OnRowDeleted attribute DispId(18).
  ...
  method-id OnChanged attribute DispId(6).

イベントは、GridViewControl.cbl 内の WPFSampleGridView クラスで定義されたデリゲートに対応します。

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

CustomerOrder.cbl

CustomerOrder.cbl は CustomerOrder クラスを定義します。CustomerOrder クラスには、顧客オーダーのインスタンスを作成および初期化するメソッドと顧客オーダーの配列を返すメソッドが含まれます。

CustomerOrder クラスは、WPF の重要な概念であるデータ バインドを実演し、どのようにデータをユーザー インターフェイスに関連付けることができるのかを示します。

CustomerOrder クラスは、データ ブロック内の Customer Order グループ項目にマッピングされます。そのため、サンプルの一部は、データ ブロックからデータを取得して、顧客オーダーのリストを作成します。このオブジェクトは WPF DataGrid に関連付けられ、WPF DataGrid はリスト内のデータを照合するためのコントロールをレンダリングします。このオブジェクトは、GridViewControl.cbl で ObservableCollection 型として定義されます。