《过程与变量的作用域.ppt》由会员分享,可在线阅读,更多相关《过程与变量的作用域.ppt(37页珍藏版)》请在三一办公上搜索。
1、本章主要内容,过程概述 Visual Basic 的代码模块 Visual Basic的过程 变量的作用域 用户自定义类型,4.1过程概述,过程:是用来执行一个特定任务的一段程序代码。VB中有两类过程:(1)由系统提供的内部函数过程和事件过程。(2)用户根据自己的需要定义、供事件过程多次调 用的自定义过程。自定义过程又分为以下几类:以“Sub”保留字开始的子过程。以“Function”保留字开始的函数过程。以“Property”保留字开始的属性过程。以“Event”保留字开始的事件过程。,4.2 Visual Basic的代码模块,VB的应用程序是由过程组成的,过程代码放在模块中。VB提供了三
2、类代码模块:窗体模块、标准模块和类模块。,VB应用程序VBP,窗体模块frm,类模块cls,标准模块bas,函数过程(function),Sub过程,事件过程,Sub过程,函数过程,模块管理是通过工程资源管理器窗口来组织和管理一个工程(应用程序)的。,窗体模块(.Frm),标准模块(.Bas),类模块(.Cls),窗体模块 每个窗体对应一个窗体模块;窗体模块包含窗体及其控件的属性设置、窗体变量的说明、事件过程、窗体内的通用过程、外部过程的窗体级声明等;窗体模块保存在扩展名为Frm的磁盘文件中,默认时应用程序只有一个窗体,因此也只有一个窗体模块文件。如果应用程序有多个窗体,就会相应地有多个窗体模
3、块件。,标准模块标准模块的作用:在多个不同的窗体中,为了避免在不同的窗体模块中重复书写相同的变量或过程代码,可以创建标准模块。标准模块一般用来存放公共代码过程和声明公共变量。说明:标准模块一般包括全局变量声明、模块级变量声明和通用代码过程等几部分。,全局变量声明位于最前面,用关键字public声明,所声明的变量供整个应用程序使用。模块级变量是指只在标准模块使用的变量,用dim或private进行声明。标准模块中的过程代码是公有的,任何窗体或模块中的事件过程都可以调用它们。由于标准模块是以单独磁盘文件形式保存的,因此在不同的应用程序中可以调用同一个标准模块。在标准模块中可以包含通用过程,但不可以
4、包含事件过程。,4.1.3 类模块 类模块保存在扩展名为.cls的文件中。可以在.类模块中编写代码建立新对象,这些新对象可以包含自定义的属性和方法,可以在应用程序内的过程中使用。类模块与标准模块的不同之外在于:标准模块仅仅含有代码,而类模块即含有代码又含有数据。类模块可以视为没有物理表示的对象。,4.2 Visual Basic的过程,通用过程创建与调试 通用过程(sub过程)可以存储在窗体或标准模块中。存储在窗体模块中的通用过程只能被窗体事件过程调用;存储在标准模块中的通用过程则可以被整个工程中的事件过程调用。,1.通用过程的创建 方法:一是:直接在代码编辑窗口中输入过程代码。二是:使用“添
5、加过程”对话框创建。(1)直接在代码编辑窗口中创建,过程的形式如下:StaticPublic|PrivateSub 子过程名(形参列表)局部变量或常数定义 Exit Sub End Sub,形式说明:按默认规定,所有模块中的子过程都为public(公用的)。标准模块的公用过程可以在应用程序中被任意调用;但窗体模块中的公用过程只能在本窗体中调用,若使用private 则只有该过程所在模块的程序才能调用该过程。如果使用static(静态)关键字,则该过程中的所有局部变量的存储空间只分配一次,且这些变量的值在整个过程中都存在,如果省略此参数,则过程每次被调用时系统会重新为其变量分配存储空间,当过程结
6、束后存储空间被释放。,过程名遵守变量名的命名规则,长度不要超过40个字符。(形参列表)类似于变量声明,是用“,”分隔开的若干个变量,格式如下:变量名1 As 类型,变量名2 As 类型,或:变量名1 类型符,变量名2 类型符,形参表中出现的参数称为形式参数,其没有固定的值,只有当过程被调用时,才被一个确定的值所替代。Exit Sub 表示中途退出子过程。,(2)使用添加过程对话框创建步骤如下:(1)切换到代码窗口。(2)选择“工具”菜单下的“添加过程”命令,弹出“添加过程”对话框,见下图。,(3)在“名称”框中输入过程名。例如在图中显示输入的过程名为“max”。(4)在“类型”组中选取“子程序
7、”。(5)在“范围”组中选取“公有的”定义一个公共级的全局过程,或选取“私有的”定义一个局部过程。(6)单击“确定”按钮,完成对子过程的定义。此时,代码窗口中会自动出现子过程的代码框架。,例如:单击图所示对话框的“确定”按钮后,在代码窗口中会出现以下代码:Public Sub sum()End Sub可以在子过程的代码框架中输入语句,以完成相应功能。,实例,4.2.2 函数过程的创建与调用 函数过程与子过程最主要的区别在于:函数过程有返回值,而子过程没有返回值。函数过程是自定义过程的另一种形式。当过程的执行需要返回一个值时,使用函数过程比用子过程更加简单方便。,1.函数过程的创建 语法格式:S
8、taticPublic|Private Function 函数名(形参列表)As类型 局部变量或常数定义 语句序列1 Exit Function 语句序列2 函数名=表达式End Function,说明:As类型:指明函数过程返回值的类型。在函数过程中至少对函数名赋值一次。从函数过程返回时函数名的值就是返回值。无论函数有无参数,函数名后的括号都不能省略。Exit Function表示中途退出函数过程。,实例说明:Function sum(x%,y%)As Integer sum=x+yEnd FunctionPrivate Sub Form_Click()d=sum(2,3)Print dEn
9、d Sub 在上述函数过程中,“As Integer”定义名为sum的函数过程返回值为整型,通过语句“sum=x+y”对函数名赋值。执行上述语句段,会在窗体上输出数字5。,2.函数过程的调用 调用函数过程可以由函数名带回一个值给调用程序,被调用的函数必须作为表达式或表达式中的一部分,再与其他的语法成分一起配合使用。因此,与子过程的调用方式不同,函数不能作为单独的语句加以调用。最简单的情况就是在赋值语句中调用函数过程,其形式为:变量名=函数过程名(实参列表),工程,过程中参数的传递1.形式参数和实际参数形式参数:在定义Sub过程或Function过程时,过程名或函数名后面括弧中的变量名,简称形参
10、。实际参数:在调用Sub过程或Function过程时,过程名或函数名后面括弧中的常量、变量或表达式,简称实参。,2.有关规定:多个实参或形参之间用逗号隔开,在定义时,形参为实参预留位置;在调用时实参的值被一一插入到对应的形参位置上去。实参与形参间个数相等,类型相符且书写顺序应一致。实参与形参按顺序对应,一一传递数据。,3.传值与传址 在调用过程时,参数的传递有两种:按地址传递和按值传递。按址传递:形参和实参使用同一个内存地址单元,因此形参和实参还有一定的联系。按值传递:系统将实参的值传给形参后,形参与实参就断开了联系,调用过程中的操作是在形参自己的存储单元中进行的,一旦过程结束,形参占用的内存
11、全部释放,由此可见,在过程中对形参的任何操作都不会影响实参。,传址与传值的区别:最主要的区别是:对形参的操作是否会对实参产生影响。传址时,实参和形参共用一个内存单元,对形参的操作等同于对实参操作。传值时,实参和形参使用不同内存单元,对形参的操作不会对实参产生影响。,形式上的区别是:在形参前是否有关键字“ByVal”。使用传址时,无需在形参前加任何关键字使用传值时,需要在形参前加关键字“ByVal”。实参取值上的区别:按址传递,实参不能是常量或表达式,只能是变量。按值传递,实参可以变量、常量或表达式。,例4-5按值传递和按址传递示意图,应用举例,10,20,实参,a,b,y,x,形参,10,20
12、,10,20,实参,a,b,形参,y,x,20,10,20,10,按值传递,按值传递,数组参数的传递 在VB中允许参数是数组,数组只能通过传址方式进行传递。注意:在实参列表和形参列表中放入数组名,忽略维数的定义,但圆括号不能省略;如果被调过程不知道实参数组的上下界,可用lbound()和ubound()函数来确定实参的上下界。,应用举例,过程的递归 递归算法是指一个过程直接或间接调用自己本身的一种方法。,在被调用的函数中必然存在一个终止条件,否则会陷入死循环,Function f(x as integer)if x=10 then f=x else f=3+f(2+x)endifEnd Fun
13、ction,f(2)函数的调用和执行过程,fact(n)=n*fact(n-1),fact(4)的执行过程,4.3 变量的作用域,变量的作用域:是指变量在程序中能够被识别的范围。按作用域变量可分为:过程级变量(procedure level):是指在过程中声明变量;模块级变量(modul level):是指在模块中声明变量。按变量的作用范围分类:过程级变量属于局部变量;模块级变量属于全局变量。,过程级变量在程序内部定义的变量就是“过程级变量”,未经声明,默认为过程级变量;在一个过程内部使用dim或 static关键字声明的变量;过程级变量被限制在过程内部使用,一旦退出过程,变量自动消失;常用于
14、存储临时数据或运算的中间结果。,例:private sub command1_click()dim a as integer,b as integer static s as long end sub,模块级变量模块级变量根据其作用范围的不同可分为模块级变量和应用程序级变量。一个窗体模块中包含多个事件过程和通用过程,如果希望在整个模块中的多个过程中使用同一个变量,就必须声明为模块级变量。在一个模块内部使用的模块级变量,可以使用private 或dim来声明。模块级变量可以在窗体模块、标准模块和类模块中定义,但不可在过程内部定义。,例如:private s as single dim a as
15、integer,b as integer private sub command_click()end sub,应用举例,变量的生存周期 程序在退出运行后,变量占用内存单元是释放还是保留,这就是变量的生存周期,根据变量的生存周期,把变量分为:静态变量(static)和动态变量(dynamic)说明:动态变量是指程序运行进入变量所在过程时,系统才分配该变量的内存单元,一旦程序结束,退出过程后,变量所占内存释放;,静态变量是指程序运行进入变量所在过程,修改变量的值,退出过程序列后,变量所占内存单元未被释放,变量值仍然可用;在过程中使用dim声明的局部变量属于动态变量;在过程中使用static声明的局部变量属于静态变量。,应用举例,4.4 用户自定义类型,用于相互之间有逻辑关系但又都是不同类型的数据处理。用户自定义类型由若干个基本数据类型组成;遵循先定义后使用原则;由type语句创建,但必须置于模块声明的部分进行。语句格式:private|public type as as as End type,说明:(1)自定义类型名不是变量,但命名规则相同;(2)元素名表示自定义类型中的一个成员;(3)类型名是VB中的基本数据类型。,应用举例,