返回第 6节 过 程
Visual Basic 程序设计
6.1 事件过程
6.2 过程及调用
6.3 参数的传递
6.5 变量的作用域
Visual Basic 程序设计将多处使用的代码分解为相对独立的部分,供使用处调用。这样可以大大解化程序的设计。
第 6节 过 程过程子程序过程( Sub)
函数过程( Function)
属性过程( Property)和
Event事件过程事件过程通用过程窗体过程控件过程
Visual Basic 程序设计
打开代码窗口(双击控件或窗体,单击查看代码)
选择对象和事件,并输入代码
建立事件过程加入对发生事件进行处理的代码的过程,称为事件过程
6.1 事件过程
1.事件:
定义,能被对象所识别的动作。
触发事件的条件,用鼠标或按键等系统也会产生事件
事件过程的分类,窗体事件过程控件事件过程
Visual Basic 程序设计
Private Sub Form_事件名 ([argumentlist])
语句块
End Sub
1) 窗体事件过程形式:
6.1 事件过程说明:
(1) Private 表明该过程是模块级的,在该窗体之外不可用。
(2) 不论定义的窗体名称是什么,窗体事件过程名中均用
Form 或 MIDFORM(多文档界面窗体)表示。
(3) 事件由 VB提供。注意部分事件的发生顺序:
Load,Initialize,Activate,GotFocus
2.定义事件过程
Visual Basic 程序设计
2) 控件事件过程形式:
6.1 事件过程说明:
(1) 控件名必须与窗体中某个控件相匹配,属于私有过程 。
(2) 参数列表:有无参数由事件本身决定,用户不可以自行添加 。
2.定义事件过程
Private Sub 控件名 _事件名 ([参数列表 ])
语句块
End Sub
Visual Basic 程序设计
6.2 过程及其调用将多次被重复使用的程序段设计成一个具有一定功能的独立程序段,即为通用过程。
6.2.1 函数过程及调用
6.2.2 子过程及调用
6.2.3 调用其他模块中的过程
Visual Basic 程序设计将多次被重复使用的程序段设计成一个具有一定功能的独立程序段,即为通用过程。
引例,已知多边形的各条边的长度,求这个多边形的面积子 过 程函数过程
:由应用程序调用才能运行。
:由应用程序或函数名都可调用。
f
a b
c
deg
S1
S2
S3
c=0.5*(x+y+z)
Area=sqr(c(c-x)(c-y)(c-z))
6.2.1 函数过程及其调用
Visual Basic 程序设计
⑴ 利用对话框
,工具,菜单 --->“添加过程,--->在对话框输入对应项
在代码中,填入形参名称和类型,以及函数名的类型
1.定义
6.2.1 函数过程的定义及调用
Visual Basic 程序设计
⑴ 利用对话框
,工具,菜单 --->“添加过程,--->在对话框输入对应项
在代码中,填入形参名称和类型,以及函数名的类型
1.定义:
⑵ 利用代码窗口直接输入
把插入点放在 所有过程之外
直接输入函数过程
Public Function area(x!,y!,z!) as single
6.2.1 函数过程的定义及调用
Visual Basic 程序设计
2.定义格式:
Public Function 函数名(形参列表 )[As 数据类型 ]
定义变量或常量语句序列函数名 = 表达式
End Function
如,Public Function area(x As Single,y!,z!) As Single
c=0.5*(x+y+z)
area=sqr(c*(c-x)*(c-y)*(c-z))
End Function
注意:
在函数体内,函数名最少赋值一次
形参列表没有值,只代表参数的个数、类型、位置
函数过程无参数,括号不能省略
(变量名 [As 类型 ],变量名 [As 类型 ],,,)
6.2.1 函数过程的定义及调用
Visual Basic 程序设计
Public Function fac(n As Integer) As Integer
k = 1
For i = 1 To n
k = k * i
Next i
fac = k
End Function
例,编写一个函数过程,求 n!的值
Private Sub Command1_Click()
Text2.Text = fac(Val(Text1.Text))
End Sub
Visual Basic 程序设计
3.函数的调用格式如下:
格式 1:变量 = 过程名( [实参表 ])
格式 2,CALL 过程名(实参)
格式 3:过程名 实参说明:通常用第一种格式比较多,用后两种方法调用函数时 VB放弃函数的返回值。
6.2.1 函数过程的定义及调用
Visual Basic 程序设计
6.2.1 函数过程的定义及调用与前面使用的标准函数的调用相同,出现在赋值号的右侧格式,函数名( [实参列表 ])
注意:
函数过程不能作为独立语句使用调用,必须与其他成分结合使用
实参列表中的参数个数、位置和类型与形参一一对应如,Public Function area(x!,y!,z!) As Single
c=0.5*(x+y+z)
area=sqr(c*(c-x)*(c-y)*(c-z))
End Function
3.函数的调用如,Private Sub Form _ Click()
a=5,b=4,c=3,d=3
e=4,f=5,g=4
s1=area(a,b,c)
s2=area(c,d,e)
End Sub
a b
c
deg
S1
S2
S3
Visual Basic 程序设计
工作流程关系:
Public Function area (x,y,z) As Single
c=0.5*(x+y+z)
area=sqr(c*(c-x)*(c-y)*(c-z))
End Function
Private Sub Form _ Click()
a = 5:b = 4:c = 3
s1=area (a,b,c)
……
print s1+s2+s3
End Sub





