版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司財(cái)務(wù)公開(kāi)制度
- 公共衛(wèi)生服務(wù)制度
- 外研版三起英語(yǔ)五年級(jí)上冊(cè)期末練習(xí)課件
- 傳統(tǒng)城市土地使用制度
- 認(rèn)識(shí)全人類共同價(jià)值主題團(tuán)課課件
- 2025-2030紙板制造行業(yè)現(xiàn)狀供需發(fā)展現(xiàn)狀與投資評(píng)估規(guī)劃研究分析報(bào)告
- 2025-2030系列產(chǎn)品行業(yè)安全生產(chǎn)標(biāo)準(zhǔn)與事故防范對(duì)策報(bào)告
- 2025-2030突尼斯釀酒行業(yè)市場(chǎng)現(xiàn)狀供需分析及葡萄酒品牌推廣規(guī)劃研究報(bào)告
- 2025-2030突尼斯傳統(tǒng)手工藝品數(shù)字化營(yíng)銷轉(zhuǎn)型與文化旅游投資合作研究報(bào)告
- 2025-2030秋季防火森林火險(xiǎn)等級(jí)發(fā)布監(jiān)管部門提前清理可燃物嚴(yán)格
- 無(wú)人機(jī)性能評(píng)估與測(cè)試計(jì)劃
- 2025年保安員(初級(jí))考試模擬100題及答案(一)
- 湖北省新八校協(xié)作體2025-2026學(xué)年度上學(xué)期高三10月月考 英語(yǔ)試卷(含答案詳解)
- 酒駕滿分考試題庫(kù)及答案2025
- 金礦開(kāi)采提升項(xiàng)目可行性研究報(bào)告
- 華潤(rùn)燃?xì)獍踩嘤?xùn)
- 包鋼集團(tuán)歷年筆試題庫(kù)及答案
- 2025版實(shí)驗(yàn)動(dòng)物中心動(dòng)物實(shí)驗(yàn)動(dòng)物飼養(yǎng)合同
- GB/T 30104.104-2025數(shù)字可尋址照明接口第104部分:一般要求無(wú)線和其他有線系統(tǒng)組件
- 三年級(jí)上冊(cè)數(shù)學(xué)第三單元題型專項(xiàng)訓(xùn)練-判斷題(解題策略專項(xiàng)秀場(chǎng))人教版(含答案)
- 2.3河流與湖泊我國(guó)第一大河長(zhǎng)江課件-八年級(jí)地理上學(xué)期人教版
評(píng)論
0/150
提交評(píng)論