230 likes | 405 Views
第 9 章 过 程. 主要内容 通用过程: 多个 不同的事件过程可能需要使用一段相同的程序代码,把这一段代码独立出来,作为一个过程,这样的过程叫做通用过程。 Visual Basic 中的通用过程分为两类,即子程序过程和函数过程,前者叫做 Sub 过程,后者叫做 Function 过程。本章介绍如何在 Visual Basic 应用程序中使用通用过程。. 9.1 Sub 过程 9.1.1 建立 Sub 过程. 定义: [ Static ][ Private ][ Public ] Sub 过程名 [( 参数表列 )] 语句块 [Exit Sub]
E N D
第9章 过 程 主要内容 通用过程:多个不同的事件过程可能需要使用一段相同的程序代码,把这一段代码独立出来,作为一个过程,这样的过程叫做通用过程。 Visual Basic中的通用过程分为两类,即子程序过程和函数过程,前者叫做Sub过程,后者叫做Function过程。本章介绍如何在Visual Basic应用程序中使用通用过程。
9.1Sub过程 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.1 Sub RecArea(Rlen, Rwid) Dim Area Area = Rlen * Rwid MsgBox "Total Area is " & Area End Sub Private Sub Command1_Click() a = Val(InputBox("length=?")) b = Val(InputBox("width=?")) RecArea a, b End Sub
9.1.3 通用过程与事件过程 • 事件过程不能由用户任意定义,只能由系统指定。 • 通用过程可以放在标准模块中,也可以放在窗体模块中,而事件过程只能放在窗体模块中,不同模块中的过程(包括事件过程和通用过程)可以互相调用。 • 当在一个模块中调用其他模块中的过程时,被调用的过程必须是“公有的”(Public)。 • 如果两个标准模块中含有相同的过程名,或是调用其他窗体中的过程时,调用时必须用模块名限定: 模块名.过程名(参数表)
9.2Function过程 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 ="; x End 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 = x End Function
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.7 Private 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 If End 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.7Shell函数 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 Integer If x = 1 Then jc = 1 Else jc = x * jc(x - 1) End If End Function