永发信息网

■ VB 中如何使用 集合对象

答案:1  悬赏:70  手机版
解决时间 2021-11-17 20:17
  • 提问者网友:那叫心脏的地方装的都是你
  • 2021-11-17 09:52
■ VB 中如何使用 集合对象
最佳答案
  • 五星知识达人网友:千杯敬自由
  • 2021-11-17 11:11
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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