第9第 第 第 主主主主 第第第第:主主主主主主主主主主主主主主主 主主主主主主主主主 主主主 主主主主主 一,一 主主 主主主 主主主主 主主主主主主主主主主主主 ,一,。 Visual Basic 主主主主主主主主主主 主主主主主主主主主主主主 主主主主 ,, Sub 主主 主主主主 , Function 主 主 主主主主主主主 。 Visual Basic 主主主主主主主主主主主。
Jan 11, 2016
第 9章 过 程
主要内容
通用过程:多个不同的事件过程可能需要使用一段相同的程序代码,把这一段代码独立出来,作为一个过程,这样的过程叫做通用过程。
Visual Basic中的通用过程分为两类,即子程序过程和函数过程,前者叫做 Sub过程,后者叫做 Function过程。本章介绍如何在 Visual Basic应用程序中使用通用过程。
9.1 Sub 过程
9.1.1 建立 Sub 过程 定义:[Static][Private][Public] Sub 过程名 [( 参数表
列 )]
语句块 [Exit Sub] [ 语句块 ]End Sub
说明: 过程是以 Sub 开头,以 End Sub 结束的一段程序,在这两句之间是语句块,
称为“过程体”或“子程序体”。 Static :可选的。表示在调用时保留 Sub 过程的局部变量的值,即此过程中
的局部变量为静态的。 Static 属性对在 Sub 外声明的变量不会产生影响,即使过程中也使用了这些变量。
Private :可选的。定义私有过程。表示只能被本模块中的其它过程访问。 Public :可选的。可以在程序的任何地方调用它。表示这一过程为公有过程。
在窗体层使用 Public 定义的模块在其它模块中使用时应该加上窗体名称。各窗体通用的过程一般在标准模块中用 Public 定义。
过程名:必需的。遵循标准的变量命名约定。且不能和变量重名。 参数表列:由多个参数组成,参数之间用逗号分隔,这里的参数通常称为形式
参数。当过程被调用时,调用过程的命令将数据传送给这里的参数,参数格式如下:
[ByVal | ByRef] 变量名 [( )] [As type] Exit Sub: 在运行时,运行到此命令时,程序返回调用此过程的下一条命令执
行。 End Sub: 表示过程结束。 过程定义不可以嵌套。也不能使用 GoTo 语句进入 Sub 过程。过程只能通过
调用来执行。在过程程序的内部可以调用其它过程。(定义不能嵌套,调用可以嵌套。)
建立:方法 1 :执行“工具”—“添加过程”命令方法 2 :在代码窗口中直接键入 Sub “ 过程
名”
9.1.2 调用 Sub 过程
1. 用 Call语句调用 Sub过程:格式: Call 过程名 [( 实际参数 )]例: Call Tryout(a,b)
2. 把过程名作为一个语句来使用 例: Tryout a,b
若省略关键字 Call “ ”,则必须去掉 实际参数 的括号。
例 9.1Sub RecArea(Rlen, Rwid) Dim Area Area = Rlen * Rwid MsgBox "Total Area is " & AreaEnd Sub
Private Sub Command1_Click() a = Val(InputBox("length=?")) b = Val(InputBox("width=?")) RecArea a, bEnd Sub
9.1.3 通用过程与事件过程
• 事件过程不能由用户任意定义,只能由系统指定。• 通用过程可以放在标准模块中,也可以放在窗体模块中,而事件过程只能放在窗体模块中,不同模块中的过程(包括事件过程和通用过程)可以互相调用。
• 当在一个模块中调用其他模块中的过程时 ,被调用的“ ”过程必须是 公有的 (Public)。
• 如果两个标准模块中含有相同的过程名,或是调用其他窗体中的过程时,调用时必须用模块名限定:模块名 .过程名 (参数表 )
9.2 Function 过程
9.2.1 建立 Function 过程
定义:[Static][Private][Public] Function 过程名 [( 参数表列 )][As 类
型 ]
[ 语句块 ]
[ 过程名=表达式 ]
[Exit Function]
[ 语句块 ]
End Function
9.2.2 调用 Function 过程 可以像使用 VB内部函数一样来调用 Function过程。例 9.3 求最大公约数。
Private Sub Form_Click() Dim a As Integer, b As Integer a = 96: b = 64 x = gcd(a, b) Print "GCD ="; xEnd Sub
Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer Do While y <> 0 remainder = x Mod y x = y y = remainder Loop gcd = xEnd Function
Visual Basic 应用程序中的过程
9.3 参数传送
9.3.1 形参与实参 按位置传送参数:
要求形参和实参的位置次序必须一致。在传送时形参和实参的变量名可以不同,但是参数个数、数据
类型、对应位置必须一致。 指名传送参数
显式地指出与形参结合的实参,把形参和实参用“ :=” 连起来。例: Private Sub Stu(StuNo As String, StuName As String,
StuComputer As Integer) ...... End Sub
调用:Call Stu(Stuname:=" 李平 ",Stuno:="2001001001",StuComputer:=95)
9.3.2 引用 在定义形参时,可以定义参数传送的方式,即按值传送还是按地址传送,默认方式为按地址传送 (引用 )。
通过引用传送方式,可以改变实参变量的值。 引用方式通过关键字 ByRef(或缺省)来实现。
例 9.7Private Sub Command1_Click() Dim a As Integer, b As Integer a = 2 b = 3 Text1.Text = fun(a, b) Text2.Text = fun(a, b) Text3.Text = fun(a, b)End Sub
Function fun(x As Integer, y As Integer) x = x + y If x <> 0 Then fun = x Else fun = y End IfEnd Function
9.3.3 传值 通过值来传送实际参数,即传送实参的值而不是传送它的地址。
传值方式通过关键字 ByVal来实现。如果形参前面有关键字 ByVal,则该参数用传值方式传送,否则用引用(即传地址)方式传送。
传值方式不会改变原来变量的值,所有的变化都是在变量的副本上进行的。
9.3.4 数组参数的传送
“ ”当用数组作为过程的参数时,使用的是 传地址 方式,而“ ” 不是 传值 方式
为了把一个数组的全部元素传送给一个过程,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省略。
例 9.9 求数组的最大值。Private Sub Form_Click()
ReDim b(4) As Integer
b(1) = 30: b(2) = 80: b(3) = 20: b(4) = 50
c = findmax(b())
Print c
End Sub
Private Function findmax(a() As Integer)
Dim start As Integer, finish As Integer, 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
findmax = Max
End Function
*9.4 可选参数与可变参数
* 9.4.1 可选参数
为了定义带可选参数的过程,必须在参数表中使用Optional 关键字,并在过程体中通过 IsMissing 函数测试调用时是否传送可选参数。
可选参数必须放在参数表的最后,而且必须是 Variant类型。
* 9.4.2 可变参数
可变参数过程通过 ParamArray命令来定义,格式为:Sub 过程名 (ParamArray 数组名)
“ ”格式中 数组 的类型默认为 Variant
*9.5 对象参数
* 9.5.1 窗体参数 用窗体作为参数时,过程的格式为: Sub 过程名 (形参表 ) 语句块 [Exit Sub] ...... End Sub
“形参表”中形参的类型为 Form 。在调用时,只能通过传地址方式传送。
* 9.5.2 控件参数 用窗体作为参数时,过程的格式为: Sub 过程名 (形参表 ) 语句块 [Exit Sub] ...... End Sub
“形参表”中形参的类型为 Control 。在过程中,用 TypeOf 语句来限定控件参数的类
型,格式为:{If | ElseIf} TypeOf 控件名称 Is 控
件类型
9.6 局部内存分配
在一般情况下,局部变量的内存在需要时分配,用完后释放,并被其他过程的变量使用。在过程结束时,如果不希望失去保存在局部变量中的值,则可用 Static语句定义该局部变量。
* 9.7 Shell 函数
Shell函数以异步方式执行 Windows的应用程序,格式为:Shell( 命令字符串 [, 窗口类型 ])
例:Private Sub Command1_Click()
x = Shell("calc.exe", 1)
End Sub
* 9.8 递归
递归就是一个过程调用过程本身。在递归调用中,一个过程执行的某一步要用到它自身的上一步(或上几
步)的结果。“ ”递归求解分为两个阶段。第一个阶段是 递推 ,第二个阶
“ ” 段是 回归 。 例求阶乘
Private Sub Form_Click()n = InputBox("n=?")Print jc(n)End Sub
Private Function jc(x As Integer) As IntegerIf x = 1 Then jc = 1Else jc = x * jc(x - 1)End IfEnd Function