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

前端之家收集整理的这篇文章主要介绍了VB6.0之Collection---Collection集合类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

参考一

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的例子。

  1. 'FileName : OneKeyCls.cls
    Option
    Explicit
  2.  
  3. Public Key As String
  1. 'FileName : OneKeyCol.cls
    Option
    '局部变量,保存集合
  2. Private mCol As Collection
  3. Public Function Add(Key String,Optional sKey String) As OneKeyCls
  4. 创建新对象
  5. Dim objNewMember Set objNewMember = New OneKeyCls
  6. 设置传入方法属性
  7. objNewMember.Key = Key
  8. If Len(sKey) = 0 Then
  9. mCol.Add objNewMember
  10. Else
  11. mCol.Add objNewMember,sKey
  12. End If
  13. 返回已创建的对象
  14. Set Add = objNewMember
  15. Nothing
  16. End Function
  17.  
  18. 下面 做了 错误处理!当 没有 关键字 的时候 就会返回Nothing了。
  19. Property Get Item(vntIndexKey As Variant) As OneKeyCls
  20. Err.Clear
  21. On Error GoTo GetItemError
  22. 引用集合中的一个元素时使用。
  23. vntIndexKey 包含集合的索引或关键字,
  24. 这是为什么要声明为 Variant 的原因
  25. 语法:Set foo = x.Item(xyz) or Set foo = x.Item(5)
  26. Set Item = mCol(vntIndexKey)
  27. Exit Property
  28. GetItemError:
  29. Debug.Print Err.Source & " : Error Was found in Item(vntIndexKey as Variant) as oneKeyCls . " & vbCrLf & Err.Description & : " & Err.Number
  30. Set Item = Nothing
  31. End Property
  32.  
  33.  
  34.  
  35. Get Count() Long
  36. 检索集合中的元素数时使用。语法:Debug.Print x.Count
  37. Count = mCol.Count
  38. End Property
  39.  
  40.  
  41. Sub Remove(vntIndexKey As Variant)
  42. 删除集合中的元素时使用。
  43. vntIndexKey 包含索引或关键字,这是为什么要声明为 Variant 的原因
  44. 语法:x.Remove(xyz)
  45. mCol.Remove vntIndexKey
  46. End Sub
  47.  
  48.  
  49. Get NewEnum() As IUnknown
  50. 属性允许用 For...Each 语法枚举该集合。
  51. Set NewEnum = mCol.[_NewEnum]
  52. Private Sub Class_Initialize()
  53. 创建类后创建集合
  54. Set mCol = New Collection
  55. Sub Class_Terminate()
  56. 类终止后破坏集合
  57. End Sub

