VisualBasic变量、常数和数据类型及过程概述三
Object 数据类型
Object 变量作为 32 位(4 个字节)地址来存储,该地址可引用应用程序中或某些其它应用程序中的对象。可以随后(用 Set 语句)指定一个被声明为 Object 的变量去引用应用程序所识别的任何实际对象。
Dim objDb As Object
Set objDb = OpenDatabase ("c:\Vb5\Biblio.mdb")
在声明对象变量时,请试用特定的类,而不用一般的 Object(例如用 TextBox而不用 Control,或者像上面的例子那样,用 Database 取代 Object)。运行应用程序之前,Visual Basic 可以决定引用特定类型对象的属性和方法。因此,应用程序在运行时速度会更快。在“对象浏览器”中列举了特定的类。
当使用其它应用程序的对象,并在“对象浏览器”中的“类”列表中列举对象时,不要用 Variant 或一般的 Object,而应声明对象。这样可确保 VisualBasic 能够识别引用的特定类型对象,在运行时解决引用问题。
详细信息 关于创建和指定对象以及对象变量的更详细信息,请参阅本章后面的“创建对象”部分。
转换数据类型
Visual Basic 提供了几种转换函数,可用来将值转换成特定数据类型。例如,用 CCur 函数将值转换成 Currency 类型: PayPerWeek = CCur (hours * hourlyPay)
注意 对目标数据类型,传递到转换函数的值必须是有效的,否则会发生错误。例如,如果想把 Long 型数转换成 Integer 型数,那么,Long 型数必须在 Integer 数据类型的有效范围之内。
详细信息 在联机帮助中查找指定的转换函数。
Variant 数据类型
Variant 变量能够存储所有系统定义类型的数据。如果把它们赋予 Variant 变量,则不必在这些数据的类型间进行转换; Visual Basic 会自动完成任何必要的转换。例如:
Dim SomeValue ''缺省为 Variant。
SomeValue = "17" ''SomeValue包含 "17"(双字符的串)。
SomeValue = SomeValue - 15 ''现在, SomeValue 包含数值 2。
SomeValue = "U" & SomeValue ''现在, SomeValue 包含 "U2" (双字符的串)。
不必过多关注 Variant 变量中数据的类型就可对 Variant 变量进行操作,但须避免落入陷阱。
1.如果对 Variant 变量进行数学运算或函数运算,则 Variant 必包含某个数。更详细的信息,请参阅《联机手册》中“高级变量主题”中的“变量中存储的 Numeric 值”部分。
2.如果正在连接两个字符串,则用 " & " 操作符而不用 " + " 操作符。更详细的信息,请参阅《联机手册》中“高级变量主题”中的“Variant 变量中存储的 Strings”部分。
除了可以像其它标准数据类型一样操作外,Variants 还包含三种特定值:Empty,Null 和 Error。
Empty 值
有时需要知道是否已将一个值赋予所创建的变量。在赋值之前,Variant 变量具有值 Empty。值 Empty 是异于0、零长度字符串 ("") 或 Null 值的特定值。可用 IsEmpty 函数测试 Empty 值:
If IsEmpty (Z) Then Z = 0
当 Variant 变量包含 Empty 值时,可在表达式中使用它;将其作为 0 或零长度字符串来处理,这要根据表达式来定。
只要将任何值(包括 0、零长度字符串或 Null)赋予 Variant 变量,Empty 值就会消失。而将关键字 Empty 赋予 Variant 变量,就可将 Variant 变量恢复为 Empty。
Null 值
Variant 数据类型还可包含一特定值:Null。Null通常用于数据库应用程序,表示未知数据或丢失的数据。 由于在数据库中使用 Null 方法,Null 具有某些唯一的特性:
1.对包含 Null 的表达式,计算结果总是 Null。于是说 Null 通过表达式“传播”;如果表达式的部分之值为 Null,那么整个表达式的值也为Null。
2.将 Null 值、含 Null 的 Variant 变量或计算结果为 Null 的表达式作为参数传递给大多数函数,将会使函数返回 Null。
3.Null 值经由返回 Variant 数据类型的内在函数传播。
也可用 Null 关键字指定 Null 值。
Z = Null
也可用 IsNull 函数测试 Variant 变量是否包含 Null 值。
If IsNull (X) And IsNull (Y) Then
Z = Null
Else
Z = 0
End If
如果将 Null 值赋予 Variant 以外的任何其它类型变量,则将出现可以捕获的错误。而将 Null 值赋予 Variant 则不会发生错误,Null 将通过包含Variant 变量的表达式传播(尽管 Null 并不通过某些函数来传播)。可以从任何具有 Variant 返回值的函数过程返回 Null。
除非明确将 Null 赋予变量,否则变量不会设置成 Null 值,所以,如果不在应用程序中使用 Null,就不必书写测试 Null 和处理 Null 的程序。
详细信息 关于如何在表达式中使用Null的详细信息,请参阅语言参考的“Null”部分。
Error 值
在 Variant 中,Error 是特定值,指出已发生的过程中的错误状态。但是,与其它类型错误不同,这里并未发生正常的应用程序级的错误处理。因此,程序员或应用程序本身可根据 Error 值进行取舍。利用 CVErr 函数将实数转换成错误值就可建立 Error 值。 详细信息 关于如何在表达式中使用 Error 值,请参阅《Visual Basic 6.0语言参考手册》中的“CVErr 函数”部分。关于错误处理的信息,请参阅第十三章“调试代码和处理错误”。有关 Variant 数据类型的更详细信息,请参阅《联机手册》中的“高级变量主题”。
高级变量主题
数值在变量中的内部表示
Variant 变量维护它们所存储的数值的内部表示。这个表示将决定 VisualBasic 在执行比较操作和其它操作时如何处理这些值。将值赋予 Variant 变量时,Visual Basic 会用最紧凑的表示正确记录这个值。以后的操作可能使Visual Basic 改变这个用于特定变量的表示(Variant 变量不是无类型变量,而是能够随意改变类型的变量)。这些内部表示与本章前面在“数据类型”中讨论的数据类型相一致。
注意 Variant 总保持 16 位,无论其中存储了什么数据。对象、字符串和数组,在物理上并非存于 Variant 之中;在这些情况下,用四个字节的 Variant 来保持对象引用、或者字符串或数组的指针。而真正的数据存在其它地方。
很多时候,不必了解Visual Basic为特殊变量使用哪一种变量类型;VisualBasic会自动转换类型。若想了解Visual Basic正在使用哪种变量类型,可使用 VarType 函数。
例如,如果在 Variant 变量中存储二进制值,Visual Basic 就会用 Double 内部表示。如果知道应用程序并不需要 Double 值提供的高精度(以及由此而来的低速度),那么将此值转换成 Single 甚至转换成 Currency 就可以加快计算速度:
If VarType (X) = 5 Then X = CSng (X) ''转换成单精度。
对 Array 变量,VarType 的值等于数组元素与数据类型返回值之和。例如,这个数组包含 Double 值:
Private Sub Form_Click ()
Dim dblSample (2) As Double
MsgBox VarType (dblSample)
End Sub
Visual Basic 的今后版本可能会增加新的 Variant 表示,所以,任何根据VarType 函数的返回值做出判断的代码都应能适当地处理非当前定义的返回值。
详细信息 关于 VarType 函数的信息,请参阅《Visual Basic 6.0语言参考手册》中的“VarType 函数”。关于数组的更详细信息,请参阅本章后面的“数组”。关于转换数据类型的详细信息,请参阅本章前面的“数据类型”。
Variant 变量中存储的 Numeric 值
在 Variant 变量中存储整个数时,Visual Basic 使用最紧凑的表示。例如,若是存储不带小数点的微小的数值,Variant 对该值使用 Integer 表示。如果此后赋予一个较大的数,则 Visual Basic将使用 Long 值,如果这个数非常大或者有小数部分,则 Visual Basic 将使用 Double 值。
有时想对一个数使用特定表示。例如,为了在以后的计算中避免舍入误差,可能希望 Variant 变量将数值作为 Currency 存储起来。Visual Basic 提供了几种转换函数,可以用它们将值转换成指定的类型(参阅本章前面的“转换数据类型”)。例如,用 CCur 函数可将值转换成 Currency 类型:
PayPerWeek = CCur (hours * hourlyPay)
如果 Variant 变量不含数或者不含可以解释为数的内容,则对 Variant 变量执行数学运算或函数计算就会出错。例如,不能对 ''U2'' 这个值进行任何算术运算,尽管它包含一个数值字符 ''2'',但整个值并非合法的数。同样不能对值 1040EZ 进行任何计算,但是,可以对 +10 或 -1.7E6 进行计算,因为它们是有效的数。因此经常需要判定 Variant 变量是否包含可以当作数使用的值。IsNumeric 函数可以完成这样的任务:
Do
anyNumber = InputBox ("Enter a number")
Loop Until IsNumeric (anyNumber)
MsgBox "The square root is: " & Sqr (anyNumber)
当 Visual Basic 将一个非数值的表示(如包含一个数的字符串)转换成数值时,它会使用地区设置(在 Windows 的“控制面板”中规定)来解释千位分隔符、小数点符号和货币符号。
于是,如果 Windows 的“控制面板”中的国家/地区设置值被设置成美国、加拿大或澳大利亚,则这两个语句将返回 True: IsNumeric ("$100")
IsNumeric ("1,560.50")
而下面两个语句则返回 false:
IsNumeric ("DM100")
IsNumeric ("1,560,50")
但是,如果在 Windows 的“控制面板”中的国家/地区设置值被设置成德国,则情况正好相反:前两个语句返回 false,而后两个语句返回 true。
如果把包含数的 Variant 赋给字符串变量或属性,Visual Basic 自动把数的内部表示转换成字符串。如果想显式地将数转换成字符串,可以用 CStr 函数。还可以用 Format 函数将数转换成字符串,字符串包含某种格式,如货币符、千位分隔符和小数点符号。Format 函数按照 Windows“控制面板”中的“地区设置”对话框自动使用相应的符号。
详细信息 请参阅《Visual Basic 6.0语言参考手册》中的 "Format 函数" 以及关于转换函数的主题。关于编写分布在国外市场的应用程序的更详细信息,请参阅第十六章“国际化”。
Variant 变量中存储的字符串
一般说来,在 Variant 变量中存储和使用字符串不会出什么问题。但是如前所述,有时在使用两个 Variant 值时," + " 运算符的结果可能很含糊。如果两个 Variant 变量都包含数,则 " + " 运算符执行加法运算。如果两个Variant 变量都包含字符串,则 " + " 运算符执行字符串连接。但是,如果一个值代表数,而另一个值代表字符串,则情况就很复杂了。Visual Basic 首先试图把字符串变成数。如果转换成功,那么 " + " 运算符把两者加在一起;如果不成功,则产生一个“类型不匹配”错误。
为了确保执行的动作为字符串连接,不管变量中的表示如何,都用 & 运算符。例如,以下代码:
Sub Form_Click ()
Dim X , Y
X = "6"
Y = "7"
Print X + Y,X & Y
X = 6
Print X + Y,X & Y
End Sub
在窗体上产生如下结果:
67 67
13 67
注意 Visual Basic 在内部用 Unicode 存储字符串。关于 Unicode 的更详细的信息,请参阅第十六章“国际化"。
Variant 变量中存储的 Date/Time 值
Variant 变量还可以包含 Date/Time 值。有几个函数返回 Date/Time 值。
例如,DateSerial 返回该年所剩的天数。
Private Sub Form_Click ()
Dim rightnow , daysleft , hoursleft , minutesleft
rightnow = Now ''Now 返回当前的 Date 和 Time。
daysleft = Int(DateSerial(Year(rightnow) _
+ 1, 1, 1) - rightnow)
hoursleft = 24 - Hour (rightnow)
minutesleft = 60 - Minute (rightnow)
Print daysleft & " days left in the year."
Print hoursleft & " hours left in the day."
Print minutesleft & " minutes left in the hour."
End Sub
还可以对 Date/Time 值进行运算。通过加减一个整数来增加或减少天数;通过加减一个分数来增加或减少时间。所以,加 20 就是加 20 天,而减掉 1/24 就是减去一小时。
存储在 Variant 变量中的 Date 值的有效范围从公元 0100 年 1 月 1 日到公元 9999 年12月31日。计算 Date 时不考虑 Gregorian 历法采用之前的日期。所以如果计算 Gregorian 历法被采用那年(在英国及其殖民地为1752 年;其它国家/地区则或早一些或晚一些)之前的日期,结果可能会不正确。
在代码中可以采用 Date/Time 文字,只要用一对 " # " 号将它们括起来,如同对字符串用一对双引号 ( "" ) 括起来一样。例如,可以将包含 Date/Time值的 Variant 和一串表示 Date 的文字作比较:
If SomeDate > #3/6/93# Then
下面的例子将包含 Date/Time 值的 Variant 变量和一串表示 Date 和 Time的文字相比较:
If SomeDate > #3/6/93 1:20pm# Then
如果 Date/Time 值不包括 Time,则 Visual Basic 自动将该值的 Time部分设定为午夜(一天的开始)。如果 Date/Time 值不包括 Date,则 Visual Basic自动将该值的 Date 部分设定为公元 1899 年 12 月 30 日。
Visual Basic 接受许多种文字的 Date 和 Time 格式。下面的 Date/Time 值全部有效:
SomeDate = #3-6-93 13:20#
SomeDate = #March 27 , 1993 1:20am#
SomeDate = #Apr-2-93#
SomeDate = #4 April 1993#
详细信息 有关用国际格式处理 Date 的信息,请参阅第十六章“国际化”。用 IsNumeric 函数可测试一个 Variant 变量是否包含一个值,这个值可以看作有效的数值,同样,用 IsDate 函数可测试一个 Variant 变量是否包含一个值,这个值可以看作有效的 Date/Time 值。
然后可用 CDate 函数将该值转换成 Date/Time值。例如,以下代码用 IsDate 测试文本框的 Text 属性。如果属性包含被看作有效 Date 的文本,则 Visual Basic 将此文本转换成 Date 并计算到年底还有几天。
Dim SomeDate , daysleft
If IsDate (Text1.Text) Then
SomeDate = CDate (Text1.Text)
daysleft = DateSerial(Year(SomeDate) + _
1, 1, 1) - SomeDate
Text2.Text = daysleft & " days left in the year."
Else
MsgBox Text1.Text & " is not a valid date."
End If
详细信息 关于各种 Date 和 Time 函数的信息,请参阅《Visual Basic 6.0语言参考手册》中的“Date 函数”。