1 / 23

第 9 章 过 程

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

quade
Download Presentation

第 9 章 过 程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第9章 过 程 主要内容 通用过程:多个不同的事件过程可能需要使用一段相同的程序代码,把这一段代码独立出来,作为一个过程,这样的过程叫做通用过程。 Visual Basic中的通用过程分为两类,即子程序过程和函数过程,前者叫做Sub过程,后者叫做Function过程。本章介绍如何在Visual Basic应用程序中使用通用过程。

  2. 9.1Sub过程 9.1.1 建立Sub过程 定义: [Static][Private][Public] Sub 过程名[(参数表列)] 语句块 [Exit Sub] [语句块] End Sub

  3. 说明: • 过程是以Sub开头,以End Sub结束的一段程序,在这两句之间是语句块,称为“过程体”或“子程序体”。 • Static:可选的。表示在调用时保留 Sub 过程的局部变量的值,即此过程中的局部变量为静态的。Static 属性对在 Sub 外声明的变量不会产生影响,即使过程中也使用了这些变量。 • Private:可选的。定义私有过程。表示只能被本模块中的其它过程访问。 • Public:可选的。可以在程序的任何地方调用它。表示这一过程为公有过程。在窗体层使用Public定义的模块在其它模块中使用时应该加上窗体名称。各窗体通用的过程一般在标准模块中用Public定义。 • 过程名:必需的。遵循标准的变量命名约定。且不能和变量重名。 • 参数表列:由多个参数组成,参数之间用逗号分隔,这里的参数通常称为形式参数。当过程被调用时,调用过程的命令将数据传送给这里的参数,参数格式如下: [ByVal | ByRef] 变量名 [( )] [As type]  • Exit Sub:在运行时,运行到此命令时,程序返回调用此过程的下一条命令执行。 • End Sub:表示过程结束。 • 过程定义不可以嵌套。也不能使用GoTo语句进入Sub过程。过程只能通过调用来执行。在过程程序的内部可以调用其它过程。(定义不能嵌套,调用可以嵌套。)

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

  5. 9.1.2 调用Sub过程 1. 用Call语句调用Sub过程: 格式:Call 过程名[(实际参数)] 例:Call Tryout(a,b) 2. 把过程名作为一个语句来使用 例:Tryout a,b 若省略关键字Call,则必须去掉“实际参数”的括号。

  6. 例 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

  7. 9.1.3 通用过程与事件过程 • 事件过程不能由用户任意定义,只能由系统指定。 • 通用过程可以放在标准模块中,也可以放在窗体模块中,而事件过程只能放在窗体模块中,不同模块中的过程(包括事件过程和通用过程)可以互相调用。 • 当在一个模块中调用其他模块中的过程时,被调用的过程必须是“公有的”(Public)。 • 如果两个标准模块中含有相同的过程名,或是调用其他窗体中的过程时,调用时必须用模块名限定: 模块名.过程名(参数表)

  8. 9.2Function过程 9.2.1 建立Function过程 定义: [Static][Private][Public] Function 过程名[(参数表列)][As 类型] [语句块] [过程名=表达式] [Exit Function] [语句块] End Function

  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 ="; 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

  10. Visual Basic应用程序中的过程

  11. 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)

  12. 9.3.2 引用 • 在定义形参时,可以定义参数传送的方式,即按值传送还是按地址传送,默认方式为按地址传送(引用)。 • 通过引用传送方式,可以改变实参变量的值。 • 引用方式通过关键字ByRef(或缺省)来实现。

  13. 例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

  14. 9.3.3 传值 通过值来传送实际参数,即传送实参的值而不是传送它的地址。 传值方式通过关键字ByVal来实现。如果形参前面有关键字ByVal,则该参数用传值方式传送,否则用引用(即传地址)方式传送。 传值方式不会改变原来变量的值,所有的变化都是在变量的副本上进行的。

  15. 9.3.4 数组参数的传送 当用数组作为过程的参数时,使用的是“传地址”方式,而不是“传值”方式 为了把一个数组的全部元素传送给一个过程,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省略。

  16. 例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

  17. *9.4 可选参数与可变参数*9.4.1 可选参数 • 为了定义带可选参数的过程,必须在参数表中使用Optional关键字,并在过程体中通过IsMissing函数测试调用时是否传送可选参数。 • 可选参数必须放在参数表的最后,而且必须是Variant类型。

  18. * 9.4.2 可变参数 可变参数过程通过ParamArray命令来定义,格式为: Sub 过程名(ParamArray 数组名) 格式中“数组”的类型默认为Variant

  19. *9.5 对象参数*9.5.1 窗体参数 用窗体作为参数时,过程的格式为: Sub 过程名(形参表)   语句块 [Exit Sub] ...... End Sub “形参表”中形参的类型为Form。 在调用时,只能通过传地址方式传送。

  20. * 9.5.2 控件参数 用窗体作为参数时,过程的格式为: Sub 过程名(形参表)   语句块 [Exit Sub] ...... End Sub “形参表”中形参的类型为Control。 在过程中,用TypeOf语句来限定控件参数的类型,格式为: {If | ElseIf} TypeOf 控件名称 Is 控件类型

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

  22. * 9.7Shell函数 Shell函数以异步方式执行Windows的应用程序,格式为: Shell(命令字符串[, 窗口类型]) 例: Private Sub Command1_Click() x = Shell("calc.exe", 1) End Sub

  23. * 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

More Related