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 プロジェクトには、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
ここで、 RowSet は、ControlInterface.cbl (後で説明) 内の WPF ユーザ・コントロールに対する COM インターフェースで定義されます。
WPFGridViewUserControl プロジェクトには、2 つのユーザ・コントロール (WPF と Windows Forms) が含まれています。WPF ユーザ・コントロールは Windows Forms ユーザ・コントロール (後で ActiveX コントロールとしてラップされる) としてホストされるため、これらのコントロールはどちらも必要です。コンテンツは実際には WPF コントロールですが、Customer + .NET User Control サンプルの場合と同様に Windows Forms ユーザ・コントロールとして処理されます。
この 2 つのコントロールを確認するには、次のファイルをダブルクリックします。
プロジェクトには、実装を完了するために次のものが含まれています。
プロジェクトは、COM 相互運用性に登録されます。COMRegister() メソッドに加えて、ActiveX コンテナがこれをコントロールとして認識するように適切なエントリをレジストリに挿入します。このメソッドについては、後で詳しく説明します。
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 には、DataGrid コントロールの動作を定義するクラスが含まれています。その主なタスクは、古い ActiveX コントロールの動作を新しい DataGrid コントロールで再現することです。
GridViewControl.cbl に含まれているコードは次のとおりです。
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
クラスのシリアル化を可能にします。この属性は、クラスが ISerializable インターフェースを実装してシリアル化プロセスを制御する場合にも必要です。
attribute Serializable()
マネージ・クラスを COM に対して可視にします。そのクラスを COM に公開します。
attribute ComVisible(true)
COM オブジェクトの ProgID を指定します。これは、COM/ActiveX オブジェクトの識別に使用される人間可読形式のクラス識別子 (CLSID) です。
attribute ProgId("WPFSampleGridView")
早期バインドと遅延バインドをサポートするクラス・インターフェースを生成します。
attribute ClassInterface(type ClassInterfaceType::None)
COM に公開するデフォルト・インターフェースとして ISampleGridView インターフェースを指定します。
attribute ComDefaultInterface (type of MicroFocus.VisualCOBOL.IWPFSampleGridView)
WindowsFormsControlLibrary1.dll ライブラリ (GridViewUserControl プロジェクトによってビルドされる) の COM イベント・ソースとして公開されるインターフェースとして IGridViewEvents を識別します。
attribute ComSourceInterfaces (type of MicroFocus.VisualCOBOL.IWPFGridViewEvents)
明示的な GUID を指定します。これにより、ビルドと登録を行うたびに新しい GUID が生成されることが回避されます。そのため、これはデバッグ段階で役立ちます。
attribute Guid("E0A41600-4531-4E55-9B24-6D2F1CF8B106")
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".
このメソッドは、指定されたオブジェクトのレジストリにエントリを追加します。このメソッドは適切なエントリを設定してオブジェクトを ActiveX として登録するため、ActiveX コンテナはこれをコントロールとして認識します。これにより、Dialog System はインポート可能なコントロールの 1 つとして ActiveX をリストできるようになります。
Register for COM Interop プロジェクト・プロパティは、オブジェクトを COM として登録しますが、ActiveX としては登録しません。
COMRegister() メソッドの逆のメソッド。
これらのメソッドは、WPFSampleGridView のインスタンスを作成します。デフォルトの New() メソッドは、適切なメソッド (OnSelectionChanged()、OnCellEditEnding()、および OnSourceUpdated()) を起動してインスタンスを初期化し、指定されたデータを追加します。
OnSourceUpdated イベントを処理し、更新された行を確認して、FireOnChanged() メソッドを起動します。
OnCellEditEnding イベントを処理して、FireOnChanged() メソッドを起動します。
OnSelectionChanged イベントを処理し、行を確認して、FireRowSelected() メソッドを起動します。
これは、コントロールのシリアル化の一部として使用されます。ただし、このサンプルには持続するものが何もないため、このメソッドは使用されません。
IWPFSampleGridView インターフェースを実装し、行のインスタンスを作成します。
これにより、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
セル編集イベントを処理します。
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.
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 クラスを定義します。CustomerOrder クラスには、顧客オーダのインスタンスを作成および初期化するメソッドと顧客オーダの配列を返すメソッドが含まれます。
CustomerOrder クラスは、WPF の重要な概念であるデータ・バインドを実演し、どのようにデータをユーザ・インターフェースに関連付けることができるのかを示します。
CustomerOrder クラスは、データ・ブロック内の Customer Order グループ項目にマッピングされます。そのため、サンプルの一部は、データ・ブロックからデータを取得して、顧客オーダのリストを作成します。このオブジェクトは WPF DataGrid に関連付けられ、WPF DataGrid はリスト内のデータを照合するためのコントロールをレンダリングします。このオブジェクトは、GridViewControl.cbl で ObservableCollection 型として定義されます。