VBA 和 VB6 加载项对象模型(VBIDE)会公开CommandBarEvents
Click
Dim WithEvents CmdBarEvents As CommandBarEvents
个对象,事件签名是:
Private Sub CmdBarEvents_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
CommandBarControl
对VBE.Events.CommandBarEvents
的引用传递给CommaneBarControl
以注册该Set CmdBarEvents = Application.VBE.Events.CommandBarEvents(CmdBarItem)
的事件处理程序:
Click
Office 对象模型定义了具有自己的CommandBarControl
event的各个CommandBar控件,例如,Click
对象具有Dim WithEvents CmdBarBtn As CommandBarButton
} event,签名是:
Private Sub CmdBarBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
CommandBarButton
WithEvents
对Set CmdBarButton = myButton
的引用已分配给CommandBarEvents
:
CommandBarButton.Click
为什么会有差异,我应该选择哪种?
我将事件附加到VBE的CommandBars上的控件(而不是主机应用程序中的CommandBars)。
Office CommandBars无权访问CommandBarButton
对象,因此我假设他们必须使用CommandBarEvents
事件。但是VBE(在任何Office主机下)都可以访问CommandBarEvents
个事件和CommandBarEvents
个事件,因此我可以使用这两种方法,尽管仅存在{{1}对象表明它是首选方法(可能是非Office VBA主机中唯一的方法),以及大多数在线events向VBE CommandBars添加事件处理程序 使用CommandBarControl.Click
。
MZ Tools的Carlos Quintero非常有用,但在这种情况下,他的网站上的信息略显矛盾。他建议使用examples,但也使用CommandBar
方法The CommandBarEvents approach was used in the old Microsoft Visual Basic 5.0 / 6.0 environment
VBE是否有特殊之处并将事件附加到CommandBarControl
控件?如果我选择在CommandBarEvents
事件上使用 var itemList = new List<Item>()
事件,是否存在任何问题(内存泄漏,IDTExtensibility2关闭问题等)?
答案 0 :(得分:7)
VB6,作为1998年的IDE(以及1997年的VB5)必须始终使用CommandBarEvents。他们使用的Office命令栏是从Office 97借来的,其CommandBarButton缺少Click事件。
Office 2000在CommandBarButton类中引入了Click事件,并且必须始终用于针对Office 2000及更高版本(或其他VBA主机)的VBA加载项,因为尽管CommandBarEvents显然可用,但Office 2010 64 -bit不支持CommandBarEvents(如果使用它会崩溃)。
Visual Studio是另一种有其独特性的动物。