数据类型和变量、常数
在 VB 环境下进行计算时,常常需要临时存储数据。例如,可能想要计算几个值,将它们进行比较,并根据比较的结果对它们进行不同的操作。如果想要比较这些值,就要存储它们,但不必把它们存入属性。
像大多数编程语言那样,VB 使用变量来存储值。变量具有名字(用来引用该变量所含的值的名词)和数据类型(确定变量可以存储的数据的种类)。数组可以用来存储建立了索引的相关变量集。
常数也存储数值,顾名思义,在整个应用程序执行过程中,这些值都保持不变。常数的使用增加了代码的可读性,因为我们看到的是具有含义的名字而不是数字。
VB 有许多内部常数,但也可以建立自定义常数。在 VB 中,数据类型控制了数据的内部存储。按照缺省规定,VisualBasic 使用了变体数据类型。在不需要 Variant 提供的灵活性时,还有许多其它可用的数据类型,它们可用来优化代码的速度和大小。
1.1 变量
在 VB 中执行应用程序期间,用变量临时存储数值。变量具有名字(用来引用变量所包含的值的词)和数据类型(确定变量能够存储的数据的种类)。
可以把变量看作内存中存放未知值的所在处。例如,假定正在为水果铺编一个销售苹果的软件。在销售实际发生之前并不知道苹果的价格和销量。此时,可以设计两个变量来保存未知数,将它们命名为 ApplePrice 和ApplesSold。每次运行程序时,用户就这两个变量提供具体值。为了计算总的销售额,并且将结果显示在名叫 txtSales 的文本框中,代码应该是这样的:
Dim ApplePrice as Currency
Dim ApplesSold as Integer
txtSales.txt = ApplePrice * ApplesSold
每次根据用户提供的数值,这个表达式返回不同的金额。由于有了变量,就可以设计一个算式,而不必事先知道实际的输入是多少。在这个例子中,ApplePrice 的数据类型是货币,而 ApplesSold 的数据类型是整数。变量还可以表示许多其它数值,比如:文本数值、日期、各种数值类型,甚至对象也在此列。
变量的定义:
|dim|static|public 变量名 as 变量类型
1.2 常数
执行程序时保持常数值的命名项目。常数可以是字符串、数值、另一常数、任何( 除乘幂与 Is 之外的) 算术运算符或逻辑运算符的组合。每个主应用程序皆可定义自己的一组常数。用户也可以 Const 语句定义附加常数。可在代码中的任何地方使用常数代替实际的值。
A 数值常量 15,19.66
B 字符串常量 “小学生”,“FGHY”,“67”
C 布尔常量 false true
D 日期常量 # 11/22/1999#
E 符号常量
Const pi=3.1415
S=pi*R*R
语法:[Public | Private] Const constname [As type] = expression
'声明公用常数。
Public Const MyString = "HELP"
1.3 数据类型
变量的特性,用来决定可保存何种数据。数据类型包括 Byte、Boolean、Integer、Long、Currency、Decimal、Single、Double、Date、String、Object、Variant ( 默认 ) 和用户定义类型等。
1. Byte 字节型 占1字节 0-255 可表示无符号整数
2. Interger 整型 占2字节 -32768—32767
3. Long 长整型 占4字节
4. Single 单精度浮点数 占4字节
5. Double 双精度浮点数 占8字节
6. Currency 货币型 点8字节
7. String 字符串型 变长 231个,定长 65526
dim aa as string ‘变长
dim bb as *7 ‘定长7位(不足用空格补)
8. Date 日期型 占64位浮点数
标准格式为:
A # 月/ 日/ 年 # 如 1999年11月22日表示为 # 11/22/1999 #
B # 时:分: 秒 AM(PM) # 如: #2:30:15PM#
C # 月/ 日/ 年 时:分: 秒 AM(PM) # 如:11/ 22/1999 2:30:15 PM #
9. Boolean 布尔类型
false:0 true:非零
10. Object 对象类型
dim objfrm as object
set object=form1
objfrm.caption=‘图片浏览窗’
11. Variant 变体类型 可自动提升数值范围
数组
2.1 数组
数组是存储在一个变量中由单个变量名引用的有序数据集合。数组中的每一个元素都可以通过一个数值下标被引用。
1. 声明固定大小的数组
Dim MyArray(5) As Integer '声明固定大小的数组。
2. 多维数组
Dim MyArray(5,1 To 10,5 To 15) As Integer '声明多维数组。
3. 动态数组
Dim MyArray() As Integer '声明动态数组。
Redim MyArray(5) '分配 5 个元素。
For I = 1 To 5 '循环 5 次。
MyArray(I) = I '初始化数组。
Next I
过程和函数
将程序分割成较小的逻辑部件就可以简化程序设计任务。称这些部件为过程,它们可以变成增强和扩展 VB 的构件。过程可用于压缩重复任务或共享任务,例如,压缩频繁的计算、文本与控件操作和数据库操作。
用过程编程有两大好处:
过程可使程序划分成离散的逻辑单元,每个单元都比无过程的整个程序容易调试。
一个程序中的过程,往往不必修改或只需稍作改动,便可以成为另一个程序的构件。
在 VB 中使用下列几种过程:
Sub 过程不返回值。
Function 过程返回值。
property 过程返回并指定值,以及设置对象引用。
3.1 Sub 过程
子过程是在响应事件时执行的代码块。将模块中的代码分成子过程后,在应用程序中查找和修改代码变得更容易了。
子过程的语法是:
[Private|Public][Static]Sub procedurename (arguments)
statements
End Sub
每次调用过程都会执行 Sub 和 End Sub 之间的 statements。可以将子过程放入标准模块、类模块和窗体模块中。按照缺省规定,所有模块中的子过程为 Public(公用的),这意味着在应用程序中可随处调用它们。过程的 arguments 类似于变量声明,它声明了从调用过程传递进来的值。在 VB 中应区分通用过程和事件过程这两类子过程。
通用过程
通用过程告诉应用程序如何完成一项指定的任务。一旦确定了通用过程,就必须专由应用程序来调用。反之,直到为响应用户引发的事件或系统引发的事件而调用事件过程时,事件过程通常总是处于空闲状态。为什么要建立通用过程呢?理由之一就是,几个不同的事件过程也许要执行同样的动作。将公共语句放入一分离开的过程(通用过程)并由事件过程来调用它,诚为编程上策。这样一来就不必重复代码,也容易维护应用程序。
事件过程
当 VB 中的对象对一个事件的发生作出认定时,便自动用相应于事件的名字调用该事件的过程。因为名字在对象和代码之间建立了联系,所以说事件过程是附加在窗体和控件上的。
一个控件的事件过程将控件的(在 Name 属性中规定的)实际名字、下划线 (_) 和事件名组合起来。例如,如果希望在单击了一个名为cmdPlay 的命令按钮之后,这个按钮会调用事件过程,则要使用cmdPlay_Click 过程。
一个窗体事件过程将词汇 "Form"、下划线和事件名组合起来。如果希望在单击窗体之后,窗体会调用事件过程,则要使用 Form_Click 过程。(和控件一样,窗体也有唯一的名字,但不能在事件过程的名字中使用这些名字。)如果正在使用 MDI 窗体,则事件过程将词汇 " MDIForm" 、下划线和事件名组合起来,如 MDIForm_Load。所有的事件过程使用相同的语法。
控件事件的语法
Private Sub controlname_eventname (arguments )
StatementsEnd
Sub
窗体事件的语法
Private Sub Form_eventname (arguments)
StatementsEnd
Sub
虽然可以自己编写事件过程,但使用 VB 提供的代码过程会更方便,这个过程自动将正确的过程名包括进来。从“对象框”中选择一个对象,从“过程框”中选择一个过程,就可在“代码编辑器” 窗口选择一个模板。
在开始为控件编写事件过程之前先设置控件的 Name 属性,这不失为一个好主意。如果对控件附加一个过程之后又更改控件的名字,那么也必须更改过程的名字,以符合控件的新名字。否则,VB 无法使控件和过程相符。过程名与控件名不符时,过程就成为通用过程。
3.2 Function 过程
VB 包含内置的或内部的函数,如 Sqr、Cos 或 Chr。此外,还可用 Function 语句编写自己的 Function 过程。
函数过程的语法是:
Private|Public][Static]Function procedurename (arguments) [As type]
Statements
End Function
与 Sub 过程一样,Function 过程也是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。与子过程不同,Function 过程可返回一个值到调用的过程。在Sub 过程与Function 过程之间有三点区别:
一般说来,让较大的语句或表达式的右边包含函数过程名和参数(returnvalue = function),这就调用了函数。
与变量完全一样,函数过程有数据类型。这就决定了返回值的类型(如果没有 As 子句,缺省的数据类型为 Variant)。
给 procedurename 自身赋一个值,就可返回这个值。Function 过程返回一个值时,该值可成为较大表达式的一部分。
在 VB 中调用 Function 过程的方法和调用任何内部函数的方法是一样的。
3.3 使用过程
创建新过程
要创建新的通用过程,请在“代码”窗口输入过程头并按下回车键。过程头以 Sub 或 Function 打头,再接一个名字。例如,可以用以下任一方式输入:
Sub UpdateForm ()
Function GetCoord ()
通过完成新过程的模板, VB 作出反应。
选择现有过程
要在当前模块中查看过程,请
为了查看现有通用过程,在“代码”窗口的“对象框”中选择“通用”,然后在“过程框”中选择过程。
或者为查看事件过程,在“代码”窗口的“对象框”中选择适当的对象,然后在“过程框”中选择事件。要查看其它模块中的过程,请
1. 在“视图”菜单中选取“对象浏览器”。
2. 在“工程/库”框中选择工程。
3. 在“类/模块”列表中选择模块,并在“成员”列表中选择过程。
4. 选取“查看定义”。
3.4 调用过程
调用过程有诸多技巧,它们与过程的类型、位置以及在应用程序中的使用方式有关。下面的章节说明如何调用 Sub 过程和 Function 过程。
1. 调用 Sub 过程
与 Sub 过程不同,在表达式中,Sub 过程不能用其名字调用。调用 Sub 过程的是一个独立的语句。Sub 过程还有一点与函数不一样,它不会用名字返回一个值。但是,与 Function过程一样,Sub 过程也可以修改传递给它们的任何变量的值。
Call MyProc (FirstArgument,SecondArgument)
MyProc FirstArgument,SecondArgument
注意,当使用 Call 语法时,参数必须在括号内。若省略 Call 关键字,则也必须省略参数两边的括号。
通常,调用自行编写的函数过程的方法和调用 VB 内部函数过程(例如 Abs)的方法一样;即在表达式中写上它的名字。
就像调用 Sub 过程那样,也能调用函数。下面的语句都调用同一个函数:
Call Year (Now)
Year Now
3. 调用其它模块中的过程
在工程中的任何地方都能调用其它模块中的公用过程。可能需要指定这样的模块,它包含正在调用的过程。调用其它模块中的过程的各种技巧,取决于该过程是在窗体模块中、类模块中还是标准模块中。
a. 窗体中的过程
所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块 Form1 中包含 SomeSub 过程,则可使用下面的语句调用 Form1 中的过程:
Call Form1.SomeSub(arguments)
b. 类模块中的过程
与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类实例的变量。例如,DemoClass 是类 Class1 的实例:
Dim DemoClass as New Class1
DemoClass.SomeSub
但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须首先声明类的实例为对象变量(在这个例子中是DemoClass )并用变量名引用它。
c. 标准模块中的过程
如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个唯一过程。如果过程仅出现在一个地方,这个过程就是唯一的。如果两个以上的模块都包含同名的过程,那就有必要用模块名来限定了。在同一模块内调用一个公共过程就会运行该模块内的过程。例如,对于Module1 和 Module2 中名为 CommonName 的过程,从 Module2 中调用CommonName 则运行 Module2 中的CommonName过程,而不是 Module1中的 CommonName 过程。从其它模块调用公共过程名时必须指定那个模块。例如,若在 Module1 中调用 Module2 中的 CommonName 过程,要用下面的语句:
Module2.CommonName (arguments)
4. 向过程传递参数
过程中的代码通常需要某些关于程序状态的信息才能完成它的工作。信息包括在调用过程时传递到过程内的变量。当将变量传递到过程时,称变量为参数。
a. 参数的数据类型
过程的参数被缺省为具有 Variant 数据类型。不过,也可以声明参数为其它数据类型。
b. 按值传递参数
按值传递参数,传递的只是变量的副本。如果过程改变了这个值,则所作变动只影响副本而不会影响变量本身。用 ByVal 关键字指出参数是按值来传递的。例如:
Sub PostAccounts (ByVal intAcctNum as Integer)
Statements
End Sub
c. 按地址传递参数
按地址传递参数使过程用变量的内存地址去访问实际变量的内容。结果,将变量传递给过程时,通过过程可永远改变变量值。按地址传递参数在VB 中是缺省的。
如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。可以给参数传递一个表达式,而不是数据类型。VB 计算表达式,如果可能的话,还会按要求的类型将值传递给参数。把变量转换成表达式的最简单的方法就是把它放在括号内。例如,为了把声明为整数的变量传递给过程,该过程以字符串为参数,则可以用下面的语句:
Sub CallingProcedure ()
Dim intX As Integer
intX = 12 * 3
Foo (intX)
End SubSub
Foo (Bar As String)
MsgBox Bar 'Bar 的值为字符串‘ 36 ’。
End Sub
d. 使用可选的参数
在过程的参数列表中列入 Optional 关键字,就可以指定过程的参数为可选的。如果指定了可选参数,则参数表中此参数后面的其它参数也必是可选的,并且要用 Optional 关键字来声明。下面两段示例代码假定有一个窗体,其内有一命令按钮和一列表框。例如,这段代码提供所有可选参数:
Dim strName As String
Dim strAddress As String
Sub ListText(Optional x As String,Optional y _As String)
List1.AddItem x
List1.AddItem y
End Sub
Private Sub Command1_Click ()
strName = "yourname"
strAddress = 12345 '提供了两个参数。
Call ListText (strName,strAddress)
End Sub
而下面的代码并未提供全部可选参数:
Dim strName As String
Dim varAddress As Variant
Sub ListText (x As String,Optional y As Variant)
List1.AddItem x
If Not IsMissing (y) Then
List1.AddItem y
End If
End Sub
Private Sub Command1_Click ()
strName = "yourname" '未提供第二个参数。
Call ListText (strName)
End Sub
原文链接:https://www.f2er.com/vb/259378.html