第 9 章 过 程

23
第9第 主主主主 第第第第主主主主主主主主主主主主主主主 主主主主主主主主主 主主主 主主主主主 一,一 主主 主主主 主主主主 主主主主主主主主主主主主 ,一,。 Visual Basic 主主主主主主主主主主 主主主主主主主主主主主主 主主主主 ,, Sub 主主 主主主主 Function 主 主 主主主主主主主 Visual Basic 主主主主主主主主主主主

Upload: quade

Post on 11-Jan-2016

87 views

Category:

Documents


7 download

DESCRIPTION

第 9 章 过 程. 主要内容 通用过程: 多个 不同的事件过程可能需要使用一段相同的程序代码,把这一段代码独立出来,作为一个过程,这样的过程叫做通用过程。 Visual Basic 中的通用过程分为两类,即子程序过程和函数过程,前者叫做 Sub 过程,后者叫做 Function 过程。本章介绍如何在 Visual Basic 应用程序中使用通用过程。. 9.1 Sub 过程 9.1.1 建立 Sub 过程. 定义: [ Static ][ Private ][ Public ] Sub 过程名 [( 参数表列 )] 语句块 [Exit Sub] - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 9 章 过    程

第 9章 过 程

主要内容

通用过程:多个不同的事件过程可能需要使用一段相同的程序代码,把这一段代码独立出来,作为一个过程,这样的过程叫做通用过程。

Visual Basic中的通用过程分为两类,即子程序过程和函数过程,前者叫做 Sub过程,后者叫做 Function过程。本章介绍如何在 Visual Basic应用程序中使用通用过程。

Page 2: 第 9 章 过    程

9.1   Sub 过程

 9.1.1 建立 Sub 过程 定义:[Static][Private][Public] Sub  过程名 [( 参数表

列 )]

        语句块 [Exit Sub]        [ 语句块 ]End Sub

Page 3: 第 9 章 过    程

说明: 过程是以 Sub 开头,以 End Sub 结束的一段程序,在这两句之间是语句块,

称为“过程体”或“子程序体”。 Static :可选的。表示在调用时保留 Sub 过程的局部变量的值,即此过程中

的局部变量为静态的。 Static 属性对在 Sub 外声明的变量不会产生影响,即使过程中也使用了这些变量。

Private :可选的。定义私有过程。表示只能被本模块中的其它过程访问。 Public :可选的。可以在程序的任何地方调用它。表示这一过程为公有过程。

在窗体层使用 Public 定义的模块在其它模块中使用时应该加上窗体名称。各窗体通用的过程一般在标准模块中用 Public 定义。

过程名:必需的。遵循标准的变量命名约定。且不能和变量重名。 参数表列:由多个参数组成,参数之间用逗号分隔,这里的参数通常称为形式

参数。当过程被调用时,调用过程的命令将数据传送给这里的参数,参数格式如下:

[ByVal | ByRef] 变量名 [( )] [As type]  Exit Sub: 在运行时,运行到此命令时,程序返回调用此过程的下一条命令执

行。 End Sub: 表示过程结束。 过程定义不可以嵌套。也不能使用 GoTo 语句进入 Sub 过程。过程只能通过

调用来执行。在过程程序的内部可以调用其它过程。(定义不能嵌套,调用可以嵌套。)

Page 4: 第 9 章 过    程

建立:方法 1 :执行“工具”—“添加过程”命令方法 2 :在代码窗口中直接键入 Sub “ 过程

名”

Page 5: 第 9 章 过    程

9.1.2  调用 Sub 过程

1. 用 Call语句调用 Sub过程:格式: Call 过程名 [( 实际参数 )]例: Call Tryout(a,b)

2. 把过程名作为一个语句来使用 例: Tryout a,b

若省略关键字 Call “ ”,则必须去掉 实际参数 的括号。

Page 6: 第 9 章 过    程

例 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

Page 7: 第 9 章 过    程

9.1.3 通用过程与事件过程

