1、第五章 过程与函数,掌握子过程(Sub过程)的定义和调用方法; 掌握函数过程(Function过程)的定义、调用方法; 掌握值传递、地址传递的传递规则; 了解过程的嵌套调用和递归调用的执行过程; 掌握过程的作用域和递归调用的执行过程; 掌握变量的作用域和生存期。,本章要求:,对于复杂的程序,结构化程序设计就是对一个复杂的问题采用“分而治之”的策略模块化,把一个较大的程序划分成若干个模块,每个模块只完成一个或者若干个功能。VB也是如此,Visual Basic把程序按功能分为多个模块。每个模块的代码中又分为相互独立的过程,每个过程完成一个具体特定的任务。使用“过程”不仅是实现结构化程序设计思想的
2、重要方法,而且是避免代码重复,便于程序调试维护的一个重要手段。在Visual Basic中就是使用子过程或函数过程来构建应用程序。,在建立VB应用程序时,应先设计代码的结构。 VB应用程序的结构通常如图所示。,VB将代码存储在3类不同的模块中:窗体模块,标准模块和类模块,如图所示,通过工程资源管理器窗口可以看到一个工程中的模块层次结构。,在程序设计时,有些程序代码常常需要重复执行,或者许多个程序都要进行同类的操作。这些重复执行的程序是相同的,只不过每次都以不同的参数进行重复而已。 比如这个程序中,底面积的求法是一样,如果在两个命令按钮中都写的话代码是一样的,如果在通用段中进行子过程的定义,在两
3、个命令按钮里调用同一个子过程即可。,5.1 过程概述,一、使用过程进行程序设计的优点 简化程序设计 过程可使程序划分成一个个小的逻辑单元,每个单元都比无过程的整个程序容易调试和维护 二、过程的种类 在VB中,除了系统提供的内部函数过程和事件过程外,用户可自定义下列四种过程: “Sub” 保留字开始的为子过程 “Function” 保留字开始的为函数过程“Property”保留字开始的为属性过程 “Event”保留字开始的事件过程,在VB中,Sub子过程分为:事件过程和通用(自定义)过程 特点:执行完毕后没有返回值 5.2.1 事件过程 (1)窗体事件的语法 Private Sub Form_事
4、件名(参数列表)语句组 End Sub(2)控件事件的语法 Private Sub 控件名_事件名(参数列表)语句组 End Sub,5.2 Sub过程,其中语句组就是程序设计者编写的让该事件发生后完成的操作的程序代码。,当几个不同的过程要执行同样的程序段时,可以不必重复编写代码,采用子过程来实现,子过程只有在被调用时才起作用,一般由事件过程来调用。子过程可以保存在窗体模块和标准模块中。 Sub过程的定义形式如下: Public|PrivateStatic Sub 子过程名(形参表)语句组Exit Sub语句组 End Sub,5.2.2 通用过程(自定义/Sub过程)的定义,说明:(1)su
5、b和end sub 之间是描述过程操作的语句块,称为“过程体”或“子程序体”。 (2)子过程名:命名规则与变量名规则相同。子过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。,5.2 Sub过程,(3)形式参数列表:形式参数通常简称“形参”,仅表示形参的类型、个数、位置,定义时是无值的,只有在过程被调用时,虚实参结合后才获得相应的值。可以无形式参数但括号不能省略。 (4)过程可以无形式参数,但括号不能省。 (5)参数的定义形式: ByValByRef变量名( )As 类型,, ByVal表示当该过程被调用时,参数是按值传递的; 缺省或ByRef表示当该过程被调用时,参数是按
6、地址传递的。 (6) 可选项Public(全局)|Private(局部)Static(静态) 其意义及作用在6.6节介绍。 (7) Exit Sub:表示退出子过程。,5.2 Sub过程,形参可以是简单变量,也可能是数组,5.2.3 子过程的建立,建立方法: 可以在窗体模块和标准模块的代码窗口中,按照语法格式直接按照定义输入子程序 也可以在代码编辑状态下,通过执行“工具”菜单中的“添加过程”命令,在“添加过程”对话框中 ,选择过程类型(子过程、函数、属性、事件)及作用范围(公有的Public、私有的Private),单击确定后得到一个过程或函数定义的结构框架(模板)。如: Public Sub
7、 Sort( ) End Sub,5.2 Sub过程,5.2.4 过程的调用1. 子过程的调用子过程名 实参列表或 Call 子过程名(实参列表) 说明:(1)参数列表称为实参,它必须与形参保持个数相同,位置与类型一一对应。(2)调用时把实参值传递给对应的形参。其中值传递(形参前有ByVal说明)时实参的值不随形参的值变化而改变。而地址传递时实参的值随形参值的改变而改变。,5.2 Sub过程,(3)实参可以是变量、常数、表达式和数组。当参数是数组时,形参与实参在参数声明时应省略其维数,但括号不能省。(4)调用子过程的形式有两种,用Call关键字时,实参必须加圆括号括起,如没有实参,则括号可以省
8、略。使用过程名直接调用时,实参之间用“,”分隔。例:调用Swap子过程的形式:Swap a,bCall Swap(a,b),5.2 Sub过程,Private Sub CmdOK()Call Swap(a,b)Swap a,b End Sub,Private Sub Swap(x%,y%)Dim temp%Temp=X X=Y Y=Temp End Sub,2.过程调用的执行过程:,5.2 Sub过程,例题5-1 用sub子过程实现根据三角形三条边计算三角形面积及内切圆面积,并在下图中完成边长的输入,单击时在文本框中输出面积。,Sub s(a As Integer, b As Integer,
9、 c As Integer, area1 As Double, area2 As Double) Dim p As Double, r As Double If a + b = c Or a + c = b Or b + c = a Then area1 = 0 area2 = 0 MsgBox “输入的边长不能构成三角形,请重新输入“, vbExclamation, “注意了“ Else p = (a + b + c) / 2 area1 = Sqr(p * (p - a) * (p - b) * (p - c) r = area1 / p area2 = 3.14 * r 2 End If
10、 End Sub,Private Sub Command1_Click() Dim aa As Integer Dim bb As Integer Dim cc As Integer Dim area1 As Double, area2 As Double aa = Val(Text1.Text) bb = Val(Text2.Text) cc = Val(Text3.Text) Call s(aa, bb, cc, area1, area2) Text4.Text = Format(area1, “0.00“) Text5.Text = Format(area2, “0.00“) End S
11、ub,课后自己编程,5.3 Function过程,Visual Basic函数分为内部函数和外部函数,内部函数是系统预先编好的、能完成一定功能的一段程序,如sqr等。外部函数是用户根据需要用Function关键字定义的函数过程,与子过程不同的是函数过程将返回一个值 。,5.3.1 函数过程(Function过程)的定义,Public|PrivateStaticFunction 函数名()As函数名=返回值Exit Function函数名=返回值End Function,说明: (1)函数名:命名规则与变量名规则相同。 (2)在函数体内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语
12、句来实现的,在函数过程中至少要对函数名赋值一次。 (3)AS类型:是指函数返回值的类型,若省略,则函数返回变体类型值(Variant)。 (4)Exit Function:表示退出函数过程,常常是与选择结构(If或Select Case语句)联用,即当满足一定条件时,退出函数过程。 (5)形参数列表:形参的定义与子过程完全相同。,5.3 Function过程,5.3.2 函数的调用,调用形式如下:函数名(实参列表) 说明:在调用时实参和形参的数据类型、顺序、个数必须匹配。函数调用只能出现在表达式中,其功能是求得函数的返回值。,5.3 Function过程,例题5-2 用Function函数过程
13、实现根据三角形三条边计算三角形面积,并在下图中完成边长的输入,单击时在文本框中输出面积。,Function s(a As Integer, b As Integer, c As Integer) Dim p As Double, area As Double If a + b = c Or a + c = b Or b + c = a Then area = 0 MsgBox “输入的边长不能构成三角形,请重新输入“, vbExclamation, “注意了“ Else p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c) En
14、d If End Function,Private Sub Command1_Click() Dim aa As Integer Dim bb As Integer Dim cc As Integer aa = Val(Text1.Text) bb = Val(Text2.Text) cc = Val(Text3.Text) Text4.Text = Format(s(aa, bb, cc), “0.00“) End Sub,5.4 过程之间参数的传递,参数传递的实质是实现主程序与子程序之间的数据传递 Visual Basic中不同模块(过程)之间数据的传递有两种方式:通过过程调用实参与形参的
15、结合实现; 使用全局变量来实现各过程中共享数据。 本节讨论使用参数实现过程间的数据传递。全局变量在后面学习。,5.4.1 形式参数与实际参数,1、形式参数是指在定义通用过程时,出现在Sub或Function语句中的变量名后面圆括号内的数,是用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔。,2、实际参数实际参数是指在调用Sub或Function过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形参变量。实参可由常量、表达式、有效的变量名、数组名(后加左、右括号,如A( ))组成,实参表中各参数用逗号分隔。,5.
16、4.2 参数传递(虚实结合),参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:按值传递、按地址传递。形参前加“ByVal”关键字的是按值传递,缺省或加“ByRef”关键字的为按地址传递。,5.4 过程之间参数的传递,传址与传值传址: 双向传递。形参得到的是实参的地址,形参和实参具有同样的地址,当形参值改变的同时也改变实参的值。传值: 单项传递。 形参得到的是实参的值,形参值的改变只是说明临时单元的值变动了,不会影响实参的值。,Sub Swap2(x%, y%)Dim Temp% Temp = x: x = y: y = Temp End
17、Sub,Sub Swap1(ByVal x%, ByVal y%)Dim Temp% Temp = x: x = y: y = Temp End Sub,例5.3 参数传递举例,5.4 过程之间参数的传递,值传递的执行过程如下图:,5.4 过程之间参数的传递,通过地址传递数据的执行过程,5.4 过程之间参数的传递,5.4.3 有关过程之间数据传递的几点说明,1.参数的数据类型:若形参被默认,则为Variant数据类型。由调用时实参的数据类型来决定。,2. 形参与实参的数据类型要求相同,按值传递参数时若不同,系统将实参的数据类型转换为形参的数据类型。按地址传递时,不同就出错了。,3.实参的使用形
18、式决定数据的传递方式,注意:在子过程和函数过程调用时,如果实参是常量(包括系统常量、用Const自定义的符号常量)或表达式,无论在定义时使用值传递还是地址传递,此时都是按值传递方式将常量或表达式计算的值传递给形参变量。如果形参定义是按传地址方式,但调用时想使实参变量按值方式传递,可以把实参变量加上括号,将其转换成表达式即可。,4使用子过程还是使用函数过程解决一个问题既可以使用子过程,也可以使用函数过程,是使用子过程还是使用函数过程呢?如果是需要求得一个值,一般情况使用函数过程,如不是为了求一个值,而是完成一些操作,或需要返回多个值,则使用子过程比较方便。 Text4.Text = Format
19、(s(aa, bb, cc), “0.00“)函数 Text4.Text = Format(area1, “0.00“)过程,5.4.4 数组作过程的参数,Visual Basic允许把数组作为实参传送到过程中。当需要将一批数据传递给一个过程时,应使用数组参数。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:1为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。 Private Sub Sort(a() As single) End Sub 其中形参“a( )”即为数组。,2被调过程可通过Lboun
20、d和Ubound函数确定实参数组的上、下界。3当用数组作形参时,对应的实参必须也是数组,且类型一致。4实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。所以对形参数组中元素的改变,将最终改变实参数组中对应元素的值。例如:定义了实参数组b(1 to 8),给它们赋了值,调用Sort()子过程的形式如下:Sort b( ) 或 Call Sort( b() ) 实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。,5.4.4 数组作过程的参数,调用时形参数组a和实参数组b虚实结合,共用一段内存单元,如下图所示。因此在Sort()过程中改变数组a的各元素值,也就相当于改变
21、了实参数组b中对应的元素的值,当调用结束时,形参数组a成为无定义。b(1) b(2) b(3) b(4) b(5) b(6) b(7) b(8)a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) 参数为数组时虚实结合示意图,5.4.4 数组作过程的参数,5.5 过程的嵌套和递归调用,5.5.1 过程的嵌套,VB语言不允许过程的嵌套定义,即一个过程内不能包含另一个过程。 VB语言允许过程的嵌套调用,即在程序中调用一子过程,而在子过程中又调用另外的子过程,在调用一个过程的过程中,又调用另一个过程。过程的嵌套调用执行过程如下图:,5.6.2 过程的递归调用,用自身的结构来
22、描述自身,称递归。例如,对阶乘的定义:,一个过程直接或间接调用它本身,称为过程的递归调用Visual Basic允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。,例5.4 过程的递归调用举例:编求阶乘fac(n)=n! 的递归函数。 Function函数举例,5.5 过程的嵌套和递归调用,Private Function fac(n As Integer) As IntegerIf n = 1 Then fac = 1Elsefac = n * fac(n - 1)End If End Function Private Sub Fo
23、rm_Click() Print “fac(4)=”;fac(4) End Sub,程序的递归过程:,5.5 过程的嵌套和递归调用,说明: 递归处理分递推和回归两个过程,如上图所示。 递推过程:每调用一次自身,把当前参数压入堆栈,直到递归结束条件成立。 回归过程:从堆栈中弹出当前参数,直到堆栈空。 使用递归算法必须要满足以下的递归条件:(1)存在递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。,5.5 过程的嵌套和递归调用,5.6 过程与变量的作用域,一个VB工程可以由若干个窗体模块和标准模块组成,每个模块又可以包含多个过程。同一模块之间是可以相互调用的,那么不同模块中
24、的过程之间是否可以相互调用了?变量可以定义在过程中,也可以定义在通用部分,定义时还可以使用不同的关键字(public等),那么在不同过程中,使用不同的关键字定义的变量,在使用时又有什么不同了?这就是下面要学习的问题。,5.6.1过程的作用域,类模块文件名,2、过程的作用域 过程可以被调用的范围被称为过程的作用域。按过程的作用范围来划分,过程可分为: (1) 模块级过程 可以在用户自定义的子过程和函数过程前加上Private关键字,使得该子过程或函数只能被本窗体或本模块中的过程调用。 (2) 全局级过程 如果在用户自定义的子过程和函数过程前不加任何关键字,或者加上Public关键字,则该子过程或
25、函数过程可以被本工程中任何窗体和模块的任何过程调用。(见表5-1),总结归纳过程的定义及作用域如表5-1(教材Pg.122)及说明,5.6 过程与变量的作用域,举例 过程的作用域:建立具有2个窗体form1和form2、2个标准模块module的工程,form1中有6个命令按钮,form2中有2个命令按钮,在form1中定义一个全局过程a1,一个模块级过程a2,在form2中定义一个全局过程b1,一个模块级过程b2,在标准模块module1中定义一个全局级过程b1,在标准模块module2中定义一个全局级过程b1,在窗体1的单击事件中打开窗体2,其他调用如图所示。,5.6 过程与变量的作用域,
26、5.6.2变量的作用域,在VB中,由于可以在过程中和模块中声明变量,根据定义变量的位置和定义变量的语句不同,变量可以分为: 局部变量(过程级变量) 窗体/模块级变量(私有的模块级变量,能被本模块的所有过程和函数使用) 全局级变量(公有的模块级变量)。,1、过程级变量局部变量,在过程内部使用 Dim 或者 Static 关键字来声明的变量。这种变量,只在声明它们的过程中才能被访问或改变该变量的值,别的过程不可访问。所以可以在不同的过程中声明相同名字的局部变量而互不影响。,5.6 过程与变量的作用域,例(n在两个模块/过程中都出现了) Private Sub Form_Load()Form1.Fo
27、ntSize = 20Dim n As Integern = 10 End SubPrivate Sub Form_Click()Dim n As IntegerPrint “n=“; n End Sub,程序运行后单击窗体,其输出结果是什么? VB变量没有赋值时,默认的数值变量初值为0,5.6 过程与变量的作用域,2、 窗体/模块级变量,窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句声明的变量,可被本窗体/模块的任何过程访问。但其他模块却不能访问该变量。例如:在“通用声明”段声明如下变量: Private s As String Dim a As Integer,5.
28、6 过程与变量的作用域,例: Dim n As Integer Private Sub Form_Load()Form1.FontSize = 20n = 10 End SubPrivate Sub Form_Click()Print “n=“; n End Sub结果?n=10,3、全局变量,全局变量也称公有的模块级变量,在窗体模块或标准模块的顶部的“通用”声明段用Public关键字声明,它的作用范围是整个应用程序,即可被本应用程序的任何过程或函数访问。 例如:Public a As Integer,b As single,5.6 过程与变量的作用域,实例5-5,Public n As In
29、teger Private Sub Form_Load()Form1.FontSize = 20n = 10 End SubPrivate Sub Form_Click()Print “n=“; nForm2.Show End Sub,Private Sub Form_Click() Dim m As Integer m = n + 10 变成form1.n Print “m=“; m End Sub,窗体1的,窗体2的,3种变量声明及使用规则如5-2表:,5.6 过程与变量的作用域,1、公用变量与局部变量同名在不同过程中定义同名变量,它们互不影响,但若在一过程中定义了与全局变量同名的变量,则
30、就应注意。,关于多个变量同名,注意:在过程中,如果定义了与模块级变量(在通用部分使用Private或Dim声明的变量)同名的变量,则在该过程内局部变量有较高的优先权,不能直接引用同名的模块级变量,若要引用则在变量名前加模块名。如教材例题5.9,5.6 过程与变量的作用域,Public Temp As Integer 定义全局变量 Private Sub Form_Load()Temp = 1 将全局变量Temp 的值设置成 1 End Sub Private Sub Command1_Click() Dim Temp As Integer 定义局部变量 Temp = 2 将局部变量Temp 的
31、值设置成 2Print “temp=“; Temp 局部变量Print “temp=“; Form1.Temp 全局变量 End Sub Private Sub Command2_Click()Print “temp=“; Temp 全局变量 End Sub,5.6 过程与变量的作用域,2、全局变量同名如果不同模块中的全局变量使用同一名字,则通过同时引用模块名和变量名就可以在代码中区分它们。例如,如果有一个在 Form1 和 Module1 中都声明了公用的 Integer 变量 intX,则把它们作为 Module1.intX 和Form1.intX 来引用便得到正确值。也就是说如果不同模块
32、中的全局变量使用同一名字,引用时就需要使用“模块名.变量名”的形式来区分它们。,5.6 过程与变量的作用域,5.6.3变量的生存期,在应用程序的存活期内一直保持模块级变量和全局变量的值。但是,对于Dim声明的局部变量仅当过程执行期间存在,当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。,除作用域之外,变量还有存活期,在这一期间变量能够保持它们的值。,局部变量的存活期由其定义的关键词来决定。(dim或static),5.6 过程与变量的作用域,局部变量声明:Dim声明的局部变量称为动态变量:随过程的调用而分配存贮
33、单元,变量的初始化;过程体结束,变量的内容自动消失,存贮单元释放,变量就无法使用了,下次调用过程时,系统又重新为其分配存储空间,因此动态变量的生存期就是过程的调用期。Static声明的变量称为静态变量,静态变量初次调用时,由系统分配存储空间,当过程调用结束后,系统并不收回其存储空间,每次调用过程,变量保持上次调用结束时的值。声明形式:Static 变量名 AS 类型Static Function 函数过程名(参数列表) As 类型Static Sub 子过程名(参数列表) 注意:过程名前加Static,表示该过程内的局部变量都是静态变量。,5.6 过程与变量的作用域,例题 有一个人编了下面一段
34、程序,想用变量n记录单击窗体的次数。 Private Sub Form_Click()Dim n As Integern = n + 1Print “已单击次数:“; n & “次“ End Sub,分析程序运行后多次单击窗体的输出结果:,要记录单击窗体次数,如何实现? 将Dim n As Integer改为Static n As Integer。使用静态变量 或将Dim n As Integer放在通用部分声明。使用模块变量,5.6 过程与变量的作用域,Option ExplicitPrivate Function fac(n As Integer) As Integer If n = 1
35、Then fac = 1 Else fac = n * fac(n - 1) End If End FunctionPublic Function sum(n As Integer, m As Integer) As Integer Dim i As Integer sum = 0 For i = n To m sum = sum + i Next i End Function,Private Sub Command1_Click() Form2.Show End SubPrivate Sub Form_Click() Call fac(4) Print “在本模块中能够调用模块级过程fac:
36、“; fac(4) Call sum(1, 100) Print “在本模块中能够调全局级过程sum:“; sum(1, 100) End SubPrivate Sub Form_Click() Call Form1.fac(4) Print “在其他模块中不能调用模块级过程fac:“; form1.fac(4) Call Form1.sum(1, 100) Print “在其他模块中能够调全局级过程sum:“; Form1.sum(1, 100) End Sub,不同作用域的过程的调用规则示例,Option Explicit Dim i As Integer 模块级变量 Public j A
37、s Integer 全局变量Private Sub Command1_Click() Form2.Show End SubPrivate Sub Form_Click() Print k; m 过程级变量不能被本模块中的其他过程存取的 i = 100 Print i 模块级变量可以被本模块中的其他过程存取的 j = 500 Print j 全局级变量可以被本模块中的其他过程存取的 End Sub Private Sub Form_Load() Dim k, m As Integer m,k是过程级变量 i = 100 j = 500 k = 10 m = 50 End Sub,Private
38、Sub Form_Click() Print Form1.k; Form1.m 过程级变量不能被其他模块中的过程存取的 Print Form1.i 模块级变量不能被其他模块中的过程存取的 Print Form1.j 全局级变量可以被其他模块中的过程存取的 End Sub,不同作用域变量的调用规则示例,窗体1,窗体2,Option Explicit Dim i As Integer 动态模块级变量Private Sub Form_Click() Static j As Integer 静态变量 Dim k As Integer 动态过程级变量 i = i + 1 j = j + 1 k = k
39、+ 1 Print i; j; k i,j都实现了统计单击次数的问题,唯独过程级变量k没有实现 End Sub,动态变量和静态变量的生存期示例,Option Explicit Dim n As Integer Private Sub Form_Click() n = n + 1 Print n If n = 2 ThenDim i As Integer, j As Integer, k As Integer Dim m As Integer FontSize = 12 Print Tab(25); “ Print: Print Print “* “;For i = 1 To 9Print Ta
40、b(i * 6); i;Next iPrintFor j = 1 To 9Print j; “ “;For k = 1 To jPrint Tab(k * 6); j * k; “ “;Next kPrintNext jElseForm1.ClsEnd IfEnd Sub,5.7 多重窗体与多模块程序设计,一个稍微复杂的应用程序,不仅有多个窗体,还可能有标准模块和类模块,如下图所示。,本节介绍在多模块程序中,关于启动对象的设置、窗体的加载与卸载、窗体的加载与卸载时的事件、多模块间数据的传递等。,5.7.1 设置启动对象,在程序运行时,首先被加载并执行的对象,称为程序的启动对象。一个程序的启动对
41、象可以是一个窗体,也可以是标准模块中名为Main的自定义Sub过程。缺省情况下,第一个创建的窗体被指定为启动对象。,1、设置方法:从“工程”菜单中的最后一项“*属性” ,在“*工程属性”对话框中进行设置。,2、如果设置从主过程Main()启动,则必须在标准模块中编写Main()过程代码。,例:Pg170.,5.7多重窗体与多模块程序设计,5.7.2 窗体的加载与卸载过程,当一个窗体要显示在屏幕之前,必须先建立,接着被装入内存(Load语句),最后显示(Show方法)在屏幕上。同样,当窗体要结束之前,会先从屏幕上隐藏(Hide方法),接着从内存中删除(Unload方法),5.7 多重窗体与多模块
42、程序设计,在窗体的加载过程的各阶段所用一的语句或方法以及所触发的事件可用下面的图来说明:,5.7多重窗体与多模块程序设计,在窗体的卸载过程的各阶段所用一的语句或方法以及所触发的事件如下图:,5.7多重窗体与多模块程序设计,1、窗体的加载与显示,(1)Load语句:装入窗体到内存Load 窗体名称说明:执行Load语句后,窗体并不显示出来,但可引用该窗体中的控件及各种属性。注意:这里的窗体名称是窗体的Name属性,而不是窗体的文件名,以下相同。 (3)Show方法:显示一个窗体窗体名称.Show 模式0 Modeless(非模式):可以对其它窗体进行操作1 Model,关闭才能对其它窗体进行操作
43、。,5.7多重窗体与多模块程序设计,2、窗体的隐藏与卸载,(1)Unload语句:从内存删除窗体Unload 说明:当窗体卸载之后,所有在运行时放到该窗体上的控件都不再是可访问的。在设计时放到该窗体上的控件将保持不变在卸载窗体时,只有显示的部件被卸载。与该窗体模块相关联的代码还保持在内存中。(2)Hide方法:隐藏,没有删除窗体名称. Hide,5.7多重窗体与多模块程序设计,5.7.3 与窗体加载与卸载过程的关的事件,1Initialize事件 2Load事件 3Paint事件 4QueryUnLoad事件 5UnLoad事件 6Activate事件与Deactivate事件 7Terminate事件,例题 验证与窗体加载与卸载过程相关的事件被触发的先后顺序。p132,5.7多重窗体与多模块程序设计,