基于VB的COM編程入門教程_第1頁
基于VB的COM編程入門教程_第2頁
基于VB的COM編程入門教程_第3頁
基于VB的COM編程入門教程_第4頁
基于VB的COM編程入門教程_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于VB的COM編程入門教程第一節COM簡介

"世上無難事,只要肯登攀",所以你要有信心成為一個COM程序員,而且你一定能。事實上,我們每次設置文本編程控件的Text屬性時,就已經在使用COM,同樣在DAO數據控件運行MoveNext方法時,甚至在使用VB控制字時,也都是在使用COM。那么,什么是COM呢?首先,COM是一種通信的方式。例如,就像我們的電視遙控一樣。當我們按下某個頻道按鈕時,電視頻道立馬切換;而當我們按下開關按鈕時,電視立即關閉等等。其實,我們并不關心它們是怎樣工作的,我們只知道按下按鈕就能產生某個動作就可以了。程序的原理也是一樣的。當改變文本編程控件的Text屬性時,我們并不知道其中的原理,也許系統內部會調用幾十個API函數也說不定?但對于用戶來說,則只關心文本編程控件中顯示的文本就可以了。其次,COM是一種重用代碼的方式。使用COM的最大好處是一旦建立COM的通信方式后,可以方便地在任何地方使用多次。例如,當用戶創建一個用于顯示日期和時間的COM組件后,就可用于任何程序中的任何地方。不僅VB應用程序、Excel程序可以訪問,而且C++應用程序也可以訪問它。所以,COM組件的代碼可重用性是最主要的。再次,COM是基于實際對象的。用COM創建的大多數組件是基于實際對象的,這就意味著一旦組件被創建,其使用是相當容易的。試想一下,如果我們在計算機系統中再添加一個用戶,又有哪種添加方式如Customer.Add那樣簡單,是添加數據處理代碼包、算法,還是向應用程序添加較大的數據庫DLL?很顯然,COM就支持這種簡單操作。所以,COM是一種通信方式、一種代碼重用方式以及基于實際對象的。本教程的以后部分中將簡單討論COM和VB的相關內容,這包括類的創建,以及如何將類轉換成一個實際對象。雖然,這里的內容太過簡單,但卻是以后COM編程的基礎。第二節類的建立

在本節中,我們來實踐一下。首先創建一個COM對象,然后使用它,最后再想法改進。

首先進行下面兩步:

運行VisualBasic;選擇"StandardEXE"工程類型;由于COM對象是基于類的,而類實際上是程序包,就像模塊中的代碼一樣。所以:

選擇"Project"->"AddClassModule";當相應的對話框出現后,選擇"'ClassModule",然后單擊"Open"按鈕。

這樣,在桌面上顯示一個表單,以及包含在工程Project1中的Class1。

下面再將空的類的類名更改:

在類的屬性窗口中,將類的Name屬性改成CDog。

需要說明的是,為了區別起見,每個對象名的前面都有相應的前綴,例如TextBox對象前是"txt"、Form前是"frm"、類前可以大寫字母"C"或小寫字母"cls",但這里使用前者。

下面我們添加一些代碼來測試一下:

在CDog類通用聲明部分中,添加變量的聲明:PublicNameAsString然后,打開Form1;

在表單中添加一個命令按鈕;

打開代碼窗口,為該命令按鈕添加下列代碼:DimMyDogAsCDog

SetMyDog=NewCDog

MyDog.Name="BillyMoore"

MsgBoxMyDog.Name

SetMyDog=Nothing下面就來解釋上述代碼的含義:DimMyDogAsCDog該行語句是用來通知VisualBasic為CDog對象設置一個位空間,但這時還不能使用該對象,必須等到下條語句為止:SetMyDog=NewCDog它是用來創建CDog的實例。這就意味著前面空的MyDog模板變成了現在可以使用的CDog對象。MyDog.Name="BillyMoore"

MsgBoxMyDog.Name上述代碼的第一行是用來設置MyDog的Name變量,同時第二行語句是用來將該變量的內容顯示在消息對話框中。最后:SetMyDog=Nothing用來將MyDog對象簡單的置空。

