220 likes | 455 Views
第 9 章 过程. SUB 过程 FUNCTION 过程 参数传递 可选参数与可变参数 对象参数 局部内存分配 递归 SHELL 函数 典型应用. 第 8 章 过程. 过程的作用: 1 、任务划分; 2 、代码重用 系统过程与自定义过程 系统过程 --- 内部函数、事件过程 自定义过程 ---SUB 过程,函数过程等 自定义通用过程: 多个不同的事件过程可能需要使用一段相同的代码, 可以把这一段代码独立出来,作为一个通用过程。 通用过程分成两类: 子程序过程 , 函数过程 子程序过程由 SUB … ..END SUB 定义
E N D
第9章 过程 • SUB过程 • FUNCTION过程 • 参数传递 • 可选参数与可变参数 • 对象参数 • 局部内存分配 • 递归 • SHELL函数 • 典型应用
第8章 过程 过程的作用:1、任务划分;2、代码重用 系统过程与自定义过程 系统过程---内部函数、事件过程 自定义过程---SUB过程,函数过程等 自定义通用过程: 多个不同的事件过程可能需要使用一段相同的代码, 可以把这一段代码独立出来,作为一个通用过程。 通用过程分成两类:子程序过程,函数过程 子程序过程由 SUB …..END SUB 定义 函数过程由FUNCTION ….END FUNCTION定义
应用程序 工程文件( .vbp) 类模块 (.cls)文件 标准模块 (.bas)文件 窗体模块 (.frm)文件 事件过程 子过程 函数过程 函数过程 子过程
SUB 过程 • SUB 过程的建立 1、定义 [static][private][public]sub 过程名[(参数表列)] 语句块 [exit sub] [语句块] End sub 过程名前缀是过程的性质,过程不能嵌套 参数表列是形参,格式是: [byval]变量名[()][as 数据类型]
SUB 过程 自定义过程与事件过程的区别: 1、从结构形式上看,事件过程名是由控件(对象)名 和事件名连接而成,而自定义过程的名称是由用户起 的一个任意的合法标识符; 2、从启动的机制上看,事件过程是由事件触发,而自 定义过程是由另外的过程来调用运行。 如何建立SUB过程? 方法1选模块---工具菜单中的添加过程 方法2工程菜单中的添加模块---模块代码窗口键入过 程的名字。
SUB 过程 子过程调用 1、用CALL 语句调用SUB过程 格式:call 过程名[(实际参数)] 如 call try(”*”,8) 2、直接用过程名调用 如 call try “*”,8 举例
函数过程 • 函数过程的定义 [过程类型]function 过程名[(参数表列)][as 类型] [语句块] [过程名=表达式] [exit function] [语句块] End function 注意:函数过程必须返回一个值(表达式的值,如果 没有过程名=表达式则返回默认的值0或空字符串) As类型是值返回值的类型
函数过程 建立函数过程 同建立子过程一样 函数过程的调用 同内部函数调用格式一样 举例
参数传递 • 形参和实参 在过程定义的参数表出现的参数叫形参。 在调用过程语句或表达式中出现的参数叫实参。 形参与实参在个数和位置上一一对应,进行数据传递 传递方式有两种:值传递(也叫传值调用) 地址传递(传址调用或引用调用) 采用传值调用,形参前要用关键字BYVAL界定 采用传址调用,形参前用关键字BYREF或省略界定 特别:采用传值调用时,实参只把值传给形参,调用 过程结束后,实参的值保持不变;采用传址调用时, 参将地址传给形参,调用过程结束后,实参的值跟随形参的值而变化。
举例 1、传值调用 Private Sub nochange(ByVal a%, ByVal b%) a = a + b b = a * b Print "a="; a; "b="; b End Sub 结果: Private Sub Command6_Click() Dim x%, y% x = 5: y = 10 Print "x="; x; "y="; y nochange x, y Print "x="; x; "y="; y End Sub X=5 y=10 A=15 b=150 X=5 y=10
举例 2、传址调用 Private Sub Command7_Click() Dim x%, y% x = 5: y = 10 Print "x="; x; "y="; y samechange x, y Print "x="; x; "y="; y End Sub 结果: Private Sub samechange(a%, b%) a = a + b b = a * b Print "a="; a; "b="; b End Sub X=5 y=10 A=15 b=150 X=15 y=150
数组参数的传递 Sub ss(a(),b()) … End sub Call ss(y(),x()) 传递的一般形式举例 采用址传递方式: 注意: 1、如传递整个数组,形参和实参表中用数组名,略去 上下界,但括号要有。 2、如果只传递单个数组元素,要指明元素的下标; 3、如果不知数组的上下界 用LBOUND和 UBOUND函数 Sub pain (a()) For I=lbound(a,1)to ubound(a,1) For j=lbound(a,2) to ubound(a,2) Print a(I,j) Next j ….
可选参数与可变参数 一般形参和实参的个数是相同的,但是可以将某个形 参前冠以OPTIONAL关键字,变成可选参数,这样, 实参可以有选择地调用形参。 sub mu(f1 as integer,f2 as integer,optional f3) N=f1*f2 If not ismissing(f3) then N=n*f3 Endif Print n End sub Private sub form-click() Mu 10,20 End Private sub form-click() Mu 10,20,30 End sub
可选参数与可变参数 假如传递的一维数组元素个数不定,可以采用可变参 数传递方式,形参只写数组名和括号,用下面格式: SUB 过程名(paremarray 数组名) 举例: Sub mu (paramarray as()) N=1 For each x in as N=n*x Next x Next n End sub Private sub form_click() Dim a%,b&,c%,d as variant A=6:b=8:c=12:d=23 Mu a,b,c,d End sub
过程与变量的作用域 • 过程的作用域 1、模块级 在某文件(模块)内定义的过程,如果在SUB或 FUNCTION前加 Private,则该过程只能被本文件中定 义的过程调用。即作用域为本文件(模块) 2、全局级 过程定义时,如果在SUB或FUNCTION前加 public,则 该过程可以应用程序中所有文件(模块)定义的过程 调用。即作用域为整个应用程序(工程)
过程与变量的作用域 3、静态过程 过程定义时,如果在SUB或FUNCTION前加static,则 该过程 的所有变量均为静态变量。
过程与变量的作用域 • 变量作用域 1、过程级(局部级)变量 在过程内部用DIM或STATIC声明的变量,作用域为本过程。 用dim声明的叫普通变量,只有过程调用时才分配单元,过程结 束后,存储单元被系统收回。 用static声明的叫静态变量,一次性分配,过程结束后, 变量的值仍然保存。 2、文件级(模块级)变量 在(通用)、(声明)段,用dim或private语句声明的变量,作 用域为本文件(模块),一次性分配内存单元
过程与变量的作用域 3、工程级(项目级、全局)变量 在任一文件中,各过程之外,用public语句定义的变 量,作用域为整个工程或整个项目
窗体参数与控件参数 VB可用对象(窗体和控件)作为过程的参数,其类型 是control,(或form) 创建的对象作为实际参数,以地址调用方式 传递给过程,在过程种可以修改对象的属性,使用对 象的方法。 Private Sub fontout(t1 As Control, t2 As Control) t1.FontSize = 24 t1.Font = "宋体" t2.FontSize = 36 t2.Font = "隶书" t2.FontItalic = True End Sub Private Sub Form_Load() Text1.Text = "欢迎使用" Text2.Text = "Visual Basic 6.0" End Sub Private Sub Form_Click() fontout Text1, Text2 End Sub
递归调用 VB允许在一个过程中有调用自身的语句,称为递归调 用;也允许调用另一过程,而该过程又反过来调用本 过程,称为间接递归调用。 如求N阶乘的VB函数过程 Private funcion f(byval n as integer) as integer If n=1 then F=1 Else F=n*f(n-1) Endif End function 递归 求解有两个条件 ①给出递归终止的条件和递归终止的状态 ②给出递归的表述形式,并且这种表述要向终止条件变化,能够在有限步内达到终止条件
递归调用 如求4!,递归调用情况如下: ①f(4)=4*f(3) N=4,调用f(3) ②f(3)=3*f(2) n=3,调用f(2) ③ f(2)=2*f(1) n=1,调用f(1) ④f(1)=1 =4*6=27⑦ 求得f(4) =3*2=6⑥ 求得f(3) =2*1=2⑤ 求得f(2)
调用外部应用程序 凡是能在DOS或WINDOWS下运行的应用程序,都可 以在VB中通过SHELL函数调用,格式如下: SHELL(命令字符串[,窗口类型]) 其中:命令字符串是应用程序名,窗口类型是指窗口 的大小,见表8.3,有6种大小 举例: 调用WORD Shell(“c:\winword\winword.exe”,1) 调用计算器 Shell(“calc.exe”,1)