将 WithEvents 与实现另一个类的类一起使用时出现运行时错误 459
Posted
技术标签:
【中文标题】将 WithEvents 与实现另一个类的类一起使用时出现运行时错误 459【英文标题】:Run-time error 459 when using WithEvents with a class that implements another 【发布时间】:2010-06-11 12:58:24 【问题描述】:我正在 Word 中开发一个 VBA 项目,但在使用实现另一个类的类时遇到了处理事件的问题。
我定义了一个空类,IMyInterface
:
Public Sub Xyz()
End Sub
Public Event SomeEvent()
还有一个类,MyClass
,它实现了上述内容:
Implements IMyInterface
Public Event SomeEvent()
Public Sub Xyz()
' ... code ...
RaiseEvent SomeEvent
End Sub
Private Sub IMyInterface_Xyz()
Xyz
End Sub
如果我创建第三个类OtherClass
,它声明一个具有接口类类型的成员变量:
Private WithEvents mMy As IMyInterface
并尝试使用实现类的实例初始化此变量:
Set mMy = New MyClass
我收到运行时错误“459”:此组件不支持这组事件。
此错误消息的MSDN page 指出:
"您尝试使用 WithEvents 具有不能的组件的变量 作为事件源工作 指定的事件集。例如, 你可能正在下沉事件 对象,然后创建另一个对象 实现第一个对象。 虽然你可能认为你可以 从已实施的事件中接收事件 对象,这不会自动 案子。实现只实现一个 方法和属性的接口。”
以上几乎总结了我正在尝试做的事情。措辞“并非自动如此”,而不是“这完全不可能”,似乎表明我需要做一些手动工作才能使其正常工作,但事实并非如此告诉我什么!有人知道这在 VBA 中是否可行?
【问题讨论】:
【参考方案1】:显然,不允许将事件通过接口类传递到具体类,就像您想使用“Implements”一样。在这篇文章中它指出:“抽象接口的事件声明不包含在由具体类继承的接口中。我还没有发现任何地方承认这是一个错误;但是,它似乎确实是一个错误。 "
这里是源链接:http://www.devx.com/getHelpOn/10MinuteSolution/20416
:-(
【讨论】:
谢谢你;看起来这是一个错误。我希望 MSDN 没有让我抱有希望!不过,我认为我有一个解决方法,尽管使用事件会更优雅。 C'est la vie。 @KenKeenan 不是错误,而是 COM 事件的工作方式。您可以使用适配器模式将事件与接口一起使用,如here 所示。 (很抱歉用这个评论来唤醒死者 - 这个问答与最近的一个问题相关联......而且这个话题很吸引海事组织)以上是关于将 WithEvents 与实现另一个类的类一起使用时出现运行时错误 459的主要内容,如果未能解决你的问题,请参考以下文章