VBB中CommandBarEvents.Click和CommandBarButton.Click之间的区别是什么?

时间:2016-12-09 08:05:46

标签: vba events vb6 vbe vbide

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

WithEventsSet 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关闭问题等)?

1 个答案:

答案 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是另一种有其独特性的动物。