イベントの追加
プロパティ、メソッド、イベントの追加 への移動
オートメーション オブジェクトがクライアントに対してイベントを発生させるのと同様に、ActiveX コントロールはコンテナに対してイベントを発生させることができます。このメカニズムについては、「オートメーション オブジェクト内のイベントの管理」を参照してください。
ActiveX コントロールの土台として使用している VCL コントロールでイベントを公開している場合、ウィザードによって、クライアント イベント シンクのリストを管理するためのサポート機能が ActiveX ラッパー クラスに自動的に追加され、送信ディスパッチ インターフェイス(イベントに応答するためにクライアントが実装しなければならないもの)が定義されます。
イベントはこの送信ディスパッチ インターフェイスに追加します。イベントをタイプ ライブラリ エディタで追加するには、イベント インターフェイスを選択し、[メソッドの新規作成]アイコンをクリックします。その後、[パラメータ]ページで、必要なパラメータのリストを手動で追加します。
次に、土台となる VCL コントロールのイベントのイベント ハンドラと同じ型のメソッドを、ラッパー クラス内で宣言しなければなりません。どのイベント ハンドラを使用しているかを Delphi では認識できないため、これは自動的に生成されません。
procedure KeyPressEvent(Sender: TObject; var Key: Char);
ホスト アプリケーションのイベント シンク(ラッパー クラスの FEvents メンバに格納されています)を使って、このメソッドを実装します。
procedure TButtonX.KeyPressEvent(Sender: TObject; var Key: Char);
var
TempKey: Smallint;
begin
TempKey := Smallint(Key); { OleAutomation 互換の型にキャストする }
if FEvents <> nil then
FEvents.OnKeyPress(TempKey)
Key := Char(TempKey);
end;
void __fastcall TButtonXImpl::KeyPressEvent(TObject *Sender, char &Key)
{
short TempKey;
TempKey = (short)Key;
Fire_OnKeyPress(&TempKey);
Key = (short)TempKey;
};
メモ: ActiveX コントロールでイベントを発生させるときに、イベント シンクのリストを反復処理する必要はありません。コントロールのホスト アプリケーションは 1 つしかないためです。この点は、ほとんどのオートメーション サーバーの処理よりも単純です。
最後に、このイベント ハンドラを土台の VCL コントロールに割り当て、イベントが発生したときに呼び出されるようにします。この割り当ては InitializeControl メソッド内で行います。
procedure TButtonX.InitializeControl;
begin
FDelphiControl := Control as TButton;
FDelphiControl.OnClick := ClickEvent;
FDelphiControl.OnKeyPress := KeyPressEvent;
end;
void InitializeControl()
{
m_VclCtl->OnClick = ClickEvent;
m_VclCtl->OnKeyPress = KeyPressEvent;
}