版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章学习目标明确过程的概念掌握sub子过程和function子过程的定义和调用理解过程调用时实参和形参的关系,掌握参数的传值方式和传递地址方式理解和掌握VB的不同模块中过程的作用域和调用形式第8章过程过程的概念一个过程就是由若干条语句构成、具有相对独立功能的一段程序代码。一个完整的程序通常由一个主过程和若干个子过程组成,主过程可根据需要调用子过程来实现相应的功能,而且各子过程间也能相互调用。每一个过程就是一个完整的功能模块,由顺序、选择和循环三种基本结构组成。过程的分类在VisualBasic6.0中,可以使用的过程包括子程序过程、函数过程、属性过程、事件过程四种类型。事件过程,是VB应用程序的主体,能够很好地支持VB以事件驱动的编程机制。这类过程一般是由VB系统创建的,用户也可以自己创建事件过程,在触发相应的事件时会自动执行事件过程中的程序代码。子程序过程,也称为自定义子过程,是由用户自己创建的一类过程。它不依附于VB的某一对象,独立于事件过程之外,可供其他自定义过程或事件过程进行调用。函数过程,即Function过程。这也是由用户自己创建的一类过程,同事件过程、自定义过程的主要区别在于函数过程要求有一定的返回值。属性过程,是由用户自己创建的一类过程,用来返回或设置属性的值及设置对象的引用等。8.1Sub过程子程序过程和事件过程的定义都是使用Sub关键字开头,这两类过程统称为Sub过程。为更好地理解这两类过程,做如下区别:子程序过程不依附于某一对象,而事件过程必须是与某一对象相关联的。子程序过程是由用户自己创建的,而事件过程主要是由VB系统创建的。事件过程在事件被触发时会自动调用,而子程序过程则必须通过调用语句的调用才能被执行,且可以多次被调用。如不做特殊说明,以下提到的事件过程都是指VB系统预定义的事件过程,如窗体的Load事件、命令按钮的Click事件等。8.1.1Sub过程的创建创建Sub过程的方法有两种:利用“工具”菜单下的“添加过程”命令在代码窗口中直接定义注意:要创建Sub过程,必须事先打开代码窗口声明Sub过程的语句及语法不管是通过“添加过程”对话框创建Sub过程,还是在代码编辑窗口中直接定义,都必须明确声明Sub过程的语句的语法。【格式】[Public|Private][Static]Sub<子过程名>([形参列表])[局部变量或符号常量的声明][语句序列][ExitSub][语句序列]EndSub【说明】子程序过程以Sub开头,EndSub结束,二者之间的语句序列称为过程体。Public|Private用于定义过程的作用范围,对应于“添加过程”对话框中的“范围”选项。关键字Public和Private只能二选一,其中Public声明的过程为全局级,可以在当前工程的所有模块中被调用;Private声明的过程为模块级,只能在声明该过程的模块中被调用。缺省时,声明的过程是全局级的。Static声明在该过程中定义的所有变量都是静态变量,对应于“添加过程”对话框中“所有本地变量为静态变量”选项。子过程名是必选项,用于定义过程的名称,命名规则同变量的命名规则一致。参数列表用于定义过程的形式参数,每一个参数相当于一个变量,其声明的形式类似于变量的声明,如果有多个参数,参数与参数之间用逗号进行分隔。语句序列是过程要执行的程序代码,用于规定过程要完成的功能。ExitSub是退出子过程语句,该语句可出现在过程中的任意一个语句位置。程序一旦执行该语句,将退出当前过程的执行,返回到主调过程中调用该过程语句的下一条语句上继续执行。EndSub标识子过程的结束。一旦执行EndSub语句,将同样结束当前子过程的调用,返回到主调过程中继续执行。8.1.2Sub过程的调用过程的调用是指实际去执行过程中的语句序列。通常,如果在过程A中调用了过程B,则称A为主调过程,B为被调过程。主调过程和被调过程是一个相对的概念,如果过程B又调用了过程C,则过程C为被调过程,而过程B对过程C来讲则是主调过程。图8-4过程调用示意图主调过程A┆过程B调用语句语句i┆EndSub被调过程B┆语句i┆EndSub8.1.2Sub过程的调用子程序过程必须通过调用语句显式调用才能执行过程中的代码。调用子程序过程的语句有如下两种形式:【格式1】Call<过程名>([参数列表])【格式2】<过程名>[参数列表]【说明】参数列表中的参数为实际参数,即在过程调用时传递给过程的实际量,能够为被调过程的形式参数接收。主调过程的实参传递给被调过程的形参时要保持一一对应的关系。如果有多个实参,参数与参数之间用逗号隔开。用Call语句调用过程时,参数列表必须包含在括号之内,如果没有参数(也称无参过程),可以省略掉括号;而使用格式2调用过程时,必须省略括号。例8-1,子程序过程的创建和调用8.2Function过程VB中的Function过程,即函数过程是过程的另一种表现形式。为完成函数要求的运算,必须首先要对函数进行定义;在表达式中调用函数时,函数运算的结果作为函数的返回值返回到主调过程,这也是Function过程与Sub过程的不同点。由VB系统的设计者预先编写完成后封装在VB系统文件中的函数过程,是VB系统预定义的内部函数,只要启动VB的系统环境,用户就可以使用这些内部函数,不需要重新定义,也不必关心函数过程的内部代码是如何编写的。8.2.1Function过程的创建与子程序过程类似,创建Function过程也有两种方法:利用“工具”菜单下的“添加过程”命令在代码编辑窗口直接定义不管是通过“添加过程”命令,还是直接在代码编辑窗口中定义函数过程,都必须遵守Function过程定义的语法格式[Public|Private][Static]Function函数过程名([形参列表])[As类型][局部变量或符号常量的声明][语句序列]函数过程名=表达式[ExitFunction][语句序列][函数过程名=表达式]EndFunctionFunction过程以Function开头,以EndFunction结尾,两者之间描述过程操作的语句序列称为函数体。格式中Public、Private、Static、ExitFunction、函数过程名、形参列表同Sub过程的含义相同。“As类型”用于指定Function过程返回值的类型,可以为Integer、Long、Single、Currency、String等,缺省时为Variant类型。由Function过程返回的值通过“函数过程名=表达式”赋给函数过程名,在调用函数过程时由主调过程获取到该返回值。如果没有“函数过程名=表达式”这条语句,则Function过程返回一个默认值,其中数值类型函数过程返回0,字符串型函数过程返回一个空字符串,Variant类型函数过程返回Empty。例8-2定义一个求绝对值的函数过程8.2.2Function过程的调用自定义Function过程的调用与VB内部函数的调用方法一样,其一般形式为:【格式】函数过程名([实参列表])Function过程的调用同Sub过程一样,一旦调用一个Function过程,将转去执行相应的Function过程的程序代码。但所不同的是,Function过程调用结束时,其运算结果将返回到主调程序。因此,Function过程的调用一般不能作为单独的一条语句出现,而是必须出现在表达式中。例8-3,编写计算阶乘的函数Fact,并求1!+2!+...+10!的结果。例8-4,求2-100之间的质数。8.3过程中的参数传递在调用过程时,主调过程和被调过程之间会有一些数据信息的传递,这种数据信息传递是双向的:主调过程要求被调过程根据其给出的数据信息进行相应的处理,而被调过程往往要将处理所得的结果再传回主调过程。主调过程和被调过程之间的信息传递有两种方式:通过非局部变量传递或通过参数传递。通过非局部变量传递是指在过程中直接处理非局部变量,如模块级变量,能够在多个不同的过程中使用,从而实现在过程之间的信息传递。通过参数传递是指在调用过程时,主调过程给出的实际参数和被调过程中的形式参数相结合,即“虚实结合”的方式,将主调过程中的实际参数所包含的数据信息传递给被调过程中的形式参数。8.3.1形式参数和实际参数形式参数是指在定义过程时,出现在Sub或Function语句的参数列表中的变量,用于接收从主调过程传递来的数据。实际参数是指在调用过程时,过程调用语句的参数列表中出现的实际的量,代表了传递给形参的数据信息。根据定义过程时对于形式参数的声明,实际参数可以是常量、变量、表达式或数组等。8.3.1形式参数和实际参数在定义过程时,形式参数的语法格式如下:[ByVal|ByRef][Optional][ParamArray]形参名[()][As类型][=缺省值]【说明】[ByVal|ByRef],用于规定参数的传递方式。ByVal表示该参数按值传递;ByRef表示该参数按地址传递。缺省时是ByRef方式。[Optional],表明该参数是可选的。若某参数是可选的,则在形参列表中该参数后面的所有参数都必须是可选的,即都要用Optional关键字来声明。[ParamArray],仅用于形参列表中的最后一个参数,说明该参数是由不定个数的Variant类型的元素所组成的一个数组。形参名[()],用于规定形式参数的名称。如果形式参数是数组,则要在数组名后加一对空的圆括号。[As类型],用于规定形式参数的数据类型,缺省时为Variant类型。对于String类型的形式参数,它只支持变长字符串。但在调用过程时,实际参数可以是定长字符串;在使用用户自定义数据类型作为形式参数的数据类型时,形式参数的前面不能使用Optional关键字。[=缺省值],只对Optional参数适用,表示该参数缺省时的值。缺省值可以是任何常量或常量表达式,但当参数的类型为Object时,显式的缺省值只能取Nothing。8.3.1形式参数和实际参数需要特别说明的是:在定义形式参数时只能使用变量或数组,不能使用常量来定义形式参数。只有在调用带参数的过程时,才为形式参数分配内存单元,并且接收由实参传递过来的数据;当过程调用结束后,形式参数所占据的存储单元也同时被释放。因此,形式参数和实际参数重名并不发生冲突。在过程被调用时,形式参数接受由实际参数传递过来的数据,第一个形参接收第一个实参,第二个形参接收第二个实参,以此类推。例如:8.3.1形式参数和实际参数实际参数和形式参数要具有一一对应的关系,在调用过程时需注意:实参与形参的个数应相等(不定数量参数除外)。实参和形参的顺序和位置要一一对应。各参数之间用逗号隔开,对于可选的形式参数即使在调用过程时没有提供实际参数,也要用逗号空出其位置。实参和形参的数据类型要相符。类型相符是根据参数的传递方式而言的,对于按值传递的参数要求实参和形参赋值相容;而对于按地址传递的参数则要求实参和形参的类型必须相同。8.3.2参数的传递方式在调用过程时,实际参数和形式参数之间的数据传递方式分为两种:按值传递(ByVal)、按地址传递(ByRef)。在默认情况下,变量(简单变量、数组或数组元素等)都按地址传送给Sub或Function过程。在这种情况下,过程中使用的变量是实际传送的变量本身。这意味着,当按地址传送参数时,有可能改变传送给过程的变量的值。8.3.2参数的传递方式按值传递:如果在调用过程时实参是常量或表达式,或者在定义过程时形参前有关键字ByVal,则该参数是按值传递的,即在调用过程时是将实际参数的值复制一份传递给形式参数,此后形式参数与实际参数之间没有任何联系,在过程中对形式参数所做的任何改变不会影响到实际参数。按值传递时,实参和形参各有内存单元,主调与被调过程之间不会相互干扰,可以提高程序的可靠性并且便于调试。所以调用过程时最好采用传值方式,除非希望被调过程改变实参的值。例8-5,按值传递参数示例8.3.2参数的传递方式按地址传递如果在定义过程时,形参前有关键字ByRef或缺省,并且在调用过程时实参是变量,则该参数按地址传递,称为按引用传递参数。按地址传递参数时,实参和形参的结合方式是:在调用过程时将实参的地址传递给形参,即形参与实参共用同一地址的内存单元。因此,在被调过程中对形参的任何改变都会影响到实参。按地址传递参数时,形参和实参共用同一个内存单元,因此实参和形参的数据类型要相同,否则就会出错。例8-6、8-7、8-8,按地址传递参数的不同形式8.3.3数组参数的传递在调用过程时,可以把数组元素作为实参传递给被调过程,也可以把整个数组作为一个参数传递给被调过程。传递数组元素如果要传递数组中的某一元素,只要在调用过程时将其作为实参即可,如:CallinputSub(a(2),6)其中a(2)为数组元素,inputSub是被调过程的名称。注:数组元素作为参数传递的用法与单个变量作为参数相同,也可以按值或按地址传递给过程。8.3.3数组参数的传递传递整个数组在将整个数组作为一个参数传递给过程时,需要注意以下几点:定义过程时,要在形参名后加一堆空的圆括号,将其声明为数组;而且因为过程被调用前无法预知数组的大小和维数,因此将形参声明为一个动态数组。调用过程时,将固定大小和维数的数组名称作为实参传递给被调过程的形参,不必包括维数和圆括号。在过程中定义时,数组作为参数要求必须以ByRef方式传递,因此,要求形参和实参数组的数据类型必须要相同,否则就要出错。在过程定义时,可以在最后一个参数的位置使用ParamArray关键字定义一个可变类型的动态数组,该参数为可选参数,且由不定个数的Variant类型的元素组成。例8-9,编写一个参数为数组的过程,能够将数组中的元素按从大到小排列。例8-10,编写一个过程,求任意一组数的最大、最小值。8.4过程的嵌套和递归调用过程的嵌套和递归调用是过程调用的特殊形式,遵循过程调用的基本原则。其中嵌套调用是过程调用时又去调用其它的过程,调用关系类型与树形结构;而递归调用是过程对自身的重复调用,类似于过程调用的循环。8.4.1过程的嵌套调用在VB中过程的定义是相互独立的,不允许嵌套定义,即在定义过程时,一个过程中不能包含另一个过程的定义。但是,过程的调用允许嵌套,即主调过程调用某个被调过程,而在被调用过程中还可以调用另外的过程,这称为过程的嵌套调用,如图8-11所示。由此可见,主调过程和被调过程是一个相对的概念。图8-11过程的嵌套调用过程A┆调用过程B语句i┆过程结束过程B┆调用过程C语句k┆过程结束过程C┆过程结束例8-11,使用嵌套调用的方式,求组合数8.4.2过程的递归调用在VB中,过程直接或间接调用它自身,称为递归调用。递归调用是一种特殊的嵌套调用情况。过程P直接调用P本身,称为直接调用;过程P调用过程Q,在过程Q中又调用过程P,称为间接调用。本节只讨论直接调用。在程序中采用递归的方法,可以使程序语言的描述与问题的自然描述一致,能够用简短清晰的程序解决复杂的问题,因而对于那些具有递归结构的问题解决非常有用。一个问题需要采用递归的方法来解决时,必须符合以下两个条件:具有递归形式即可以把要解决的问题转化为一个新问题,而这个新问题的解决仍与原来的问题解法相同,只是所处理的数据有规律地递增或递减,并且通过这个转化过程能够使问题最终得到解决。必须有一个明确的结束递归的条件例8-12,用递归的方法求N!例8-13,用递归法求m和n的最大公约数8.5代码模块VB的应用程序是以工程为主体的,其中每一个工程可包含若干个不同的模块,每个模块又是以过程为单元进行代码的组织和使用的,代码最终存储在不同的模块中。VB的代码模块有三种类型,即窗体模块、标准模块和类模块,在工程中按照类别进行分层组织,如右图所示。其中标准模块通常简称为模块。8.5.1窗体模块窗体模块是VB应用程序的基础,作为应用程序界面的重要组成部分,是用户与VB应用程序进行交互的主要方式。在VB的工程中,每一个窗体都对应一个窗体模块,窗体模块保存在扩展名为.frm的文件中。窗体模块主要包含三部分内容,一是跟窗体有关的事件处理过程、通用过程(包括Sub过程和Function过程);二是窗体级的常量、变量、类型定义以及外部过程的声明;三是窗体的大小、颜色、所含的各种控件的属性设置等信息。如果在文本编辑器中打开窗体模块,就会看到关于窗体以及控件的描述,包括它们的属性设置等。默认情况下,VB的工程中只包含一个窗体,可以根据需要添加多个窗体。如在“工程”菜单中执行“添加窗体”命令,在打开的“添加窗体”对话框中,可以选择“新建”一个窗体或者从“现存”选项卡中选择添加一个已经创建并保存的窗体。每一个新添加的窗体都将单独保存,并在VB的“工程资源管理器”窗口中显示。8.5.2标准模块在VB的应用程序中,一个工程可以包含多个窗体,这些窗体要执行的公共代码部分可以从窗体中独立出来,存放于标准模块中。通过标准模块的使用,可以进一步提高代码的可重用性,增加代码的模块化和可读性。标准模块保存在扩展名为.bas的文件中,通常包含变量、常量、类型定义、外部过程和通用过程的全局级或模块级声明。在缺省的情况下,标准模块中的声明都是全局级的,只有用关键字Private或Dim所作的声明才是模块级的。全局变量可以用Public或Global关键字进行声明。标准模块可以脱离特定的应用程序,也就是说在不同的应用程序中可以重用标准模块,只要将标准模块添加到当前的应用程序中即可。8.5.2标准模块创建标准模块设置启动对象在标准模块中,可以创建一个特殊的Sub子过程,即Main子程序过程,而且即使有多个标准模块,也只能在一个标准模块中创建一个SubMain子过程。其特殊性就在于SubMain子过程可以作为VB整个应用程序的启动对象。要把SubMain作为启动对象,可以执行“工程”菜单的“工程属性”命令,在打开的“工程属性”对话框中,可设置“启动对象”为SubMain,当然也可以设置工程中的一个窗体作为启动对象。作为启动对象的SubMain子过程就是在标准模块中创建的Main子程序过程。8.5.3类模块类模块是面向对象编程的基础,它保存在扩展名为.cls的文件中。类模块代表了一个类的模板,据此可以创建新的对象。类模块既包含数据,又包含代码,分别描述了从该类创建的对象的特征和行为,可以看做是没有物理表示的对象。类模块的创建和使用方法,在此不做介绍。8.6过程的作用域过程调用时,必须考虑其作用域问题。8.6.1过程的作用域过程同变量一样,需要考虑过程的作用域问题。按照过程定义时所在的模块位置以及采用的关键字的不同,过程的作用域分为模块级和全局级。其中,模块级也称为文件级;全局级也称为工程级。全局级:在用户自定义的子程序和函数过程前不加任何关键字,或
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工作室合伙合同
- 二零二五年度个人留学贷款最高额质押担保协议3篇
- 个人年度工作自我鉴定7篇
- 2024年立式风机盘管机组项目可行性研究报告
- 2024年真丝手绘丝巾项目可行性研究报告
- 2025版酒店品牌代理合作协议范本(含数据分析)3篇
- 消防安全讲座心得体会
- 2024年氟乙烯树脂粘合胶带项目可行性研究报告
- 关于教师语文工作述职报告四篇
- 房屋代理合同
- 口腔正畸科普课件
- 2024年广东省普通高中学业水平合格性地理试卷(1月份)
- 住宅楼安全性检测鉴定方案
- 配送管理招聘面试题与参考回答2024年
- 江苏省语文小学三年级上学期期末试题及解答参考(2024年)
- 黑龙江哈尔滨市省实验中学2025届数学高一上期末监测试题含解析
- 小学一年级数学思维训练100题(附答案)
- 安全生产治本攻坚三年行动方案(一般工贸) 2024
- 2024年广东省广州市黄埔区中考一模语文试题及答案
- 饭堂挂靠协议合同范本
- 2023-2024学年辽宁省重点高中沈阳市郊联体高二上学期期末考试生物试题(解析版)
评论
0/150
提交评论