页数:51页文件大小:292.7 KB来源: VB程序设计ppt课件
本课件讲解VB中的过程,先说明通用过程的概念与作用,分别介绍Function函数过程与Sub过程的定义、创建与调用方式,重点分析形参与实参的按值传递与按地址传递,随后说明过程的嵌套调用与递归,并梳理VB工程结构及变量的作用域与生存期。
第8章 过程
第8章过程§8.1 Function(函数过程)§8.2 Sub过程(Sub过程)§8.3过程之间参数的传递§8.4过程嵌套的调用§8.5过程的递归调用§8.6 VB的工程结构§8.7变量的作用域
引例:求解阶乘组合
8.1 Function过程
/函数前面用过Rnd、Int、InputBox等许多内部函数,它们能够根据提供的参数,执行了某些操作后返回一个函数值。这里可以通过Function过程来建立自己的函数8.1.1Function过程的定义Function过程定义的语法为:[Public|Private|Static]Function函数名([形参列表])[As类型][局部变量和常数声明][语句组][函数名=表达式]EndFunction
Function过程的说明
函数返回值的写法
5)函数名=表达式:为可选项,给函数名赋值语句,表达式的值就是函数的返回值,在Function过程内可以有多次给函数名赋值的语句,但返回值只有一个(即最后一个被执行的给函数名赋值的表达式的值)。
如果没有函数名赋值的语句,则根据该函数的类型不同返回不同的默认值:若是数值类型的,则返回“0”;若是字符串类型的,则返回空字符串。
但通常情况下,在过程结束语句“EndFunction”之前都有一条函数名赋值语句。6)EndFunction:定义Function过程的结束标志。
8.1.1Function过程的定义
8.1.2 Function过程
求解阶乘组合示例
例:求解阶乘N!/(M!*(N-M)!)
Private Sub Command1_Click() Dim n As Integer, m As Integer Dim doufact As DoubleDon = Val( InputBox("n:")): m = Val( InputBox(“m:")) Loop While n >= mdoufact =jc(n) /jc(m)(jc(n-m))text3 = Str(doufact) End Sub Private Functionjc(ByVal x As Integer) As Double Dim i As Integer, result As Doubleresult = 1Fori = 1 To xresult = result * i Next ijc= result End Function8.2.1 Sub过程
一、Sub过程的概念Sub用过程不与任何事件过程相联系,也不依附于任何对象,只能由别的过程来调用。它即可以存储在窗体模块中,也可以存储在标准模块中。
在程序中使用Sub过程是结构化程序设计的一个重要思想。对于那些与事件没有直接关系而且又要在多个过程中引用的程序段,最好的方式是将其定义为Sub过程,这样既可以简化程序,同时又可以提高程序的可读性和可维护性。
8.2 Sub过程与事件过程
Sub过程的创建
形式参数列表的定义
Sub过程的调用
8.2.2 事件过程
通用过程与事件过程的关系
事件过程1事件过程2Sub过程、函数过程事件过程对Sub过程和函数过程的调用:事件过程和通用子过程具有相同的格式和调用方法。
8.2.2事件过程8.2 Sub过程与事件过程
模块间数据传递的方式
2、实际参数
8.3.1形式参数
与实际参数按位置传送:指名传送:用“:=”把形参和实参连接起来。过程调用:Call TestSub( A% , B!,"Test")过程定义:Sub TestSub( P1 %, p2 !, p3 As String)Sub Add_num( var1%,var2%,var3%)c=(var1+var2)*var3print c
End SubAdd_num 4, 6,8Add_num var2:=6,var1 :=4, var3:=88.3过程之间参数的传递8.3.2 传值与传址
8.3.2传值与传址传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。传值:形参得到的是实参的值,形参值的改变不会影响实参的值。
8.3过程之间参数的传递形参前缺省或加“ByRef”关键字的为按地址传递,加“ByVal”关键字的是按值传递,
8.3.2 传值与传址(代码)
Private Sub CmdOK_Click()a% = 10: b% = 20: Swap1 (a, b) '传值 Print "A1="; a, "B1="; ba % = 10: b % = 20: Swap2(a, b)‘传址 Print "A2="; a, "B2="; b End Sub Sub Swap1(ByValx%, ByValy%) Dim Temp%Temp = x: x = y: y = Temp EndSub Sub Swap2(Byrefx%, y%) Dim Temp%Temp = x: x = y: y = Temp End Sub按值与按地址传递的对比
通过值传递的执行过程如下图:通过地址传递数据的执行过程
8.3.3可选参数
在过程参数列表中,可以指定一个或多个参数为可选参数,在调用时可有选择的向指定的可选参数传送或不传送数值。使用方法为可选参数前加Optional及使用Ismissing函数测试是否传送可选参数。
Sub Multi (fir %,sec%,OptionalThird)N=fir*secIf NotIsmissing(Third) thenN=N*Third
End If Print n End Sub Private Sub Form_Click()Multi 10,20End sub Private Sub Form_Click()Multi 10,20,30End sub8.3过程之间参数的传递可选参数的IsMissing测试
8.3.3可选参数可选参数过程通过Optional指定可选的参数,其类型必须是Variant,通过Ismissing函数测试是否可选参数传送实参值。
Ismissing函数有一个参数,它就是由Optional指定的形参的名字,其返回值为Boolean类型。在调用过程时,如果没有向可选参数传送实参,则Ismissing函数的返回值为True,否则返回值为False。
8.3过程之间参数的传递
8.3.4不定数量的参数
在过程调用时可向过程传送任意个数、任意类型的参数。格式:Sub过程名(ParamArray数组名)Sub Multi (ParamArrayNumber())n=1For EachxInNumbersn=n*xNext xPrint n
End Sub Sub Form_Click( )Multi 2,3,4,5,6 End Sub可变参数过程实际上把所有的参数传递给了一个数组,该数组为动态数组。8.3过程之间参数的传递8.3.5 对象参数
8.3.5对象参数将窗体或控件作为Sub过程的参数进行传递和使用。Sub FormSet ( Formnum AsForm)Formnum.left=2000Formnum.Top=3000Formnum.Width=5000Formnum.Height……
End Sub Sub Form_ClickForm Set Form1Form Set Form2…… End Sub(1)窗体参数8.3过程之间参数的传递(2)控件参数
Sub Fontout ( TestContrlAs Control)TestContrl.FontSize=四号TestContrl.FontName="隶书"……TestContrl.Text=“VB6.0"
End Sub Sub Form_ClickFontout Text1Fontout Text2 End Sub8.3过程之间参数的传递8.3.5对象参数参数传递方式小结
1.参数的数据类型2.按值传递参数:形参是实参的一个副本3.按地址传递参数:形参实参公用内存单元4.子过程执行一系列操作,函数过程返回一个值5.如果实参是常量(系统常量、符号常量)或者表达式,则无论定义时使用值传递还是地址传递,都是按值传递将常量或者表达式的计算值传递给形参。
参数传递的几点说明:8.3过程之间参数的传递
8.4 过程的嵌套调用
在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程如下图:8.4过程的嵌套调用
8.5 递归的概念
8.5 递归的概念(代码)
递归的执行过程
递归的两个必要条件
例:用递归求最大公约数
例利用递归求最大公约数
Public Functiongcd(m As Integer, n As Integer) As Integer If (m Mod n) = 0 Thengcd= n Elsegcd=gcd(n, m Mod n) End If End Function Private Sub Form_Click() Print gcd(10, 4) End Sub8.6 VB工程结构
VB应用程序由三种模块组成:窗体模块(Form) (文件扩展名.frm)标准模块(Module) (文件扩展名.bas)类模块(Class) (文件扩展名.cls)应用程序工程文件(.vbp)窗体模块(.frm)文件类模块(.cls)文件标准模块(.bas)文件事件过程Function过程Sub过程Property过程
1.窗体模块
标准模块的引入
当一个应用程序含有多个窗体时,可能其中的几个窗体都需要调用某一段公共代码,如果在每个窗体内都包含这些代码,就会造成大量的代码冗余,这时就可以在标准模块内建立一个包含此公共代码的通用过程,实现代码的共享。
标准模块不对应于某个窗体、是纯代码模块。标准模块可以包含:全局常量、变量、全局过程标准模块级常量、变量、通用过程注:不能包含事件过程添加:工程→添加模块→选“新建”标签→打开“添加模块”对话框。
默认名字:ModuleX8.6.2标准模块
类模块的概念
类是具有相同或相似特征的事物的集合,类封装了对象的属性(数据成员)和方法(处理数据的函数或过程)。程序员一般不对类进行操作,而只能对类的实例——对象进行操作。
Visual Baisc所使用的每种控件都对应着一个类,如Button按钮控件对应着Button类,它们支持封装和多态性,但它们不支持继承,即不能从现有的类(控件)来创建新的类(控件)。
有时用户需要创建自己的类以实现特定的功能,则可以通过类模块创建自己的类。类模块文件的的扩展名为.cls。*8.6.3类模块
设置启动窗体
缺省情况下,应用程序中的第一个窗体为启动窗体,如果想在应用程序启动时首先显示其它窗体,那么就得在“工程属性”对话框中改变启动窗体的名称。
有时,有些应用程序启动时需要先做一些初始化工作,如装入数据文件,然后再根据数据文件的内容决定显示哪个窗体;有时应用程序根本就不需要加载窗体(比如一些监控程序)。
为此,可以在标准模块中编写一个main过程,作为应用程序的入口。定义sub main过程为启动程序的步骤:“工程”→“工程属性”→选择“通用”选项卡→在“启动对象”下拉列表框中选择“SubMain”。
8.6.4 Sub Main过程
过程的作用域
过程的建立位置不同,允许被访问的范围也不同。作用域:模块级、全局级1.模块级过程:在过程前如果加Private关键字,则这种过程只能被其所在的模块中的其他过程所调用。
2.全局过程:在过程前如果加Public关键字(或省略),则这种过程可以被其他模块中的过程所调用。调用格式:模块名.过程名(参数表)注意:标准模块中的全局过程名如果唯一,则调用时可以省略模块名8.6.5过程的作用域
全局过程调用示例
例:设窗体Form1中有按钮: Command1、Command2
Public Sub aa()' aa为全局过程 MsgBox ("这是窗体Form1中的过程") End Sub Private Sub Command1_Click() Call aa End Sub Private Sub Command2_Click()Form2. Show End Sub可以省略添加标准模块Module1,编写以下过程: Public Sub bb()' bb为全局过程 MsgBox ("这是标准模块中的过程bb") End Sub可以省略跨窗体调用示例
设窗体Form2中有按钮: Command1、Command2
Private Sub Command1_Click() Call Form1.aa End Sub Private Sub Command2_Click() Call Module1.bb End Sub不可以省略可以省略8.7变量的作用域
与生存期变量的作用域:指变量的有效范围。变量的生存期:指变量的作用时间。8.7.1变量的作用域将变量分为:局部变量模块级变量全局变量模块级变量……全局变量局部变量…………模块过程
1.局部变量
•声明不声明DimA As Integer' A每次执行过程时被初始化StaticC As Single' C在应用程序执行期间保持不变•作用范围仅在声明的过程中起作用其他过程中即使有同名变量,也不是指同一变量。
局部变量示例
例:Sub S()X = 1Y = 2Z = X + YPrint X, Y, Z
End Sub Private Sub C1_Click()X = 2Y = 3Z = X + Y Call S Print X, Y, Z End Sub单击C1后运行结果:1 2 32 3 5局部变量局部变量2.模块级变量
模块级变量示例
例:Dim Z As IntegerSub S()Z = Z + 2Print Z
End Sub Private Sub C1_Click()Z = Z + 2 Call S Print Z End Sub第一次单击C1结果:44第二次单击C1结果:88第三次单击C1结果:1212模块级变量模块级变量同名局部变量示例
例:Dim Z As IntegerSub S()Dim ZZ = Z + 2Print Z
End Sub Private Sub C1_Click()Z = Z + 2 Call S Print Z End Sub第一次单击C1结果:22第二次单击C1结果:24第三次单击C1结果:26模块级变量局部变量8.7.2 变量的生存期
8.7.2变量的生存期静态变量:在应用程序执行期间保留不变动态变量:在所在的模块(过程)运行时被初始化单击按钮打印结果:55110StaticSub SS1()'局部变量I,S为静态变量For I = 1 To 10S = S + INext IPrint S
End Sub Private Sub Command1_Click() Call SS1 Call SS1 End Sub静态变量示例
例:Sub S()Static Z As IntegerZ = Z + 2Print Z
End Sub Private Sub C1_Click() Dim Z As IntegerZ = Z + 2 Call S Print Z End Sub第一次单击C1结果:22第二次单击C1结果:42第三次单击C1结果:62静态变量动态变量本章小结
End Function形参表:变量、数组名()调用:函数名(<实参表>)出现在表达式可以出现的位置第8章 小结(续)
End Sub调用:(1)Call<过程名>([<实参表>])(2)<过程名> [<实参表>]注意:Sub过程调用与函数过程定义与调用的区别第8章 小结(续2)
3.过程之间的参数传递按值传递:实参为常数、表达式;实参为变量,形参为ByVal变量按地址传递:实参为变量、数组;形参用ByRef定义的变量、数组(或省略ByRef)4.过程的嵌套调用*5.过程的递归调用6. VB工程结构窗体模块(Form) (文件扩展名.frm)标准模块(Module) (文件扩展名.bas)Sub Main过程类模块(Class) (文件扩展名.cls)
第8章 小结(续3)
7.过程的作用域模块级过程;全局级过程8.变量的作用域局部变量(过程级);模块级变量;全局变量9.变量的生存期动态变量;静态变量
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}