對程式設計師和程式設計愛好者來說,VB中類別的技術是學習中的一個困難,在大型軟體的開發過程中,模組(Moudle)、控制項(Activeocx)、連結庫(Activedll)和類別(Classmoudle)構成了系統化、高效的軟體工程,而類別的技術是控制和連結庫技術的基礎,因此掌握類別的理論和程式設計方法是非常有意義的。
(一)類別的基本定義與應用概述;
類別是包含了方法、屬性、資料成員的高階程式碼模組,它既在模組的範疇之內,又是一個沒有圖形介面的Activeocx,程式設計師可以像使用控制項一樣使用它,但卻不能看到它,值得注意的是,類別是不能繼承的。
類別能夠使我們有效率的完成對某一個或某幾個特定的物件的複雜操作,而物件的動作就是類別的方法,而物件的屬性就是類別的屬性過程。相對而言,如果程式設計的物件是一組事物,那麼,我們採用標準模組的方式是非常合適的,在下列兩種情況下,應該使用類別進行程式碼處理:
(1)創造大量性質相近的物件;
(2)提高程式碼的封裝性。
類別的建立非常簡單,在進行程式碼編寫的時候,在「工程」選單中選擇「新增類別模組」項目,就可以加入一個空白的類別。
類別檔案一般以.cls作為副檔名保存。
(二)類的方法的實作;
類別的方法類似於動態連結庫的介面函數,它能夠接受其他窗體程式碼的指定類型參數,並且傳遞到類別中。一般來說類別的方法是能夠指定是否有回傳值的。它在類別中通常是一個public過程。請看下面的程式碼範例,它使一個密碼框拒絕非字母的輸入:
(1)類cls的程式碼;
OptionExplicit'變數檢查
PRivateWithEventsmytxtAsTextBox
'本類別中的方法接受並控制一個text密碼框
DimisNUMAsBoolean
'類別的模組級變數
PublicSubAttach(itTEXTAsTextBox)
'接受外部變數到mytxt中
Setmytxt=itTEXT
EndSub
PrivateSubmytxt_KeyUp(KeyCodeAsInteger,ShiftAsInteger)
isNUM=(KeyCode>=65)And(KeyCode<=90)
'測試密碼框的鍵盤輸入是否為英文字母
IfisNUM=FalseThen
Beep
mytxt.Text=
'如果輸入不是英文字母則響鈴並且清空密碼框內容
MsgBox非法字元輸入!
EndIf
Debug.Printmytxt.Text
'調試輸出密碼框內容
EndSub
'類的代碼結束
(2)類的引用;
已經編寫完成的類別可以經過兩種格式進行引用,第一種方式:Private(public或dim)myCLS(指定的類別名稱)AsNewcls(編寫完成的類別名稱);第二種方式較多用於程式編寫風格較「老」的程式設計師:首先在窗體程式碼中進行模組級聲明――DimmyCLSAscls,然後在具體程式碼過程中進行具體定義――Setmycls=Newcls。這兩種方式的效率和程式碼的簡潔性方面可能會有所差別,但在筆者的程式設計實踐中,並沒有什麼特別的感覺,不過我較多使用第一種方式,因為它書寫起來更加方便。另外,在程式碼結束的時候,使用SetmyCLS=Nothing來取消類別的資源佔用是一種非常好的程式設計習慣。
在窗體form1中(窗體有一個密碼框控制項text1,passworldchar=*)加入以下程式碼:
OptionExplicit
PrivatemyCLSAsNewcls
'引用cls
PrivateSubForm_Load()
myCLS.AttachText1
'啟動類別
EndSub
'在程式碼結束時記得釋放資源
PrivateSubForm_Unload(CancelAsInteger)
SetmyCLS=Nothing
End
EndSub
本文程式碼展示了類別的方法的程式碼編寫過程和呼叫方式(儘管它和類別的事件非常相似),它的效果是,如果密碼框中被輸入了非字母,則係統振鈴,並刪除密碼框中的原來的資料――在一定程度上保護密碼。
類別的方法可以不需要任何參數,這一點類似一個public的函數或過程,它也是類別中使用最廣泛的。在下一篇文章中我將討論,如何使用類別的屬性、事件和方法進行綜合程式設計。
我們討論了類別的理論、類別的創建和類別的方法的程式設計實踐,實際上,類別之所以能夠在軟體工程中廣泛應用,最主要的一點是它可以非常方便的封裝許多程式設計所需的屬性,這不僅使程式設計師在一定程度上克服控制項(ocx)和連結庫(dll)設計和調試中的複雜性,而且能夠提高程式碼的簡潔和高效性――本文將討論完整的類別的編程,包括方法、屬性和基本事件。
(一)類的屬性的特徵與定義;
類似於標準控制項的屬性,類別的屬性允許使用者在指定的資料範圍內進行賦值,這些值被類別內的各個程式碼部分所共用。屬性的取得和傳遞需要經過PropertyLet和PropertyGet語句進行編程,當然,我們首先需要在類別中進行全域或模組級的對應變數定義。
(二)事件的屬性和基本定義;
和窗體的事件類似,類別也有兩個基本的事件,Class_Initialize(類別載入時觸發)和Class_Terminate(類別卸載時觸發),這兩個事件都是private的。實際上,我們完全可以忽略這兩個事件――只要你記得完善類別的方法和屬性。
類別同樣可以定義自己的事件,它和方法的程式編寫格式類似,只不過需要WithEvents關鍵字進行參數聲明,而且事件不能有任何命名參數或者可選參數,它也沒有回傳值。
實際上,結構良好的方法和屬性完全可以取代結構複雜的類別的事件。
(三)類的方法、事件、屬性的程式實例;
本程式的設計目的是,透過類別控制窗體中文字方塊的內容的全部大寫、小寫和逆向排序轉換。
為了方便程式碼的書寫和調用,我在類別中引用了枚舉的程式方法。
以下程式碼在類別Class1:
OptionExplicit
PrivateWithEventsmyTXTAsTextBox
'方法的參數接口
PublicEnumsTYLE
Lcaseit'小寫屬性
Lbigit'大寫屬性
Nlogoit'逆向排序屬性
EndEnum
'自訂枚舉,用來實現屬性的自動賦值
PrivatemvarBiaozhiAssTYLE
'實現枚舉常量的連接
PublicFunctiondONE()AsString'
'DONE方法用來根據指定的枚舉屬性,對
'窗體文字方塊進行對應的字元轉換操作
'並且傳回轉換後的字串
IfmvarBiaozhi=NlogoitThen
dONE=StrReverse(myTXT)
'逆向排序
ElseIfmvarBiaozhi=LcaseitThen
dONE=LCase(myTXT)
'強制小寫轉化
Else
dONE=UCase(myTXT)
'強制大寫轉化
EndIf
EndFunction
'DONE方法結束
PublicPropertyLetBiaozhi(ByValvDataAssTYLE)
'獲得屬性的被賦的值
mvarBiaozhi=vData
EndProperty
PublicPropertyGetBiaozhi()AssTYLE
'傳遞屬性值到類別中
SetBiaozhi=mvarBiaozhi
EndProperty
PublicSubAttach(itTEXTAsTextBox)
'連接類別的方法
SetmyTXT=itTEXT
EndSub
PrivateSubClass_Initialize()
'本事件在類倍加載時激活
MsgBox你好!本程式向您展示使用類別的方法、屬性、事件進行程式設計的技術!
EndSub
PrivateSubClass_Terminate()
'本事件在類別被卸載時激活
MsgBox你好!記得在Class_Terminate中填入物件撤銷後的程式碼!
EndSub
'類別的程式碼全部結束
(四)窗體程式碼的引用程式;
在窗體FORM1中加入文字控制項TEXT1、下拉清單控制項COMBO1、指令按鈕COMMAND1(CAPTION=開始轉換),調整三個控製到適當位置。
DimmyTAsNewClass1
'類的引用
PrivateSubForm_Load()
Combo1.Clear
Combo1.AddItem字串大寫轉化
Combo1.AddItem字串小寫轉化
Combo1.AddItem字串逆向排序
Combo1.ListIndex=0
'在列錶框中新增屬性選項
EndSub
PrivateSubCommand1_Click()
'當命令按鈕按下時啟動類
myT.AttachText1
'方法參數聯接
SelectCaseCombo1.ListIndex
Case0
myT.Biaozhi=Lbigit
Case1
myT.Biaozhi=Lcaseit
Case2
myT.Biaozhi=Nlogoit
EndSelect
'根據列錶框的選擇,給類別的Biaozhi屬性賦值
'注意,在程式設計環境中,上述屬性值自動添加
Text1.Text=myT.dONE
'傳回排序結束後的字串
EndSub
PrivateSubForm_Unload(CancelAsInteger)
SetmyT=Nothing
End
'良好的程式設計習慣
EndSub
怎麼樣,我們的程式碼看起來如此的簡潔,這種感覺就像是在使用一個控件,不僅可以隨心所欲的調用,而且方便的使用了vb的自動提示功能。
(五)關於類的程式設計技術的總結;
嚴格的說,類別是vb編程中的一個相當有用的技術,同樣也是學習和掌握中的難點,類在大型軟體工程中應用是非常廣泛和卓有成效的,但是,在小型軟體開發中,為了提高軟體的效率和程式碼的清晰度,應該避免使用較多的類別模組,控制和聯接庫,取代以標準模組。
本文範例的程式碼比較簡單,卻涵蓋了關於模組程式設計技術的方方面面,希望初學者能有所借鑒,也希望程式設計師能共同探討。我們應該相信,無論多麼複雜的高樓大廈都是由普普通通的方磚堆砌而成的,同樣,無論所麼複雜的軟體工程都是由基本的程序語句所構成的,程式設計愛好者、程式設計師和分析員的差別只是在於,用同樣的程式語句所建構的程式的不同而已。 ->