VB程序设计第二版第七章_第1页
VB程序设计第二版第七章_第2页
VB程序设计第二版第七章_第3页
VB程序设计第二版第七章_第4页
VB程序设计第二版第七章_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、12 ,也称为,也称为“子过程子过程”或或“子程序子程序” 。调用调用事件过程或其他通用过程使用另一个通用过程称事件过程或其他通用过程使用另一个通用过程称为调用。为调用。 调用过程调用过程调用子过程的过程称为调用子过程的过程称为“调用过程调用过程”。 3调用过程调用过程: 调用调用Sprg1调用调用Sprg1调用调用Sprg2子过程子过程: Sprg1子过程子过程: Sprg2过程的执行:过程的执行:4过程分类过程分类: : Sub过程过程Function过过程程内部过程内部过程(方法方法)事件过程事件过程自定义过程自定义过程 内部函数内部函数 自定义函数自定义函数 其中,自定义函数和自定义过

2、程统称为其中,自定义函数和自定义过程统称为通用过程通用过程57.1.1 事件过程事件过程 VB程序是事件驱动的。程序是事件驱动的。 事件过程分为窗体事件过程分为窗体事件过程和控件事件过程。事件过程和控件事件过程。1.窗体事件过程:窗体事件过程:定义:定义:Private sub Form_事件名(事件名(参数列表参数列表)语句语句End sub6说明:说明:(1)窗体的事件过程由)窗体的事件过程由Form、下划线、下划线和事件名组成。和事件名组成。(2)private表示这个事件过程是局部的,表示这个事件过程是局部的,只有本窗体有效。只有本窗体有效。(3)事件名由)事件名由VB系统提供。系统提

3、供。(4)窗体过程有无参数,由)窗体过程有无参数,由VB提供的具提供的具体事件决定,用户不可以随意添加或者更体事件决定,用户不可以随意添加或者更改或者删除。改或者删除。72.控件事件过程控件事件过程格式:格式:Private Sub 控件名控件名_事件名(事件名(参数列表参数列表)语句语句End sub说明:说明:(1)窗体的事件过程由控件名、下划线)窗体的事件过程由控件名、下划线和事件名组成。和事件名组成。(2)private表示这个事件过程是局部的,表示这个事件过程是局部的,只有本窗体有效。只有本窗体有效。(3)窗体过程有无参数,由)窗体过程有无参数,由VB提供的具提供的具体事件决定,用户

4、不可以随意添加或者更体事件决定,用户不可以随意添加或者更改或者删除。改或者删除。8【例【例7-1】 窗体过程应用示例:创建窗体的窗体过程应用示例:创建窗体的Initialize、Load、Activate、GotFocus事件过事件过程,分别在立即窗口打印相应的信息,观察各个程,分别在立即窗口打印相应的信息,观察各个窗体过程执行的顺序。窗体过程执行的顺序。程序代码如下:程序代码如下:Private Sub Form_Activate() Debug.Print 触发了触发了Activate事件事件End SubPrivate Sub Form_GotFocus() Debug.Print 触发

5、了触发了GotFocus事件事件End Sub9Private Sub Form_Initialize() Debug.Print 触发了触发了Initialize事件事件End SubPrivate Sub Form_Load() Debug.Print 触发了触发了Load事件事件End Sub10【例【例7-2】 控件过程应用示例:在运行程序控件过程应用示例:在运行程序时,触发文本框的时,触发文本框的Keypress事件过程,在标事件过程,在标签中显示用户敲击的键名。签中显示用户敲击的键名。程序代码如下:程序代码如下:Private Sub Text1_KeyPress(KeyAscii

6、 As Integer) Text1.Text = Label1.Caption = 你敲击了你敲击了 & Chr(KeyAscii) & 键!键!End Sub117.1.2 通用过程通用过程 将多次被重复使用的程序代码设将多次被重复使用的程序代码设计成一个具有一定功能的独立程序段,计成一个具有一定功能的独立程序段,称为通用过程。称为通用过程。 与事件过程的不同之处:由用户与事件过程的不同之处:由用户创建,并且由其他事件过程或者通用创建,并且由其他事件过程或者通用过程显式调用(不能由事件或者系统过程显式调用(不能由事件或者系统触发)。触发)。1.定义通用Sub过程12Priv

