摘要:集合對象(Collection)是VB重要的特征,利用它可以對具有共同屬性的對象進行操作訪問。本文介紹了VB中的內部集合和自定義集合的應用,以及它與數組的異同。
關鍵詞:Visual Basic 6.0 集合對象 應用
Visual Basic提供一種很有用的數據集合對象(Collection),它是由相關數據所構成的有序集,它可以使編程者對一組對象進行操作。Visual Basic本身含有一些內部集合,如Forms、Controls和Printers等,它們給出了工程中所有窗體、具體窗體中的所有控件以及Windows環境中的所有打印機的信息。如果要建立自己的集合,則需要使用Collection類。
1 對象變量的集合
對于對象變量可以理解為屬于某種類型對象的集合,這個集合可以有很多對象,也可以只有一個,甚至可以是空集。在VB中可以用Set語句使一個對象變量指向一個具體的控件。
對于集合對象,其Count屬性是一個非常重要的屬性,利用這個屬性可以對同一類對象的某一共同的屬性進行訪問和操作。如可以用以下的代碼實現將項目中所有窗體上控件的字體的大小都設置成統一的格式,所有載入的窗體中的控件的字體都被指定為宋體,字號為16。
(1) 在項目中定義一標準模塊
| '定義兩個全局變量 Global CtrFont As Control, Aform As Form '定義一FontAllSame子過程 Sub FontAllSame() Dim i, j As Integer For i = 0 To Forms.Count - 1'Count屬性是從0開始的整數 Set Aform = Forms(i) For j = 0 To Aform.Controls.Count - 1 Set Font1 = Aform.Controls(j) CtrFont.FontName = "宋體" CtrFont.FontSize = 16 Next j Next i End Sub |
(2) 在項目中的所有窗體的Activate事件中加入以下語句:
FontAllSame
2 數據庫中的集合對象
在VB的數據庫編程中,所有的數據庫均看作是一個結構良好一致的對象所組成。可以使用對象的屬性及方法對這些對象進行操作、創建和刪除。
在VB數據庫管理中數據的集合對象存在兩類:一類是用于數據庫結構的維護和管理,有三種集合:如,表集(TableDefs)、字段集(Fields)和索引集(Indexes);一類是數據存取對象的記錄集:Recordset。每個集合對象都可以看作是一個數組,并按數組的方法來調用。一旦數據庫建立以后,就可以用這些集合來對數據庫的結構進行修改和數據處理。
在這些集合中同樣具有屬性Count,利用它可對集合中的元素進行操作,如下面是打開一個數據庫,并取得其內各表(Table)的具體特征的應用程序實例。可以得到各表:表名,字段名,字段的個數,字段的類型,表中記錄的條數。
| Sub TableInfo() Dim i, j As Integer, Fname As String Dim db1 As Database, Td1 As TableDefs Dim fld1 As Fields Dim FieldNum, RecNum As Integer Fname$ = "d:mdbxx.mdb" 'XX為Access數據庫文件 |
從以上的程序中可以清楚地看出:數據庫、表、字段存在著層次關系。在VB中層次結構的頂部是Jet數據引擎(DBEngine對象),它是惟一不被其它對象所包含的數據訪問對象。DBEngine對象擁有一個Workspaces集合,該集合含有一個或多個Workspace對象。每個Workspace對象有一個Database集合,該集合又有一個或多個Database對象。每個Database對象含有一個TableDfes集合,該集合又含有一個或多個TableDef對象,依次類推。集合的對象都是基于0的索引來訪問的。
如:DBEngine.Workspaces(0).Databases(0).TableDefs(0).Fields("CustName")
3 建立自己的集合
VB中Collection類用于建立自己的集合。它的工作原理類似于C語言的鏈表,在使用時可以很方便地在其中進行數據的插入、刪除,并且在使用了關鍵字以后,查詢操作也變得簡單了。建立集合后可以用Add方法添加項到集合,Remove方法從集合中刪除項,Item方法檢索集合中的特定項,Count屬性反應集合中項的數目。
VB中舊的內部集合的索引大多是基于0的,即集合中元素的下標是從現0開始的,如上面所述的Forms、Controls和數據庫上的集合等;Collection類建立的集合對象都是基于1的。
3.1 手工創建
用Add方法向中添加項:
| Add(Item As Variant,[,Key As Variant][,Before As Variant][,After As Variant]) |
其中的Key為關鍵字,是一個字符串的表達式,如果以整數為關鍵字則必須用CStr函數將其轉換為字符串。Before和After用于指定添加項所放的相對位置。
如建立一數據結構,用保存學生學號,姓名和成績。
| Public m_colData As New Collection 'm_ColDta用于保存記錄 '自定義一數據類型 Type Mytype ID as Strng Name as String End Type '建立一類Class1,如下 Public ID As String Public Name As String Public Score As Integer '定義插入函數用來接受數據到數據結構中 Public Function InserT2col(pData As Mytype) Dim Myclass As New Class1 Set Myclass = Nothing Myclass.ID = pData.ID Myclass.Name = pData.Name Myclass.Score = pData.Score m_colData.Add Item:=Myclass, Key:=pData.ID '以ID作為關鍵字 End Function |
這樣這建立了數據結構,通過編寫處理函數代碼就可以對其中的數據進行處理輸出,如成績的排序、統計不及格人數等。
3. 2 使用向導
同樣建立上例中建立的自定義類型MyTpye和類Class1。在"項目(Project)"菜單中選取"增加類模塊(Add Class Module)",選擇"VB類構造(VB Class Builder)",在Cass Builder對話框中,選取欄中的"Add New Collection"按鈕,選已存在的類clsData形成集合對象Collection1 類,如圖1所示。
圖1 Collection Builder對話框
此時系統會自動生成Add,Remove,Item屬性和Count方法。
通過定義:Public m_colData As New Collection1 '用于保存記錄
調用Collecton1類中的Add方法,即可生成數據結構。
3.3集合與數組的比較
集合和數組都可用下標來調用,但它們之間存在著區別和聯系。
(1)相同點。它們都是數據元素的有序集,數組可以看作為限制了數據元素個數的集合。
(2)不同點。①元素的個數不同。數組的大小由創建時決定;集合的大小在創建時并不確定。
②訪問元素的效率不同:。集合相當于鏈表,查找元素時從集合的頭一個開始,順序向下,訪問m_coData(99)要比訪問_colData(1)慢得多;而數組元素在內存中是順序存放的,訪問m_coData(99)和訪問m_coData(1)的時間是一樣的。
4結束語
集合是面向對象編程的一個很重要的特點,對于多個具有相同特征的對象可以用集合對象來處理,從而提高編程效率和界面的統一。