由於要對一些資料進行處理,比較麻煩,實現某個演算法要處理大量不同的不同類型的資料。
所以考慮到一些因素,又在使用VB6(可惜微軟不支援VB6了,改為DotNet架構了 ),所以使用 VB6 內建的 Collection集合(類) 最好。
其實Collection 也是有Key 和 Value一一對應的關係的。而且 還有 ID 順序。
現在不是流行 key-value的資料庫麼,collection如果可以儲存到檔案,那麼不久完美了嗎?? 反正 現在當作 key value的即時處理資料的庫來用 還是很好的。
從VB6的 《類產生器工具 + 生產力》 建立 collection挺方便,唯一不方便的是,預設不把 collection當作類來使用。其實 這就是一個類而已麼。一般collection只有一個就行,add多個元素。但是collection也可以 建立多個,就是collection下有collection,下又有 一些 class,複雜程度稍微高一點。
下面是一個簡單的collection配合一個class的例子。
'FileName : OneKeyCls.cls
Option ExplicitPublic Key As String
'FileName : OneKeyCol.cls
Option Explicit'局部變數,儲存集合Private mCol As CollectionPublic Function Add(Key As String, Optional sKey As String) As OneKeyCls '建立新對象 Dim objNewMember As OneKeyCls Set objNewMember = New OneKeyCls '設定傳入方法的屬性 objNewMember.Key = Key If Len(sKey) = 0 Then mCol.Add objNewMember Else mCol.Add objNewMember, sKey End If '返回已建立的對象 Set Add = objNewMember Set objNewMember = Nothing End Function'下面 做了 錯誤處理!當 沒有 關鍵字 的時候 就會返回Nothing了。Public Property Get Item(vntIndexKey As Variant) As OneKeyCls Err.Clear On Error GoTo GetItemError '引用集合中的一個元素時使用。 'vntIndexKey 包含集合的索引或關鍵字, '這是為什麼要聲明為 Variant 的原因 '文法:Set foo = x.Item(xyz) or Set foo = x.Item(5) Set Item = mCol(vntIndexKey) Exit Property GetItemError: Debug.Print Err.Source & " : Error Was found in Item(vntIndexKey as Variant) as oneKeyCls . " & vbCrLf & Err.Description & " : " & Err.Number Set Item = NothingEnd PropertyPublic Property Get Count() As Long '檢索集合中的元素數時使用。文法:Debug.Print x.Count Count = mCol.CountEnd PropertyPublic Sub Remove(vntIndexKey As Variant) '刪除集合中的元素時使用。 'vntIndexKey 包含索引或關鍵字,這是為什麼要聲明為 Variant 的原因 '文法:x.Remove(xyz) mCol.Remove vntIndexKeyEnd SubPublic Property Get NewEnum() As IUnknown '本屬性允許用 For...Each 文法枚舉該集合。 Set NewEnum = mCol.[_NewEnum]End PropertyPrivate Sub Class_Initialize() '建立類後建立集合 Set mCol = New CollectionEnd SubPrivate Sub Class_Terminate() '類終止後破壞集合 Set mCol = NothingEnd Sub
使用範例:
Dim Cars As New OneKeyCol Cars.Add "10.1", "2" Cars.Add "10.2", "20" Cars.Add "10.3", "200" Cars.Add "key" Debug.Print "Count:" & Cars.Count Debug.Print Cars.Item("200").Key Debug.Print TypeName(Cars.Item("300")) ' Error Nothing Dim i Dim key1 As OneKeyCls '按照 index 索引 進行遍曆 ,效率要比下面的方法低一點 For i = 1 To Cars.Count Set key1 = Cars.Item(i) Debug.Print key1.Key Next '推薦這種遍曆方法 For Each key1 In Cars Debug.Print key1.Key Next
一下為稍微整理下VB6的 collection 的轉載。
Visual Basic 集合對象()
集合是方法將一系列相關的項構成組的一種方法。Visual Basic 中集合可用於跟蹤很多事情,例如程式中載入的表單(表單集合),或者在表單中的所有控制項(控制項集合)。
Visual Basic 提供的類屬 Collection 類可用來定義自己的集合。需要多少集合對象,就可以建立多少 Collection 對象- 即 Collection 類的執行個體。還可使用集合對象作為自己的集合類和物件模型的基礎,它將在本章後面的“建立自己的集合類”和“物件模型”中討論。
例如,集合是跟蹤多表單的最好方法。在“建立使用者介面”中的“多重文件介面 (MDI) 應用程式”裡討論使用者可以開啟任何數目文件視窗的應用程式。以下程式碼片段示範如何使用集合對象的 Add 方法,對使用者建立的 MDI 子表單列表進行管理。該代碼假定已經存在一個名為 mdiDocument 的表單,其 MDIChild 屬性設定為 True。
'父 MDIForm 中的模組層級集合。
Public colDocuments As New Collection'建立新的 MDI 子文檔表單的代碼。Private Sub mnuFileNew()Dim f As New mdiDocumentStatic intDocumentNumber As IntegerintDocumentNumber = intDocumentNumber 1'下面的語句建立表單。f.Caption = "Document" & intDocumentNumber'給集合添加對象引用。colDocuments.Add ff.ShowEnd Sub
colDocuments 的作用象是內建表單集合的一個子集,它只包含表單 mdiDocument 的一些執行個體。每添加一個新表單,自動調節集合的大小。可使用 For Each ... Next 在集合內進行迭代。如果賦予表單一個可以檢索的鍵,那麼可提供一文本字串作為 Add 方法的第二個參數,如本節後面部分所述。
在變數 colDocuments 的聲明中,New 關鍵字導致當該變數第一次被引用時,在代碼中建立集合對象。因為集合是類,而不是資料類型,所以必須建立集合執行個體,並且在變數中記錄對該執行個體(對象)的引用。
象其它任何對象一樣,當包含其引用的最後一個變數被設定成 Nothing 或不可見時,Collection 對象將被撤消。它包含的所有對象引用將被釋放。因此,變數 colDocuments 在父 MDIForm 中聲明,於是它將存在於程式存活期中的整個過程。
注意 如果使用集合來跟蹤表單,當表單被卸載之後,應使用集合的 Remove 方法從集合中刪除該對象引用。只要對該表單的引用仍然存在,就不能收回表單使用的記憶體,並且 Collection 對象儲存的引用象物件變數中的引用一樣完好。
集合對象的構成
Collection 對象將每一項儲存於 Variants 對象中。於是,能夠添加到 Collection 對象裡的內容列表就和能夠儲存到 Variants 中的內容列表是相同的。這包括標準資料類型、對象和數組- 但不包括使用者定義型別。
不管 Variants 中儲存的是什麼,它都占 16 位元組,因此使用 Collection 對象不如使用數組的效率高。然而,不能 ReDim 一個 Collection 對象,ReDim Collection 對象能夠使代碼更清楚、更容易維護。此外,集合對象按鍵能進行快速的尋找,而數組卻不能。
注意 準確一點說,即使是把資料存放區在其它地方,Variants 也總是只佔 16 個位元組。例如,如果把字串或數組賦給 Variants,Variants 將包含一個指向字串和數組資料備份的指標。在 32 位系統中,指標只使用了 Variants 的 4 個位元組,而且 Variants 中實際上不存在資料。
若要儲存一個對象,Variants 將包含該對象引用,就象物件變數所做的一樣。對字串和數組來說,也只使用 Variants 的 4 個位元組。
數字資料類型儲存在 Variants 中。不管什麼樣的資料類型,Variants 仍然占 16 個位元組。
除了 Variants 大小之外,還有很多情況需要使用 Collection 對象來儲存上面列出的所有資料類型。應該知道進行權衡:使用 Collection 對象能夠編寫清楚且容易維護的代碼- 所花費的僅是將一些項儲存在 Variant 中。
集合對象的屬性和方法
每個集合對象都有屬性和方法,使用它們能夠插入、刪除和檢索該集合中的項。
屬性或方法 描述Add 方法 給集合添加項。Count 屬性 返回集合中項的數目。唯讀。Item 方法 通過索引或關鍵字,返回項。Remove 方法 通過索引或關鍵字,從集合中刪除項。
這些屬性和方法僅僅是集合最基本的功能。例如,要確保集合只包含一種對象,Add 方法並不能檢查將要添加到集合裡的物件類型。通過建立自己的集合類能夠提供更強健的功能,以及額外的屬性、方法和事件,正如本章後面的“建立自己的集合類”中所述。
集合中的增加、刪除和檢索的準系統需要關鍵字和索引。關鍵字是一個 String 的值。它可以是能轉換成字串的名字、駕駛執照號、社會安全號或者簡單的整數。Add 方法允許將關鍵字與項相關聯,如本節後面部分所述。
索引是長整型,介於 1 和集合中項的數目之間。使用 before 和 after 命名的參數,可以控制項索引的初始值,但是隨著其它項的增加和刪除,其值會發生改變。
注意 索引從 1 開始的集合稱為基於 1,如“Visual Basic 中的集合”中所述。
使用索引能夠在進行集合的項中迭代。例如,假定變數 mcolEmployees 中包含對集合對象的一個引用,下列代碼使用兩種方法把 Employee 對象集合中所有僱員的薪水提高 10%。
Dim lngCt As LongFor lngCt = 1 To mcolEmployees.CountmcolEmployees(lngCt).Rate = _mcolEmployees(lngCt).Rate * 1.1NextDim emp As EmployeeFor Each emp In mcolEmployeesemp.Rate = emp.Rate * 1.1Next
提示 為改善效能,應使用 For Each 對 Collection 對象中的項進行迭代。使用 For Each 迭代要比使用索引快很多倍。這並不是對所有集合都正確- 它取決於集合內部儲存資料的方法。
給集合添加項
Add 方法用於將項添加到集合。文法是:
Sub Add (item As Variant [, key As Variant] [, before As Variant][, after As Variant] )
例如,使用工作定單 ID 屬性作為關鍵字,將工作定單對象添加到工作定單集合裡,代碼可編寫為:
colWorkOrders.Add woNew, woNew.ID
這裡假定 ID 屬性是字串。如果屬性是數字(例如 Long),則應使用 CStr 函數將它轉換成關鍵字所要求的字串值:
colWorkOrders.Add woNew, CStr(woNew.ID)
Add 方法支援命名的參數。為了添加一項作為第三個元素,代碼可編寫為:
colWorkOrders.Add woNew, woNew.ID, after:=2
可以使用 before 和 after 命名的參數管理有序的對象集合。例如,before:=1 將在集合的開始插入一項,因為集合對象是基於 1 的。
從集合中刪除項
Remove 方法用於從集合中刪除項。文法是:
object.Remove index
index 參數可以是所刪除項在集合中的位置,或者是該項的關鍵字。如果集合中第三個元素的關鍵字是“W017493”,則可使用這兩條語句中的任何一條刪除它:
colWorkOrders.Remove 3- 或 -colWorkOrders.Remove "W017493"
從集合中檢索項
Item 方法用於從集合中檢索特定項。文法是:
[Set] variable = object.Item(index)
和 Remove 方法一樣, index 可以檢索項在集合中的位置,或者是該項的關鍵字。使用 Remove 方法中的相同樣本,這兩條語句中的任一條都可檢索集合中的第三個元素:
Set woCurrent = colWorkOrders.Item(3)- 或 -Set woCurrent = colWorkOrders.Item("W017493")
如果使用整數作為關鍵字,在將它們傳遞到 Item 或 Remove 方法之前,必須使用 CStr 函數將其轉換成字串。通常集合對象都假定整數是索引。
提示 Collection 對象不能決定所傳遞的值是索引還是鍵。如果想把值解釋為鍵,並且包含該值的變數是除 String 以外的任何值,可以使用 CStr 函數進行轉換。如果想把值解釋為索引,並且包含該值的變數不是整數資料型別中的一種,使用 CLng 進行轉換。
Item 是預設方法
對於集合對象來說,Item 方法是預設方法,因此當訪問集合中的項時,可忽略它。所以前面的程式碼範例也可以寫成:
Set woCurrent = colWorkOrders(3)- 或 -Set woCurrent = colWorkOrders("W017493")
重點 當添加和刪除集合對象元素時,集合對象會自動地維護其數字索引編號。因此給定元素的數字索引隨之改變。不能在程式中儲存數字索引值,並用它檢索同一個元素。為達到該目的,應使用鍵。
使用 Item 方法調用屬性和方法
為了使用對象引用,不能從集合中檢索該對象引用,並把它放到物件變數中。當對象仍然在集合裡時能夠使用其引用。
例如,假設上述代碼中的 WorkOrder 對象具有 Priority 屬性。下面的語句都可用於設定工作定單的優先順序:
colWorkOrders.Item("W017493").Priority = 3colWorkOrders("W017493").Priority = 3
可行的原因是 Visual Basic 要從左至右計算運算式。當遇到 Item 方法時- 顯式的或隱式的- Visual Basic 為指定的項(此時是鍵為 W017493 的 WorkOrder 對象)取得一個引用,並使用該引用計算該行的其餘部分。
提示 如果想調用集合中對象的多個屬性或方法,首先將該對象引用複製到一個強型別的物件變數中。把引用放到一個強型別的物件變數中,然後使用,比使用集合裡對象的引用要快(例如,Dim woCurrent As WorkOrder),因為 Collection 對象是把項儲存在 Variants 中。 Variants 中的對象引用總是最後綁定。
詳細資料 對很多一般的程式設計任務來說,集合對象也是數組的很有用的可選方案。 請參閱“再論編程”中的“用集合替代數組”。
Visual Basic 提供很多內建集合。有關它們與集合對象的比較,請參閱“Visual Basic 中的集合”。
建立自己的集合類
一般可以採取三種辦法用集合來實現對象包含。以上面“物件模型”中所討論的 SmallBusiness 對象的 Employees 集合為例。為了實現該集合,可以這樣做:
在 SmallBusiness 類別模組中,將 Employees 變數聲明為 As Collection,並使之成為 Public。這是最簡單的解決方案
轉自:http://blog.sina.com.cn/s/blog_4b168e640100lbma.html