问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

■ VB 中如何使用 集合对象

发布网友 发布时间:2022-04-25 13:12

我来回答

1个回答

热心网友 时间:2023-07-13 03:48

Visual Basic 中的集合

什么是集合?在“Visual Basic 集合对象”中,集合定义为一种把有相关的对象分组的方法。这种定义留下很多解释余地,与其说它是一种定义还不如说它是一个概念更合适。

实际上,当比较集合时就会发现,Visual Basic 所提供的各种集合之间都有很大的差别。例如,下列代码会引起错误:

Dim col As Collection
Set col = Forms '错误!

这是怎么回事?Forms 集合是集合,变量 col 也声明为 Collection,为什么不能将指向 Forms 的引用赋给变量 col?

其原因是 Collection 类和 Forms 集合都不是多态的,即它们不能相互交换,因为是从各自的代码库开发的。它们没有相同的方法,没有用相同的方法存储对象引用,或者没有使用相同种类的索引值。

这使得 Collection 类名似乎是多余的,因为它仅仅代表许多可能实现集合方法的一种。该主题探讨一些实现方法的差别,后面将会遇到这些差别。

基于 0 和基于 1 的集合
集合是基于 0 还是基于 1,要取决于开始索引是哪一个。可以猜想,前者的意思是集合中第一项的索引为 0,后者的意思是集合中第一项的索引为 1。基于 0 的集合示例是 Forms 和 Controls 集合。基于 1 的集合的示例是集合对象。

Visual Basic 中旧的集合大多是基于 0 的。而新添加的集合大多基于 1。基于 1 的集合使用时更加直观,因为索引的范围是从 1 到 Count,其中,Count 是能返回集合中项数目的属性。

对应基于 0 的集合索引来说,其范围则是从 0 到 Count-1。

索引和键值
正象 Visual Basic 中的 Collection 对象那样,Visual Basic 中很多集合可以使用数字索引或字符串键来访问其中的项。(然而,Visual Basic 中的 Collection 对象不用指定键就能添加项。)

相反,Forms 集合只能使用数字索引来访问。这是因为没有唯一的字符串值与窗体关联。例如,多个窗体可以有相同的标题,或者加载的多个窗体有相同的 Name 属性。

添加和删除项
在能否向集合中添加项这点上,集合之间也是有区别的,如果可以,这些项是如何添加到集合中的。例如,不能使用 Visual Basic 代码向 Printers 集合添加打印机。

因为 Collection 对象是一般性程序设计工具,它比其它集合更加灵活。它具有 Add 方法可以将项添加到集合里,也有 Remove 方法可以将项从集合中删除。

与之形成对比的是,Forms 集合获取窗体的唯一方法是加载窗体。如果使用 New 操作符建立窗体,或者通过引用一个声明为 As New 的变量建立窗体,那么该窗体是不能被添加到窗体集合里的,除非使用 Load 语句进行加载。

Forms 和控件集合没有 Remove 方法。可以使用 Load 和 Unload 语句间接的向这些集合中添加和从这些集合中删除窗体和控件。

窗体集合中的成员
正如上面所述,窗体在加载之前不能添加到 Forms 集合中。因此 Forms 集合的最准确的说明是:它包含的是程序中当前加载的所有窗体。

即使它不完全准确。如果工程中使用 Microsoft Forms(为了与 Microsoft Office 兼容被包括的),就会发现这些窗体都在一个名为 UserForms 的单独集合里。因此该 Forms 集合所包含的就是程序中当前加载的所有 Visual Basic 窗体。

而 Collection 类十分准确指定的内容是:能够存储到 Variants 里的任何东西。于是集合对象能包含对象或者整数,但不能包含用户定义类型。

遗憾的是,该说明的覆盖范围很广- 集合类给定的一个实例能够存储任何数据类型、数组和对象的混合组合。

提示 正如“创建自己的集合类”中所述,建立自己的集合类的最重要原因是能够控制自己的集合中的内容- 称为类型安全性概念。

集合的枚举
可以使用 For Each ... Next 对集合中的项枚举,而不用担心集合是基于 0 还是基于 1。当然,这很难作为集合的一个定义特性,因为 Visual Basic 也允许使用 For Each ... Next 对数组中的项枚举。

使 For Each ... Next 能工作的是一个称为 enumerato 的很小的对象。枚举算子记录集合中项的位置,并在需要时返回下一项。

