VB/VBA のイベント
メモ。雰囲気的につぎのようなコードにすると、たかが Set ステートメントのところで止まってしまう。スーパークラスの変数にイベントハンドラーをしかけようとすると、子クラスのインスタンスを変数にセットしたところでおかしくなってしまう。
デバッガー上で動かすと、そこで実行が途切れている?Sub を抜けてしまうのか?エラーメッセージもなしなのがいやらしい。
Private WithEvents Cmd As ICmd ←これが子クラスなら問題ない。 Public Sub Foo() Dim tc As TradeCmd ' ICmd の子クラス Set tc = New TradeCmd Set Cmd = tc ←ここで止まってしまう。 Debug.Print "Hello" ←ここまで到達することがない。 End Sub Public Sub ICmd_MyEvent() ' ここでイベントを捕まえたい。 End Sub
...ソースコードをシンプルにすると、Set の時に、
実行時エラー '459 ': オブジェクトまたはクラスがこのイベント セットをサポートしていません。
というエラーになるなあ。
実行が途切れているのではなく、本来はエラーになるのかな?
...マイクロソフトの、
「PRB: エラー代替オブジェクト インターフェイスを使用しようとする 459」
http://support.microsoft.com/kb/172329/ja
文書番号 : 172329
最終更新日 : 2003年5月13日
リビジョン : 3.0
が該当するようだ。
現象
「オブジェクトまたはクラスが要素のセットをサポートしないの、」代替インターフェイスを使用するために、クラス B のオブジェクト変数にクラス A のオブジェクトを代入する実行時いつ取得エラー 459。原因
WithEvents キーワードを使用すると、オブジェクトの実装している基本クラスが Event 子オブジェクトを定義し、オブジェクト変数が宣言されます。 上記で一覧された Visual Basic バージョンは、継承されたインターフェイスでイベントをサポートしません。解決方法
これが上記で一覧されたバージョンの Visual Basic の制限です。状況
この動作は、仕様です。
なあんだ。サポートしませんかあ。制限かあ。仕様かあ。
orz...