コンポーネント ラッパーの利用
COM クライアントの作成:インデックス への移動
サーバーオブジェクトのコンポーネントラッパーを生成した場合,COM クライアントアプリケーションの作成は,VCL コンポーネントが入ったほかのアプリケーションの作成と大差ありません。サーバーオブジェクトのプロパティ,メソッド,およびイベントは,すでに VCL コンポーネントにカプセル化されています。イベントハンドラを割り当て,プロパティ値を設定し,メソッドを呼び出すだけで済みます。
サーバーオブジェクトのプロパティ,メソッド,およびイベントの使い方については,サーバーのマニュアルを参照してください。コンポーネントラッパーは,可能であればデュアルインターフェースを自動的に提供します。Delphi は,タイプライブラリ内の情報から仮想テーブルのレイアウトを判断します。
さらに,新規のコンポーネントは,基本クラスから特定の重要なプロパティとメソッドを継承します。
ActiveX ラッパー
ActiveX コントロールのホストには常にコンポーネントラッパーを使用してください。なぜなら,コンポーネントラッパーは ActiveX コントロールのウィンドウを VCL フレームワークに組み込むからです。
ActiveX コントロールが olectrls.TOleControl から継承するプロパティとメソッドを使用すると,基底のインターフェースにアクセスしたり,そのコントロールについての情報を取得することができます。ただし,大部分のアプリケーションでは,これらを使用する必要はありません。そのかわりに,ほかの VCL コントロールを使用する場合と同様に,インポートされたコントロールを使用します。
通常,ActiveX コントロールは,プロパティを設定できるプロパティページを提供します。プロパティページは,フォームデザイナでコンポーネントをダブルクリックしたときに,一部のコンポーネントで表示されるコンポーネントエディタに似ています。ActiveX コントロールのプロパティページを表示するには,右クリックして[プロパティ]を選択します。
大部分のインポートされた ActiveX コントロールの使い方は,サーバーアプリケーションによって決まります。ただし,ActiveX コントロールがデータベース項目のデータを表す場合は,標準セットの通知を使用します。このような ActiveX コントロールのホスト方法については,olectrls.TOleControl を参照してください。
オートメーションオブジェクトラッパー
オートメーションオブジェクトのラッパーを使用すると,サーバーオブジェクトに対する接続をどのように形成するかを,以下のように制御できます。
First, the ConnectKind プロパティは,サーバーがローカルまたはリモートのいずれであるか,およびすでに動作中のサーバーに接続するか新規のインスタンスを起動するかを示す。リモートサーバーに接続する場合は,RemoteMachineName プロパティを使ってマシン名を指定しなければならない
いったん ConnectKind を指定すると,以下の 3 つの方法でコンポーネントをサーバーに接続できる
- コンポーネントの Connect メソッドを呼び出してサーバーに明示的に接続できる
- AutoConnect プロパティを true に設定して,アプリケーションの起動時に自動的にコンポーネントを接続できる
- サーバーに明示的に接続する必要はない。コンポーネントを使ってサーバーのプロパティまたはメソッドの 1 つを使用すれば,自動的に接続が形成される
以下のように,メソッドの呼び出しまたはプロパティのアクセスの方法は,その他のコンポーネントを使用する場合と同じです。
TServerComponent1.DoSomething;
TServerComponent1->DoSomething();
オブジェクトインスペクタを使ってイベントハンドラを作成できるので,簡単にイベントを処理できます。ただし,コンポーネント上のイベントハンドラのパラメータが,タイプライブラリ内のイベントに対して定義されたパラメータとは少し違うことがあります。特に,ポインタ型(var パラメータとインターフェースポインタ)はバリアント型に変更されます。var パラメータについては,値を代入する前に基底の型に明示的にキャストする必要があります。インターフェースポインタについては,as 演算子を使って適切なインターフェース型にキャストできます。
例として,ExcelApplication イベントのイベントハンドラ OnNewWorkBook のコードを次に示します。このイベントハンドラには,ほかの CoClass(ExcelWorkbook)のインターフェースを提供するパラメータがあります。ただし,このインターフェースは ExcelWorkbook インターフェースポインタとして渡されるのではなく,OleVariant として渡されます。
procedure TForm1.XLappNewWorkbook(Sender: TObject; var Wb:OleVariant);
begin
{ OleVariant をどうやって正しい型にキャストするか注意 }
ExcelWorkbook1.ConnectTo((iUnknown(wb) as ExcelWorkbook));
end;
void _fastcall TForm1::XLappNewWorkbook(TObject *Sender, ExcelWorkbookPtr Wb)
{
ExcelWorkbook1->ConnectTo(Wb);
}
この例では,イベントハンドラが ExcelWorkbook コンポーネント(ExcelWorkbook1)にワークブックを割り当てます。これは ConnectTo メソッドを使ってコンポーネントラッパーを既存のインターフェースに接続する方法を示します。ConnectTo メソッドは,コンポーネントラッパーに対して生成されたコードに追加されます。
アプリケーションオブジェクトを持つサーバーは,そのオブジェクト内で Quit メソッドをエクスポーズして,クライアントが接続を終了できるようにします。Quit は,通常,アプリケーションを終了するために[ファイル|終了]を使用するのと同じ機能を提供します。Quit メソッドを呼び出すコードは,コンポーネントの Disconnect メソッド内で生成されます。パラメータを何も指定せずに Quit メソッドを呼び出すことが可能ならば,コンポーネントラッパーには AutoQuit プロパティもあります。AutoQuit は,コンポーネントが解放されたときに,コントローラが Quit を呼び出せるようにします。それ以外のときに切断したい場合,または Quit メソッドにパラメータが必要である場合は,このメソッドを明示的に呼び出さなければなりません。Quit は生成されたコンポーネント上にパブリックメソッドとして表示されます。