在声明数组时,若数组名称、数组元素的数据类型和元素的个数能够确定,这样声明的数组为静态数组。
在声明静态数组时的几点说明:
(1)数组名的命名规则与变量的命名规则相同。
(2)数组的维数由下标的个数确定,下标的个数最多可以为60个。
(3)数组每一维的元素个数,也就是数组每一维的大小是:(上界-下界+1),而整个数组元素的个数是每一维元素个数的乘积。
(4)缺省<下标的下界>,数组每一维的下标从0开始,若希望从1开始,可在模块的通用部分用使用Option Base语句设置开始下标为1(Option Base 1).
(5)<下标的下界>和<下标的上界>不能使用变量,必须是常量,常量可以是直接常量,符号常量,一般是整型常量。
(6)如果省略[AS 类型/类型符],则数组的类型为变体类型。
(7)Static语句只能用在事件过程中定义数组。
声明静态数组的方法有两种。
方法1
Dim 数组名(上界) As数据类型
如Dim A(3) As Integer
该语句定义了一个一维数组,数组名字为A,类型为整型,包括4个数组元素,分别是A(0),A(1),A(2),A(3)。
Dim A(3,3) As Integer,这是一个二维数组,该语句的数组名字为A,类型为整型,包括16个数组元素。
(2)方法2
Dim 数组名(下界 To 上界)
如Dim A(1 To 3) As Integer
该语句定义了一个包含3个元素的数组,分别是A(1),A(2),A(3)。
Dim A(1 To 5,1 To 5) As Integer,该语句定义了25个数组元素。
应注意:
Dim A(3) As Integer ‘下标3用于确定A数组有4个元素
A(3) ‘下标3用来指定数组元素A(3)
控件数组是一组相同类型的控件的集合,具体说,控件数组是一组具有共同名称、类型和事件过程的控件。
控件数组中的每个元素可以有自己的属性值,建立时系统给每个元素赋一个唯一的索引号(Index),用来标识控件数组中的每个控件数组元素。
有两种方法:
(1)在设计窗体时创建控件数组
1)在窗体上画出多个同类控件使“名称”属性相同,Indexe属性不同。
2)在窗体上先画一个控件,再选中该控件,多次进行“复制”和“粘贴”操作。
(2)在车工序运行时创建控件数组
在设计窗体时先画一个控件,并设计该控件Index属性未0。在运行程序时使用Load语句为控件数组添加新对象。还可以通过Unload语句删除控件数组中已有的控件数组元素。
1)Load语句
格式:Load <控件名>
功能:添加一个新的控件数组对象。
2)UnLoad 语句
格式:UnLoad <控件名>
功能:删除控件数组中一个对象。
将一个大程序分割成多个具有独立功能的逻辑段以实现系统功能,这些逻辑段就称为过程。在程序中引用过过程,可以大大改善程序的结构,它可以把复杂的问题分解成若干个简单问题进行设计,即“化全局为局部”,还可以使同一程序段重复使用,即“程序重用”。
在程序中要引用Sub过程首先要定义Sub过程,然后才能调用Sub过程。
(1)创建Sub过程
Sub过程可以在标准模块中或在窗体的通用模块中建立(如图4-1和4-2所示)。可以使用程序方式,也可以使用菜单方式。
创建Sub过程有有两种方法:
第一种:用程序方式创建Sub过程
格式:
[Public|Private] [Static] Sub<过程名>([<参数表>])
<局部变量或常数定义>
<语句序列1>
<Exit Sub>
<语句序列2>
End Sub
其功能是定义一个以<过程名>为名的Sub过程。
几点说明:
1)<过程名>的命名规则与变量命名规则相同。
2)<参数表>中的参数为形参,定义形参的类型、个数、位置是实时的,定义时时无值的。
3)<参数表>中可以有多个形参,他们之间要用逗号隔开。
4)Static、Private定义的Sub过程为局部过程,只能在定义它的模块中被调用。
5)Public定义的Sub过程为公有过程,可被任何模块中调用。
6)[Exit Sub]是退出Sub过程的语句,常常与分支结构语句联用。
7)过程可以无形式参数,但括号不能省。
第二种:用菜单方式创建Sub过程
操作步骤如下:
1)在代码编辑窗口,依次选择【工具】→【添加过程】,打开“添加过程”窗口,如图4-3所示。
2)在“添加过程”窗口,定义所建立过程的名称(MySub),选择过程类型(子过程),定义过程的作用范围(公有的Public)。
3)在“添加过程”窗口,单击“确定”按钮,便建立了一个Sub过程的结构框架。
Public Sub MySub()
——–
End Sub
(2)调用Sub过程
调用Sub过程的语句
格式:
<过程名>[<参数表>]
或:
Call <过程名>([<参数表>])
其功能是调用一个已定义的Sub过程
注意以下几点:
1)<参数表>中的参数为实参,它必须与形参个数相同且类型要一致。
2)调用过程是把实参传递给对应的形参,其中:
形参前有ByVal,说明形参与实参数据传递是值传递方式。
形参前有ByRef,说明形参与实参数据传递是地址传递方式。这种方式为默认方式,有时前面不加ByRef,仍表示是地址传递方式。
3)当参数是数组时,形参与实参在参数声明时应省略其维数,但括号不能省。
在VB系统中有许多内部函数,用户可直接引用,但有时内部函数不能解决特有问题的需求,此时,我们可以根据问题的需要创建自定义函数,其使用方法与使用内部函数一样。
(1)创建Function过程
Function过程可以在标准模块中或在窗体的通用模块中建立,可以使用程序方式,也可以使用菜单方式。
第一种:用程序方式创建Function过程
格式:
[Public|Private] [Static] Function<过程名>([<参数表>])[As<类型>]
<局部变量或常数定义>
<语句序列1>
<Exit Function>
<语句序列2>
End Function
其功能是定义一个以<函数名>为名的Function过程
几点说明:
1)<函数名>的命名规则与变量命名规则相同,但它不能与系统的内部函数或其他通用过程同名,也不能与已定义的全局变量和本模块中同模块级变量同名。
2)在函数体内部,<函数名>可以当做变量使用,函数的返回值就是通过给<函数名>的赋值语句来实现的,在函数过程中至少要对函数名赋值一次。
3)As<类型>是指函数返回值的类型,若省略,则函数返回值为变体类型。
4)<参数表>中形参的定义与Sub过程完全相同。
5)Static、Private定义的Sub过程为局部过程,只能在定义它的模块中被调用。
6)Public定义的Function过程为公有过程,可被任何模块过程调用。
7)[Exit Function]是退出Function过程的语句,常常与选择结构语句联用。
8)过程可以无形式参数,但括号不能省。
第二种:用菜单方式创建Function过程
操作步骤如下:
1)在代码编辑窗口,依次选择【工具】→【添加过程】,打开“添加过程”窗口,如图4-4所示。
2)在“添加过程”窗口,定义所建立过程的名称(MyFunction),选择过程类型(函数),定义过程的作用范围(私有的Private)。
3)在“添加过程”窗口,单击“确定”按钮,便建立了一个Function过程的结构框架。
Public Function MyFunction()
--------
End Function
(2)调用Function过程
调用Function过程的语句
格式:
函数名 (<参数表>)
其功能是调用一个已定义的Function过程
注意以下两点:
1)<参数表>中的参数为实参,形参与实参传递与Sub过程相同。
2)函数调用只能出现在表达式中,其功能是求得函数的返回值。
(1)形式参数
形式参数(简称“形参”),是指在定义过程时出现在Sub或Function语句中过程名后面圆括号内的参数。它是用来接收传送给过程的数据,在定义过程时,形式参数表中各个变量之间要用逗号分隔,在定义形式参数的同时还要定义各参数的类型。
例如:
(2)实际参数
实际参数(简称“实参”)是指在调用Sub或Function过程时,写入过程名或函数名后括号内的参数。它是将它们的数据(数据或地址)传送给Sub或Function过程与其对应的形式参数。
例如:
调用语句
在未出现过程调用时,形参并不占存储单元,只有在发生过程调用时,形参才被分配存储单元。在调用结束后,形参所占的存储单元被释放。
当发生过程调用时,实参与形参按位置的对应关系相结合。例如上面的例子:
在VB中,形参与实参的参数传递有传值和传址两种方式。
(1)传值方式
传值方式是指实参把值传递给形参而不传递实参的地址。当发生过程调用时,系统把需要传递的实参复制到一个临时的存储单元中,然后把临时单元与形参结合。因此,在这个过程中,形参值的改变不会影响到实参值,数据的传送是单向的。
例1:下面的程序采用按值传递方式
Private Sub ww(ByVal x , ByVal y As , ByVal z )
x = x + 2
y = y + 2
z = z + 2
End Sub
Private Sub Command1_Click()
A = 1: B = 2: C = 3
Call ww(A, B, C)
Print A, B, C
End Sub
运行时,单击命令按纽,在窗体上打印如下结果:
1 2 3
在命令按纽Command1的Click事件过程中执行Call ww(A,B,C)语句时,A、B、C以按值传递的方式分别与形参变量X、Y、Z结合,在ww过程中改变了变量X、Y、Z的值,但从ww过程返回时,这些值不会影响调用过程A、B、C的值,因此打印A、B、C的值与执行Call语句之前相同。
(3)传址方式
传址方式是指将实参的地址传给对应的形参,使形参和实参具有相同的地址,意味着形参与实参共享同一个存储单元,形参的值也就是实参的值。因此主调过程对被调过程的数据传递是双向的。
上面的例1,将ww过程中的ByVal改为ByRef,则表示按地址传递
运行结果为:3 4 5
同学们上机检验
例2.编写一个Sub过程,计算N个数的和,即1+2+…+N,并通过命令按纽的单击事件调用该过程计算S=1+(1+2)+(1+2+3)+…+(1+2+3+…+K)。
分析:用Sub过程计算1+2+…+N,首先需要设置参数N,另外需要引入一个参数S,用于返回该和值。程序如下:
Public Sub A1(N As Integer, S As Long)
S = 0
For J = 1 To N
S = S + J
Next J
End Sub
Private Sub Command1_()
Dim K As Integer, S1 As Integer, I As Integer
K = Val(Text1.Text)
For I = 1 To K
Call A1(I, S1) ' 调用过程A1求1+2+…+I,和值返回到S1中
Sum = Sum + S1
Next I
Text2.Text = Sum
End Sub
VB提供了3种键盘事件,即:
- KeyDown事件:按下键盘上的任意键
- KeyUp事件:释放键盘的任意键
- KeyPress事件:按下对应某ASCII字符的键
(1)KeyDown事件和KeyUp事件
按下键盘上的任意一个键,就会引发当前具有焦点的对象的KeyDown事件。释放时,则会引发该对象的KeyUp事件。
以窗体为例,KeyDown事件和KeyUp事件的语法如下:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
语句组
End Sub
和
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
语句组
End Sub
1)Keycode参数
KeyCode参数是一个整数,返回所按键的键码值。键码值是以“键”为准。例如,由于大写字母和小写字母使用同一键,因此“A”和“a”的键码值是相同的。又如大键盘上的数字“1”和小建盘上的数字“1”,虽然是同一数字,但由于键不同,它们的键码值也不相同。常用键的键码值如表4-1所示:
2)Shift参数
Shift参数是一个整数值,返回Shift、Ctrl、Alt的状态。只有检查此状态才能判断输入的是大写还是小写字母。
Shift参数用来判断是否按下了键盘上的Shift、Ctrl和Alt,或这3个键的任意组合,其对应的关系如表4-2所示:
下面的代码将测试你当前按下的键,并通过消息框告诉你。
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim ShiftKey As Integer
ShiftKey = Shift And 7 '7对应为1+2+4
Select Case ShiftKey
Case 1 '或VbShiftMask
MsgBox "You pressed the Shift key."
Case 2 '或VbCtrlMask
MsgBox "You pressed the Ctrl key."
Case 4 '或VbAltMask
MsgBox "You pressed the Alt key."
End Select
End Sub
(2)KeyPress事件
按下键盘上与ASCII字符对应的键时,触发KeyPress事件。KeyPress事件能识别的ASCII字符包括:字母键、数字键、标点符号键以及Enter键、Tab键和Backspace键。也就是说,在键盘上除了按这些键以外,按其它键不会引发KeyPress事件。
ASCII码值是以按键上的字符为准。同一按键上的字符有大小之分,所以按下同一个键时,ASCII码值是不一样的。例如,“A”和“a”的ASCII码值不一样。
以窗体为例,KeyPress事件的语法是:
Private Sub Form_KeyPress (KeyAscii As Integer)
语句组
End Sub
参数KeyAscii是一个整数,返回所按键的ASCII码值。借助字符的ASCII码值来判断用户按下的是哪一个键。
常用键的键码值和ASCII码值分别如表4-3所示:
如果你想知道键盘上各个键的ASCII值,可在文本框的keyPress事件下编写如下代码。运行程序,当焦点位于该文本框上时,按下希望了解的键,消息框中就会显示所按键的ASCII值。
Private Sub Text1_KeyPress(KeyAscii As Integer)
MsgBox KeyAscii
End Sub
当敲击一个有ASCII码值的键时,会同时引发KeyDown事件、KeyPress事件和KeyUp事件,它们发生的顺序如下:
KeyDown事件→KeyPress事件→KeyUp事件
鼠标是我们常用的输入工具,代替键盘而使操作更方便、更灵活。 Visual Basic提供的鼠标事件共有7个,分别是Click、DbClick、MouseDown、MouseMove、MouseUp、DragDrop和DragOver。
(1)MouseDown、MouseMove、MouseUp事件
以窗体为例,3个事件的语法如下:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, _
Y As Single)
语句组
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, _
Y As Single)
语句组
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, _
Y As Single)
语句组
End Sub
由上可见,上述3个事件的参数都是一样的,说明如下:
Button参数:表示按下的鼠标是哪一个键。1表示按下鼠标左键,2表示按下鼠标右键,4表示按下鼠标的中间键。
Shift参数:是一个整数值,其取值的含义见表4-2。
X、Y参数:表示鼠标光标所在的坐标值。
(2)DragDrop事件
按住鼠标拖动对象A到对象B,当松开鼠标放下对象A时,对象B产生DragDrop(拖放)事件。例如把一个图片拖放到窗体的任一位置,在放开鼠标时,该窗体就发生了DragDrop事件。对于窗体,DragDrop事件的语法如下:
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
语句组
End Sub
其中:
参数Source:表示被拖动的对象。注意在界面设置时,应将被拖动对象的DragMode属性设置为1(表示设置拖动模式为自动);
参数X、Y:表示松开鼠标时,鼠标指针光标的位置坐标。
例3.在窗体上对一字符进行拖放。
创建窗体,在窗体上添加一个命令按纽Command1,将其Caption属性值设为Visual Basic,DragMode属性设置为1(设置拖动模式为自动)。然后在窗体的DragDrop事件上添加如下代码:
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Command1.Move X, Y
Print "窗体的DragDrop事件"
End Sub
运行程序,用鼠标拖动命令按纽,在拖放的过程中,出现如图4-5所示的界面,放开鼠标时,出现如图4-6所示的界面。
由上例可知,DragDrop事件和MouseMove事件的区别是:
1)DragDrop事件:鼠标点住某一对象并拖动,直到放开鼠标键时才发生该事件,在拖放过程中,不发生DragDrop事件。
2)MouseMove事件:鼠标一旦移动就引发该事件。
1.下面关于多窗体的叙述中,正确的是( )。
A.作为启动对象的Main子过程只能放在窗体模块内
B.没有启动窗体,程序不能执行
C.如果启动对象是Main子过程,则程序启动时不加载任何窗体,以后由该过程根据不同情况决定是否加载及加载哪一窗体
D.以上都不对
2.下列关于过程叙述不正确的是( )。
A.过程的传值调用是将实参的具体值传递给形参
B.过程的传址调用是将实参在内存的地址传递给形参
C.过程的传值调用参数是单向传递的,过程的传址调用参数是双向传递的
D.无论过程传值调用还是过程传址调用,参数传递都是双向的
3.下列关于变量的说法不正确的是( )。
A.局部变量是指那些在过程中用Dim语句或Static语句声明的变量
B.局部变量的作用域仅限于声明它的过程
C.静态局部变量是在过程中用Static语句声明的
D.局部变量在声明它的过程执行完毕后就被释放了
4.下列数组声明语句,正确的是( )。
A.Dim a[3,1To 4] As Integer B.Dim a(3 1To 4) As Integer
C.Dim a(n,n) As Integer D.Dim a(3, 1To 4) As Integer
5.Dim A(-1 To 4, 5) As String定义的数组包含的元素个数是( )。
A.30 B.36
C.25 D.20
6.设用复制、粘贴的方法建立了一个命令按钮数组Command1,以下对该数组的说法错误的是( )。
A.命令按钮的所有Caption属性都是Command1
B.在代码中访问任意一个命令按钮只需使用名称Command1
C.命令按钮的大小都相同
D.命令按钮共享相同的事件过程
7.定义数组Array(1 to 5,5)后,下列不存在的数组元素是( )。
A.Array(1,1) B.Array(1,0)
C.Array(0,1) D.Array(5,5)
8.在过程定义中用( )表示形参的值。
A.Var B.ByDef
C.ByVal D.Value
9.若已编写了一个Sort子过程,在该工程中有多个窗体,为了方便地调用Sort子过程,应该将过程放在( )中。
A.窗体模块 B.标准模块
C.类模块 D.工程
10.在过程中定义的变量,若希望在离开该过程后,还能保存过程中局部变量的值,则应使用( )关键字在过程中定义局部变量。
A.Dim B.Private
C.Public D.Static
11.下面子过程语句说明合法的是( )。
A.Sub f2(ByVal n%()) B.Sub f2(n%) As Integer
C.Functionf2%( f2%) D.Functionf2(ByVal n%)
12.键盘事件的执行顺序是( )。
A.KeyPress、KeyDown、KeyUp
B.KeyDown、KeyPress、KeyUp
C.KeyUp、KeyDown、KeyPress
D.KeyUp、KeyPress、KeyDown
阅读下列程序并写出程序运行结果
1.
Sub test(i As Integer)
i = i + 3
End Sub
Private Sub Form_Click()
Dim x As Integer
x = 8
Print "x="; x
Call test(x)
Print "x="; x
End Sub
程序运行时,单击窗体后显示的值是 。
2.
Function F(a As Integer)
Dim b As Integer
Static c As Integer
b = b + 3 3
c = c + 3 3 6 9
F = a + b + c 10 13 16
End Function
Private Sub Command1_Click()
Dim a As Integer
a = 4
For i = 1 To 3
Print F(a)
Next i
End Sub
程序运行时,单击命令按钮在窗体上的输出结果是 。
3.
Sub Change(ByVal x As Integer, ByVal y As Integer) 所传参数为形参
Dim t As Integer
t = x
x = y
y = t
Print x, y
End Sub
Private Sub Form_Click()
Dim a As Integer, b As Integer
a = 5: b = 8
Change a, b
Print a, b
End Sub
程序运行时单击Command1按纽后,Form1上的输出结果是 。
1.C 2.D 3.D 4.D 5.B 6.B 7.C 8.C 9.B 10.D 11.D 12.B
1.
x= 8
x= 11
2.
10
13
16
3.
8 5
5 8