作为 Visual Basic 程序员,可能习惯于处理诸如鼠标移动、鼠标单击、在组合框选择项目之类的事件。在 Visual Basic Version 的扩展模型中,有一个附加的控件层- 即响应 IDE 本身产生的事件的能力,例如,在“工程资源管理器”窗口选择工程或者突出显示模块中的代码。Events 对象是通往这些事件的必由之路。
从根对象 VBE 中直接引用的 Events 对象提供了一些方法,允许外接程序连接扩展模型中的所有事件。(请注意该事件也可以在每一个对象中产生。)
Events 对象包含下面的对象:
每个对象都允许用来响应属于该对象的事件。例如,CommandBarEvents 对象允许响应发生于 CommandBar 对象的事件,如命令条被单击。而 SelectedVBControlsEvents 对象允许响应发生于任何当前选择的 Visual Basic 控件的事件,等等。
关键字 WithEvents 显露了这些事件。例如,当部件添加到工程中时,对象 VBComponentsEvents 中就发生了 ItemAdded 事件,而当从工程中删除部件时,对象 VBComponentsEvents 中就发生了 ItemRemoved 事件,以此类推。
这是说明如何在类模块中声明这样的对象的例子:
Private WithEvents evtVBProjects As VBProjectsEvents
然而,为了访问这些事件,必须引用对象。检查一下并引用这样一个对象:VBControlsEvents,它是 VBIDE.Events 对象的属性。它有三个事件:ItemAdded、ItemRemoved、ItemRenamed,及两个参数:VBProject 和 VBForm。
为了访问 ItemAdded、ItemRemoved 和 ItemRenamed 事件,必须首先在主类模块的声明部分使用 Set 语句引用 VBControlEvents 对象:
'
显露事件。Public WithEvents CtrlHandler As VBControlsEvents
'
通过引用对象访问事件。Set Me.CtrlHandler = gVBInstance.Events.VBControlsEvents(Nothing, Nothing)
现在,可以编程访问 ItemAdded、ItemRemoved 和 ItemRenamed 事件,并且可以编译外接程序,当在工程中添加、删除或者重命名控件时作出响应。至于如何响应这些事件将取决于程序员和放入事件处理程序中的代码。
先前的 Set 语句的参数被设置为 Nothing。这意味着不再引用工程中的特定窗体,而是任何工程的任何窗体。可以将 Events 对象的参数视为一种过滤器,它确定了希望监视的工程、部件或者控件中的事件。例如,当实例设置为 VBControlsEvents 对象时,如果指定了特定的工程和窗体,则仅对于那个特定的工程的特定窗体,才会出现控件事件。然而,如果两个参数均被设置为 Nothing,则对于所有相关联的工程中的所有窗体的所有控件事件都会发生。换言之,不筛选任何控件事件。