基于VB的COM編程入門教程_第1頁(yè)
基于VB的COM編程入門教程_第2頁(yè)
基于VB的COM編程入門教程_第3頁(yè)
基于VB的COM編程入門教程_第4頁(yè)
基于VB的COM編程入門教程_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于VB的COM編程入門教程第一節(jié)COM簡(jiǎn)介

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

在本節(jié)中,我們來(lái)實(shí)踐一下。首先創(chuàng)建一個(gè)COM對(duì)象,然后使用它,最后再想法改進(jìn)。

首先進(jìn)行下面兩步:

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

選擇"Project"->"AddClassModule";當(dāng)相應(yīng)的對(duì)話框出現(xiàn)后,選擇"'ClassModule",然后單擊"Open"按鈕。

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

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

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

需要說(shuō)明的是,為了區(qū)別起見(jiàn),每個(gè)對(duì)象名的前面都有相應(yīng)的前綴,例如TextBox對(duì)象前是"txt"、Form前是"frm"、類前可以大寫字母"C"或小寫字母"cls",但這里使用前者。

下面我們添加一些代碼來(lái)測(cè)試一下:

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

在表單中添加一個(gè)命令按鈕;

打開(kāi)代碼窗口,為該命令按鈕添加下列代碼:DimMyDogAsCDog

SetMyDog=NewCDog

MyDog.Name="BillyMoore"

MsgBoxMyDog.Name

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

MsgBoxMyDog.Name上述代碼的第一行是用來(lái)設(shè)置MyDog的Name變量,同時(shí)第二行語(yǔ)句是用來(lái)將該變量的內(nèi)容顯示在消息對(duì)話框中。最后:SetMyDog=Nothing用來(lái)將MyDog對(duì)象簡(jiǎn)單的置空。

按F5鍵運(yùn)行并測(cè)試。

怎么樣?但同時(shí),我們可能不禁要問(wèn),標(biāo)準(zhǔn)模塊和類模塊究竟有什么不同?我們?cè)賮?lái)看看下面的示例:

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

SetMyDog=NewCDog

DimMyDog2AsCDog

SetMyDog2=NewCDog

MyDog.Name="BillyMoore"

MsgBoxMyDog.Name

MyDog2.Name="SadieMoore"

MsgBoxMyDog2.Name顯示一個(gè)提示對(duì)話框。

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

在設(shè)置Age屬性代碼處的第一行語(yǔ)句中單擊鼠標(biāo),并按F9;

MyDog.Age=4

在獲取Age屬性代碼處的第一行語(yǔ)句中單擊鼠標(biāo),并按F9;

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

現(xiàn)在讓我們測(cè)試一下:

按F5運(yùn)行程序;

單擊Command按鈕;

代碼應(yīng)該中斷在按F9添加的斷點(diǎn)的代碼行上。

當(dāng)代碼中斷后,按F8單步運(yùn)行并觀察結(jié)果;

現(xiàn)在明白它們是怎樣工作的嗎?注意Age屬性的"get"和"let"是怎樣運(yùn)行的?

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

我想,答案是肯定的。因?yàn)檫@種處理就稱為"枚舉"。

打開(kāi)上一節(jié)的工程,讓我們添加一些代碼。

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

BigAndShaggy=1

ShortCrewCut=2

PoodleStyleAfro=3

Unknown=4

EndEnum關(guān)鍵詞"Enum"就是用來(lái)定義枚舉的,換句話說(shuō),它是可能選項(xiàng)的列表。各選項(xiàng)都有相應(yīng)的數(shù)字,也就是說(shuō)BigAndShaggy表示1,ShortCrewCut等于2,等等。

需要注意的是,當(dāng)將枚舉項(xiàng)相關(guān)信息添加在數(shù)據(jù)庫(kù)中時(shí),其相應(yīng)的數(shù)值是非常有用的。由于"BigAndShaggy"實(shí)際代表的是數(shù)值1,所以可以直接將其插入到數(shù)據(jù)庫(kù)的數(shù)值字段中。這就意味著,可以方便使用字符串來(lái)維護(hù)數(shù)據(jù)庫(kù)。

所以,我們來(lái)創(chuàng)建一個(gè)Dog的Coat類型列表,并另外定義一個(gè)屬性,將這些類型添加在CDog類中。

在類中聲明下列變量:

PrivateudtCoatAsCoatType

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

當(dāng)類CDog打開(kāi)時(shí),選擇"Tools"菜單中的"AddProcedure"命令,彈出相應(yīng)的對(duì)話框;

