工具栏按钮、打开工程、添加/删除工程中的文件等等。对应每一种事件,VB实例都包含有一个相应的事件对象。对象可以通过VB实例对象的Events属性获得或者设置。在插件程序中可以事先定义一个事件对象并编写好对象的事件响应代码,然后将该对象赋予VB实例对象中的相应事件对象。在上面的程序中,需要插件监控对添加的菜单项的点击事件,那么首先在程序中首先定义了一个With Events的对象MenuHandler。并在
程序中编写对象的Click事件代码,然后在OnConnection方法中用
Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)
将MenuHandler设定为建立的菜单对象的事件对象,那么当在VB中点击 My Add-In项后,VB就会调用MenuHandle的Click事件代码。
三、完善
程序从上面的分析可以得知,程序框架实现了VB与插件间的接口和插件监控VB事件。接下来要实现插件对VB的控制
在VB调用插件对象的OnConnection方法时,会将自身作为一个VBE对象传递给插件供访问及操作。VBE对象是VB实例的根对象,其下包含以下5类基本的对象集合:
VBProjects集合:通过该集合可以访问VB实例中所包含的工程。
Windows集合:通过该集合可以访问所有的窗口,包括控件栏、属性栏以及工程中的窗体等。
CodePanes集合:通过该集合可以访问所有的代码窗口。可以获得代码窗口中的代码以及改变其中的代码。
CommandBars 集合:通过该集合可以访问VB实例中的所有命令栏,包括支持快速菜单的命令栏。
Events 集合:通过该集合插件可以访问VB中的所有事件对象。
下面的程序我们要实现的是:当点击 My-Addin菜单时,在当前工程中添加一个模块并在其中添加一个子程序,并让用户选择在工程中的窗体中选择一个窗体添加一个CommandButton控件,并向窗体的代码窗口写入代码使得点击CommmandButton控件就执行添加的子程序。
打开工程中的frmAddIn窗体,在其中添加一个CommandButton控件和一个ListBox控件。
在frmAddIn的Load事件中添加如下代码:
Dim mCop As Object
''获得当前启动工程中的所有对象
For Each mCop In VBInstance.VBProjects.StartProject.VBComponents
''如果对象是窗体类型就将其添加到ListBox中
If mCop.Type = vbext_ct_VBForm Then
List1.AddItem mCop.Name
End If
Next
If List1.ListCount <1 Then
MsgBox "工程中没有添加控件的窗体"
Connect.Hide
Else
List1.ListIndex = 0
End If
Command1.Caption = "Add Code"
在Command1的Click事件中添加如下代码:
Dim xComp As VBComponent
Dim xModule As VBComponent
Dim xForm As VBForm
Dim xControl As VBControl
Dim xCode As CodeModule
''获得用户选择的窗体对象
Set xComp = VBInstance.VBProjects.StartProject.VBComponents(List1.List(List1.ListIndex))
''获得窗体设计器对象
Set xForm = xComp.Designer
''添加一个CommandButton到窗体上
Set xControl = xForm.VBControls.Add("VB.CommandButton")
''设定控件的名称
xControl.Properties("Name") = "cmdButton"
''添加控件的Click事件代码
xComp.CodeModule.CreateEventProc "Click", "cmdButton"
''添加一个新模块到工程中
Set xModule = VBInstance.VBProjects.StartProject.VBComponents.Add(vbext_ct_StdModule)
''设定模块名称
xModule.Properties("Name") = "ModulTemp"
''获得对象的代码对象
Set xCode = xModule.CodeModule
Dim astr As String