7、ate|PublicStatic Sub () Exit Sub End SubSub过程体过程体2. 说明(1)在省略可选项的情况下,通用Sub过程以sub语句开始,以End sub结束,两者之间的部分称作子程序体或者过程体。 (2)以Private开头的Sub过程是模块级(私有)过程,只能在本模块中被调用。(3)以Public开头或省略Public或者Private关键字的Sub过程是全局过程,可以被应用程序的所有模块调用。 13(4)使用Static选项,表示过程内部定义的所有局部变量为静态变量,也就是调用了该过程后将保留过程中局部变量的值,下次再调用该过程时,局部变量保持上次调用后的值

8、。如果忽略,那么每次都重新初始化。 (5) 不具有值的意义,在Sub过程中不能给赋值,也不能给定义类型。(6) 形参列表:Sub过程可以没有参数,但是一堆括号不能省略,没有参数的过程称为无参过程。如果有多个参数,参数之间逗号隔开。14形式参数的格式:Byval|Byref变量名 () as 数据类型1.Byval:表示形参是按照值传递参数,参数传递是单向的;若省略Byval或者用Byref则表示参数是按照地址传递的,也就是双向的。2.变量名 () :合法的Vb变量名或者数组名,有括号表示数组,否则是普通变量。3. as 数据类型:形参的类型15(7) 过程体内不再定义过程,即过程定义不能嵌套。

9、但是可以调用其他的Sub过程或者函数过程。(8)End Sub:表示过程的结束。162.调用通用Sub过程 事件过程是通过事件驱动或者系统自动调用的,Sub过程必须通过调用语句执行调用。调用Sub过程的格式: 格式1:call 过程名(实参列表)格式2:过程名实参列表17说明:1.过程名:必须是已经定义的Sub过程名称。2.实参列表:指的是要传递给Sub过程的常量、变量、表达式,各个参数逗号分隔,如果是数组,则在数组名之后跟一对空括号。 实参个数必须和形参一致。3.如果是无参的Sub过程,格式1中科院省略实参列表和圆括号,call 过程名。4.格式2中,过程名和实参列表之间有空格,且实参列表不

10、加括号。183.创建通用Sub过程(1)直接在代码窗口创建选择通用,键入Sub和过程名并回车后,系统直接添加圆括号和End sub。(2)使用添加过程对话框工程添加模块新建选项卡,双击模块图标,打开代码编辑窗口。选择工具添加过程,弹出添加过程对话框,在对话框中输入过程名,选择类型以及范围。19【例7-3】 输入自然数a,b,c,计算p=a!+b!+c!。要求:编写一个过程,计算阶乘。在“计算”按钮的Click事件中调用该过程,计算p并在文本框中显示计算结果。程序代码如下:20Option ExplicitDim a%, b%, c%, s1#, s2#, s3#, s#, i%Private

11、Sub Command1_Click() a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) Call fact(a, s1) 调用过程 Call fact(b, s2) 调用过程 Call fact(c, s3) 调用过程 Text4.Text = Format(s1 + s2 + s3, 0.000)End Sub21Sub fact(n, s) 求阶乘的过程 s = 1 For i = 1 To n s = s * i NextEnd Sub22【例7-4】 求一维数组中的最小值和最大值。要求:利用随机数函数生成一个有1

12、0个元素的数组,编写过程找出最大值和最小值。程序代码如下:Option ExplicitDim a(1 To 10)Dim i%, ma%, mi%Sub bijiao(a(), ma, mi) 求最大和最小值的过程,引入数组参数a,a后面要跟一对空圆括号23ma = a(1) mi = a(1) For i = 2 To UBound(a) If a(i) ma Then ma = a(i) If a(i) mi Then mi = a(i) NextEnd Sub24Private Sub Form_Click() Call bijiao(a(), ma, mi) 调用过程,实参a为数组后

