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

'FileName : OneKeyCls.cls
Option
Explicit Public Key As String
'FileName : OneKeyCol.cls
Option
'局部变量,保存集合 Private mCol As Collection Public Function Add(Key String,Optional sKey String) As OneKeyCls 创建新对象 Dim objNewMember 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 Nothing End Function 下面 做了 错误处理!当 没有 关键字 的时候 就会返回Nothing了。 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 = Nothing End Property Get Count() Long 检索集合中的元素数时使用。语法:Debug.Print x.Count Count = mCol.Count End Property Sub Remove(vntIndexKey As Variant) 删除集合中的元素时使用。 vntIndexKey 包含索引或关键字,这是为什么要声明为 Variant 的原因 语法:x.Remove(xyz) mCol.Remove vntIndexKey End Sub Get NewEnum() As IUnknown 本属性允许用 For...Each 语法枚举该集合。 Set NewEnum = mCol.[_NewEnum] Private Sub Class_Initialize() 创建类后创建集合 Set mCol = New Collection Sub Class_Terminate() 类终止后破坏集合 End Sub

使用范例:

    Dim Cars New OneKeyCol
    Cars.Add 10.1",2"
    Cars.Add 10.22010.3200key"
    Debug.Print Count:" & Cars.Count

    
    
    Debug.Print Cars.Item(").Key
    Debug.Print TypeName(Cars.Item(300"))  Error Nothing
    
    
    Dim i
    Dim key1 按照 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 建立新的 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 中。


集合对象的属性和方法

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

属性或方法     描述
Add    方法 给集合添加项。
Count  属性 返回集合中项的数目。只读。
Item   方法 通过索引或关键字,返回项。
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 *


提示 为改善性能,应使用 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 函数将它转换成关键字所要求的字符串值:

CStr(woNew.ID)

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

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) - 或 - ")

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

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

Set woCurrent = colWorkOrders(")

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")