1、第八章第八章 过程过程8.1过程概述过程概述8.2子程序过程子程序过程(Sub过程过程)8.3函数函数(Fountion过程过程)8.4过程之间的参数传递过程之间的参数传递8.5过程和变量的作用域过程和变量的作用域8.1过程概述过程概述过程:过程:一个实际应用程序可分解成多个具有独立一个实际应用程序可分解成多个具有独立功能的逻辑程序段来实现程序的完整功能,这些功能的逻辑程序段来实现程序的完整功能,这些逻辑程序段被称为过程。逻辑程序段被称为过程。Visual Basic中的过程:内部过程和外部过程。中的过程:内部过程和外部过程。内部过程内部过程是由系统提供的程序段,用户在编写程是由系统提供的程序
2、段,用户在编写程序时,可以使用内部过程名直接调用内部过程。序时,可以使用内部过程名直接调用内部过程。外部过程外部过程是用户根据需要自己定义编写的程序段。是用户根据需要自己定义编写的程序段。外部过程可分为外部过程可分为事件过程事件过程和和通用过程通用过程。事件过程事件过程附加在窗体或控件上,是当某事件发生附加在窗体或控件上,是当某事件发生时,对象对该事件做出响应的程序代码。时,对象对该事件做出响应的程序代码。通用过程:通用过程:在实际编程中,有时会有多个不同的在实际编程中,有时会有多个不同的事件过程需要使用同一段程序代码。这时把这段事件过程需要使用同一段程序代码。这时把这段代码独立出来,编写成为
3、一个共用的过程,即代码独立出来,编写成为一个共用的过程,即通通用过程用过程,它可供其他事件过程调用。,它可供其他事件过程调用。通用过程根据是否返回值,可分为通用过程根据是否返回值,可分为子程序过程子程序过程(Sub过程)和过程)和函数过程函数过程(Function过程)。过程)。子程序过程不返回值,函数过程返回函数值。子程序过程不返回值,函数过程返回函数值。定义子程序过程有两种方法:一种是使用定义子程序过程有两种方法:一种是使用“添加过添加过程程”对话框,另一种是直接在代码窗口中输入过程对话框,另一种是直接在代码窗口中输入过程代码。代码。8.2 子程序过程(子程序过程(Sub过程)过程)1使用
4、使用“添加过添加过程程”对话框对话框创建创建8.2 子程序过程(子程序过程(Sub过程)过程)2直接在代码窗口中定义直接在代码窗口中定义在窗体或标准模块的代码窗口中,按以下格式输入在窗体或标准模块的代码窗口中,按以下格式输入相应的代码:相应的代码:Public|Private Static Sub(形参列表形参列表)语句块语句块1Exit Sub语句块语句块2End Sub8.2 子程序过程(子程序过程(Sub过程)过程)说明:说明:Private:表示:表示Sub过程是一个私有过程,只限于本模过程是一个私有过程,只限于本模块内的其他过程调用。块内的其他过程调用。Public:表示:表示Sub
5、过程是一个公有过程,可在整个应用过程是一个公有过程,可在整个应用程序范围调用。程序范围调用。Static:表示:表示Sub过程中的所有局部变量的存储空间只过程中的所有局部变量的存储空间只分配一次,且这些变量的值在整个程序运行期间都存在。分配一次,且这些变量的值在整个程序运行期间都存在。过程名:用户为过程名:用户为Sub过程起的名字。命名规则与变量命过程起的名字。命名规则与变量命名规则相同。同一模块内,名规则相同。同一模块内,Sub过程不能和过程不能和Function过程同名。过程同名。形参列表:类似于变量声明,它指明了从调用过形参列表:类似于变量声明,它指明了从调用过程传递给过程的参量个数、类
6、型和位置,形参可程传递给过程的参量个数、类型和位置,形参可以是变量名或数组名。各参数之间用以是变量名或数组名。各参数之间用“,”隔开。隔开。参数定义格式:参数定义格式:ByVal|ByRef 变量名变量名()As 数数据类型据类型 ,ByVal表示该过程被调用时,参数是按值传递的;表示该过程被调用时,参数是按值传递的;默认或默认或ByRef表示该过程被调用时,参数是按地表示该过程被调用时,参数是按地址传递的。址传递的。Exit Sub:表示退出:表示退出Sub过程,常常是与选择结过程,常常是与选择结构联用,即当满足一定条件时,退出构联用,即当满足一定条件时,退出Sub过程。过程。8.2 子程序
7、过程(子程序过程(Sub过程)过程)例例【8-1】编一个交换两个整型变量值的编一个交换两个整型变量值的Sub过程。过程。Private Sub swap(a As Integer,b As Integer)Dim t As Integert=a:a=b:b=tEnd Sub 8.2 子程序过程(子程序过程(Sub过程)过程)子程序过程的调用有两种方法。子程序过程的调用有两种方法。1使用使用Call语句语句Call 窗体名窗体名|模块名模块名.(实参列表实参列表)如:如:Call swap(m,n)或或 Call Form1.swap(m,n)2直接使用过程名直接使用过程名窗体名窗体名|模块名模
8、块名.如:如:swap m,n 或或 Form1.swap m,n说明:说明:直接使用过程名调用时必须直接使用过程名调用时必须省略参数两边省略参数两边的括号的括号。使用。使用Call语句调用时,没有参数,()也语句调用时,没有参数,()也能省,否则参数必须在括号内。在调用时实参和能省,否则参数必须在括号内。在调用时实参和形参的数据类型、顺序、个数必须匹配。形参的数据类型、顺序、个数必须匹配。8.2 子程序过程(子程序过程(Sub过程)过程)例例【8-2】调用前面的交换两个整数的调用前面的交换两个整数的Sub过程。过程。Private Sub Form_Click()Dim first As I
9、nteger,second As Integerfirst=Val(InputBox(请输入第一个整数请输入第一个整数)second=Val(InputBox(请输入第二个整数请输入第二个整数)Print 交换前交换前first=;first,second=;secondswap first,secondPrint 交换后交换后first=;first,second=;secondEnd SubPrivate Sub swap(a As Integer,b As Integer)Dim t As Integert=a:a=b:b=tEnd Sub形参形参实参实参8.2 子程序过程(子程序过程(
10、Sub过程)过程)例例【8-3】编写一个程序,在文本框(编写一个程序,在文本框(Text1)中输入)中输入一个正整数,当单击命令按钮(一个正整数,当单击命令按钮(Command1)时,)时,调用调用Sub过程输出其阶乘。过程输出其阶乘。8.2 子程序过程(子程序过程(Sub过程)过程)创建步骤:创建步骤:(1)新建一个工程,在窗体中添)新建一个工程,在窗体中添加两个标签,一个文本框和一个加两个标签,一个文本框和一个命令按钮,并按图命令按钮,并按图8-3设置它们的设置它们的属性。属性。(2)在代码窗口输入下列代码:)在代码窗口输入下列代码:Private Sub Command1_Click()
11、Dim ji As Long,a As Integera=Val(Text1.Text)fact a,jiLabel2.Caption=其阶乘为:其阶乘为:&jiEnd SubPrivate Sub fact(n As Integer,f As Long)Dim i As Integerf=1For i=1 To nf=f*iNextEnd Sub 8.3 函数(函数(Function过程)过程)函数过程是用户根据需要用函数过程是用户根据需要用Function关键字定义的过程,与关键字定义的过程,与Sub过程不同的过程不同的是函数过程返回一个值。是函数过程返回一个值。格式:格式:Public|
12、Private Static Function(形参列表形参列表)As 语句块语句块1函数名函数名=返回值返回值Exit Function语句块语句块2函数名函数名=返回值返回值End Function说明:说明:As:是指函数:是指函数的返回值类型,若省略,的返回值类型,若省略,则函数返回则函数返回Variant类类型。型。Exit Function:常常:常常是与选择结构联用,即是与选择结构联用,即当满足一定条件时,退当满足一定条件时,退出出Function过程。过程。在函数体内,函数名可在函数体内,函数名可以当变量名使用,函数以当变量名使用,函数值通过函数名返回,因值通过函数名返回,因此
13、在此在函数过程中至少要函数过程中至少要对函数名赋值一次对函数名赋值一次。8.3 函数(函数(Function过程)过程)例例【8-4】编写一个函数过程,当调用该过编写一个函数过程,当调用该过程时,能求出一个正整数的阶乘值。程时,能求出一个正整数的阶乘值。Private Function fact(n As Integer)As LongDim i As Integerf=1For i=1 To nf=f*iNextfact=fEnd Function 8.3 函数(函数(Function过程)过程)例例【8-5】利用例利用例【8-4】的函数过程,编写一个与例的函数过程,编写一个与例【8-3】一
14、一样功能的程序。在文本框(样功能的程序。在文本框(Text1)中输入一个正整数,当单击)中输入一个正整数,当单击命令按钮(命令按钮(Command1)时,调用例)时,调用例【8-4】函数过程输出其阶函数过程输出其阶乘。乘。编写程序代码编写程序代码Private Sub Command1_Click()Dim ji As Long,a As Integera=Val(Text1.Text)ji=fact(a)Label2.Caption=其阶乘为:其阶乘为:&jiEnd Sub例例【8-5】Private Function fact(n As Integer)As LongDim i As In
15、tegerf=1For i=1 To nf=f*iNextfact=fEnd Function 8.3 函数(函数(Function过程)过程)例例【8-6】编写一个求两个数中较大数的函数过程。然后调用该编写一个求两个数中较大数的函数过程。然后调用该函数过程求任意两个数中较大的数。函数过程求任意两个数中较大的数。Private Function max(a As Single,b As Single)As Singlemax=IIf(a=b,a,b)End FunctionPrivate Sub Command1_Click()Dim m As Single,n As Singlem=Text
16、1.Text:n=Text2.TextLabel3.Caption=大数为:大数为:&max(m,n)End Sub 8.4过程之间的参数传递过程之间的参数传递1形式参数形式参数形式参数简称形式参数简称形参形参,是指在定义通用过程时,出现在,是指在定义通用过程时,出现在Sub或或Function语句中过程名后面圆括号内的变量名,是用语句中过程名后面圆括号内的变量名,是用来接收传送给过程的数据,形参列表中的各形式参数之间来接收传送给过程的数据,形参列表中的各形式参数之间用逗号分隔。用逗号分隔。2实际参数实际参数实际参数简称实际参数简称实参实参,是指在调用,是指在调用Sub或或Function过程
17、时,过程时,写入过程名后面圆括号内的参数。其作用是将它们的数据写入过程名后面圆括号内的参数。其作用是将它们的数据(数值或地址)传送给(数值或地址)传送给Sub或或Function过程与其对应的形过程与其对应的形参变量。实参列表可由常量、表达式、有效的变量名、数参变量。实参列表可由常量、表达式、有效的变量名、数组名(后加左右圆括号,如组名(后加左右圆括号,如Arr())组成,实参表中的各)组成,实参表中的各实际参数之间用逗号分隔。实际参数之间用逗号分隔。8.4过程之间的参数传递过程之间的参数传递在在过程调用过程调用时必须先完成时必须先完成“实参列表实参列表”与与“形参列表形参列表”的结合,即把实
18、参传递给形参,参数的传递是按实参的结合,即把实参传递给形参,参数的传递是按实参与形参对应位置进行的,不是按同名的原则进行的,与形参对应位置进行的,不是按同名的原则进行的,这就要求实参与形参在类型、个数、位置上要一一对这就要求实参与形参在类型、个数、位置上要一一对应;然后按实参执行调用的过程。应;然后按实参执行调用的过程。8.4过程之间的参数传递过程之间的参数传递在调用过程时,参数的传递有两种方式:按地址传递在调用过程时,参数的传递有两种方式:按地址传递(即传址)和按值传递(传值),其中(即传址)和按值传递(传值),其中按地址传递方按地址传递方式是默认方式式是默认方式。按值传递按值传递(传值):
19、当定义过程时在(传值):当定义过程时在形参前加上形参前加上ByVal关键字或在传递实参时实参为常量或表达式。关键字或在传递实参时实参为常量或表达式。按地址传递按地址传递(即传址):当定义过程时在(即传址):当定义过程时在形参前加上形参前加上ByRef关键字时参数的传递方式就是传址方式或缺省关键字时参数的传递方式就是传址方式或缺省没有关键字没有关键字“ByVal”。VB6.0中参数的传递方式默认中参数的传递方式默认为传址方式。为传址方式。1传值传值 将实参的数值传递给过程中对应的形参变量。将实参的数值传递给过程中对应的形参变量。按值传递参数时,按值传递参数时,Visual Basic给传递的形参
20、分给传递的形参分配一个临时的内存单元,将实参的值传递到这配一个临时的内存单元,将实参的值传递到这个临时单元中去。个临时单元中去。按值传递是单向的按值传递是单向的。如果在被调用过程中改变。如果在被调用过程中改变了形参变量的值,则只是变动了临时单元的值,了形参变量的值,则只是变动了临时单元的值,不会影响实参变量的值。当被调过程结束返回不会影响实参变量的值。当被调过程结束返回调用过程时,调用过程时,Visual Basic释放形参变量的临时释放形参变量的临时单元,实参变量的值不变。单元,实参变量的值不变。8.4过程之间的参数传递过程之间的参数传递2传址(默认方式)传址(默认方式)是一种将实参的地址传
21、递给过程中对应形参变是一种将实参的地址传递给过程中对应形参变量的方式,形参变量和实参变量具有相同的地量的方式,形参变量和实参变量具有相同的地址,址,即形参、实参共用一存储单元即形参、实参共用一存储单元。按地址传递是双向的按地址传递是双向的。如果在被调用过程中改。如果在被调用过程中改变了形参变量的值,当被调过程结束返回调用变了形参变量的值,当被调过程结束返回调用过程时,实参变量的值也改变。过程时,实参变量的值也改变。实参的使用形式决定数据的传递方式。实参的使用形式决定数据的传递方式。在过程调用时,如果实参是在过程调用时,如果实参是常量常量或或表达式表达式,无论过,无论过程定义时使用按地址传递(即
22、传址)还是按值传递程定义时使用按地址传递(即传址)还是按值传递(即传值),此时都是(即传值),此时都是按值传递方式按值传递方式将常量或表达式将常量或表达式计算的值传递给形参变量。计算的值传递给形参变量。如果在定义时是按地址传递(即传址),但调用时如果在定义时是按地址传递(即传址),但调用时想使实参按值传递,可以把想使实参按值传递,可以把实参变量加上圆括号,将实参变量加上圆括号,将其转换为表达式其转换为表达式。8.4过程之间的参数传递过程之间的参数传递例例【8-7】传址和传值方式的比较。编写交换两个数的过程程序传址和传值方式的比较。编写交换两个数的过程程序代码代码Swap1和和Swap2。Swa
23、p1按地址传递参数,按地址传递参数,Swap2按值传按值传递参数。运行程序,观察它们的区别。递参数。运行程序,观察它们的区别。创建过程:创建过程:(1)新建一个工程,在)新建一个工程,在窗体中添加两个命令按钮,窗体中添加两个命令按钮,并按图设置有关的对象属并按图设置有关的对象属性。性。8.4过程之间的参数传递过程之间的参数传递(2)编写两个过程)编写两个过程Swap1和和Swap2:Sub Swap1(x As Integer,y As Integer)Dim t As Integert=x:x=y:y=tEnd SubSub Swap2(ByVal x As Integer,ByVal y
24、As Integer)Dim t As Integert=x:x=y:y=tEnd Sub(3)编写两个命令按钮单击事件过程如下:)编写两个命令按钮单击事件过程如下:Private Sub Command1_Click()Print 按地址传递按地址传递Dim a As Integer,b As Integera=10:b=20Print 两数交换前:两数交换前:a=;a;b=;bSwap1 a,bPrint 两数交换后:两数交换后:a=;a;b=;bEnd SubPrivate Sub Command2_Click()Print 按值传递按值传递Dim a As Integer,b As I
25、ntegera=10:b=20Print 两数交换前:两数交换前:a=;a;b=;bSwap2 a,bPrint 两数交换后:两数交换后:a=;a;b=;bEnd Sub 8.4过程之间的参数传递过程之间的参数传递实参实参 a b 实参实参 a b形参形参 x y 形参形参 x y 改变前改变前 改变后改变后 图图8-10 按地址传递参数示意图按地址传递参数示意图 10202010实参实参 a b 实参实参 a b 形参形参 x y 形参形参 x y 改变前改变前 改变后改变后 图图8-11 按数值传递参数示意图按数值传递参数示意图1020201010201020形参、实参一块变形参、实参一块
26、变形参变、实参不变形参变、实参不变 8.4过程之间的参数传递过程之间的参数传递例例【8-8】下面程序是在窗体单击事下面程序是在窗体单击事件中,五次调用子过程件中,五次调用子过程Sxyz,每次,每次使用了不同的实际参数。请认真阅使用了不同的实际参数。请认真阅读此程序,分析程序的输出结果。读此程序,分析程序的输出结果。Private Sub Sxyz(a As Integer)a=a+5Print a=;a,End SubPrivate Sub Form_Click()Dim x As Integer,y As Integer,z As Integerx=10:y=20Print“1:x=;x;x
27、=10Sxyz x+y 实参是用表达式实参是用表达式,按值传递方式传递参数按值传递方式传递参数,a=35Print“x=;x x=10Printz=x+yPrint 2:z=;z;z=30Sxyz z 实参是用变量实参是用变量,按地址传递方式传递参数按地址传递方式传递参数,a=35 8.4过程之间的参数传递过程之间的参数传递Print z=;z z=35PrintPrint 3:x=;x;x=10Sxyz x+5 实参是用表达式实参是用表达式,按值传递方式传递参数按值传递方式传递参数,a=20Print x=;x x=10PrintPrint 4:x=;x;x=10Sxyz(x)实参是用括号强
28、行转换表达式实参是用括号强行转换表达式,按值传递方式传递参数按值传递方式传递参数,a=15Print x=;x x=10PrintPrint 5:x=;x;x=10Sxyz x 实参是用变量实参是用变量,按地址传递方式传递参数按地址传递方式传递参数,a=15Print x=;x x=15End Sub 8.4过程之间的参数传递过程之间的参数传递例例【8-9】编写程序,求任意两个正整数的最大公约数编写程序,求任意两个正整数的最大公约数和最小公倍数。和最小公倍数。编程思路:编程思路:求最大公约数可以使用求最大公约数可以使用“辗转相除法辗转相除法”其步骤是:其步骤是:(1)以大数)以大数m作为被除数
29、,小数作为被除数,小数n作为除数,相除后作为除数,相除后余数为余数为r。(2)若)若r不为零,则不为零,则m n,n r,继续相除得到新的,继续相除得到新的r。若。若r不为零,则重复此过程,直到不为零,则重复此过程,直到r=0。(3)最后的)最后的n(除数除数)就是最大公约数就是最大公约数。mn*n m最小公倍数最大公约数思考思考m、n为何值?为何值?8.4过程之间的参数传递过程之间的参数传递mn流程图流程图 8.4过程之间的参数传递过程之间的参数传递mn编程步骤:编程步骤:(1)新建一工程,)新建一工程,在窗体上添加四个在窗体上添加四个标签、两个文本框标签、两个文本框和一个命令按钮并和一个命
30、令按钮并设置有关对象属性设置有关对象属性如图所示。如图所示。(2)根据编程思路,编写如下求)根据编程思路,编写如下求最大公约数的函数过程:最大公约数的函数过程:Function Hef(ByVal m As Long,ByVal n As Long)As Long Dim r As Long,t As Long If m n Then t=m:m=n:n=t End If r=m Mod n Do While r 0 m=n n=r r=m Mod n Loop Hef=n 函数返回最大公约数函数返回最大公约数 End Function 8.4过程之间的参数传递过程之间的参数传递mn(3)编写
31、命令按钮的单击事件过程如下:)编写命令按钮的单击事件过程如下:Private Sub Command1_Click()Dim a As Long,b As LongDim c As Long,d As Longa=Val(Text1.Text)b=Val(Text2.Text)c=Hef(a,b)Label3=最大公约数最大公约数:&Str(c)d=a*b/cLabel4=最小公倍数最小公倍数:&Str(d)End Sub请注意:如果使用按地址传递参数方法定义函数,在计算最小公请注意:如果使用按地址传递参数方法定义函数,在计算最小公倍数时,就得不到正确的结果,为什么?。倍数时,就得不到正确的结
32、果,为什么?。8.4过程之间的参数传递过程之间的参数传递mnVisual Basic允许参数是数组,数组只能通过允许参数是数组,数组只能通过传址传址的方式进行传递。在传递数组时要的方式进行传递。在传递数组时要注意注意:(1)在实参列表和形参列表中放入数组名,忽略)在实参列表和形参列表中放入数组名,忽略维数的定义,但圆括号不能省略。维数的定义,但圆括号不能省略。(2)如果被调用过程不知道实参数组的上下界,)如果被调用过程不知道实参数组的上下界,可用可用LBound和和UBound函数来确定实参的下界和函数来确定实参的下界和上界。上界。(3)实参数组和形参数组类型必须一致。实参和)实参数组和形参数
33、组类型必须一致。实参和形参的结合是按地址传递,即形参数组和实参数形参的结合是按地址传递,即形参数组和实参数组共用一段内存单元。组共用一段内存单元。8.4过程之间的参数传递过程之间的参数传递mn例例【8-10】改写上章例改写上章例【7-5】排序程序。用子过程排序程序。用子过程Sort()来来排序(流程图见图),用子排序(流程图见图),用子过程过程GetData产生产生N个随机整个随机整数,用子过程数,用子过程PrintData()输输出出N个数据元素。个数据元素。子过程子过程Sort()的流程图的流程图 8.4过程之间的参数传递过程之间的参数传递mnPrivate Sub Form_Click(
34、)D i m x(1 To 1 0)A s IntegerGetData x()Print 排序前的数据:排序前的数据:PrintData x()PrintSort x()Print 排序后的数据:排序后的数据:PrintData x()End SubPrivate Sub Sort(a()As Integer)Dim i As Integer,j As Integer,n As Integer,temp As Integern=UBound(a)k=LBound(a)For i=k To n-1 i控制轮次控制轮次 For j=k To n-i 对对N-i 个元个元素两两比较素两两比较 If
35、 a(j)a(j+1)Then 若次序不对,若次序不对,则马上交换位置则马上交换位置 temp=a(j)a(j)=a(j+1)a(j+1)=temp End If Next jNext iEnd Sub 8.4过程之间的参数传递过程之间的参数传递mnPrivate Sub GetData(a()As Integer)Dim i As Integer,n As Integern=UBound(a)k=LBound(a)For i=k To na(i)=Int(Rnd*90)+10NextEnd SubPrivate Sub PrintData(a()As Integer)Dim i As Int
36、eger,n As Integern=UBound(a)k=LBound(a)For i=k To nPrint a(i);NextEnd Sub8.4过程之间的参数传递过程之间的参数传递mn1可选参数可选参数用户在定义子过程或函数时可以定义可选参数。要用户在定义子过程或函数时可以定义可选参数。要指定某个形参为可选参数,在形参变量前加入关键指定某个形参为可选参数,在形参变量前加入关键字字Optional即可。即可。如果一个过程某个形参为可选参数,则在调用此过如果一个过程某个形参为可选参数,则在调用此过程时可以不提供对应于这个形参的实参,并可以使程时可以不提供对应于这个形参的实参,并可以使用用V
37、isual Basic的内部函数的内部函数IsMissing来测试过程来测试过程被调用时某个参数是否被省略。还可以指定可选参被调用时某个参数是否被省略。还可以指定可选参数的默认取值。数的默认取值。如果一个过程有多个形参,当它的一个形参被设定如果一个过程有多个形参,当它的一个形参被设定为可选参数,则这个参数后面的其他参数也必是可为可选参数,则这个参数后面的其他参数也必是可选的,并且要用选的,并且要用Optional关键字来声明。关键字来声明。8.4过程之间的参数传递过程之间的参数传递mn1可选参数可选参数例例【8-11】可选参数的使用。可选参数的使用。Private Function Sum(a
38、 As Integer,b As Integer,Optional c As Integer)As IntegerDim s As IntegerIf IsMissing(c)Then 参数参数c被省略则执行被省略则执行s=a=bs=a+bElses=a+b+cEnd IfSum=sEnd FunctionPrivate Sub Form_Click()Print Sum(1,2,3)提供了可选参数,输出结果为提供了可选参数,输出结果为6Print Sum(1,2)未提供可选参数,输出结果为未提供可选参数,输出结果为3 End Sub 8.4过程之间的参数传递过程之间的参数传递mn1可选参数可
39、选参数例例【8-12】指定可选参数的默认值。指定可选参数的默认值。Private Function Sum(a As Integer,b As Integer,Optional c As Integer=5)As IntegerDim s As Integers=a+b+cSum=sEnd FunctionPrivate Sub Form_Click()Print Sum(1,2,3)提供了可选参数提供了可选参数Print Sum(1,2)未提供可选参数,用默认值未提供可选参数,用默认值5End Sub程序运行后,单击窗体的输出结果为:程序运行后,单击窗体的输出结果为:6 88.4过程之间的参
40、数传递过程之间的参数传递mn2不确定参数不确定参数一般说来,过程调用中的参数个数应等于过程定义的参数一般说来,过程调用中的参数个数应等于过程定义的参数个数。如果使用个数。如果使用ParamArray关键字,则过程可以接受任关键字,则过程可以接受任意个数的参数。意个数的参数。例例【8-13】编写一个计算任意多个数据总和的编写一个计算任意多个数据总和的Sum函数,然后进行简函数,然后进行简单应用。单应用。Private Sub Form_Click()Print Sum(1,2,3)Print Sum(1,2,3,4,5)End SubPrivate Function Sum(ParamArray
41、 a()As IntegerDim i As Integer,s As Integers=0For i=LBound(a)To UBound(a)s=s+a(i)NextSum=sEnd Function 8.5 过程和变量的作用域过程和变量的作用域mn各种控件各种控件函数过程(函数过程(Functionn)Sub过程过程事件过程事件过程一个或若干个窗体一个或若干个窗体模块文件(模块文件(.frm)一个或若干个标准一个或若干个标准模块文件(模块文件(.bas)类模块文件(类模块文件(.cls)VB工程工程(*.Vbp)1.Sub过程过程2.事件过程事件过程图图8-18 Visual Basic
42、的应用程序的结构的应用程序的结构 8.5 过程和变量的作用域过程和变量的作用域mn1窗体模块窗体模块每个窗体对应一个窗体模块,窗体模块包含窗体及每个窗体对应一个窗体模块,窗体模块包含窗体及其控件的属性设置、窗体变量的说明、事件过程、其控件的属性设置、窗体变量的说明、事件过程、窗体内的通用过程、外部过程的窗体级声明。窗体内的通用过程、外部过程的窗体级声明。窗体模块保存在扩展名为窗体模块保存在扩展名为.frm的文件中。默认时应的文件中。默认时应用程序中只有一个窗体,因此有一个以用程序中只有一个窗体,因此有一个以.frm为扩展为扩展名的文件。如果应用程序有多个窗体,就会有多个名的文件。如果应用程序有
43、多个窗体,就会有多个以以.frm为扩展名的窗体模块文件。为扩展名的窗体模块文件。8.5 过程和变量的作用域过程和变量的作用域mn2标准模块标准模块简单的应用程序可以只有一个窗体,应用程序的所简单的应用程序可以只有一个窗体,应用程序的所有代码都存放在窗体模块中。有代码都存放在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。而当应用程序庞大复杂时,就要另加窗体。当在几个窗体中都有要执行的公共代码,又不希望当在几个窗体中都有要执行的公共代码,又不希望在两个窗体中重复相同的代码时,这就需要创建一在两个窗体中重复相同的代码时,这就需要创建一个独立的模块,它包含公共代码。这个独立的模块个独立的模块,它包
44、含公共代码。这个独立的模块就是就是标准模块标准模块。标准模块保存在文件扩展名为标准模块保存在文件扩展名为.bas的文件中,缺省的文件中,缺省时应用程序中不包含标准模块。时应用程序中不包含标准模块。8.5 过程和变量的作用域过程和变量的作用域mn2标准模块标准模块在工程中添加标准模块的步骤为:在工程中添加标准模块的步骤为:(1)从)从“工程工程”菜单中执行菜单中执行“添加模块添加模块”命令,则打命令,则打开开“添加模块添加模块”对话框中的对话框中的“新建新建”选项卡,如图选项卡,如图8-22所示。所示。(2)在该对话框中双击)在该对话框中双击“模块模块”图标,将打开新建标图标,将打开新建标准模块
45、窗口,如图准模块窗口,如图8-23所示所示(3)新 添 加 的 第 一 个 标 准 模 块,其 名 称 为)新 添 加 的 第 一 个 标 准 模 块,其 名 称 为“Module1”,可以通过属性窗口,给模块命名。接下,可以通过属性窗口,给模块命名。接下来就是在标准模块的代码窗口编写程序。来就是在标准模块的代码窗口编写程序。8.5 过程和变量的作用域过程和变量的作用域mn3类模块类模块在在Visual Basic中类模块(文件扩展名为中类模块(文件扩展名为.cls)是)是面向对象编程的基础。面向对象编程的基础。可在类模块中编写代码建立新对象,这些新对象可可在类模块中编写代码建立新对象,这些新
46、对象可以包含自定义的属性和方法,可以在应用程序内的以包含自定义的属性和方法,可以在应用程序内的过程中使用。过程中使用。8.5 过程和变量的作用域过程和变量的作用域mn1模块级过程模块级过程模块级过程是在某个模块(文件)内定义的过程,模块级过程是在某个模块(文件)内定义的过程,在在Sub或或Function前加关键字前加关键字Private,则该过程只,则该过程只能在本模块中定义的过程调用,即其作用域为本模能在本模块中定义的过程调用,即其作用域为本模块(文件)。块(文件)。过程的作用域分为模块级(或称文件级)和全局过程的作用域分为模块级(或称文件级)和全局级(或称工程级或项目级)级(或称工程级或
47、项目级)8.5 过程和变量的作用域过程和变量的作用域mn2全局级过程全局级过程全局级过程是在定义过程时,在全局级过程是在定义过程时,在Sub或或Function前加前加关键字关键字Public(可以(可以默认默认),则该过程能在整个应用),则该过程能在整个应用程序的所有模块定义的过程调用,即程序的所有模块定义的过程调用,即其作用域为整个其作用域为整个应用程序(工程)应用程序(工程)调用时的规则如下:调用时的规则如下:在标准模块内定义的公有过程,调用时只需写出过程名在标准模块内定义的公有过程,调用时只需写出过程名和所需参数;和所需参数;如果是在如果是在窗体模块内定义窗体模块内定义的公有过程,那么
48、的公有过程,那么其他窗体其他窗体来来调用它时,应在过程名前指明它所在的窗体;调用它时,应在过程名前指明它所在的窗体;在不同模块中定义的全局级过程可以同名,调用时如果在不同模块中定义的全局级过程可以同名,调用时如果在过程名前一律加上模块名,则不论什么情况都没问题。在过程名前一律加上模块名,则不论什么情况都没问题。8.5 过程和变量的作用域过程和变量的作用域mn例例【8-14】模块级、全局级过程的使用。模块级、全局级过程的使用。应用程序(工程)包括一个窗体,在窗体代码窗口的应用程序(工程)包括一个窗体,在窗体代码窗口的代码如下:代码如下:Public Function Area(x As Sing
49、le,y As Single)Area=x*yEnd FunctionPrivate Sub Command1_Click()Dim a As Single,b As Singlea=Val(Text1.Text)b=Val(Text2.Text)Label3=Area(a,b)End Sub8.5 过程和变量的作用域过程和变量的作用域mn表表8-1 不同作用范围的两种过程定义及调用规则不同作用范围的两种过程定义及调用规则全局级全局级模块级模块级定义位置定义位置窗体窗体标准模块标准模块窗体窗体标准模块标准模块定义方式定义方式在过程名前加在过程名前加Public或省或省略略在过程名前加在过程名前
50、加Private能否被本模能否被本模块其他过程块其他过程调用调用能能能能能能能能能否被本应能否被本应用程序其他用程序其他模块调用模块调用能,但必须能,但必须在过程名前在过程名前加窗体名加窗体名能,但过程能,但过程名必须唯一,名必须唯一,否则要在过否则要在过程前加标准程前加标准模块名模块名不能不能不能不能 说明:说明:(1)全局级过程若是在窗体模块中定义)全局级过程若是在窗体模块中定义,其他模块的过其他模块的过程要调用程要调用,必须在该过程名前加该过程所处的窗体名。必须在该过程名前加该过程所处的窗体名。例如,例如,在窗体在窗体Form1中调用窗体模块中调用窗体模块Form2中的名为中的名为Myf