给部件提供命名的常数

用枚举类型来定义一个相关的命名常数集合是很方便的。例如,内置的枚举类型 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 部件提供的类的实例化”和“建立代码部件”中论述。