Name編輯框中鍵入Coat;

選中"Property"選項(xiàng)按鈕,然后單擊[OK]。

系統(tǒng)自動(dòng)產(chǎn)生下列代碼框架:PublicPropertyGetCoat()AsVariant

EndProperty

PublicPropertyLetCoat(ByValvNewValueAsVariant)

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

將產(chǎn)生的代碼中所有的"Variant"改成"CoatType";

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

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

將Command按鈕的代碼改為:DimMyDogAsCDog

SetMyDog=NewCDog

MyDog.Name="Billy"現(xiàn)在開(kāi)始鍵入:MyDog.Coat=

奇跡出現(xiàn)了,當(dāng)你敲下"="鍵時(shí),出現(xiàn)一個(gè)含有可能選項(xiàng)的列表,從中我們可以選擇一個(gè)。

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

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

但這里采用另外一種方法,它是用If-Then語(yǔ)句判斷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這里的代碼只是簡(jiǎn)單判斷Coat屬性值,并顯示相應(yīng)的消息對(duì)話框。當(dāng)然,這里也可以使用"SelectCase"語(yǔ)句。

最后,我們添加最后一條語(yǔ)句來(lái)釋放計(jì)算機(jī)內(nèi)存:

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

結(jié)果怎樣?第五節(jié)子過(guò)程、函數(shù)和參數(shù)

前面已經(jīng)接觸到類的變量、屬性以及枚舉,但我們?cè)鯓硬拍芨玫睦盟鼈兡兀?/p>

顯然,子過(guò)程就是其中的一種方式,它幾乎出現(xiàn)所有的VisualBasic程序中,所以這里來(lái)舉例說(shuō)明。

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

MsgBox"Woof!Woof!"

EndSub這里的子過(guò)程是最常見(jiàn)的,我們可以簡(jiǎn)單地使用MyDog.Bark來(lái)調(diào)用它。

下面來(lái)試一試:

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

SetMyDog=NewCDog

MyDog.Name="Billy"

MyDog.Bark

SetMyDog=Nothing需要說(shuō)明的是,在鍵入"MyDog."會(huì)彈出相應(yīng)的列表,各列表項(xiàng)前面都有不同顏色的小圖標(biāo)區(qū)分不同的類型。例如Bark子過(guò)程項(xiàng)前面的是黃綠色的,屬性是灰色和藍(lán)色的,這樣能幫助我們識(shí)別Bark是MyDog對(duì)象的一個(gè)方法。

按F5運(yùn)行并測(cè)試。

事實(shí)上,除了子過(guò)程外,我們也可以在代碼中添加函數(shù)。這里我們就不舉例了,你可以自己嘗試一下。因?yàn)楹瘮?shù)和一般子過(guò)程除了能在一個(gè)類中外,其工作也是相同的。但不要忘記,所有子過(guò)程和函數(shù)都可以有自己的參數(shù)。

現(xiàn)在,讓我們?cè)O(shè)想一下,在類中有一個(gè)Sleep方法。當(dāng)我們想要cat睡覺(jué)或dog打盹時(shí),每次都得調(diào)用這個(gè)方法。

但是,我們?cè)趺粗肋@些小東西什么時(shí)候醒來(lái)?這是一個(gè)非常有趣的問(wèn)題,其答案是使用事件(event)。

當(dāng)我們?cè)谖谋揪庉嬁蛑墟I入字符時(shí)就會(huì)產(chǎn)生Change事件,而當(dāng)我們單擊命令按鈕時(shí)就會(huì)產(chǎn)生Click事件。同樣,想知道這些小東西什么時(shí)候醒來(lái),就需使用下一節(jié)所著重討論的Awake事件。第六節(jié)事件

相對(duì)來(lái)說(shuō),事件的使用是比較簡(jiǎn)單的。在使用前,我們必須先定義該事件,這就意味著通知VisualBasic什么事件被調(diào)用。一個(gè)事件可能有自己的參數(shù),例如,一個(gè)Command按鈕有一個(gè)Click(單擊)事件,它沒(méi)有參數(shù)。另外,文本編輯框有一個(gè)KeyPress事件,它通過(guò)一個(gè)叫"KeyAscii"的值來(lái)處理相關(guān)內(nèi)容。

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

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

DimiAsLong

Fori=1To1000000

DoEvents:DoEvents:DoEvents

exit

RaiseEventAwake

EndSub

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論