第六章 过 程(8学时)
一、教学内容
本章讨论VB6.0中Sub子过程和Function过程的定义与调用以及过程调用中数据传递的方式。
二、目的要求
通过对本章的学习,使学生掌握子过程(Sub过程的定义、调用);掌握函数过程(Function过程)的定义、调用;了解值传递、地址传递的传递规则。
三、教学重点与难点
教学重点:1.Sub过程及Function过程的定义与调用
2.过程调用中数据的传递。
教学难点:过程调用中数据的传递。
四、教学方法
课堂教学为主。适当提问,加深学生对概念的理解。
6.1 Sub过程 (2学时)
一、教学内容
本节介绍事件过程和通用过程的区别,通用过程的定义以及通用过程的调用。
二、目的要求
了解事件过程和通用过程的区别,掌握通用过程的定义以及通用过程的调用。
三、教学重点与难点
教学重点:通用过程的定义以及通用过程的调用。
教学难点:通用过程的调用
四、教学方法
课堂教学。
五、教学过程
在VB中,的Sub子过程分为:事件过程和通用过程
6.1.1 事件过程
(1)窗体事件的语法
Private Sub Form_事件名(参数列表)
<语句组>
End Sub
(2)控件事件的语法
Private Sub 控件名_事件名(参数列表)
<语句组>
End Sub
6.1.2 通用过程(Sub过程)的定义
1.子过程的定义形式如下:
[Public|Private][Static] Sub 子过程名([形参表])
<局部变量或常数定义>
<语句组>
[Exit Sub]
<语句组>
End Sub
说明:
(1)子过程名:命名规则与变量名规则相同。子过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。
(2)形式参数列表:形式参数通常简称“形参”,仅表示形参的类型、个数、位置,定义时是无值的,只有在过程被调用时,虚实参结合后才获得相应的值。
(3)过程可以无形式参数,但括号不能省。
(4)参数的定义形式:
[ByVal|ByRef]变量名[( )][As 类型][,…],
ByVal表示当该过程被调用时,参数是按值传递的;缺省或ByRef表示当该过程被调用时,参数是按地址传递的。
提问1:如何编写一个交换两个整型变量值的子过程。
2.通用过程的建立
6.1.3 过程的调用
1、用Call语句调用Sub过程
格式:Call 子过程名(参数列表)
2、把过程名作为一个语句来使用
格式:子过程名 [参数列表]
说明:
(1)参数列表称为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。
(2)调用时把实参值传递给对应的形参。其中值传递(形参前有ByVal说明)时实参的值不随形参的值变化而改变。而地址传递时实参的值随形参值的改变而改变。
(3)当参数是数组时,形参与实参在参数声明时应省略其维数,但括号不能省。
(4)调用子过程的形式有两种,用Call关键字时,实参必须加圆括号括起,反之则实参之间用“,”分隔。
提问2:如何调用提问1写出的过程?
七、作业 P154 习题6.1、6.10
6.2 Function过程 (2学时)
一、教学内容:本节将介绍Function过程的定义以及调用过程
二、教学重点:Function过程的定义以及调用过程
三、教学难点:Function过程的调用过程
四、教学方法:课堂教学为主,并适当提问、收集学生学习情况。
五、教学要求:掌握Function过程的定义以及调用过程
六、教学过程:
Visual Basic函数分为内部函数和外部函数,外部函数是用户根据需要用Function关键字定义的函数过程,与子过程不同的是函数过程将返回一个值 。
6.2.1 函数过程(Function过程)的定义
[Public|Private][Static]Function 函数名([<参数列表>])[As<类型>]
<局部变量或常数定义>
<语句块>
[函数名=返回值]
[Exit Function]
<语句块>
[函数名=返回值]
End Function
说明:
(1)函数名:命名规则与变量名规则相同。
(2)在函数体内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语句来实现的,在函数过程中至少要对函数名赋值一次。
(3)AS类型:是指函数返回值的类型,若省略,则函数返回变体类型值(Variant)。
(4)Exit Function:表示退出函数过程,常常是与选择结构(If或Select Case语句)联用,即当满足一定条件时,退出函数过程。
(5)形参数列表:形参的定义与子过程完全相同。
提问1:如何编写一个编写一个求圆面积的函数?
函数的调用
调用形式如下:
函数名(实参列表)
说明:
在调用时实参和形参的数据类型、顺序、个数必须匹配。函数调用只能出现在表达式中,其功能是求得函数的返回值。
提问2:如何调用求圆面积的函数?
七、作业 P154 习题6.3-6.6
6.3 参数的传递 (2学时)
一、教学内容:本节简要地介绍了形参与实参,可选参数与可变参数,数组和记录参数的传递,对象参数的传送,重点讲解了参数的传递方式
二、教学重点:形参与实参、参数的传递方式。
三、教学难点:参数的传递方式。
四、教学方法:课堂教学为主,注意结合例子进行讲解。
五、教学要求:掌握形参与实参的定义,可选参数与可变参数的定义,数组和记录参数的传递方式,对象参数的传送方式,尤其是参数的两种传递方式。
六、教学内容:
Visual Basic中不同模块(过程)之间数据的传递有两种方式:
通过过程调用实参与形参的结合实现;
使用全局变量来实现各过程中共享数据。
6.3.1 形参与实参
1、形式参数
是指在定义通用过程时,出现在Sub或Function语句中的变量名后面园括号内的数,是用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔。
2、实际参数
实际参数是指在调用Sub或Function过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形参变量。
6.3.2 参数传递(虚实结合)
参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:按值传递、按地址传递。形参前加“ByVal”关键字的是按值传递,缺省或加“ByRef”关键字的为按地址传递。
传址与传值
传址: 形参得到的是实参的地址,当形参值的改变同时也改变实参的值。
传值: 形参得到的是实参的值,形参值的改变不会影响实参的值。
6.3.3 数组作过程的参数
Visual Basic允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:
1.为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。
Private Sub Sort(a() As single)
……
End Sub
其中形参“a( )”即为数组。
2.被调过程可通过Lbound和Ubound函数确定实参数组的上、下界。
3.当用数组作形参时,对应的实参必须也是数组,且类型一致。
4.实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。
【例6.1】定义了实参数组b(1 to 8),给它们赋了值,调用Sort()函数过程的形式如下:
Sort b( ) 或 Call Sort( b() )
实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。
调用时形参数组a和实参数组b虚实结合,共用一段内存单元,如图所示。因此在Sort()过程中改变数组a的各元素值,也就相当于改变了实参数组b中对应的元素的值,当调用结束时,形参数组a成为无定义。
? b(1) b(2) b(3) b(4) b(5) b(6) b(7) b(8)
a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8)
参数为数组时虚实结合示意图
【例6.2】在窗体层声明数组:Dim Values () As Integer
编写如下通用过程:
Static Sub changeArray (Min%,Max%,p() As Integer)
For i%=Min% To Max%
p(i%)=i% ^ 3
Next i%
End Sub
Static Sub PrintArray (Min%,Max%,p() As Integer)
For i%=Min% To Max%
Print p (i%)
Next i%
End Sub
编写如下事件过程:
Sub Form_Click()
ReDim Values (1 To 5) As Integer
Call changeArray (1,5,Values ())
Call PrintArray (1,5,Values ())
End Sub
【例6.3】 编写一个Function过程,求数组的最大值。
求数组最大值的通用过程如下:
Private Function FindMax (a() As Integer)
Dim Start As Integer,Finish As Integer
Dim i As Integer
Start=Lbound (a)
Finish=Ubound (a)
Max=a (Start)
For i=Start To Finish
If a (i) > Max Then Max=a (i)
Next i
End Function
该过程先求出数组的上界和下界,然后从整个数组中找出最大值。过程中的数组是一个形式参数,可以在下面的事件过程中调用该过程:
Sub Form_Click ()
ReDim b (4) As Integer
b (1)=30
b (2)=80
b (3)=234
b (4)=874
c=FindMax (b ())
Print c
End Sub
执行程序后,单击窗体,输出结果为:874。
6.3.5 对象参数的传送
Visual Basic还允许用对象(窗体或控件)作为通用过程的参数。其格式为:
Sub 过程名(形参表)
语句块
[Exit Sub]
语句块
End Sub
“形参表”中形参的类型通常为Control和Form。注意,在调用含有对象的过程时,对象只能通过传地址方式传送。因此在定义过程时,不能在其参数前加关键字ByVal。
1. 窗体参数的传送
2. 控件参数的传送
【例6.5】 编写一个通用过程,在过程中设置字体属性,并调用该过程显示指定的信息。
Sub Fontout (TestCtrl1 As Control,TestCtrl2 As Control)
TestCtrl1.FontSize=16
TestCtrl1.FontName=(隶书(
TestCtrl1.FontItalic=True
TestCtrl1.FontBold=True
TestCtrl1.FontUnderline= False
TestCtrl2.FontSize=18
TestCtrl2.FontName=(Times new Roman”
TestCtrl2.FontItalic=False
TestCtrl2.FontUnderline=False
End Sub
上述过程有两个参数,其类型均为Control。该过程用来设置控件上所显示的文字的各种属性。为了调用该过程,在窗体上建立两个文本框,然后编写如下的事件过程:
Private Sub Form_Load ()
Text1.Text=(欢迎光临(
Text2.Text=(中国 武汉光谷(
End Sub
Private Sub Form_Click ()
Fontout Text1 ,Text2
End Sub
运行上面的程序,单击窗体,执行结果如P150页图6.9所示。
七、作业 P154 习题6.7-6.9
6.4 过程的作用域 (2学时)
一、教学内容
本节介绍代码的模块以及过程的作用域
二、目的要求
了解VB6.0中的三个模块的功能与结构,掌握过程的作用域。
三、教学重点与难点
教学重点:过程的作用域
教学难点:过程的作用域
四、教学方法
课堂教学。
五、教学过程
6.4.1 代码的模块
一般来说,VB应用程序由窗体模块、标准模块和类模块组成。这三个模块中都可以包含声明和过程,它们形成了工程的一种模块层次结构,既便于较好地组织工程,也便于代码的维护。
1. 窗体模块
2. 标准模块
3. 类模块
6.4.2 过程的作用域
如果使用Public关键字定义过程,那么所有模块(包括窗体模块、标准模块和类模块)中的过程都可以调用该过程,这样的过程称作公有过程
如果使用Private关键字定义过程,那么只有与该过程定义在同一个模块中的其它过程才能调用该过程,而其它模块中的所有过程却不能够调用该过程,就像它根本不存在一样,这样的过程称作私有过程。
Static,它的作用是把函数中使用的所有局部变量都转换为静态变量,这样,在每次调用这个过程时,系统将保留这些局部变量的值。省略该关键字时,过程调用完毕后,系统将释放局部变量。Static关键字对所声明过程之外的变量不起作用。
六、作业 作业 P154 习题6.16