• 事件过程不能由用户任意定义,只能由系统指定。• 通用过程可以放在标准模块中,也可以放在窗体模块中,而事件过程只能放在窗体模块中,不同模块中的过程(包括事件过程和通用过程)可以互相调用。

• 当在一个模块中调用其他模块中的过程时 ,被调用的“ ”过程必须是 公有的 (Public)。

• 如果两个标准模块中含有相同的过程名,或是调用其他窗体中的过程时,调用时必须用模块名限定:模块名 .过程名 (参数表 )

Page 8: 第 9 章 过    程

9.2   Function 过程

 9.2.1  建立 Function 过程

定义:[Static][Private][Public] Function 过程名 [( 参数表列 )][As 类

型 ]

[ 语句块 ]

[ 过程名=表达式 ]

[Exit Function]

[ 语句块 ]

End Function

Page 9: 第 9 章 过    程

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

Page 10: 第 9 章 过    程

Visual Basic 应用程序中的过程

Page 11: 第 9 章 过    程

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)

Page 12: 第 9 章 过    程

9.3.2  引用 在定义形参时,可以定义参数传送的方式,即按值传送还是按地址传送,默认方式为按地址传送 (引用 )。

通过引用传送方式,可以改变实参变量的值。 引用方式通过关键字 ByRef(或缺省)来实现。

Page 13: 第 9 章 过    程

例 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

Page 14: 第 9 章 过    程

9.3.3  传值 通过值来传送实际参数,即传送实参的值而不是传送它的地址。

传值方式通过关键字 ByVal来实现。如果形参前面有关键字 ByVal,则该参数用传值方式传送,否则用引用(即传地址)方式传送。

传值方式不会改变原来变量的值,所有的变化都是在变量的副本上进行的。

Page 15: 第 9 章 过    程

9.3.4  数组参数的传送

“ ”当用数组作为过程的参数时,使用的是 传地址 方式,而“ ” 不是 传值 方式

为了把一个数组的全部元素传送给一个过程,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省略。

Page 16: 第 9 章 过    程

例 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

Page 17: 第 9 章 过    程

*9.4  可选参数与可变参数

* 9.4.1 可选参数

为了定义带可选参数的过程,必须在参数表中使用Optional 关键字,并在过程体中通过 IsMissing 函数测试调用时是否传送可选参数。

可选参数必须放在参数表的最后,而且必须是 Variant类型。

Page 18: 第 9 章 过    程

* 9.4.2 可变参数

可变参数过程通过 ParamArray命令来定义,格式为:Sub 过程名 (ParamArray 数组名)

“ ”格式中 数组 的类型默认为 Variant

Page 19: 第 9 章 过    程

*9.5  对象参数

 * 9.5.1  窗体参数 用窗体作为参数时,过程的格式为: Sub 过程名 (形参表 ) 语句块 [Exit Sub] ...... End Sub

“形参表”中形参的类型为 Form 。在调用时,只能通过传地址方式传送。

Page 20: 第 9 章 过    程

* 9.5.2  控件参数 用窗体作为参数时,过程的格式为: Sub 过程名 (形参表 ) 语句块 [Exit Sub] ...... End Sub

“形参表”中形参的类型为 Control 。在过程中,用 TypeOf 语句来限定控件参数的类

型,格式为:{If | ElseIf} TypeOf 控件名称  Is 控

件类型

Page 21: 第 9 章 过    程

9.6  局部内存分配

在一般情况下,局部变量的内存在需要时分配,用完后释放,并被其他过程的变量使用。在过程结束时,如果不希望失去保存在局部变量中的值,则可用 Static语句定义该局部变量。

Page 22: 第 9 章 过    程

* 9.7   Shell 函数

Shell函数以异步方式执行 Windows的应用程序,格式为:Shell( 命令字符串 [, 窗口类型 ])

例:Private Sub Command1_Click()

x = Shell("calc.exe", 1)

End Sub

Page 23: 第 9 章 过    程

* 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