一、变量和常数的声明
(1)Visual Basic 用前缀 &H 表示十六进制数,而用 &O 表示八进制数。
(2)在模块级,Private 和 Dim 之间没有什么区别。
1.1 静态变量
(1)用 Static 关键字声明一个局部变量,那么,即使过程结束,变量的值也仍然保留着。
(2)可将局部变量定义成静态的,从而保留变量的值。在模块的声明段声明模块级变量,也会收到同样效果。但是这种方法改变了变量的范围,其它过程也可以访问和改变该变量的值,代码将难于维护。
(3)为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static 关键字。例如:
这就使过程中的所有局部变量都变为静态,无论它们是用 Static、Dim 或 Private 声明的还是隐式声明的。
1.2 阴影效应
(1)过程、变量和常数的名字不能和受到限制的关键字同名。窗体和控件可以和受到限制的关键字同名。为了引用那些和受到限制的关键字同名的窗体或控件,就必须限定它们,或者将其用方括号 [ ] 括起来。例如,可以将某个控件命名为 Loop。
MyForm . Loop . Visible = True '用窗体名将其限定。
[ Loop ] . Visible = True '方括号起了作用。
(2)如果不同模块中的公用变量使用同一名字,则通过同时引用模块名和变量名就可以在代码中区分它们。如果多个过程或变量同名,则 Visual Basic 会取变化更受限制的值。一般说来,当变量名称相同而范围不同时,局限性大的变量总会用“阴影”遮住局限性不太大的变量(即优先访问局限性大的变量)。
(3)在窗体模块中应尽量使变量名和窗体中的控件名不一样。由于阴影效应,窗体属性、控件、常数和过程皆被视为窗体模块中的模块级变量。在窗体模块内,和窗体中控件同名的局部变量将遮住同名控件。因此必须引用窗体名称或 Me 关键字来限定控件,才能设置或者得到该控件的值或它的属性值。
(4)窗体属性或控件的名称与模块级变量、常数、自定义类型或过程的名称相同是不合法的,因为它们的范围相同。
1.3 常数
(1)来自 Visual Basic 和 Visual Basic for applications 对象库的常数以 "vb" 开头— 例如vbTileHorizontal。设计前缀时应尽力防止发生意外冲突,不能出现常数名称相同但表示不同数值的情况。即使使用了前缀,两个对象库也仍可能包含表示不同值的相同常数。在这种情况下,引用哪个常数取决于哪个对象库具有更高的优先级。为了绝对确保不发生常数名字冲突,可用以下语法来限定对常数的引用:
(2)如果用逗号进行分隔,则在一行中可放置多个常数声明:
(3)在窗体模块或类模块中不能声明 Public 常数。
conWorldPop = 6 E + 09
二、简单数据类型
(1)如果不提供数据类型,则变量为缺省类型。在下例中,变量 Test 和 Amount 是 Variant 数据类型。
(2)与 Variant 类型相比,Numeric 类型占用的存储空间通常要少。整数的运算速度较快,而且比其它数据类型占据的内存要少。
(3)如果变量包含小数,则可将它们声明为 Single、Double 或 Currency 变量。Currency 数据类型支持小数点右面 4 位和小数点左面 15 位;它是一个精确的定点数据类型,适用于货币计算。浮点(Single 和 Double)数比 Currency 的有效范围大得多,但有可能产生小的进位误差。
(4)浮点数值可表示为 mmmEeee 或 mmmDeee ,其中 mmm 是假数,而 eee 是指数(以 10 为底的幂)。Single 数据类型的最大正数值为 3.402823E+38,或 3.4 乘以 10 的 38 次方;Double 数据类型的最大正数值是 1.79769313486232D+308 或 1.8 乘以 10 的 308 次方。用 D 将数值文字中的假数部分和指数部分隔开,就会导致将该值作为 Double 数据类型来处理。同样,用这种方式使用 E,也会导致将该值作为 Single 数据类型来处理。
(5)如果变量包含二进制数,则将它声明为 Byte 数据类型的数组。在转换格式期间用 Byte 变量存储二进制数据就可保留数据。当 String 变量在 ANSI 和 Unicode 格式间进行转换时,变量中的任何二进制数据都会遭到破坏。在下列任何一种情况下,Visual Basic 都会自动在 ANSI 和 Unicode 之间进行转换:读文件时、写文件时、调用 DLL 时、调用对象的方法和属性时。因为 Byte 是从 0 - 255 的无符号类型,所以不能表示负数。因此,在进行一元减法运算时,Visual Basic 首先将 Byte 转换为符号整数。
(6)在声明对象变量时,请试用特定的类,而不用一般的 Object(例如用 TextBox
而不用 Control
,用 Database
取代 Object
)。运行应用程序之前,Visual Basic 可以决定引用特定类型对象的属性和方法。因此,应用程序在运行时速度会更快。
(7)Cvar、CVErr
三、VARIANT
(1)除了可以像其它标准数据类型一样操作外,Variants 还包含三种特定值:Empty,Null 和 Error。可将关键字 Empty 赋予 Variant 变量,利用 CVErr 函数将实数转换成错误值就可建立 Error 值。还可以如下语句使用:
Z = Null
IsNull (X)
(2)Variant 总保持 16 位,无论其中存储了什么数据。对象、字符串和数组,在物理上并非存于 Variant 之中;在这些情况下,用四个字节的 Variant 来保持对象引用、或者字符串或数组的指针。而真正的数据存在其它地方。
(3)Variant 变量维护它们所存储的数值的内部表示。这个表示将决定 Visual Basic 在执行比较操作和其它操作时如何处理这些值。
(4)对 Array 变量,VarType 的值等于数组元素与数据类型返回值之和。例如,这个数组包含 Double 值
Dim dblSample (2) As Double
MsgBox VarType (dblSample)
End Sub
(5)将值赋予 Variant 变量时,Visual Basic 会用最紧凑的表示正确记录这个值。以后的操作可能使 Visual Basic 改变这个用于特定变量的表示。例如,若是存储不带小数点的微小的数值,Variant 对该值使用 Integer 表示。如果此后赋予一个较大的数,则 Visual Basic将使用 Long 值,如果这个数非常大或者有小数部分,则 Visual Basic 将使用 Double 值。
有时想对一个数使用特定表示。例如,为了在以后的计算中避免舍入误差,可能希望 Variant 变量将数值作为 Currency 存储起来。Visual Basic 提供了几种转换函数,可以用它们将值转换成指定的类型(参阅本章前面的“转换数据类型”)。例如,用 Ccur 函数可将值转换成 Currency 类型。
比如,如果在 Variant 变量中存储二进制值,Visual Basic 就会用 Double 内部表示。如果知道应用程序并不需要 Double 值提供的高精度(以及由此而来的低速度),那么将此值转换成 Single 甚至转换成 Currency 就可以加快计算速度。
(6)IsNumeric 函数可判定 Variant 变量是否包含可以当作数使用的值。当 Visual Basic 将一个非数值的表示(如包含一个数的字符串)转换成数值时,它会使用地区设置(在 Windows 的“控制面板”中规定)来解释千位分隔符、小数点符号和货币符号。
四、字符串
(1)按照缺省规定,String 变量或参数是一个可变长度的字符串,随着对字符串赋予新数据,它的长度可增可减。 也可以声明字符串具有固定长度。例如,为了声明一个长度为 50 字符的字符串,可用下列语句:
如果赋予字符串的字符少于 50 个,则用空格将 EmpName
的不足部分填满。如果赋予字符串的长度太长,已不能成为定长字符串,则 Visual Basic 会直接截去超出部分的字符。因为定长字符串用空格填充尾部多余的空间,所以在处理定长字符串时可发现,删除空格的 Trim 和 RTrim 函数是很有用的。
(2)可将标准模块中的定长字符串声明为 Public 或 Private。在窗体和类模块中,必须将定长字符串声明为 Private。
(3)Variant 变量中存储的字符串:一般说来,在 Variant 变量中存储和使用字符串不会出什么问题。但是有时在使用两个 Variant 值时," + " 运算符的结果可能很含糊。如果两个 Variant 变量都包含数,则 " + " 运算符执行加法运算。如果两个 Variant 变量都包含字符串,则 " + " 运算符执行字符串连接。但是,如果一个值代表数,而另一个值代表字符串,则情况就很复杂了。Visual Basic 首先试图把字符串变成数。如果转换成功,那么 " + " 运算符把两者加在一起;如果不成功,则产生一个“类型不匹配”错误。为了确保执行的动作为字符串连接,不管变量中的表示如何,都用 & 运算符。
(4)注意 Visual Basic 在内部用 Unicode 存储字符串。
(5)如果字符串表示数值,则可将字符串赋予数值变量。也可将数值赋予字符串变量。Visual Basic 会自动强制变量为适当的数据类型。
(6)如果把包含数的 Variant 赋给字符串变量或属性,Visual Basic 自动把数的内部表示转换成字符串。如果想显式地将数转换成字符串,可以用 CStr 函数。还可以用 Format 函数将数转换成字符串,字符串包含某种格式,如货币符,千位分隔符和小数点符号。Format 函数按照 Windows“控制面板”中的“地区设置”对话框自动使用相应的符号。
五、Date 数据类型
(1)Date 和 Time 值既可包含在特定的 Date 数据类型中,又可包含在 Variant 变量中。一般的 Date 特性适用于这两种类型。当其它数值数据类型转换为 Date 时,小数点左边的值表示 Date 信息,小数点右边的值则代表 Time。午夜为 0,正午为 0.5。负数表示公元 1899 年 12 月 31 日之前的 Date。
(2)在代码中可以采用 Date/Time 文字,只要用一对 " # " 号将它们括起来。例如,可以将包含 Date/Time 值的 Variant 和一串表示 Date 的文字作比较。
(3)Visual Basic 接受许多种文字的 Date 和 Time 格式。下面的 Date/Time 值全部有效:
SomeDate = #March 27 , 1993 1:20am#
SomeDate = #Apr-2-93#
SomeDate = #4 April 1993#
(4)还可以对 Date/Time 值进行运算。通过加减一个整数来增加或减少天数;通过加减一个分数来增加或减少时间。所以,加 20 就是加 20 天,而减掉 1/24 就是减去一小时。
(5)如果 Date/Time 值不包括 Time,则 Visual Basic 自动将该值的 Time部分设定为午夜(一天的开始)。如果 Date/Time 值不包括 Date,则 Visual Basic 自动将该值的 Date 部分设定为公元 1899 年 12 月 30 日。
(6)用 IsDate 函数可测试一个 Variant 变量是否包含一个值,这个值可以看作有效的 Date/Time 值。然后可用 CDate 函数将该值转换成 Date/Time值。
(7)DateSerial 返回该年所剩的天数。
六、数组
(1)可用关键字 To 显式的规定下界(为 Long 数据类型):
(2)包含其它数组的数组:有可能建立 Variant 数据类型数组,并与不同数据类型的数组共居一处。以下代码建立两个数组,一个包含整数,而另一个包含 字符串。然后声明第三个 Variant 数组,并将整数和字符串数组放置其中:
Dim intX As Integer '声明计数器变量。
'声明并放置整数数组。
Dim countersA (5) As Integer
For intX = 0 To 4
countersA (intX) = 5
Next intX
'声明并放置字符串数组。
Dim countersB (5) As String
For intX = 0 To 4
countersB (intX) = "hello"
Next intX
Dim arrX (2) As Variant '声明拥有两个成员的新数组。
arrX (1) = countersA () '将其它数组移居到数组。
arrX (2) = countersB ()
MsgBox arrX (1) (2) '显示每一个数组的成员。
MsgBox arrX (2) (3)
End Sub
(3)动态数组:对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变(好像可以改)。
(4)可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非 Unicode 平台上的两倍。
(5)每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basic 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。
(6)在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:
而不可这样编程:
(7)可以将 Objects 存储在 Variant 变量中。当需要高效地处理包括 Objects 在内的各种数据类型时,这可能十分有用。例如,一个数组中的所有元素都必须具有相同的数据类型。将数组的数据类型设置成 Variant 就可将 Objects 连同其它数据类型一起存入同一个数组中。