按F5鍵運行并測試。

怎么樣?但同時,我們可能不禁要問,標準模塊和類模塊究竟有什么不同?我們再來看看下面的示例:

將命令按鈕的代碼變成:DimMyDogAsCDog

SetMyDog=NewCDog

DimMyDog2AsCDog

SetMyDog2=NewCDog

MyDog.Name="BillyMoore"

MsgBoxMyDog.Name

MyDog2.Name="SadieMoore"

MsgBoxMyDog2.Name顯示一個提示對話框。

切換到Form1后面的代碼窗口;

在設置Age屬性代碼處的第一行語句中單擊鼠標,并按F9;

MyDog.Age=4

在獲取Age屬性代碼處的第一行語句中單擊鼠標,并按F9;

MsgBoxMyDog.Name&"is"&MyDog.Age&"yearsold"

現在讓我們測試一下:

按F5運行程序;

單擊Command按鈕;

代碼應該中斷在按F9添加的斷點的代碼行上。

當代碼中斷后,按F8單步運行并觀察結果;

現在明白它們是怎樣工作的嗎?注意Age屬性的"get"和"let"是怎樣運行的?

在下一節中,我們不僅要討論使用更多屬性的方式,而且還討論如何隨意創建它們。第四節添加更多的屬性有時候,為了更好地處理類往往需更多的屬性。例如,假如你有四種不同的客戶群:集團、較大、較小和新的客戶類型,或者一個用于搜索的類中有三種不同的搜索方式:軟盤、硬盤和網絡。那么,能不能最好從選項列表中選擇一個,而不是用不能理解的數字或文本來設置相關屬性?

我想,答案是肯定的。因為這種處理就稱為"枚舉"。

打開上一節的工程,讓我們添加一些代碼。

在CDog類中添加下列代碼:PublicEnumCoatType

BigAndShaggy=1

ShortCrewCut=2

PoodleStyleAfro=3

Unknown=4

EndEnum關鍵詞"Enum"就是用來定義枚舉的,換句話說,它是可能選項的列表。各選項都有相應的數字,也就是說BigAndShaggy表示1,ShortCrewCut等于2,等等。

需要注意的是,當將枚舉項相關信息添加在數據庫中時,其相應的數值是非常有用的。由于"BigAndShaggy"實際代表的是數值1,所以可以直接將其插入到數據庫的數值字段中。這就意味著,可以方便使用字符串來維護數據庫。

所以,我們來創建一個Dog的Coat類型列表,并另外定義一個屬性,將這些類型添加在CDog類中。

在類中聲明下列變量:

PrivateudtCoatAsCoatType

這個定義的私有變量用來保存即將添加的Coat類型屬性,注意到udtCoat變量既不是字符串也不是整型,而是我們自己定義的枚舉類型CoatType。

當類CDog打開時,選擇"Tools"菜單中的"AddProcedure"命令,彈出相應的對話框;

Name編輯框中鍵入Coat;

選中"Property"選項按鈕,然后單擊[OK]。

系統自動產生下列代碼框架:PublicPropertyGetCoat()AsVariant

EndProperty

PublicPropertyLetCoat(ByValvNewValueAsVariant)

EndProperty但我們需要的卻不是這個框架。代碼中,"Variant"變量類型是能接收和處理任何類型數據。在我們定義的CDog類中,最后的屬性是Age,它只能接受整型。但現在需要屬性能接收CoatType列表中的數據類型,因此需要作下列修改:

將產生的代碼中所有的"Variant"改成"CoatType";

然后,添加一些實際處理屬性的代碼。

在屬性的Get過程中,添加下列代碼:Coat=udtCoat在屬性的Let過程中,添加下列代碼:udtCoat=vNewValue切換到Form1;

將Command按鈕的代碼改為:DimMyDogAsCDog

SetMyDog=NewCDog

MyDog.Name="Billy"現在開始鍵入:MyDog.Coat=

奇跡出現了,當你敲下"="鍵時,出現一個含有可能選項的列表,從中我們可以選擇一個。

完成代碼的鍵入:MyDog.Coat=ShortCrewCut

