透過開發VB外掛來擴充套件VB應用 (轉)

gugu99發表於2008-03-02
透過開發VB外掛來擴充套件VB應用 (轉)[@more@]使用功能擴充套件VB 摘要:本文透過例項介紹如何開發一個VB的外掛來擴充套件VB的應用。包括如何實現外掛與VB開發環境的連線,控制VB開發環境,以及簡要介紹外掛的結構。 文章內容 一、外掛介紹 從結構上來看,一個VB外掛實際上是一個COM,原則上元件可以使用支援COM的開發工具,例如、VC來編寫。元件透過實現COM中的IDTExtensibility物件來建立與VB的連線。元件註冊以後,當VB執行中在Add-In選單中裝載元件後,VB就會元件中IDTExtensibility物件中的相應方法(如在裝載元件後會呼叫OnConnection方法)。這時整個外掛就成為VB的一部分從而可以訪問VB開發環境中的各種物件和資源了。 利用VB本身來編寫外掛是一個很好的辦法,首先透過VB可以建立一個IDTExtensibility物件(當然在VB中不叫這個名稱);其次VB對於整個開發環境都提供了相應的物件供外掛訪問和控制,而使用外掛的主要目的就是透過外掛來控制宿主;最後是十分的方便,可以直接執行看結果,不需要編譯註冊。 二、建立程式框架 首先我們來建立程式框架,以下的程式碼和說明都是使用+中文企業版完成的,在VB英文版以及下執行透過只是程式中對於介面的說明根據不同的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和OnDinnection。在這裡我們稱它們為方法而不是事件,是因為它們是由VB呼叫而不是由某個訊息引發而由呼叫的。 OnConnection方法在外掛裝載使被呼叫,其中的引數Application是呼叫外掛的VB例項物件。這個物件是一個VBE類物件。由VB傳遞給外掛外掛就可以透過Application物件訪問和控制呼叫自己的VB例項。其中比較重要的是這一段: If ConnectMode = ext_cm_External Then Me.Show Else Set mcbMenuCommanar = 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例項中所包含的工程。 集合:透過該集合可以訪問所有的視窗,包括欄、屬性欄以及工程中的窗體等。 CodePanes集合:透過該集合可以訪問所有的程式碼視窗。可以獲得程式碼視窗中的程式碼以及改變其中的程式碼。 CommandBars 集合:透過該集合可以訪問VB例項中的所有命令欄,包括支援快速選單的命令欄。 Events 集合:透過該集合外掛可以訪問VB中的所有事件物件。 下面的程式我們要實現的是:當點選 My-Addin選單時,在當前工程中新增一個模組並在其中新增一個子程式,並讓選擇在工程中的窗體中選擇一個窗體新增一個CommandButton控制元件,並向窗體的程式碼視窗寫入程式碼使得點選CommmandButton控制元件就執行新增的子程式。 開啟工程中的frmAddIn窗體,在其中新增一個CommandButton控制元件和一個ListBox控制元件。 在frmAddIn的Load事件中新增如下程式碼: Dim mCop As '獲得當前啟動工程中的所有物件 For Each mCop In VBInstance.VBProjects.StartProject.VBComponents '如果物件是窗體型別就將其新增到ListBox中 If mCop.Type = vbext_ct_VBFoThen List1.AddItem mCop.Name End If Next If List1.ListCount <1 then msgbox href="tag-351-1.html">ide 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外掛的實現。透過完善可以形成一個功能齊全的外掛程式,例如你可以將所積累很多年的程式碼儲存到一個檔案中,然後透過一個外掛讓使用者可以方便的選擇新增他們所需要的部分到自己的程式中。 上面就是文章的全內容,如果大家在方面有什麼問題,歡迎到我的站點上同我一起探討

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1000288/,如需轉載,請註明出處,否則將追究法律責任。

相關文章