注意,参数值和函数值的变化
Visual Basic 程序设计
过程调用的参数传递关系:
Public Function area (x!,y!,z!) As Single
c=0.5*(x+y+z)
area=sqr(c*(c-x)*(c-y)*(c-z))
End Function
Private Sub Form _ Click()
dim a!,b!,c!,s1!
a = 5:b = 4:c = 3
s1=area (a,b,c)
……
print s1+s2+s3
End Sub
实际参数形式参数
Visual Basic 程序设计例,已知下图所示的立方柱底边长 a,b和柱高
h,求出立方柱两顶角之间的对角线 d.
a
b
d
h
c
Public Function z(x!,y!) As Single
z = Sqr(x * x + y * y)
End Function
Dim a,b,c,d,h As Single
a = Val(Text1.Text)
b = Val(Text2.Text)
h = Val(Text3.Text)
c = z(a,b)
d = z(c,h)
Print "d=" ; d
End Sub
函数的定义调用函数 求矩形的对角线输入部分
Private Sub Command1_Click()
分析:
(1)函数:
重复的工作 (求矩形的对角线 )
(2)Command1_Click
事件中,完成数据的输入、函数的调用和输出
Visual Basic 程序设计例,求 1!~ n!之和
Public Function fac(n%) As Integer
fac = 1
For i = 1 To n
fac = fac * i
Next i
End Function
Dim sum as integer,k As integer
For k = 1 To 5
Sum = Sum + fac(k)
Next
print Sum
Private Sub Command1_Click()分析:(1)函数过程:
完成求任一数 n!
(2)Command1_Click中:
各阶乘值的累加,和函数调用及输出
Visual Basic 程序设计复习
1.定义格式:
Public Function 函数名(形参列表 )[As 数据类型 ]
定义变量或常量语句序列函数名 = 表达式
End Function
注意:
在函数体内,函数名最少赋值一次
形参列表没有值,只代表参数的个数、类型、位置
函数过程无参数,括号不能省略
2.函数的调用格式 1:变量 = 过程名( [实参表 ])
Visual Basic 程序设计
6.2.2 子过程的定义及其调用
1.定义方式
⑴ 进入代码窗口,
按定义格式 敲入 Sub及子程序名,
⑵ 在,工具,-->选择,添加过程,
-->在对话框中选择,子过程,,并输入过程名
(变量名 [As 类型,] 变量名 [As 类型 ],,,)
2.定义格式:
[Public|Private] Sub 过程名(形参列表)
语句序列
End Sub
Visual Basic 程序设计
Public Sub result( a!,b!,c!,x1!,x2!)
Dim t As Single
t = b^2-4*a*c
x1=(-1*b+sqr(t))/(2*a)
x2=(-1*b-sqr(t))/(2*a)
End Sub
例,编写一个计算一个一元二次方程根的 Sub子过程总结:
形参应是变量
子过程名无值,不要在子过程中赋值
子过程的应用范围比函数过程范围广
Visual Basic 程序设计
3.调用,两种格式
Call 子过程名 [( 实参列表 ) ]
子过程名 [实参列表 ]
无实参时,括号省略
Public Sub command1_click()
Dim t As Single
a1=5:b1=4:c1=3
call result(a1,b1,c1,y1,y2)
End Sub
6.2.2 子过程的定义及其调用
result a1,b1,c1,y1,y2
Visual Basic 程序设计
6.2.2 子过程的定义及其调用
4.退出子过程
Exit Sub (通常与 条件语句 同时使用 )
在 子程序 中进行测试,并根据测试结果确定是否退出子程序,
Public Sub result( a!,b!,c!,x1!,x2!)
Dim t As Single
t = b^2-4*a*c
x1=(-1*b+sqr(t))/(2*a)
x2=(-1*b-sqr(t))/(2*a)
End Sub
if t<0 then Exit Sub
Visual Basic 程序设计在程序中只能调用其他模块中的公有过程。
6.2.3 调用其它模块中的过程
1.窗体模块格式,CALL 窗体名,过程名 ( [实参表 ])
2.标准模块
(1) 若调用自身模块中的过程,或标准模块中的过程且过程名唯一,则格式为:
CALL 过程名 ( 实参 )
(2) 若调用别的模块中的过程且有两个以上的模块中含有同名过程,则格式为:
CALL 模块名,过程名 ( 实参 )
3.类模块必须首先声明类的实例为对象变量,然后用变量名引用,
Visual Basic 程序设计
6.3 参数的传递按地址传递按值传递数组参数 参数对象参数
Visual Basic 程序设计
6.3 参数的传递在调用有参过程时,首先进行参数,形实结合,的过程,即将调用程序中的实参和被调用过程中的形参结合,实现主调程序和过程之间的数据传递;
在结合时一定要按位置对应进行并且类型要相同,特别注意不是按名字进行结合。
该传递方式分为,传值 和 传址 (引用)两种。
Visual Basic 程序设计
6.3.1 按地址传递按地址传送时传送的是实参的地址,在调用时,被调用过程直接将接受到的地址里的值进行修改,从而实参值被改变。所以执行完调用语句后,实参的值将会有所改变。
按址传递形参的语法特点:
形式变量前没有修饰词;
或在形式变量前加,ByRef”关键词如,Public Sub test(i!,ByRef j As Integer)
……
End Sub
Visual Basic 程序设计
6.3.1 按地址传递
Private Sub Form_Click()
Dim x As Integer,y As Integer
x = 10
y = 20
Print "执行过程前,x="; x,"y=" ; y
test x,y
Print,执行过程后,x="; x,"y=" ; y
End Sub
Public Sub test(i As Integer,j As Integer)
i = i + 1
j = j + 1
End Sub
Visual Basic 程序设计
6.3.2 按值传递按值传送时传送的不是实参的值,仅传送实参变量的副本,执行完调用语句后,调用程序中的实参值不会改变。
按值传递形参的语法特点:
在相应的形式变量前加,ByVal”关键词如,Public Sub test(ByVal j As Integer)
……
End Sub
Visual Basic 程序设计
6.3.2 按值传递例,Private Sub Command1_Click()
Dim m As Integer,n As Integer
m = 15,n = 20
Print,调用前,m="; m,"n="; n
Call value(m,n)
Print,调用后,m="; m,"n="; n
End Sub
Private Sub value(ByVal x%,ByVal y As Integer)
x = x + 20,y = y + x
Print,返回前,x="; x,"y="; y
End Sub
Visual Basic 程序设计
6.3.2 按地址传递
传值和传址在形式上表现的主要区别为:
按值传送,形参变量前应加有 ByVal;
按址传送,形参前没有加上任何修饰词,或加,ByRef”
说明:如果形参是变量,实参是 常数 或表达式 时,即使在形参前没有关键词
ByVal,也是实现按值传递
(1)形参
可以是 除定长字符串 外的合法变量名
后面跟有左右括号的数组名
(2)实参
可以是:变量,数组名,常数、表达式、对象
Visual Basic 程序设计数组可以作为形式参数。
定义格式,Public 过程名( 形参数组名 () AS 类型 )
说明:
形参数组只能 按地址传递 参数。
对应实参的类型,实参只写数组名,后面不加括号 。
长度必须和形参一致,
在被调用的过程中不要再用 Dim对形参声明,若动态数组时,可以用 ReDim来重新定义数组的维界与大小。
6.3.3 数组参数
Visual Basic 程序设计例:
Private Sub change(a() As Integer)
Dim i As Integer
ReDim a(7)
For i = 1 To 7
a(i) = I
Next I
End Sub
Option Base 1
Private Sub Form_Click()
Dim ArrayA() As Integer,i As Integer
ReDim ArrayA(5)
Print "调用前上界是,"; UBound(ArrayA)
Call change(ArrayA)
Print "调用后上界是,"; UBound(ArrayA)
End Sub
Visual Basic 程序设计对象也可以作为参数传递,但也只能是 按地址 来传递。
在形参中若是控件,则类型声明为,Contral”,若是窗体,
则类型声明为,Form”。
定义格式,Public 过程名( 变量名 AS Contral)
Public 过程名( 变量名 AS Form)
6.3.4 对象参数
Visual Basic 程序设计
6.3.4 对象参数例,Private Sub Command1_Click()
Call objarg(Label1)
End Sub
Public Function objarg(lad As Control)
lad.BackColor = &HFF0000
lad.ForeColor = &HFFFF00
lad.FontSize = 18
lad.FontItalic = True
lad.name =,隶书”
lad.Caption = "对象的参数传递 "
End Function
Visual Basic 程序设计
6.5 变量的作用域变量的作用域过程的作用域静态变量示例
Visual Basic 程序设计
6.5 变量的作用域应用程序
(.vbp文件 )
类模块 (.cls)文件一个或若干个窗体 模块 (*.frm)文件用户自定义子过程 (Sub)
用户自定义函数过程 (Function)
事件过程 (Sub)
用户自定义子过程 (Sub)
用户自定义函数过程 (Function)
一个或若干个标准模块 (*.bas)文件全局级模块级过程级
Visual Basic 程序设计
6.5.1 变量的作用域
1.局部变量作用域:定义的过程内,
指在过程内用 Dim语句声明的变量,或不加声明直接使用的变量 ;
只能在本过程中使用,别的过程不可访问;
局部变量随过程的调用而分配存储单元,并进行初始化 ;该过程体结束,占用的存储单元被释放;
不同过程中可有相同名称的变量,彼此互不相干。
使用局部变量有利于程序的调试
Visual Basic 程序设计
6.5.1 变量的作用域
2.窗体 /模块级变量
作用域:定义变量的窗体 /模块内 。
定义位置:指在窗体 /模块的,通用声明,中
定义词:用 Dim语句或 Private语句声明的变量
使用范围:可被本窗体 /模块的任何过程访问。
Visual Basic 程序设计
6.5.1 变量的作用域
3.全局变量
作用域:为整个应用程序内
定义位置,在标准模块或窗体的,通用声明,段中
关键词,用 Public语句声明的变量。
调用对象,可被应用程序中的任何过程或函数访问。
全局变量的值在整个应用程序中始终不会消失和重新初始化,只有当整个应用程序结束时,才会消失。
思考,如果出现不同作用域的同名变量,系统会如何处理?
Visual Basic 程序设计
6.5.2 过程的作用域
1.窗体 /模块级
指在某个窗体或标准模块内定义的过程;
定义子过程或函数时,加 Private关键字;
过程只能被本窗体或本标准模块中的过程调用
2.全局级
指在窗体或标准模块中定义的过程,其默认是全局的,也可加 Public进行说明。
全局级过程可供该应用程序的所有窗体和所有标准模块调用,调用方式有如下两种:
1.在窗体定义的过程,外部过程调用时,必须加窗体名
2.在标准模块定义的过程,外部过程均可调用,但过程名必须唯一,否则要加标准模块名
Visual Basic 程序设计
6.5.3 静态变量每次调用过程时,用 Static说明的变量保持原来的值,
而用 Dim说明的变量,每次调用过程时,都重新初始化。
使用格式:
Static 变量名 [As 类型 ]
Static Function 函数名 ([参数列表 ])[As 类型 ]
Static Sub 过程名 [(参数列表 )]