下一步,我們將獲取Coat屬性的值。假如現在就來簡單地在消息對話框中顯示屬性值,則只需返回選擇項的值就可以了。例如,若選擇了ShortCrewCut,其屬性一定返回2。不信,可以試一試!

但這里采用另外一種方法,它是用If-Then語句判斷Coat:

在Command按鈕已有的代碼后面添加下列代碼:IfMyDog.Coat=BigAndShaggyThen

MsgBox"Youhaveabig,bouncy,bushypup!"

ElseIfMyDog.Coat=PoodleStyleAfroThen

MsgBox"Yourpoochispretty,petitandpooch-like!"

ElseIfMyDog.Coat=ShortCrewCutThen

MsgBox"Yourdogisfullofoomph,oomphandmoreoomph!"

ElseIfMyDog.Coat=UnknownThen

MsgBox"Ihavenoideaaboutyourdog.Idon'tthink"&_

"youdoeither!"

EndIf這里的代碼只是簡單判斷Coat屬性值,并顯示相應的消息對話框。當然,這里也可以使用"SelectCase"語句。

最后,我們添加最后一條語句來釋放計算機內存:

在Command按鈕已有的代碼后面添加下列代碼:SetMyDog=Nothing按F5運行程序,并單擊Command按鈕測試一下。

結果怎樣?第五節子過程、函數和參數

前面已經接觸到類的變量、屬性以及枚舉,但我們怎樣才能更好的利用它們呢?

顯然,子過程就是其中的一種方式,它幾乎出現所有的VisualBasic程序中,所以這里來舉例說明。

在CDog類中添加下列代碼:PublicSubBark()

MsgBox"Woof!Woof!"

EndSub這里的子過程是最常見的,我們可以簡單地使用MyDog.Bark來調用它。

下面來試一試:

將表單Form1的Command按鈕的代碼改成:DimMyDogAsCDog

SetMyDog=NewCDog

MyDog.Name="Billy"

MyDog.Bark

SetMyDog=Nothing需要說明的是,在鍵入"MyDog."會彈出相應的列表,各列表項前面都有不同顏色的小圖標區分不同的類型。例如Bark子過程項前面的是黃綠色的,屬性是灰色和藍色的,這樣能幫助我們識別Bark是MyDog對象的一個方法。

按F5運行并測試。

事實上,除了子過程外,我們也可以在代碼中添加函數。這里我們就不舉例了,你可以自己嘗試一下。因為函數和一般子過程除了能在一個類中外,其工作也是相同的。但不要忘記,所有子過程和函數都可以有自己的參數。

現在,讓我們設想一下,在類中有一個Sleep方法。當我們想要cat睡覺或dog打盹時,每次都得調用這個方法。

但是,我們怎么知道這些小東西什么時候醒來?這是一個非常有趣的問題,其答案是使用事件(event)。

當我們在文本編輯框中鍵入字符時就會產生Change事件,而當我們單擊命令按鈕時就會產生Click事件。同樣,想知道這些小東西什么時候醒來,就需使用下一節所著重討論的Awake事件。第六節事件

相對來說,事件的使用是比較簡單的。在使用前,我們必須先定義該事件,這就意味著通知VisualBasic什么事件被調用。一個事件可能有自己的參數,例如,一個Command按鈕有一個Click(單擊)事件,它沒有參數。另外,文本編輯框有一個KeyPress事件,它通過一個叫"KeyAscii"的值來處理相關內容。

定義一個事件是在一個類的通用聲明部分添加類似下面的代碼:PublicEventMyEventName(PossArgumentsAsString,EtcAsVariant)然后在代碼調用RaiseEvent方法來激發一個事件。就像下面的代碼一樣:RaiseEventMyEventName("PossArgs","Etc")為了更好地說明上述添加和激發事件的過程,我們舉一個例子。首先,定義一個事件:

在CDog類的通用聲明部分添加下列代碼:PublicEventAwake()在CDog類中添加Sleep子過程:PublicSubSleep()

DimiAsLong

Fori=1To1000000

DoEvents:DoEvents:DoEvents

exit

RaiseEventAwake

EndSub

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論