13、面要跟一对空圆括号 Text2.Text = Str(ma) 显示结果Text3.Text = Str(mi) End SubPrivate Sub Form_Load() 给数组赋值 For i = 1 To 10 Randomize a(i) = Int(Rnd * 100) Text1.Text = Text1.Text & Str(a(i) NextEnd Sub2526 * * * * * Sub a() For i = 1 To 5 Print Tab(7 - i); For j = 1 To 2 * i - 1 Print *; Next j Print Next iEn

14、d Sub27在在VB中,有如中,有如Sin函数、函数、Sqr函数等内部函数。函数等内部函数。而程序员也可以自己定义函数。自定义函数通过而程序员也可以自己定义函数。自定义函数通过Function过程实现。过程实现。Function过程也称为函数过程。过程也称为函数过程。7.2.1 Function过程的定义Function过程的格式 28Public|PrivateStatic Function 函数过程名函数过程名 () As 函数过程名函数过程名 = Exit Function End Function函数过程体函数过程体2. 说明(1) Public: 缺省值。使用Public时表示各模

15、块的所有其他过程都可以调用该过程。(2) Private: 使用Private时表示只有本模块中的其他过程才可以调用该Function过程。(3) Static: 使用Static时表示将过程中的所有局部变 量说明为静态变量。(4) 函数过程名: Function过程的名称,遵循变量的命名规则。(5) : 表示Function过程的参数变量列表。多个变量之间用逗号隔开。格式: ByVal|ByRef ( ) As 29 ByVal: 表示该参数按值传递。 ByRef: 缺省值。表示该参数按地址传递。 : 任何变量名或数组名。 ( ): 当参数为数组时使用。(6) As : 声明函数值的类型。(

16、7) Exit Function语句: 从Function过程中退出。(8) Function过程通过赋值语句: 函数过程名= 将函数的返回值赋给。(9) Function过程的定义不能嵌套。函数过程应该建立在模块的通用声明段。30317.2.2 Function过程的调用过程的调用1. 调用位置调用位置 直接在表达式中调用。直接在表达式中调用。2. 调用格式调用格式 (1)函数过程名:必须是一个已定义的函数过程的)函数过程名:必须是一个已定义的函数过程的名称。名称。(2)实参表:指要传递给函数过程的常量、变量或)实参表:指要传递给函数过程的常量、变量或表达式,各参数之间用逗号分隔。如果参数是

17、数组,表达式,各参数之间用逗号分隔。如果参数是数组,在数组名之后必须跟一对空括号。在数组名之后必须跟一对空括号。函数过程名函数过程名(实参表实参表)Sub过程和function 过程的区别1.Function过程有返回值,因此函数必须定义类型,同时在函数过程体内必须对函数过程名赋值。 Sub无返回值,不需要定义类型和内部赋值。2.到底采用哪种过程,一般情况下,通过一个过程求一个值,定义为function直观些;求多个值或者完成一组操作,用Sub过程。32【例7-5】 输入自然数a,b,c,计算p=a!+b!+c!。要求:编写一个Function过程,计算阶乘。在“计算”按钮的Click事件中调

18、用该过程,计算p并在文本框中显示计算结果。在例7-5中将用Function过程完成例7-3的功能。程序代码如下:33Dim a%, b%, c%, f#, p#, i%Private Sub Command1_Click() a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) p = fact(a) + fact(b) + fact(c) 调用函数过程计算各个阶乘 Text4.Text = Format(p, 0.000)End Sub34Function fact(n As Integer) As Double 求阶乘的函数

19、过程 f = 1 For i = 1 To n f = f * i Next fact = fEnd Function35【例7-6】 求两个自然数的最大公约数和最小公倍数。要求在文本框中输入两个自然数,编写函数过程,求两个数的最大公约数和最小公倍数,在窗体的Click事件中,调用函数,计算结果。假设过程名为gcd,需要设置两个参数x, y,求x, y的最大公约数可以使用辗转相除法。具体如下:(1) 以第一个数x作为被除数,第二个数y作为除数,求余数r。(2) 如果r不为0,则将除数y作为新的被除数x,而将余数r作为新的除数y,再进行相除,得到新的余数r。(3) 如果r不为0,则重复步骤(2)

20、。如果r为0,则这时的除数就是最大公约数。36Option ExplicitDim a%, b%, r%, t%, p%Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer求最大公约数的函数过程 If x y Then t = y: y = x: x = t 保证x始终大于y Do While y 0辗转相除求最大公约数 r = x Mod y x = y y = r Loop gcd = xEnd Function37Function lcm(x, y, m) As Integer 求最小公倍数的函数过程 lcm =

