使用插件技巧擴展VB
發表時間:2024-02-19 來源:明輝站整理相關軟件相關文章人氣:
[摘要]摘要:本文通過實例介紹如何開發一個VB的插件來擴展VB的應用。包括如何實現插件與VB開發環境的連接,控制VB開發環境,以及簡要介紹插件對象的結構。 文章內容 一、插件介紹 從結構上來看,一個VB插件實際上是一個COM組件,原則上組件可以使用支持COM的開發工具,例如Delphi、VC來編寫。...
摘要:本文通過實例介紹如何開發一個VB的插件來擴展VB的應用。包括如何實現插件與VB開發環境的連接,控制VB開發環境,以及簡要介紹插件對象的結構。
文章內容
一、插件介紹
從結構上來看,一個VB插件實際上是一個COM組件,原則上組件可以使用支持COM的開發工具,例如Delphi、VC來編寫。組件通過實現COM中的IDTExtensibility對象來建立與VB的連接。組件注冊以后,當VB運行中在Add-In菜單中裝載組件后,VB就會調用組件中IDTExtensibility對象中的相應方法(如在裝載組件后會調用OnConnection方法)。這時整個插件就成為VB的一部分從而可以訪問VB開發環境中的各種對象和資源了。
利用VB本身來編寫插件是一個很好的辦法,首先通過VB可以快速建立一個IDTExtensibility對象框架(當然在VB中不叫這個名稱);其次VB對于整個開發環境都提供了相應的對象供插件訪問和控制,而使用插件的主要目的就是通過插件來控制宿主程序;最后是調試十分的方便,可以直接運行看結果,不需要編譯注冊。
二、建立程序框架
首先我們來建立程序框架,以下的代碼和說明都是使用Win2K+VB6中文企業版完成的,在VB英文版以及Win9X下運行通過只是程序中對于界面的說明根據不同的VB會有不同。
打開VB,點擊菜單中的 文件 新建 項,在 新建工程 窗口中選擇"外接程序" 項(在英文版中是Addin),然后點擊確定按鈕建立插件工程。
建立完畢后在工程列表窗口中可以看到新工程的名稱為MyAddIn。其中包含兩個對象,在窗體類中包含frmAddIn窗體,在設計器類中包含Connect設計器對象。VB已經為插件設立了一個基本框架,下面按F5運行插件并將VB主窗口最小化。然后再打開一個VB程序,在其中建立一個標準 Exe工程。點擊菜單的 外接程序 外接程序管理器 項。在打開的外接程序管理器窗口的列表中可以看到其中有一個My Add-In 項,點擊該項,然后將下面 加載行為(英文版中是Load Behavior) 區域中的三個復選框都選中后點擊確定按鈕裝載插件。然后再點擊"外接程序" 菜單,再點擊其中新添加的 My AddIn 項。可以看到插件彈出一個窗體,點擊"確定"按鈕可以獲得VB運行的目錄,點擊"取消"按鈕關閉窗體。
接下來再次打開外接程序管理器窗口。選中 My Add-In項,將 加載行為 區域中的三個復選框中的對勾去掉。然后回到運行插件的VB程序,點擊停止按鈕停止插件的執行。
回到插件工程中,我們主要來看Connect對象,打開Connect對象的代碼窗口。可以看到其中包含兩個對象:AddinInstance和MenuHandler。其中AddInstance是工程中實現同VB接口的對象。在程序中對應AddInstance包含兩個方法:OnConnection和OnDisconnection。在這里我們稱它們為方法而不是事件,是因為它們是由VB調用而不是由某個消息引發而由系統調用的。
OnConnection方法在插件裝載使被調用,其中的參數Application是調用插件的VB實例對象。這個對象是一個VBE類對象。由VB傳遞給插件插件就可以通過Application對象訪問和控制調用自己的VB實例。其中比較重要的是這一段:
If ConnectMode = ext_cm_External Then
Me.Show
Else
Set mcbMenuCommandBar = AddToAddInCommandBar("AddInSample")
Set Me.MenuHandler = VBInstance. Events. CommandBarEvents (mcbMenuCommandBar)
End If
在上面的程序段中,首先通過ConnectMode來判斷插件被裝載的方式,如果是不是通過外部程序啟動的話,首先調用AddToAddInCommandBar方法添加一個菜單項到 外接程序 菜單欄。
添加了菜單項后,插件程序還必須能夠響應對菜單的點擊做響應,VB支持插件對自身的很多事件監控,包括點擊菜單、工具欄按鈕、打開工程、添加/刪除工程中的文件等等。對應每一種事件,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
'添加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事件中添加執行mClick子程序
lCount = xComp.CodeModule.ProcBodyLine("cmdButton_Click", vbext_pk_Proc)
If lCount <> 0 Then
xComp.CodeModule.InsertLines lCount + 1, "mClick"
End If
運行程序,再次打開另一個VB程序建立一個標準Exe工程。并裝載 My AddIn插件,點擊菜單的 My AddIn項,然后在彈出窗口中選擇工程中的一個窗體,然后點擊 Add Code 按鈕,可以看到工程中新添加了一個ModuleTemp模塊,并且你選擇的窗體中添加了一個CommandButton按鈕。通過前面的介紹以及上面代碼的注釋,相信大家對于插件如何通過VBE對象控制VB可能有一個比較基本的了解了。
上面的程序只是基本的介紹了VB插件的實現。通過完善可以形成一個功能齊全的插件程序,例如你可以將所積累很多年的代碼保存到一個文件中,然后通過一個插件讓用戶可以方便的選擇添加他們所需要的部分到自己的程序中。
上面就是文章的全內容,如果大家在編程方面有什么問題,歡迎到我的站點www.applevb.com上同我一起探討