一、变量
变量是指在程序的运行过程中随时可以发生变化的量。
变量是程序中数据的临时存放场所。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性。由于变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用。变量可以保存程序运行时用户输入的数据(如使用InputBox函数在屏幕上显示一个对话框,然后把用户键入的文本保存到变量中)、特定运算的结果以及要在窗体上显示的一段数据等。简而言之,变量是用于跟踪几乎所有类型信息的简单工具。
变量有两种类型:属性变量和用户自己建立的变量。
当我们在窗体中设计用户界面时,vb6会自动为产生的对象(包括窗体本身)创建一组变量,即属性变量,并为每个变量设置其缺省值。这类变量可供我们直接使用,比如引用它或给它赋新值。
用户也可以创建自己的变量,以便存放程序执行过程中的临时数据或结果数据等等。在程序中,这样的变量是非常需要的。下面就介绍这类变量的创建和使用方法。
1.变量的命名规则
首先,我们必须给变量取一个合适的名字,就好像每个人都有自己的名字一样,否则就难以区分了。
在VB6中,变量的命名必须遵循以下规则:
(1)变量名必须以字母打头,名字中间只能由字母、数字和下划线“_”组成;最后一个字符可以是类型说明符;
(2)变量名的长度不得超过255个字符;
(3)变量名在有效的范围内必须是唯一的。
有效的范围就是引用变量可以被程序识别、使用的作用范围——例如一个过程、一个窗体等等。有关引用变量作用范围的内容,将在以后介绍。
(4)变量名不能是VB中的保留字(关键字),也不能是末尾带类型说明符的保留字,但可以把保留字嵌入变量名,
关键字是指VB6语言中的属性、事件、方法、过程、函数等系统内部的标识符。如已经定义的词(if、endif、while、loop等)、函数名(len、format、msgbox等)。像Print、Print$是非法的,而Myprint是合法的。
例如:
strName1,intMax_Length,intLesson,strNo3等是合法的变量名,而A&B,all right,3M,_Number等是非法的变量名。
注意:
(1)变量名是不区分大小写的。如ABC、aBc、abc等都是一样的。
(2)定义和使用变量时,通常要把变量名定义为容易使用阅读和能够描述所含数据用处的名称,而不要使用一些难懂的缩写如A或B2等。
例如,假定正在为水果铺编一个销售苹果的软件。我们需要两个变量来存储平果的价格和销量。此时,可以定义两个名为Apple_Price和Apple_Sold的变量。每次运行程序时,用户就这两个变虽提供具体值,这样看起来就非常直观。
具体方法是:通过用一个或多个单词组成有意义的变量名来使变量意义明确。例如,变量名SalesTaxRate就比Tax或Rate的意义明确得多。
(3)根据需要混合使用大小写字母和数字。一个合理协议是,变量中每个单词的第一个字母大写,例如:DateOfBirth。
(4)另一个合理协议是,每个变量名以两个或三个字符缩写开始,这些字符缩写对应于变量要存储数据的数据类型。例如,使用strName来说明Name变量保存字符串型数据。
虽然现在无须过多地关注字符缩写的细节,但以后还是需要看一下这方面的约定。在Visual Basic联机帮助和许多Visual Basic高级编程的书籍中都可以找到这一约定的细节。
2.声明一个变量
变量在使用前,必须在代码中进行声明,即创建该变量。
在使用变量之前,大多数语言通常首先需要声明变量。就是说,必须事先告诉编译器在程序中使用了哪些变量,及这些变量的数据类型以及变量的长度。这是因为在编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,这样可以优化程序的执行。
声明变量有两种方式:隐式声明、显式声明。
隐式声明:变量可以不经声明直接使用,此时VB给该变量赋予缺省的类型和值。这种方式比较简单方便,在程序代码中可以随时命名并使用变量,但不易检查。
显式声明:用声明语句创建变量。
强制显式声明变量:
为了避免写错变量名引起的麻烦,用户可以规定,只要遇到一个未经明确声明就当成变量的名字,VB都发出错误警告。方法是----强制显式声明变量。要强制显式声明变量,只须在类模块、窗体模块或标准模块的声明段中加入这条语句:
Option Explicit
这条语句是用来规定在本模块中所有变量必须先声明再使用,即不能通过隐式声明来创建变量。在添加Option Explicit语句后,VB将自动检查程序中是否有未定义的变量,发现后将显示错误信息。
如果要自动插入Option Explicit语句,用户只要在“工具”菜单中选取“选项”命令,然后单击“选项”对话框中的“编辑器”选项卡,再选中“要求变量声明”选项,如下图

