VB6.0之Collection---Collection集合类

来源:互联网 发布:matlab根据数据求函数 编辑:程序博客网 时间:2024/04/29 11:04

参考一

VB之Collection---Collection集合类

你看到的这个文章来自于http://www.cnblogs.com/ayanmw

由于要对一些数据进行处理,比较麻烦,实现某个算法要处理大量不同的不同类型的数据。

所以考虑到一些因素,又在使用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

转载请注明出处:http://www.cnblogs.com/ayanmw 我会很高兴的!

------------------------------------------------------------------------------------------------

一定要专业!本博客定位于ArcGIS开发,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。.



参考二

Collection 的用法
Collection是我們在使用類時最常用到的對象。一個Collection對象代表一組相關的項目,雖然它的成員並不被強制要求是同一類型的的,但
請記住,這通常並不能給我們帶來額外的方便,相反,我們通常是用來收集同一類型的數據。

建立集合的方法和建立其它對象一樣,如:
Dim col As New Collection

集合建立後,可以使用Add方法添加成員,用Remove方法刪除成員,用Item方法從集合中返回特定成員。

Private Sub Command1_Click()
    Dim col As New Collection
    Dim i as integer
    Dim ct As Control
    '收集
    For Each ct In Me.Controls
        If Left(ct.Name, 7) = "Text1" Then col.Add ct
    Next ct
    '移除
    For i = col.Count To 1 Step -1
        MsgBox "下面刪除成員" & col.Item(i).Name
        col.Remove i
    Next i
End Sub

上面的代碼先將窗體上所有的TextBox加入到集合中,然後再刪除掉。Count屬性返回集合的成員數量,Remove方法後面的參數是集合成員的索引號。成員的索引號通常是按照加入的順序自然編號,從1開始,但可以在加入時使用Add方法的參數進行改變。Add方法的完整語法是:
object.Add item[, key][, before][, after]
item 必需的。任意類型的表達式,指定要添加到集合中的成員。
key 可選的。唯一字符串表達式,指定可以使用的鍵字符串,代替位置索引來訪問集合中的成員。
before/after 可選的。表達式,指定集合中的相對位置。
下面語句向集合增加一個對象Text1,並定義該成員的關鍵字為tx1。
col.Add Text1, "tx1"
然後,下面兩句都可以向集合中增加一個Text2,並把它放在成員Text1的前面。
col.Add Text2, , col.Count
col.Add Text2, , "tx1"
第一句中,因為只有一個成員,所以col.Count也是索引號

 

Collection除了收集之外也能將其實體化,接下來再看這下面這一例,

Option Explicit
Public form_count As Integer
Public a As New Collection
'在表單 (Form1) 中:
Private Sub Command2_Click()
    If form_count = 0 Then form_count = 1
    form_count = form_count + 1
    a.Add New Form1, "form" & form_count
    a("form" & form_count).Show
    a("form" & form_count).Caption = "form" & form_count
End Sub

再看一例會更清楚,這是利用class來演示資料傳輸及收集。

Family
|
-------- > Childred ------ >child

Family class與 Child class的關係是一對多的關係。為了簡化class之間的關係,我們增加了一個Children class,Children類是Child

class的集合,因此 Family class與Children class直接關聯,形成一對一的關係。
簡單的講也就是Family class繼承了Childred class,而Childred class繼承了child class

 

 
1 Option Explicit
2 Public Name As String
3 Public BirthDay As Date
4 Public Sex As Boolean
5
 
01 Option Explicit
02 Private mcolChildren As New Collection
03 Public Property Get Count() As Long
04     Count = mcolChildren.Count
05 End Property
06 Public Function Add(ByVal Name As String, ByVal BirthDay As Date, ByVal Sex As Boolean) As Child
07     Dim empNew As New Child
08     Static intNum As Integer
09     With empNew
10         intNum = intNum + 1
11         .Name = Name
12         .BirthDay = BirthDay
13         .Sex = Sex
14         mcolChildren.Add empNew
15     End With
16     Set Add = empNew
17 End Function
18 Public Function Item(ByVal Index As Variant) As Child
19     Set Item = mcolChildren.Item(Index)
20 End Function
21
 
1 Private mChildren As New Children
2 Public Property Get Children() 'As Children '回傳至Children class
3     Set Children = mChildren
4 End Property
5
 
01 Option Explicit
02 Public sbMain As New Family
03 '開始收集
04 Private Sub cmdAddChild_Click()
05     '使用Children class的Add方法
06     sbMain.Children.Add CStr(txtName.Text), CDate(txtBirthDay.Text), CBool(txtSex.Text)
07 End Sub
08 'List收集視窗
09 Private Sub cmdListChild_Click()
10     Dim emp As New Child
11     Dim i As Long
12     lstChild.Clear
13     For i = 1 To sbMain.Children.Count
14         Set emp = sbMain.Children.Item(i)
15         lstChild.AddItem emp.Name & ", " & emp.BirthDay & ", " & emp.Sex
16     Next
17 End Sub