1、过程概述 2、函数过程 3、子过程 4、过程的使用 5、传递参数 6、过程的嵌套 第六章 过程 1、过程概述 2、函数过程 3、子过程 4、过程的使用 5、传递参数 6、过程的嵌套
过程的概述 将程序分割成较小的逻辑部件就可以简化程序设计任务,这些部件称为过程 过程分类: 1、子过程 2、函数过程 3、属性过程 4、事件过程
引例 已知多边形的各条边的长度,要计算多边形的面积。 计算多边形面积,可将多边形分解成若干个三角形。 计算三角形面积的公式如下: x y z 定义函数过程area: Public Function area(x!, y!, z!) As Single Dim c! c = 1 / 2 * (x + y + z) area = Sqr(c * (c - x) * (c - y) * (c - z)) End Function 调用函数过程: Sub command1_click() …… 输入若干个三角形边长 S=area(a,b,c)+area(c,d,e) S=S+area(e,f,g) Print S End Sub
函数过程 1、除了系统提供的内部属性过程和事件过程外,用户可自定义过程: 以Sub保留字开始的为子过程; 以Function保留字开始的为函数过程 例:要将一个十进制数转换成二到十六进制数,定义函数TranDec。 Public Function TranDec$(ByVal m%, ByVal r%) Dim StrDtoR$ Dim mr% strDto = "" Do While m <> 0 mr = m Mod r m = m \ r If mr >= 10 Then StrDtoR = Chr(mr - 10 + 65) & StrDtoR Else StrDtoR = mr & StrDtoR End If Loop TranDec = StrDtoR End Function 例:6-1
2.函数过程的定义 自定义函数过程有两种方法: (1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架。 (2)利用代码窗口直接定义。 函数过程形式: Function 函数过程名([参数列表]) [As 类型] 局部变量或常数定义 语句块 函数名 = 返回值 函数过程体 [Exit Function] 函数名 = 返回值 End Function 函数过程名:命名规则同变量名 参数列表形式: [ByVal]变量名[()][As 类型] 称为形参或哑元,仅表示参数的个数、类型,无值。 函数名 = 返回值 在函数体内至少对函数名赋值一次。 [Exit Function] : 表示退出函数过程。
3.函数过程的调用 函数过程调用同标准函数调用,形式:函数过程名([参数列表]) 参数列表:称为实参或实元,它必须与形参个数相同,位置与类型一一对应。可以是同类型的常量、变量、表达式。
子 过 程 1、子过程定义 Sub 子过程名[(参数列表)] 局部变量或常数定义 语句 [Exit Sub] End Sub 2.子过程的调用 子过程名 [参数列表] 或 Call 子过程名(参数列表) 3.子过程与函数过程区别: (1)函数过程名有值,有类型,在函数体内至少赋值一次; 子过程名无值,无类型,在子过程体内不能对子过程名赋值; (2)调用时,子过程调用是一句独立的语句。 函数过程不能作为单独的语句加以调用,必须参与表达式运算。 (3)一般当过程有一个函数值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观。
例: 编写一子过程del(s1,s2),将字符串s1中出现的s2子字符串删去,结果仍存放在s1中。 Private Sub del(s1 As String, ByVal s2 As String) Dim i% i = InStr(s1, s2) ls2 = Len(s2) Do While i > 0 s1 = Left(s1, i - 1) + Mid(s1, i + ls2) Loop End Sub 例:6-2
时钟控件 P134 重要属性:enabled 、 Interval Interval决定间隔多少时间激发计时器事件,单位是毫秒,当为0时,则屏蔽计时器 重要事件:timer事件 例7-4 例6-4
6.3 参数传递P117 Sub Swap2(x%, y%) t% = x: x = y: y = t End Sub 指主调过程的实参传递给被调过程的形参。 1. 传址与传值 传址:用byref,或默认 形参得到的是实参的地址,当形参值的改变同时也改变实参的值。 传值:用byval 形参得到的是实参的值,形参值的改变不会影响实参的值。 例 两个变量的交换。 Sub Swap1(ByVal x%, ByVal y%) t% = x: x = y: y = t End Sub Private Sub Command1_Click() a% = 10: b% = 20: Swap1 a, b '传值 Print "A1="; a, "B1="; b a = 10: b = 20: Swap2 a, b '传址 Print "A2="; a, "B2="; b 例:6-7 药品价格 Sub Swap2(x%, y%) t% = x: x = y: y = t End Sub
当参数是数组通过传址方式进行传递。注意: 2. 数组参数的传递 当参数是数组通过传址方式进行传递。注意: 在实参和形参中写数组名,忽略维数的定义,但圆括号不能省。 被调过程可通过Lbound和Ubound函数确定实参数组的下、上界。 Lbound和Ubound函数的形式如下: {L|U}bound(数组名[,维数]) 其中:维数指明要测试的是第几维的下标值,缺省是一维数组。 例:6-6
使用过程注意事项: 1. 确定自定义的过程是子过程还是函数过程 函数过程名有值,子过程名无值。 2.过程中形参的个数和传递方式的确定 过程中参数的作用是实现过程与调用者的数据通信。 (1)从主调程序获得初值,值传递。 (2)将结果返回给主调程序,地址传递。 3. 实参与形参结合时对应问题 个数、类型、位置、次序一一对应。 形参是值传递,对应实参可以是表达式、常量、数组元素。 形参是地址传递,对应实参只能是简单变量。 数组、记录类型、对象只能是地址传递。
过程的嵌套调用 过程嵌套调用的执行原理如图所示(其中带圆圈的数值为执行步骤): 例6-10 事件过程 ··· Call 过程一 End Sub Sub 过程一 Call 过程二(y) Sub 过程二(n) ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ 例6-10