使用插件技巧擴(kuò)展VB
發(fā)表時(shí)間:2024-02-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]摘要:本文通過(guò)實(shí)例介紹如何開(kāi)發(fā)一個(gè)VB的插件來(lái)擴(kuò)展VB的應(yīng)用。包括如何實(shí)現(xiàn)插件與VB開(kāi)發(fā)環(huán)境的連接,控制VB開(kāi)發(fā)環(huán)境,以及簡(jiǎn)要介紹插件對(duì)象的結(jié)構(gòu)。 文章內(nèi)容 一、插件介紹 從結(jié)構(gòu)上來(lái)看,一個(gè)VB插件實(shí)際上是一個(gè)COM組件,原則上組件可以使用支持COM的開(kāi)發(fā)工具,例如Delphi、VC來(lái)編寫。...
摘要:本文通過(guò)實(shí)例介紹如何開(kāi)發(fā)一個(gè)VB的插件來(lái)擴(kuò)展VB的應(yīng)用。包括如何實(shí)現(xiàn)插件與VB開(kāi)發(fā)環(huán)境的連接,控制VB開(kāi)發(fā)環(huán)境,以及簡(jiǎn)要介紹插件對(duì)象的結(jié)構(gòu)。
文章內(nèi)容
一、插件介紹
從結(jié)構(gòu)上來(lái)看,一個(gè)VB插件實(shí)際上是一個(gè)COM組件,原則上組件可以使用支持COM的開(kāi)發(fā)工具,例如Delphi、VC來(lái)編寫。組件通過(guò)實(shí)現(xiàn)COM中的IDTExtensibility對(duì)象來(lái)建立與VB的連接。組件注冊(cè)以后,當(dāng)VB運(yùn)行中在Add-In菜單中裝載組件后,VB就會(huì)調(diào)用組件中IDTExtensibility對(duì)象中的相應(yīng)方法(如在裝載組件后會(huì)調(diào)用OnConnection方法)。這時(shí)整個(gè)插件就成為VB的一部分從而可以訪問(wèn)VB開(kāi)發(fā)環(huán)境中的各種對(duì)象和資源了。
利用VB本身來(lái)編寫插件是一個(gè)很好的辦法,首先通過(guò)VB可以快速建立一個(gè)IDTExtensibility對(duì)象框架(當(dāng)然在VB中不叫這個(gè)名稱);其次VB對(duì)于整個(gè)開(kāi)發(fā)環(huán)境都提供了相應(yīng)的對(duì)象供插件訪問(wèn)和控制,而使用插件的主要目的就是通過(guò)插件來(lái)控制宿主程序;最后是調(diào)試十分的方便,可以直接運(yùn)行看結(jié)果,不需要編譯注冊(cè)。
二、建立程序框架
首先我們來(lái)建立程序框架,以下的代碼和說(shuō)明都是使用Win2K+VB6中文企業(yè)版完成的,在VB英文版以及Win9X下運(yùn)行通過(guò)只是程序中對(duì)于界面的說(shuō)明根據(jù)不同的VB會(huì)有不同。
打開(kāi)VB,點(diǎn)擊菜單中的 文件 新建 項(xiàng),在 新建工程 窗口中選擇"外接程序" 項(xiàng)(在英文版中是Addin),然后點(diǎn)擊確定按鈕建立插件工程。
建立完畢后在工程列表窗口中可以看到新工程的名稱為MyAddIn。其中包含兩個(gè)對(duì)象,在窗體類中包含frmAddIn窗體,在設(shè)計(jì)器類中包含Connect設(shè)計(jì)器對(duì)象。VB已經(jīng)為插件設(shè)立了一個(gè)基本框架,下面按F5運(yùn)行插件并將VB主窗口最小化。然后再打開(kāi)一個(gè)VB程序,在其中建立一個(gè)標(biāo)準(zhǔn) Exe工程。點(diǎn)擊菜單的 外接程序 外接程序管理器 項(xiàng)。在打開(kāi)的外接程序管理器窗口的列表中可以看到其中有一個(gè)My Add-In 項(xiàng),點(diǎn)擊該項(xiàng),然后將下面 加載行為(英文版中是Load Behavior) 區(qū)域中的三個(gè)復(fù)選框都選中后點(diǎn)擊確定按鈕裝載插件。然后再點(diǎn)擊"外接程序" 菜單,再點(diǎn)擊其中新添加的 My AddIn 項(xiàng)?梢钥吹讲寮䦶棾鲆粋(gè)窗體,點(diǎn)擊"確定"按鈕可以獲得VB運(yùn)行的目錄,點(diǎn)擊"取消"按鈕關(guān)閉窗體。
接下來(lái)再次打開(kāi)外接程序管理器窗口。選中 My Add-In項(xiàng),將 加載行為 區(qū)域中的三個(gè)復(fù)選框中的對(duì)勾去掉。然后回到運(yùn)行插件的VB程序,點(diǎn)擊停止按鈕停止插件的執(zhí)行。
回到插件工程中,我們主要來(lái)看Connect對(duì)象,打開(kāi)Connect對(duì)象的代碼窗口。可以看到其中包含兩個(gè)對(duì)象:AddinInstance和MenuHandler。其中AddInstance是工程中實(shí)現(xiàn)同VB接口的對(duì)象。在程序中對(duì)應(yīng)AddInstance包含兩個(gè)方法:OnConnection和OnDisconnection。在這里我們稱它們?yōu)榉椒ǘ皇鞘录,是因(yàn)樗鼈兪怯蒝B調(diào)用而不是由某個(gè)消息引發(fā)而由系統(tǒng)調(diào)用的。
OnConnection方法在插件裝載使被調(diào)用,其中的參數(shù)Application是調(diào)用插件的VB實(shí)例對(duì)象。這個(gè)對(duì)象是一個(gè)VBE類對(duì)象。由VB傳遞給插件插件就可以通過(guò)Application對(duì)象訪問(wèn)和控制調(diào)用自己的VB實(shí)例。其中比較重要的是這一段:
If ConnectMode = ext_cm_External Then
Me.Show
Else
Set mcbMenuCommandBar = AddToAddInCommandBar("AddInSample")
Set Me.MenuHandler = VBInstance. Events. CommandBarEvents (mcbMenuCommandBar)
End If
在上面的程序段中,首先通過(guò)ConnectMode來(lái)判斷插件被裝載的方式,如果是不是通過(guò)外部程序啟動(dòng)的話,首先調(diào)用AddToAddInCommandBar方法添加一個(gè)菜單項(xiàng)到 外接程序 菜單欄。
添加了菜單項(xiàng)后,插件程序還必須能夠響應(yīng)對(duì)菜單的點(diǎn)擊做響應(yīng),VB支持插件對(duì)自身的很多事件監(jiān)控,包括點(diǎn)擊菜單、工具欄按鈕、打開(kāi)工程、添加/刪除工程中的文件等等。對(duì)應(yīng)每一種事件,VB實(shí)例都包含有一個(gè)相應(yīng)的事件對(duì)象。對(duì)象可以通過(guò)VB實(shí)例對(duì)象的Events屬性獲得或者設(shè)置。在插件程序中可以事先定義一個(gè)事件對(duì)象并編寫好對(duì)象的事件響應(yīng)代碼,然后將該對(duì)象賦予VB實(shí)例對(duì)象中的相應(yīng)事件對(duì)象。在上面的程序中,需要插件監(jiān)控對(duì)添加的菜單項(xiàng)的點(diǎn)擊事件,那么首先在程序中首先定義了一個(gè)With Events的對(duì)象MenuHandler。并在程序中編寫對(duì)象的Click事件代碼,然后在OnConnection方法中用
Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)
將MenuHandler設(shè)定為建立的菜單對(duì)象的事件對(duì)象,那么當(dāng)在VB中點(diǎn)擊 My Add-In項(xiàng)后,VB就會(huì)調(diào)用MenuHandle的Click事件代碼。
三、完善程序
從上面的分析可以得知,程序框架實(shí)現(xiàn)了VB與插件間的接口和插件監(jiān)控VB事件。接下來(lái)要實(shí)現(xiàn)插件對(duì)VB的控制
在VB調(diào)用插件對(duì)象的OnConnection方法時(shí),會(huì)將自身作為一個(gè)VBE對(duì)象傳遞給插件供訪問(wèn)及操作。VBE對(duì)象是VB實(shí)例的根對(duì)象,其下包含以下5類基本的對(duì)象集合:
VBProjects集合:通過(guò)該集合可以訪問(wèn)VB實(shí)例中所包含的工程。
Windows集合:通過(guò)該集合可以訪問(wèn)所有的窗口,包括控件欄、屬性欄以及工程中的窗體等。
CodePanes集合:通過(guò)該集合可以訪問(wèn)所有的代碼窗口?梢垣@得代碼窗口中的代碼以及改變其中的代碼。
CommandBars 集合:通過(guò)該集合可以訪問(wèn)VB實(shí)例中的所有命令欄,包括支持快速菜單的命令欄。
Events 集合:通過(guò)該集合插件可以訪問(wèn)VB中的所有事件對(duì)象。
下面的程序我們要實(shí)現(xiàn)的是:當(dāng)點(diǎn)擊 My-Addin菜單時(shí),在當(dāng)前工程中添加一個(gè)模塊并在其中添加一個(gè)子程序,并讓用戶選擇在工程中的窗體中選擇一個(gè)窗體添加一個(gè)CommandButton控件,并向窗體的代碼窗口寫入代碼使得點(diǎn)擊CommmandButton控件就執(zhí)行添加的子程序。
打開(kāi)工程中的frmAddIn窗體,在其中添加一個(gè)CommandButton控件和一個(gè)ListBox控件。
在frmAddIn的Load事件中添加如下代碼:
Dim mCop As Object
'獲得當(dāng)前啟動(dòng)工程中的所有對(duì)象
For Each mCop In VBInstance.VBProjects.StartProject.VBComponents
'如果對(duì)象是窗體類型就將其添加到ListBox中
If mCop.Type = vbext_ct_VBForm Then
List1.AddItem mCop.Name
End If
Next
If List1.ListCount <1 Then
MsgBox "工程中沒(méi)有添加控件的窗體"
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
'獲得用戶選擇的窗體對(duì)象
Set xComp = VBInstance.VBProjects.StartProject.VBComponents(List1.List(List1.ListIndex))
'獲得窗體設(shè)計(jì)器對(duì)象
Set xForm = xComp.Designer
'添加一個(gè)CommandButton到窗體上
Set xControl = xForm.VBControls.Add("VB.CommandButton")
'設(shè)定控件的名稱
xControl.Properties("Name") = "cmdButton"
'添加控件的Click事件代碼
xComp.CodeModule.CreateEventProc "Click", "cmdButton"
'添加一個(gè)新模塊到工程中
Set xModule = VBInstance.VBProjects.StartProject.VBComponents.Add(vbext_ct_StdModule)
'設(shè)定模塊名稱
xModule.Properties("Name") = "ModulTemp"
'獲得對(duì)象的代碼對(duì)象
Set xCode = xModule.CodeModule
Dim astr As String
'添加mClick子程序到新模塊中
astr = "Public Sub mClick()" + Chr(13) + Chr(10) + _
Chr(vbKeyTab) + "MsgBox ""You click a button!""" + Chr(13) + Chr(10) + _
"End Sub"
xCode.AddFromString astr
Dim lCount As Long
'在cmdButton的Click事件中添加執(zhí)行mClick子程序
lCount = xComp.CodeModule.ProcBodyLine("cmdButton_Click", vbext_pk_Proc)
If lCount <> 0 Then
xComp.CodeModule.InsertLines lCount + 1, "mClick"
End If
運(yùn)行程序,再次打開(kāi)另一個(gè)VB程序建立一個(gè)標(biāo)準(zhǔn)Exe工程。并裝載 My AddIn插件,點(diǎn)擊菜單的 My AddIn項(xiàng),然后在彈出窗口中選擇工程中的一個(gè)窗體,然后點(diǎn)擊 Add Code 按鈕,可以看到工程中新添加了一個(gè)ModuleTemp模塊,并且你選擇的窗體中添加了一個(gè)CommandButton按鈕。通過(guò)前面的介紹以及上面代碼的注釋,相信大家對(duì)于插件如何通過(guò)VBE對(duì)象控制VB可能有一個(gè)比較基本的了解了。
上面的程序只是基本的介紹了VB插件的實(shí)現(xiàn)。通過(guò)完善可以形成一個(gè)功能齊全的插件程序,例如你可以將所積累很多年的代碼保存到一個(gè)文件中,然后通過(guò)一個(gè)插件讓用戶可以方便的選擇添加他們所需要的部分到自己的程序中。
上面就是文章的全內(nèi)容,如果大家在編程方面有什么問(wèn)題,歡迎到我的站點(diǎn)www.applevb.com上同我一起探討