枚举数组时,在运行中 Visual Basic 创建一个数组枚举算子对象。集合具有自己的枚举算子对象,它也是需要时创建的。

枚举算子不会跳过项
Visual Basic 中集合的枚举算子不会跳过项。例如,假设枚举一个包含 "A"、"B" 和 "C" 的集合,并且进行枚举时删除了 "B",则在操作时 Visual Basic 不会跳到 "C" 上。

枚举算子可能不捕捉添加的项
当枚举集合时,如果给集合添加了项,一些枚举算子将能包含添加的项,而一些枚举算子则不会。例如,枚举 Forms 集合时就不枚举刚加载的任何窗体。

如果将它们添加到集合末尾,则在枚举时集合,对象就能枚举添加的项。因此下列循环永远不会终止(即直到按 CTRL+BREAK 组合键):

Dim col As New Collection
Dim vnt As Variant
col.Add "Endless"
col.Add "Endless"
For Each vnt In col
MsgBox vnt
col.Add "Endless"
Next

另一方面,添加到集合开始的项不会包含在枚举里。

Dim col As New Collection
Dim vnt As Variant
col.Add "Will be enumerated"
For Each vnt In col
MsgBox vnt
'在开始处添加项。
col.Add "Won't be enumerated", Before:=1
Next

为什么需要枚举算子?
每次 For Each ... Next 开始时,通过发出一新枚举算子,集合允许嵌套的枚举。例如,假定在变量 mcolStrings 中有一个 Collection 对象的引用,并且该集合只包含字符串。下列代码打印两个不同字符串的所有组合:

Dim vnt1 As Variant
Dim vnt2 As Variant
For Each vnt1 In mcolStrings
For Each vnt2 In mcolStrings
If vnt1 <> vnt2 Then
Debug.Print vnt1 & " " & vnt2
End If
Next
Next
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...是4厘米、和7厘米,第三条边的长度可能是多少厘米? 一个三角形的一条边是四厘米另一条边是七厘米第三条边可能是 一个三角形的一条边是4厘米,另一条边是7厘米,第三条边可能是( ) A... ...3厘米,另一条边是7厘米,第三条边可能是( )厘米. A.3 B.4 C._百 ... ...三条边可能是( )厘米。 A. 4厘米 B. 3厘米 C.2厘米 d.1 2017款宝马730Li前刹车片的价格 宝马730刹车盘多少公里更换宝马7系刹车片多久换一次 宝马换完4轮刹车片怎么归零 宝马7系刹车盘多少公里更换? 如何将QQ炫舞里两人结婚的录像制成照片放在QQ空间里啊 集合对象是空值null 与 其大小size() == 0 有什么区别? 集合对象有哪些 什么样的对象可以构成一个集合举例说明 集合定义中不同对象的含义是什么 c#集合类对象有哪些 下列对象能构成集合的是? 集合的概念?什么是集合?? 数学中集合的对象叫什么? 梦见发洪水淹大山,自己没淹着 面对面怎么样进入别人建的群 微信面对面如何加入 上海嘉定望仙公墓今年扫墓踏青开放吗? 上海嘉定望仙公墓今年扫墓踏青开放吗?要 可以去踏青吗? 上海周边有些什么好玩的啊? 上海有哪些贴近大自然的好玩地方? 去哪里踏青? 上海有适合踏青、郊游并且能推轮椅进去的地儿吗? 上海哪里有免费的自然景点,适合踏青的 春暖花开,上海附近有什么踏青的好去处啊? 红米 怎么知道有没有解开bl锁 红米手机如何解BL锁 红米note3怎么看有没有bl锁 红米手机怎么解bl锁 红米手机10pro的blgn在哪里 红米5plus的bl锁怎么强行破解 红米note4怎么知道自己手机是不是bl锁 原生态村落被污染,开发成景点后物价涨十倍,网友纷纷给差评,你怎么看... 求助,红米Note有没有BL锁 红米bl解锁账号登录时间怎么看 西江千户苗寨导游词 红米note4高配版怎么解BL锁? 燃烧殆尽!贵州西江千户苗寨景区一木质房失火,对周围建筑是否造成影响... 红米note3换了手机号怎么解锁bl 西江千户苗寨住宿及就餐? 我的手机登陆不到小米账号但是申请解bl锁通过了能解开bl锁吗 220V继电器实物接线图 西江千户苗寨 红米4密码忘了被锁定 小米账号忘了 没有解锁bl 还能怎么办? 电流继电器的三种接线方式图纸