使用范例:

  1. Dim Cars New OneKeyCol
  2. Cars.Add 10.1",2"
  3. Cars.Add 10.22010.3200key"
  4. Debug.Print Count:" & Cars.Count
  5. Debug.Print Cars.Item(").Key
  6. Debug.Print TypeName(Cars.Item(300")) Error Nothing
  7. Dim i
  8. Dim key1 按照 index 索引 进行遍历,效率要比下面的方法低一点
  9. For i = 1 To Cars.Count
  10. Set key1 = Cars.Item(i)
  11. Debug.Print key1.Key
  12. Next
  13. 推荐这种遍历方法
  14. For Each key1 In Cars
  15. Debug.Print key1.Key
  16. Next

一下为稍微整理下VB6的 collection 的转载。

Visual Basic 集合对象()
集合是方法将一系列相关的项构成组的一种方法。Visual Basic 中集合可用于跟踪很多事情,例如程序中加载的窗体(窗体集合),或者在窗体中的所有控件(控件集合)。
Visual Basic 提供的类属 Collection 类可用来定义自己的集合。需要多少集合对象,就可以建立多少 Collection 对象- 即 Collection 类的实例。还可使用集合对象作为自己的集合类和对象模型的基础,它将在本章后面的“创建自己的集合类”和“对象模型”中讨论。
例如,集合是跟踪多窗体的最好方法。在“创建用户界面”中的“多文档界面 (MDI) 应用程序”里讨论用户可以打开任何数目文档窗口的应用程序。以下代码段演示如何使用集合对象的 Add 方法,对用户建立的 MDI 子窗体列表进行管理。该代码假定已经存在一个名为 mdiDocument 的窗体,其 MDIChild 属性设置为 True。
'父 MDIForm 中的模块级集合。

Public colDocuments 建立新的 MDI 子文档窗体的代码 Sub mnuFileNew() Dim f New mdiDocument Static intDocumentNumber Integer intDocumentNumber = intDocumentNumber 1 下面的语句创建窗体。 f.Caption = Document" & intDocumentNumber 给集合添加对象引用。 colDocuments.Add f f.Show

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 中。


集合对象的属性方法

每个集合对象都有属性方法,使用它们能够插入、删除和检索该集合中的项。

  1. 属性方法 描述
  2. Add 方法 给集合添加项。
  3. Count 属性 返回集合中项的数目。只读。
  4. Item 方法 通过索引或关键字,返回项。
  5. Remove 方法 通过索引或关键字,从集合中删除项。

这些属性方法仅仅是集合最基本的功能。例如,要确保集合只包含一种对象,Add 方法并不能检查将要添加到集合里的对象类型。通过建立自己的集合类能够提供更强健的功能,以及额外的属性方法和事件,正如本章后面的“创建自己的集合类”中所述。

集合中的增加删除和检索的基本功能需要关键字和索引。关键字是一个 String 的值。它可以是能转换成字符串的名字、驾驶执照号、社会安全号或者简单的整数。Add 方法允许将关键字与项相关联,如本节后面部分所述。
索引是长整型,介于 1 和集合中项的数目之间。使用 before 和 after 命名的参数,可以控制项索引的初始值,但是随着其它项的增加删除,其值会发生改变。
注意 索引从 1 开始的集合称为基于 1,如“Visual Basic 中的集合”中所述。
使用索引能够在进行集合的项中迭代。例如,假定变量 mcolEmployees 中包含对集合对象的一个引用,下列代码使用两种方法把 Employee 对象集合中所有雇员的薪水提高 10%。

Dim lngCt Long For lngCt = To mcolEmployees.Count mcolEmployees(lngCt).Rate = _ mcolEmployees(lngCt).Rate * 1.1 Next Dim emp As Employee Each emp In mcolEmployees emp.Rate = emp.Rate *


提示 为改善性能,@H_845_502@应使用 For Each 对 Collection 对象中的项进行迭代。使用 For Each 迭代要比使用索引快很多倍。这并不是对所有集合都正确- 它取决于集合内部存储数据的方法


给集合添加
Add 方法用于将项添加到集合。语法是:

Sub Add (item As Variant [,key As Variant] [,before As Variant] [,after As Variant] )

例如,使用工作定单 ID 属性作为关键字,将工作定单对象添加到工作定单集合里,代码可编写为:

  1. colWorkOrders.Add woNew,woNew.ID

这里假定 ID 属性是字符串。如果属性是数字(例如 Long),则应使用 CStr 函数将它转换成关键字所要求的字符串值:

CStr(woNew.ID)

Add 方法支持命名的参数。为了添加一项作为第三个元素,代码可编写为:

2

可以使用 before 和 after 命名的参数管理有序的对象集合。例如,before:=1 将在集合的开始插入一项,因为集合对象是基于 1 的。

从集合中删除
Remove 方法用于从集合中删除项。语法是:

object.Remove index

index 参数可以是所删除项在集合中的位置,或者是该项的关键字。如果集合中第三个元素的关键字是“W017493”,则可使用这两条语句中的任何一条删除它:

  1. colWorkOrders.Remove 3
  2. - -
  3. colWorkOrders.Remove W017493"

从集合中检索项

Item 方法用于从集合中检索特定项。语法是:

  1. [Set] variable = object.Item(index)

和 Remove 方法一样, index 可以检索项在集合中的位置,或者是该项的关键字。使用 Remove 方法中的相同示例,这两条语句中的任一条都可检索集合中的第三个元素:

Set woCurrent = colWorkOrders.Item(3) - 或 - ")

如果使用整数作为关键字,在将它们传递到 Item 或 Remove 方法之前,必须使用 CStr 函数将其转换成字符串。通常集合对象都假定整数是索引。

提示 Collection 对象不能决定所传递的值是索引还是键。如果想把值解释为键,并且包含该值的变量是除 String 以外的任何值,可以使用 CStr 函数进行转换。如果想把值解释为索引,并且包含该值的变量不是整型数据类型中的一种,使用 CLng 进行转换。
Item 是缺省方法
对于集合对象来说,Item 方法是缺省方法,因此当访问集合中的项时,可忽略它。所以前面的代码示例也可以写成:

Set woCurrent = colWorkOrders(")

重点 当添加删除集合对象元素时,集合对象会自动地维护其数字索引编号。因此给定元素的数字索引随之改变。不能在程序中存储数字索引值,并用它检索同一个元素。为达到该目的,应使用键。

使用 Item 方法调用属性方法
为了使用对象引用,不能从集合中检索该对象引用,并把它放到对象变量中。当对象仍然在集合里时能够使用其引用。
例如,假设上述代码中的 WorkOrder 对象具有 Priority 属性。下面的语句都可用于设置工作定单的优先级:

  1. colWorkOrders.Item(").Priority = 3
  2. colWorkOrders(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


1Option Explicit
2Public Name As String
3Public BirthDay As Date
4Public Sex As Boolean
5

01Option Explicit
2Private mcolChildren As New Collection
3Public Property Get Count() As Long
4Count = mcolChildren.Count
5End Property
6Public Function Add(ByVal Name As String,ByVal BirthDay As Date,ByVal Sex As Boolean) As Child
7Dim empNew As New Child
8Static intNum As Integer
9With empNew
10intNum = intNum + 1
11.Name = Name
12.BirthDay = BirthDay
13.Sex = Sex
14mcolChildren.Add empNew
15End With
16Set Add = empNew
17End Function
18Public Function Item(ByVal Index As Variant) As Child
19Set Item = mcolChildren.Item(Index)
20End Function
21

1Private mChildren As New Children
2Public Property Get Children() 'As Children '回傳至Childrenclass
3Set Children = mChildren
4End Property

2Public sbMain As New Family
3'開始收集
4Private Sub cmdAddChild_Click()
5'使用Childrenclass的Add方法
6sbMain.Children.Add CStr(txtName.Text),CDate(txtBirthDay.Text),CBool(txtSex.Text)
7End Sub
8'List收集視窗
9Private Sub cmdListChild_Click()
10Dim emp As New Child
11Dim i As Long
12lstChild.Clear
13For i = 1 To sbMain.Children.Count
14Set emp = sbMain.Children.Item(i)
15lstChild.AddItem emp.Name &","& emp.BirthDay && emp.Sex
16Next
17End Sub

猜你在找的VB相关文章