21、x * y / m 最小公倍数等于两个数的乘积除以它们的最大公约数End FunctionPrivate Sub Form_click() a = Val(Text1.Text) b = Val(Text2.Text) Text3.Text = gcd(a, b) 调用函数过程求最大公约数 Text4.Text = lcm(a, b, gcd(a, b)调用函数过程求最小公倍数End Sub3839 参数传递参数传递是指是指调用过程与被调用过程之间的一种调用过程与被调用过程之间的一种数据通讯方法。数据通讯方法。 数据的传递方式可以是:数据的传递方式可以是: 单向的单向的按值传递按值传递 双向的

22、双向的按地址传递按地址传递 数据传递是通过数据传递是通过形参形参和和实参实参进行传递的。进行传递的。 7.3.1 形参和实参 形参: 出现在Sub或Function语句中。 实参: 出现在调用程序中。 例如,定义如下一个过程: Sub SubTest(n As Integer,Sum As Single) End Sub 调用语句: Call SubTest( a , s )40形参形参实参实参41说明说明: 一般情况下,形参表与实参表中对应参数个数、一般情况下,形参表与实参表中对应参数个数、类型、位置顺序必须一一对应。类型、位置顺序必须一一对应。 形参表中的参数可以是形参表中的参数可以是:

23、除固定长度字符串之外的合法变量名、数组名除固定长度字符串之外的合法变量名、数组名() 实参表中的参数可以是实参表中的参数可以是: 常量、变量、表达式、数组名常量、变量、表达式、数组名() 形参与实参的结合有两种方式形参与实参的结合有两种方式: 按值传递和按地址传递。按值传递和按地址传递。427.3.2 按地址传递按地址传递(引用)(引用)指将实参的地址传给形参,使形参和实参具指将实参的地址传给形参,使形参和实参具有相同的地址,即形参与实参共享同一存储单元。有相同的地址,即形参与实参共享同一存储单元。(1) 当实参为变量或数组时,形参使用关键字当实参为变量或数组时,形参使用关键字ByRef定义定

24、义(或省略或省略)表示要按地址传递。表示要按地址传递。(2) 当参数是数组时,数组名之后必须使用一当参数是数组时,数组名之后必须使用一对空的圆括号。对空的圆括号。 按地址传递可以实现调用过程与子过程之按地址传递可以实现调用过程与子过程之间数据的间数据的双向传递双向传递。【例7-7】 定义了如下的函数过程:Option ExplicitPublic Function f(x As Integer) Dim y As Integer x = 10: y = 3: f = x * yEnd Function在命令按钮的Click事件过程如下:Private Sub Command1_Click()

25、Dim x As Integer, y As Integer x = 30: y = 3: y = f(x) Print x; yEnd Sub43 Sub SS(ByRef X, ByRef Y, ByRef Z) X = X + 1: Y = Y + 1: Z = Z + 1 End Sub而命令按钮Command1的Click事件过程如下: Private Sub Command1_Click() A = 1: B = 2: C = 3 Call SS(A, B, C) Print A, B, C End Sub44【补充补充】设定义了以下设定义了以下SS过程:过程:形参形参: X Y

26、Z实参实参: A B C存储单元存储单元45实参:实参: A B C 1 2 3形参:形参: X Y Z存储单元:存储单元:实参:实参: A B C 2 3 4形参:形参: X Y Z存储单元:存储单元:执行执行Call语句,进入过程时语句,进入过程时 从过程返回时从过程返回时 运行时,单击命令按钮在窗体上打印运行时,单击命令按钮在窗体上打印: 2 3 4467.3.3 按值传递按值传递实参把其值传递给形参而不传递实参的地址。实参把其值传递给形参而不传递实参的地址。数据的传递是单向的。数据的传递是单向的。(1) 当实参为常量或表达式时,数据传递总是单向当实参为常量或表达式时,数据传递总是单向的

27、。的。例如例如: Sub Test( n As Integer,Sum As Single) Call Test(10, 1+2)47【补补】设定义了以下过程】设定义了以下过程SS:Sub SS(ByVal X, ByVal Y, ByVal Z) X = X + 1 : Y = Y + 1 : Z = Z + 1End Sub命令按钮命令按钮Command1的的Click事件过程如下:事件过程如下:Private Sub Command1_Click() A = 1: B = 2: C = 3 Call SS(A, B, C) 在这里调用在这里调用SS子过程子过程 Print A, B, C

28、End Sub48因此,运行时单击命令按钮,在窗体上打印:因此,运行时单击命令按钮,在窗体上打印: 1 2 31 2 31 2 31 2 31 2 3实参:实参: A B CA B C形参:形参: X Y ZX Y Z1 2 31 2 32 3 42 3 4实参:实参: A B CA B C形参:形参: X Y ZX Y Z执行执行Call语句,进入过程时语句,进入过程时 从过程返回时从过程返回时 【例7-8】 有如下的程序:Private Sub Form_click() Dim a As Integer, b As Integer a = 20: b = 50 p1 a, b: p2 a,

29、 b: p3 a, b Print a=; a, b=; bEnd Sub49Sub p1(x As Integer, ByVal y As Integer) x = x + 10: y = y + 20End SubSub p2(ByVal x As Integer, y As Integer) x = x + 10: y = y + 20End SubSub p3(ByVal x As Integer, ByVal y As Integer) x = x + 10: y = y + 20End Sub50【例7-9】 编写一个函数过程,计算x的y次方,其中y0。单击窗体时调用该函数过程,打

30、印51、52、53、54、55的结果。程序代码如下:Option ExplicitDim r As Single, i As IntegerFunction power(x As Integer, ByVal y As Integer) r = 1 Do While y 0 r = r * x y = y -1 Loop power = rEnd Function51Private Sub Form_click() For i = 1 To 5 r = power(5, i) Print r; Next iEnd Sub52537.3.4 使用数组参数使用数组参数使用数组作为参数时只能按地址传

31、递,不能使用数组作为参数时只能按地址传递,不能按值传递。当参数是数组时,数组名之后需要使按值传递。当参数是数组时,数组名之后需要使用一对空的圆括号。用一对空的圆括号。【例7-10】 编写一个Sub过程,将数组元素中的数据倒置。程序代码如下:Option ExplicitSub swap(a() As Integer) 定义sub过程,将数组作为形参,不能定义数组的上下界 Dim i As Integer, t As Integer For i = LBound(a() To UBound(a() / 2 在过程中,用LBound()和UBound() 54获得数组的上界和下界将第一个与最后一个

32、交换,第二个与倒数第二个交换,.,第I个与第(UBound(a() + 1 -i)个交换 t = a(i) a(i) = a(UBound(a() + 1 -i) a(UBound(a() + 1 -i) = t Next iEnd Sub55Private Sub Form_click() Dim n As Integer, i As Integer Dim a() As Integer n = Val(InputBox(请输入数组的个数:) ReDim a(1 To n) For i = 1 To n Randomize a(i) = Int(Rnd * 20) Text1.Text =

33、Text1.Text & Str(a(i) Next i56 Call swap(a() 调用过程,将已经赋值的数组作为实参,也可以写成 swap a() For i = 1 To n Text2.Text = Text2.Text & Str(a(i) Next iEnd Sub57587.4.1 过程的嵌套调用过程不能嵌套定义过程不能嵌套定义,即不能在一个过程体内再即不能在一个过程体内再定义另一个过程定义另一个过程,但过程可以嵌套调用但过程可以嵌套调用,即可以即可以在一个在一个过程体过程体中中调用调用另一个另一个过程过程。【例例7-15】编写程序,计算编写程序,计算y的值。

34、的值。11111 2 1 2 31 2 39 10y 在这里用函数过程的嵌套实现在这里用函数过程的嵌套实现,首先编写一个函数过程首先编写一个函数过程,求每求每一项分母的值一项分母的值;其次编写另外一个函数过程求各项的和。其次编写另外一个函数过程求各项的和。 Option ExplicitFunction sum(n As Integer) As DoubleDim i As Integersum = 0For i = 1 To nsum = sum + iNext iEnd FunctionFunction sigma(n As Integer) As DoubleDim i As Integ

35、erFor i = 1 To nsigma = sigma + 1 / sum(i) 在在sigma()函数过程中调用函数过程中调用sum()函数函数Next iEnd FunctionPrivate Sub Command1_Click()Text1.Text = Format(sigma(10), 0.00000000000000)在事件过程中调用在事件过程中调用sigma()函数函数End Sub窗体模块窗体模块(Form) (文件扩展名文件扩展名)标准模块标准模块(Module) (文件扩展名文件扩展名)类模块类模块(Class) (文件扩展名文件扩展名)7.5 Visual Basi

36、c工程结构工程结构“工程添加窗体工程添加窗体”“工程添加模块工程添加模块”“工程添加类模块工程添加类模块”7.5.1 模块的分类模块的分类一个应用程序可以由一个应用程序可以由组成组成.vbp-工程文件工程文件多个工程组成多个工程组成.vbg-工程组文件工程组文件“文件文件|添加工程添加工程”“工程工程|添加窗体添加窗体/添加模块添加模块/添加类模块添加类模块”窗体模块包含:窗体模块包含:通用声明通用声明(常量、变量、数组、常量、变量、数组、外部过程外部过程)、事件过程、通用过程。事件过程、通用过程。可以用可以用查看查看一个一个窗体模块包含窗体模块包含了了界面界面和和代码代码两部分信息两部分信息

37、当一个当一个应用程序含有应用程序含有多个窗体多个窗体时时,如果有如果有多个窗体多个窗体都需要调用某都需要调用某一段公共过程一段公共过程,或需要共享常量、变或需要共享常量、变量等量等,则可以将则可以将这种过程这种过程或或常量、变量的声明常量、变量的声明建立建立在在标准模块标准模块内内,定义为定义为全局常量、变量全局常量、变量或或过程过程,供各供各个窗体模块使用。个窗体模块使用。2. 工程工程添加模块添加模块选选“新建新建”标签标签打开打开“添加模块添加模块”对话框。对话框。默认名字:默认名字:ModuleXModule1,Module2.2. 标准模块标准模块不对应于某个窗体、不对应于某个窗体、

38、是是纯代码模纯代码模块块,因此因此标准模块标准模块中中没有事件过程没有事件过程。3. 标准模块可以包含标准模块可以包含: 全局常量全局常量、变量、全局过、变量、全局过程;及程;及标准模块级常量标准模块级常量、变量、通用过程。、变量、通用过程。4. 存盘时每个存盘时每个标准模块标准模块对应一个对应一个.Bas文件文件,默认默认文件主名文件主名module1,.标准模块的添加标准模块的添加3. 类模块类模块类类是具有相同或相似特征的事物的集合是具有相同或相似特征的事物的集合,类封类封装了对象的属性和方法。装了对象的属性和方法。程序员一般不对类进行操作程序员一般不对类进行操作,而只能对类的实而只能对

39、类的实例例对象进行操作。对象进行操作。VB所使用的每种控件都对应着一个类所使用的每种控件都对应着一个类,如如Button按钮控件对应着按钮控件对应着Button类类,它们支持它们支持封装和多态性封装和多态性,但它们不支持继承但它们不支持继承,即不能从即不能从现有的类来创建新的类。现有的类来创建新的类。有时用户需要创建自己的类以实现特定的功有时用户需要创建自己的类以实现特定的功能能,则可以通过则可以通过类模块类模块创建创建自己的类自己的类。类模块。类模块文件的的扩展名为文件的的扩展名为.cls。默认主名。默认主名class1,.创建类的方法:创建类的方法:“工程添加类模块工程添加类模块”4. 过

40、程的作用域过程的作用域1. 模块级过程模块级过程: 在过程前如果在过程前如果加加Private关键关键字字,则这种过程只能被其所在的模块中的其他则这种过程只能被其所在的模块中的其他过程所调用。过程所调用。2. 全局过程全局过程: 在过程前如果在过程前如果加加Public关键字关键字(或省略或省略),则这种过程可以被其他模块中的过则这种过程可以被其他模块中的过程所调用。程所调用。调用格式调用格式:模块名模块名.过程名过程名(参数表参数表)注意:注意:标准模块标准模块中的中的全局过程名全局过程名如果惟一如果惟一,则则调用时调用时可以省略可以省略模块名模块名过程作用域的分类过程作用域的分类: 模块级

41、模块级、全局级全局级P2167.5.2 多重窗体多重窗体多重窗体的概念多重窗体的概念指在一个窗体内放置或包含了多个其他窗体的结构指在一个窗体内放置或包含了多个其他窗体的结构,也称也称“多文档界面多文档界面”MDI(Multiple Document Interface),并称该并称该窗体为窗体为“父窗体父窗体”;被放置或包含的窗体称被放置或包含的窗体称“子窗体子窗体”MDIChild。1、添加窗体、添加窗体“工程添加窗体工程添加窗体”;或工具栏中的;或工具栏中的“添加窗体添加窗体”按钮按钮;“添加窗体添加窗体”对话框对话框.对添加的窗体设置其对添加的窗体设置其:MDIChild=true。2、

42、设置、设置启动窗体启动窗体“工程工程XX属性属性”“工程属性工程属性”对话框对话框中选择中选择“启动对象启动对象”3、与多重窗体程序设计有关的语句和方法、与多重窗体程序设计有关的语句和方法(1)Load语句语句格式格式:Load 窗体名称窗体名称功能功能: 将一个窗体装入内存。执行该语句后,可以引用窗体将一个窗体装入内存。执行该语句后,可以引用窗体中的控件及各种属性,但此时窗体并没有显示出来。中的控件及各种属性,但此时窗体并没有显示出来。(2)UnLoad语句语句格式格式:UnLoad 窗体名称窗体名称功能功能: 将一个窗体从内存中删除。常用语句将一个窗体从内存中删除。常用语句UnLoad m

43、e,表示关闭本窗口。表示关闭本窗口。3、与多重窗体程序设计有关的语句和方法、与多重窗体程序设计有关的语句和方法(3)Show语句语句格式格式:窗体名称窗体名称.show(模式模式,OwnerForm)功能:功能:用来显示一个窗体,兼有载入和显示窗体两种功能用来显示一个窗体,兼有载入和显示窗体两种功能如:如:Form1.Show 0, Form23、与多重窗体程序设计有关的语句和方法、与多重窗体程序设计有关的语句和方法(4)hide方法方法格式格式:窗体名窗体名.hide功能:用来隐藏窗体,兼有载入和隐藏窗体两种功能。功能:用来隐藏窗体,兼有载入和隐藏窗体两种功能。【例例7-18】多窗体的应用。

44、输入学生多窗体的应用。输入学生5门课程的成绩,计算门课程的成绩,计算总分、平均分并显示。总分、平均分并显示。本例有本例有3个窗体个窗体Form1、Form2、Form3,分别作为应用程,分别作为应用程序的主窗体、输入窗体、显示窗体,还有一个标准模块,对序的主窗体、输入窗体、显示窗体,还有一个标准模块,对窗体间共用的全局变量进行说明。窗体间共用的全局变量进行说明。标准模块的代码标准模块的代码: Option ExplicitPublic yw%, sx%, yy%, hx%, jsj%Public zf As Single, pj As Single声明声明7个全局变量个全局变量,供应供应用程序

45、的各个模块共用用程序的各个模块共用 语文,数学,英语,化学,计算机语文,数学,英语,化学,计算机Form1窗体如图窗体如图7-16所示,是主窗体,运行后见到的第一所示,是主窗体,运行后见到的第一个窗体。单击个窗体。单击“输入成绩输入成绩”按钮显示按钮显示Form2,单击单击“计算成绩计算成绩”按钮显示按钮显示Form3,单击单击“重新计算重新计算”按钮按钮,显示显示Form1窗体窗体,单单击击“退出退出”按钮,退出应用程序。按钮,退出应用程序。7.5.2 多重窗体多重窗体通过通过“工程资源管理器工程资源管理器”双击切换至双击切换至form1,双击输入双击输入form1窗体代码窗体代码:Priv

46、ate Sub Command1_Click() 输入成绩按钮输入成绩按钮Form2.ShowCommand2.Enabled = TrueEnd SubPrivate Sub Command2_Click() 计算成绩按钮计算成绩按钮Form3.ShowCommand4.Enabled = TrueEnd SubPrivate Sub Command3_Click() 退出按钮退出按钮EndEnd SubPrivate Sub Command4_Click() 重新计算按钮重新计算按钮Load Form1Unload Form2Unload Form3Command2.Enabled = F

47、alseCommand4.Enabled = FalseEnd Sub7.5.2 多重窗体多重窗体通过通过“工程资源管理器工程资源管理器”双击切换至双击切换至form2,双击输入双击输入form2窗体代码窗体代码:Private Sub Text5_LostFocus()yw = Val(Text1.Text)sx = Val(Text2.Text)yy = Val(Text3.Text)hx = Val(Text4.Text)jsj = Val(Text5.Text)End SubPrivate Sub Form_Activate()Text1.Text = Str(yw + sx + yy

48、 + hx + jsj)Text2.Text = Str(yw + sx + yy + hx + jsj) / 5)End Sub通过通过“工程资源管理器工程资源管理器”双击切换至双击切换至form3,双击输入双击输入form3窗体代码窗体代码:7.5.3 Sub main过程过程Sub main过程过程是是标准模块标准模块module1.bas等等中的中的一个一个特殊过程特殊过程,主要包含主要包含一些一些应用程序启动时首先执行的应用程序启动时首先执行的代码代码,如如一些一些数据的初始化数据的初始化或根据情况或根据情况加载不同窗体加载不同窗体代码代码等。在等。在“工程属性工程属性”对话框对话框

49、中的中的“启动对象启动对象”中设置中设置sub main过程过程为为启动过程启动过程。 Sub main过程过程又称为又称为“启动过程启动过程”。 Sub main过程过程只能定义在只能定义在标准模块标准模块bas中,中,且同一且同一程序程序(工程或工程组工程或工程组)中中只能定义一次该过程只能定义一次该过程,如如果果有有多个标准模块多个标准模块,则只能在其中之一模块中定义一次则只能在其中之一模块中定义一次Sub main过程过程。概念概念注意事项注意事项7.5.3 Sub Main过程过程1. 默认默认情况下情况下,应用程序的第一个窗体应用程序的第一个窗体为为启动启动窗体窗体,如果如果想在应

50、用程序启动时首先显示其他想在应用程序启动时首先显示其他窗体窗体,那么就得在那么就得在“工程属性工程属性”对话框对话框中改变启中改变启动窗体的名称。动窗体的名称。2. 如果如果希望希望应用程序启动时首先执行一些代应用程序启动时首先执行一些代码码,则则可以将这些代码写在可以将这些代码写在标准模块标准模块的的一个一个名名称称为为Main的的Sub过程过程中中,然后然后将将Main过程过程定定义为义为启动程序启动程序。3. 设置设置Main过程过程为为“启动程序启动程序”的方法的方法 “工程工程工程工程1属性属性”在在“工程属性工程属性”对话框对话框的的“启动对象启动对象”下拉列表下拉列表框中框中选择

51、选择“Sub Main”。相关说明相关说明77 变量的作用域变量的作用域: 指变量的指变量的有效范围有效范围。 变量的生存期变量的生存期: 指变量的指变量的作用时间作用时间。787.6.1 变量的作用域变量的作用域可以将变量分为可以将变量分为局部局部变量、变量、模块模块级变量和级变量和全局全局变量。变量。模块级变量模块级变量全局变量全局变量局局部部变变量量模块模块过程过程1. 局部变量声明 不声明 Dim A As Integer A每次执行过程时被初始化 Static C As Single C在程序执行期间保持不变作用范围 仅在声明的过程中起作用 其他过程中即使有同名变量,也不是指同一变量

52、。79【例7-19】 有如下程序,单击三次Command1按钮的结果是什么?Sub p(a As Integer)x,y 为过程中的局部变量,只在本过程有效,且每次运行该过程都会被初始化 Dim x, y x = x + 1 y = y + 2 a = a + x + y a为引用传递的形参,是双向传递的End Sub80Private Sub Command1_Click() Dim a As Integer a为过程中的局部变量,每次运行都会被初始化 a = 1 Call p(a) 将赋值为1的实参传给形参 Print a; 在过程改变a的值要回传给实参,所以为4 Call p(a) 将赋值为4的实参传给形参 Print a81程序运行的结果是:4 7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论