プロパティの追加
プロパティ、メソッド、イベントの追加 への移動
ActiveX ラッパー クラスは、読み取りおよび書き込み用のアクセス メソッドを使用して、インターフェイス内のプロパティを実装します。つまり、ラッパー クラスには COM プロパティが含まれ、それがインターフェイス上では取得アクセサ メソッドや設定アクセサ メソッドになります。VCL プロパティとは違って、COM プロパティのインターフェイスに "property" 宣言はありません。その代わりに、プロパティ アクセス メソッドであると指定されたメソッドが含まれます。ActiveX コントロールのデフォルト インターフェイスにプロパティを追加すると、ラッパー クラスの定義(タイプ ライブラリ エディタによって更新される _TLB ユニットに含まれます)に 1 つまたは 2 つの新しいメソッド(取得アクセサ メソッドや設定アクセサ メソッド)が追加されるため、それを実装しなければなりません。これは、インターフェイスにメソッドを追加したときに、対応するメソッドがラッパー クラスに追加され、それを実装しなければならないのと同じです。つまり、ラッパー クラスのインターフェイスへのプロパティの追加は、本質的にメソッドの追加と同じであり、ラッパー クラスの定義に新しいメソッド実装のスケルトンが追加されてその内容を記述することになります。
メモ: 生成された _TLB ユニットに何が含まれるかの詳細は、「タイプ ライブラリ情報のインポート時に生成されるコード」を参照してください。
たとえば、土台となる VCL オブジェクトに TCaption 型の Caption というプロパティがあるとします。
このプロパティをオブジェクトのインターフェイスに追加するには、タイプ ライブラリ エディタでインターフェイスにプロパティを追加するときに、以下を入力します。
property Caption: TCaption read Get_Caption write Set_Caption;
Delphi によって次の宣言がラッパー クラスに追加されます。
function Get_Caption: WideString; safecall;
procedure Set_Caption(const Value: WideString); safecall;
さらに、メソッド実装のスケルトンが追加されます(内容は自分で記述しなければなりません)。
function TButtonX.Get_Caption: WideString;
begin
end;
procedure TButtonX.Set_Caption(Value: WideString);
begin
end;
タイプ ライブラリ エディタでこのプロパティを追加すると、C++Builder によって以下の宣言がラッパー クラスに追加されます。
STDMETHOD(get_Caption(BSTR* Value));
STDMETHOD(set_Caption(BSTR Value));
さらに、C++Builder によってメソッド実装のスケルトンも追加されます(内容は自分で記述しなければなりません)。
STDMETHODIMP TButtonXImpl::get_Caption(BSTR* Value)
{
try
{
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IButtonX);
}
return S_OK;
};
STDMETHODIMP TButtonXImpl::set_Caption(BSTR Value)
{
try
{
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IButtonX);
}
return S_OK;
};
通常、これらのメソッドの実装では、関連する VCL コントロールに処理を移譲するだけで済みます。VCL コントロールには、ラッパー クラスの FDelphiControl メンバまたは m_VclCtl メンバを使ってアクセスできます。
function TButtonX.Get_Caption: WideString;
begin
Result := WideString(FDelphiControl.Caption);
end;
procedure TButtonX.Set_Caption(const Value: WideString);
begin
FDelphiControl.Caption := TCaption(Value);
end;
STDMETHODIMP TButtonXImpl::get_Caption(BSTR* Value)
{
try
{
*Value = WideString(m_VclCtl->Caption).Copy();
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IButtonX);
}
return S_OK;
};
STDMETHODIMP TButtonXImpl::set_Caption(BSTR Value)
{
try
{
m_VclCtl->Caption = AnsiString(Value);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IButtonX);
}
return S_OK;
};
状況によっては、COM データ型をネイティブ型に変換するためのコードを追加しなければならないことがあります。上の例では、型キャストで対処しています。
メモ: オートメーション インターフェイス メソッドは safecall と宣言されるため、これらのメソッドに COM 例外コードを実装する必要はありません。Delphi コンパイラにより、Delphi 例外を捕捉して COM エラー情報構造体とリターン コードに変換するコードが、safecall メソッド本体を囲むように生成されるためです。