这样VB就会在任何新模块中自动插入Option Explicit语句,但只会在新建立的模块中自动插入。所以对于已经建立的模块,只能用手工方法向现有模块添加Option Explicit语句(只有再重新启动VB,这项功能才有效)。
理解变量的范围
变量的范围确定了能够知晓该变量存在的那部分代码。在一个过程内部声明变量时,只有过程内部的代码才能访问或改变那个变量的值;它有一个范围,对该过程来说是局部的。但是,有时需要使用具有更大范围的变量,例如这样一个变量,其值对于同一模块内的所有过程都有效,甚至对于整个应用程序的所有过程都有效。Visual Basic 允许在声明变量时指定它的范围。
指定变量的有效范围
一个变量在划定范围时被看作是过程级(局部)变量,还是模块级变量,这取决于声明该变量时采用的方式。
过程内部使用的变量
过程级变量只有在声明它们的过程中才能被识别,它们又称为局部变量。用 Dim 或者 Static 关键字来声明它们,两者的区别在于:在整个应用程序运行时,用 Static 声明的局部变量中的值一直存在,而用Dim 声明的变量只在过程执行期间才存在。
对任何临时计算来说,局部变量是最佳选择。例如,可以建立十来个不同的过程,每个过程都包含称作 intTemp 的变量(同一个变量名在不同的过程中意义可能不同)。只要每个 intTemp 都声明为局部变量,那么每个过程只识别它自己的 intTemp 版本。任何一个过程都能够改变它自己的局部的 intTemp 变量的值,而不会影响别的过程中的intTemp 变量。
模块内部使用的变量
按照缺省规定,模块级变量对该模块的所有过程都可用,但对其它模块的代码不可用。可在模块顶部的声明段用 Private 或Dim关键字声明模块级变量,从而建立模块级变量。例如:
Private intTemp As Integer
在模块级,Private 和 Dim 之间没有什么区别,但 Private 更好些,因为很容易把它和 Public 区别开来,使代码更容易理解。
所有模块使用的变量
为了使模块级的变量在其它模块中也有效,用 Public 关键字声明变量。公用变量中的值可用于应用程序的所有过程。和所有模块级变量一样,也在模块顶部的声明段来声明公用变量。例如
Public intTemp As Integer
注意:不能在过程中声明公用变量,只能在模块的声明段中声明公用变量。
总结以上可知:声明语句有如下四种格式,这四种语句创建了不同特性的变量,下面将作详细的介绍。
(I)Dim语句,其格式为;
Dim<变量名>[As<数据类型>]
程序运行时,上述声明在内存中为变量分配空间,并使Visual Basic了解随后要处理数据的数据类型。
Dim语句用于在标准模块(Module)、窗体模块(Form)或过程(Procedure)中定义变量或数组
用Dim语句在窗体的过程中声明的变量称为局部变量,其作用域仅局限在本过程内部,过程一旦执行完毕,其值也就消失了。
例如(见教材P35)。
Dim Number As Integer '声明Number为Integer(整型)变量。
Dim I As Integer,j As Integer,k As Integer '同时声明为整型变量。
Dim AnyValue,MyValue 'AnyValue和MyValue按缺省情况被声明为Variant类型,同时值被设为Empty(空)。
Dim AnotherVar, Choice As Boolean, BirthDate As DAte '在一行中声明多种类型变量,AnotherVar为Variant类型,因为它的类型被省略了,Choice为布尔型变量,BirthDate为日期型变量。
(2)Private语句.其格式为:
Private<变量名>[As<数据类型>]
如果要在一个窗体模块的所有过程中共享同一个变量,则应在这个窗体模块的声明段用Private语句进行声明.这种变量称为模块级变量,其作用域为整个窗体模块。这就好比是您家里的电话号码,它在您所在的城市是通用的,但出了这个范围就不能单独使用了。
(3)Public语句,其格式为:
Public<变量名>[As<数据类型> ]
用来在标准模块中定义全局变量或数组。如果在标准模块的声明段中用Public关键字来声明模块级变量,那么这个变量的作用域是整个工程,即它会在整个工程的所有模块中有效,这种变量称为全局变量,也称公用变量。这就好比是加了邮政区号的电话号码,在全国范围内通用。
(4)static语句.其格式为:
static<变量名>[As<数据类型>·
局部变量在过程执行结束后其值不能被保留下来,在每一次过程重新执行时,变量会被重新初始化。如果希望在该过程结束之后,还能继续保持过程中局部变量的值,就应该用static关键字将这个变量声明为静态变量。这样,即使过程结束,该静态变量的值也仍然保留着。
例如我们可以为一个窗体编写下面这样一程序,可以对用户在窗体上单击的次数计数并用显示出来。
Private Sub Form_click()
Static I As Integer I = I + 1 Label1.Caption = I
End Sub
再如:
Private Sub Command1_Click()
Static IntCount As Integer IntCount = IntCount + 1 Select Case IntCount Case 1 Command1.Caption = "春眠不觉晓" Case 2
Command1.Caption = "处处闻啼鸟" Case 3 Command1.Caption = "夜来风雨声" Case Else Command1.Caption = "花落知多少" IntCount = 0 End Select
End Sub
将Static换成Dim,运行一下,连续单击窗体,试比较结果的不同。
注意:就像在过程中不能使用Public和Private关键字一样,在模块的声明段中不能使用static关键字。
变量的作用域 变量的作用域指的是变量的有效范围。为了能正确地使用变量的值,应当明确可以在程序的什么地方访问该变量。VB中变量可以分为3类:局部(Local)变量、模块(Module)变量及全局(Public)变量,其中模块变量包括窗体模块变量和标准模块变量。各变量位于不同的层次。 1、局部变量——在过程(事件过程或通用过程)内定义的变量,其作用域是它所在的过程。 局部变量在过程内用Dim、 Static定义。 2、模块变量(窗体变量和标准变量) 窗体变量——可用于该窗体内的所有过程。在使用窗体变量前,必须先声明,即窗体变量不能默认声明。 标准模块级变量——对该模块中所有过程都可见,但对其它模块中的代码不可见。 标准模块中模块层变量的声明和使用与窗体模块中窗体层变量类似。标准模块是只含有程序代码的应用程序文件,扩展名为.bas。 建立新的标准模块的方法:打开“工程”菜单/“添加模块”命令,选择“新建”选项卡,单击“模块”图标后打开,则打开了标准模块代码窗口,在其中输入标准模块代码。声明标准模块变量用Dim、 Private定义。 3、全局变量(全程变量)——可以在工程的每个模块、每个过程中使用。全局变量只能在标准模块的声明部分声明(不能在过程或窗体模块在声明),必须用 Public或Global语句声明,不能用Dim、 Private声明。 3种变量的作用域如下表:
名称 |
作用域 |
声明位置 |
使用语句 |
局部变量 模块变量 全局变量 |
过程 窗体模块或标准模块 整个应用程序 |
过程中 模块的声明部分 标准模块的声明部分 |
Dim或Static Huo或Private Public或Global | |
3.变量的数据类型
每个变量都具有各自的数据类型,数据类型决定了变量能够存储哪种数据。对不同类型的数据,要使用同种数据类型的变量,如果两者匹配得不好,就会出现错误或者造成内存空间的浪费。所以,这是—个很重要的问题。
在VB6中,变量的数据类型较多,我们归纳如下:
(1)用于保存数字的六种数据类型
VB6中共有六种数字型的数据类型: 整型integer、长整型long、货币型currency、单精度single、双精度double、字节型byte。
整型
以Integer 表示整型,变量存储为 16位(2 个字节)的数值形式,其范围为 -32,768 到 32,767 之间。Integer 的类型声明字符是百分比符号 (%)。
长整型
Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647。Long 的类型声明字符为和号 (&)。
单精度型(Single)
Single(单精度浮点型)变量存储为32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。Single 的类型声明字符为感叹号 (!)。
双精度型(Double)
Double(双精度浮点型)变量存储为 64 位(8 个字节)浮点数值的形式,它的范围在负数的时候是从 -1.79769313486232E308 到 -4.94065645841247E-324,而正数的时候是从 4.94065645841247E-324 到 1.79769313486232E308。Double 的类型声明字符是数字符号 (#)。
货币型(Currency)
货币型(Currency) 变量存储为 64 位(8 个字节)整型的数值形式,货币型的数据类型声明字符为@。货币型数据类型在货币计算中很有用,在这种场合精度特别重要。因为所有运算是整型运算,所以不会产生近似误差。
(2)用来进行逻辑判断的布尔型Boolean数据类型
Boolean类型的变量主要用来存放逻辑判断的结果,它只能取逻辑值,即:True(真)或False(假)。
(3)用来保存日期的Date数据类型
Date类型的变量用来保存日期和时间,它可接受多种表示形式的日期和时间。请记住,在vB6中必须用“#”这个符号把日期和时间的值括起来。
例:
Private Sub Form_Click()
Dim date1 As Date Dim date2 As Date Dim m1 As Byte
Dim m2 As Byte date1 = #1/10/1999# date2 = #10/1/2000 1:20:50 PM# Print date1, date2 m1 = Month(date1) m2 = Month(date2) Print m1, m2
End Sub
(4)用来保存字符串的string数据类型
string类型的变量专门用来保存字符串。
字符串类型变量用于保存字符信息。字符串可以为定长,也可以为变长,每个字符占用一个字节。定长字符串用一个具体长度来说明,其最大长度可为64KB个字符。变长字符串可以有不超过约20亿(231)个字符的任何长度。字符串数据类型的类型声明字符是 $。下面对可变长字符串和定长字符串详细说明。
可变长字符串
大多数字符串变量是可变长字符串类型,存储在其中的字符串长度可以为0到约20亿个字符之间。可变长字符串变量一次只能存储一个字符串,其长度可以随程序运行而改变。例如下面一段程序将可变长字符串变量MyString$的值,从一个短字符串重新赋值成一个长字符串。
Dim MyString As String '定义一个可变长字符串
MyString$ = "I'm not long."
Print MyString$
MyString$ = "Hey,I'm a long string now." '赋新值后,MyString 的长度变长了
Print MyString$
定长字符串
定长字符串存储确定长度的字符串。对此类型的变量,可以定义从0到65535(64KB)个字符的固定长度。程序可以改变定长字符串变量的内容,但是不能改变其长度。如果字符串的长度小于固定长度,则字符串的尾部自动补空格将字符串的长度与固定长度相等,如果字符串的长度大于固定长度,则字符串将被自动截取尾部多出的字符与固定长度相等。例如:
Dim MyString As String * 10 '声明长度为10字节的定长字符串
MyString = "Mary is 5."
Print MyString
MyString = "Mary is five years old." 'MyString的值为"Mary is fi",'多余的部分被截断,舍弃
Print MyString
在VB中,数字和包含数字的字符串变量可以方便地互换类型。如果字符中表示数值,则可将字符串赋予数值变量,同时也可将数值赋予字符串变量,VB会自动强制变量为适当的数据类型。例如在下面的程序中,就可以随意地将数字和字符串混合使用:
Dim intX As Integer
Dim strY As String
StrY=3716 '将数字赋值给字符串
intX=strY '将字符串传递给数值变量
strY=Cos(strY) '将字符串变量作为数字传递给余弦函数,然后再将余弦值传递给字符串变量
String类型变量的字符码范围是0-255。字符集的前128个字符(0-127)对应于标准键盘上的字符与符号,而后128个字符(128-255)则代表了一些特殊字符,例如国际字符、重音字符、货币符号及分数。使用String类型可以声明两种字符串:变长与定长的字符串。
(5)用来保存对象引用的object数据类型
object类型用来进行对象的引用。利用Set语句,声明为object的变量可以被赋值为任何对象的引用。
定义对象变量时可以直接指定对象的类型,也可以使用通用对象类型进行定义。如下面的代码:
Dim obj1 As Commandbutton Dim obj2 As TextBox '直接指定对象的类型 Dim obj3 As Object '使用通用对象类型
在程序中可以利用Set语句,声明给对象变量赋值为该对象的引用,如果声明为Object对象,则可以赋值为对任何对象的引用。例如下面的代码:
Set obj1=Command1 Set obj2=TextBox1 Set obj3=Command1
这时就可以直接利用obj1、obj2变量来直接引用相应的控件,设置控件的属性。例如要改变命令控件的标题,可以用下面的代码:
obj1.Caption="new caption"
如果要改变文本框的字体为粗体,可以用下面的语句:
obj2.FontBold=True
注意:不能直接把对象赋给object类型的变量,必须加上Set。
(6)可以保存任何数据的variant数据类型
variant类型是一种很特殊的数据类型,除了定长string类型的数据和用户自定义类型的数据外,它可以保存任何种类的数据。将一个数据赋予variant类型的变量时,不必在数据类型之间进行转换,vB6会自动完成任何必要的转换。
以上各种数据类型总结于下表:
数据类型 |
类型名称 |
类型声明字符 |
所占字节 |
有效值 |
字节型 |
byte |
1 |
0-255 |
|
布尔型 |
boolean |
|
2 |
true或false |
整型 |
integer |
% |
2 |
-32768 - 32767 |
长整型 |
long |
& |
4 |
-2147483648-214483647 |
单精度 |
single |
! |
4 |
|
双精度 |
double |
# |
8 |
|
货币型 |
currency |
@ |
8 |
|
日期型 |
date |
|
8 |
|
对象型 |
object |
|
4 |
任何对象的引用 |
变长字符串 |
string |
$ |
1字节/字符 |
|
定长字符串 |
string*num |
$ |
num |
|
可变类型 |
variant |
|
不定 |
|
VB中有一些数据类型可以自动转换,例如数字字符串可以自动转换为数值型。但是,许多数据类型不能自动转换,需要类型转换函数来实现。类型转换函数的函数名通常由字母C加上需要转换的类型。例如,要将一个变量转换为字符串型变量,就可以利用CStr()函数。下表列出了VB中可以进行类型转换的函数。
函数 |
转换后的类型或返回值 |
函数 |
转换后的类型或返回值 |
Cbool |
Boolean |
CSng |
Single |
Cbyte |
Byte |
CStr |
String |
Ccur |
Currency,小数部分最多保留4位,且四舍五入 |
Cvar |
Variant |
Cdate |
Date |
CVErr |
Error |
Cdbl |
Double |
Hex |
十进制转换为十六进制数 |
Chr |
返回字符码对应的ASCII字符 |
Oct |
十进制转换为八进制数 |
Cint |
把小数部分四舍五入后,转换为整数 |
Str |
返回字符串 |
Clng |
把小数部分四舍五入后,转换为长整数 |
Val |
返回字符串内的数字 |
注意:整数的运算速度相对较快,且占用内存较少,如果事先知道要存放在变量中的是整数则应视其大小范围将它声明为Integer或Long类型。
|