用枚举类型来定义一个相关的命名常数集合是很方便的。例如,内置的枚举类型 VbDayOfWeek 就包含了一些名字为 vbMonday、vbTuesday 等的数值常数。
可以使用枚举类型作为属性或方法的参数的数据类型,如下例所示:
Private mdowDayOfWeek As VbDayOfWeek
Property Get DayOfWeek() As VbDayOfWeek
DayOfWeek = mdowDayOfWeek
End Property
Property Let DayOfWeek(ByVal NewDay As VbDayOfWeek)
If (NewDay < vbUseSystemDayOfWeek) _
Or (NewDay < vbSaturday) Then
Err.Raise Number:=31013, _
Description:="Invalid day of week"
Else
DayOfWeek = mdowDayOfWeek
End If
End Property
当部件的用户键入代码为该属性赋值时,自动列表成员功能将提供一个下拉列表框,列出该枚举类型的所有成员,如图 6.3 所示。
图 6.3 自动列出成员枚举类型
提示 也许出于节省空间的考虑,设计者定义一个内部变量 mdowDayOfWeek
As Byte 而不是 As VbDayOfWeek─ 因为后者定义变量的数据类型为 Long 型。不过,在 32 位的操作系统中装入 Long 型要比装入短的数据类型要快而且更紧凑。所以,这样做不仅那些额外的代码会超出所节省的空间,而且由于模块和数据有对齐的要求,可能一开始就没有节省空间。
通过设置枚举类型为 Public,并包含在任何一个定义类的模块─ 即类模块、UserControl 或 UserDocument 中,部件的用户就可以使用该枚举类型。
编译部件时,该枚举类型将添加入类型库。“对象浏览器”就可以显示该枚举类型及其成员。
注意 尽管枚举类型是在定义类的模块中出现,但在类型库中却是全局性质的。它不局限于定义它的类,也不以任何其它方式关联于定义它的类。
枚举类型的成员不必是顺序的或相邻的。因此,如果要为部件定义一些通用数值常数,可以把它们放入一个包罗万象的 Enum 中。
Public Enum General
levsFeetInAMile = 5280
levsIgnitionTemp = 451
levsAnswer = 42
End Enum
在下面的代码示例中,Enum 及其成员都带有一个四个小写字母的前缀用于标识所属的部件,这样也可以减少部件的用户遇到名字冲突的可能性。这是本章前面的“命名的学问”介绍的通常命名规则。
详细信息 枚举类型在《Visual Basic 程序员指南》的“再论编程”和“用对象编程”中详述。
枚举类型的成员可以是 Long 型范围内的任何值。也就是说,这些成员可以设为从 -2,147,483,648 至 2,147,483,647 之间的任何整数值。声明 Enum 类型的数据类型,就等于声明了一个 Long 型变量。
有时也可能需要使用字符串常数或非整数常数。Visual Basic 不能将这些值作为公共常数添加到类型库,但是,可以使用只读属性的全局对象获得相似的效果。
如果部件中没有全局对象,如 Application,则在工程中添加一个名为 GlobalConstants 的公共类模块。将其 Instancing 属性设为 GlobalMultiUse。
对要提供的每一个常数,在 GlobalConstants 类模块中添加一个返回所需值的 Property Get 过程。例如,下面的代码可以提供阿浮加德罗常数,以及模拟 Visual Basic 的 vbCrLf 常数。
Public Property Get Avogadro() As Double
Avogadro = 6.02E+23
End Property
Public Property Get vbCrLf() As String
vbCrLf = Chr$(13) & Chr$(10)
End Property
由于 Instancing 属性为 GlobalMultiUse,部件的用户不必显式地创建 GlobalConstants 类的实例就可以使用该常数。可以认为这些常数就是 Visual Basic 的一部分:
strNewText = "Line1" & vbCrLf & "Line2"
注意 Visual Basic,Microsoft Excel 或任何其它使用 Visual Basic for Applications 的应用程序的用户都不可能见到 vbCrLf 常数的这个版本,因为在引用对话框中 VBA 类型库的级别总是优先于其它部件的类型库的级别。
详细信息 全局对象在本章的“ActiveX 部件提供的类的实例化”和“建立代码部件”中论述。