您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 《VB程序设计基础》第4章 函数与过程
第4章函数与过程4.1过程的编写与调用4.2参数传递4.3多模块程序设计4.4小结4.1.1函数过程的编写与调用1.函数过程的编写格式:[Public|Private][Static]Function函数名[(形参声明列表)][As类型声明]函数体EndFunction(1)Private限定所编制的函数只限于在本窗体中被调用;Public声明该函数可以被其他窗体、模块调用;选项Private是缺省值。(2)Static声明函数名以及函数中声明的局部变量都是静态变量(详见4.3.3节)(3)函数体为实现该函数运算的若干声明语句和执行语句,其中至少应有1个赋值语句为函数名赋值。函数被调用后的返回值,为返回时函数名的当前值。(4)一般将调用、被调用过程之间要相互传递的数据作为形参(形式参数)。4.1.1函数过程的编写与调用形参声明格式:[Byval|ByRef]变量名As类型标识符数组名()As类型标识符关于形参变量名前置Byval或ByRef的含义,在4.2节详细说明。如果数组名作形参:若为一维数组,一般应设置一个形参传递实参数组的元素个数;若为二维数组,一般应设置2个形参分别传递实参数组行数、列数。4.1.1函数过程的编写与调用2.函数过程的调用(1)定义为Private的任何过程,只能被其所在窗体的过程调用。调用格式为:函数名(实参列表)(2)定义为Public的任何过程,可以被当前工程中其他窗体中的过程调用。调用格式为:窗体名.函数名(实参列表)(3)一般应像使用VB内部函数一样来调用Function过程,调用后返回结果是1个函数值。也可以像后面所介绍的,调用Sub过程那样用Call命令调用,如:Call函数名(实参列表),但用这种方式调用函数时,VB系统将放弃返回值,这样你就得不到想要的函数值了。4.1.2SUB过程的编写与调用程序中多次重复出现的操作过程,VB允许用户将这些操作自定义为SUB过程。与函数过程相区别,这些重复操作不是计算返回一个值,只是完成某些特定的操作。有时,将返回多个值的运算也写作SUB过程。1.SUB过程的编写格式:[Public|Private][Static]SubSub过程名[(形参列表)]SUB过程体EndsubSUB过程体中:不得为SUB过程名赋值;执行ExitSub语句可以将控制返回到调用程序。函数过程的名在函数体中一定要被赋值,因为函数过程调用结束后,函数名要用其获得的值参加调用处表达式的计算。而SUB过程的名不能被赋值,这是函数过程和SUB过程的最主要的区别之一。4.1.2SUB过程的编写与调用2.SUB过程的调用调用格式:CallSub过程名(实参列表)或Sub过程名实参列表Public或Private属性对Sub过程调用的影响,与函数过程相同。特别要注意的是,事件过程也是Sub过程。这就是说,事件过程在运行时还可以用Call语句调用。如Command1_Click事件会显示“hello!”,而执行Form_Click过程中的语句“CallCommand1”也会激发Command1_Click事件、显示“hello!”。此外,自定义Sub过程可以为形参命名,则应当允许在事件过程中编写代码时为形参改名,如将KeyAscii改名为k,等等。4.2.1按值传递1.按值传递的形参变量名前的修饰符是Byval形参的传递方式,是由过程编写时形参声明决定的,按值传递的步骤如下:(1)创建形参变量(由此可知,如果实参也是变量,则形参变量与实参变量不是同一个变量)。(2)将实参表达式的值复制给形参变量。(3)过程调用结束后,形参变量被取消(存储空间被系统回收)。按值传递是一种单向的传递,即对形参的改变不会导致对实参变量的任何改变,因此试图用下列过程swap实现交换两个数值变量的值是错误的。4.2.1按值传递2.按值传递的类型转换当实参表达式值与形参变量类型不同时,VB将转换为同一类型后再复制给形参变量,具体规则如下。(1)形参为数值类型:形参为整型而实参表达式为浮点类型则以四舍五入后的值为形参变量赋值;实参表达式为字符型则以字面上的值为形参变量赋值(“123”等价于123,“12a”则出错)。(2)形参为字符串:实参为数值则转换为字符串后为形参变量赋值(123等价于123)。4.2.2按地址传递1.按地址传递的形参变量名前的修饰符是Byref对形参变量传递方式不做任何说明(缺省),为按地址传递。(1)如果实参不是变量(如常量、函数),尽管形参声明为按地址传递,实际还是按值传递。(2)按地址传递时,过程中对形参变量值的改变即是对实参变量的改变。如果说按值传递的方式为单向传递(由调用处向被调用函数传递数据)的话,参数的按地址传送则是一种双向传递的方式,在调用结束、控制返回时,实参的值就是对应形参的值。2.形参为数组则对应实参为同类型数组名,数组参数只有按地址传递1种方式。在此,不讨论按地址传递的实现机制。从编程者的角度,只需理解为形参变量与实参变量是同一变量即可。4.3.1标准模块标准模块中保存的过程都是通用过程。此前,我们将窗体中通用过程写在该窗体通用部分,现在,可以考虑将这些通用过程都写在标准模块中。1.创建标准模块单击下拉菜单“工程”中的“添加模块”选项,系统显示如图4-3所示。再选择“新建”选项卡,显示标准模块窗口,如图4-4所示为一个写入了两个通用过程的标准模块窗口。图4-3添加标准模块图4-4在标准模块的代码窗口编辑通用过程4.3.1标准模块2.跨模块调用我们可以将通用过程写在窗体的通用部分,也可以将一些通用过程写在标准模块中,哪些通用过程可以在不同模块、窗体中被调用呢?(1)用关键字Private修饰的通用过程,只能被本模块中调用。譬如,在Form1中以Private修饰的通用过程,只能被该窗体中的事件过程调用;如图4-3(b)所定义的标准过程x2,只能被该模块所调用。(2)在标准模块中,用关键字Public修饰的通用过程,可以被工程中所有模块调用。(3)某窗体中、用关键字Public修饰的通用过程,必须标明窗体名称才可以被工程中所有其他模块调用。4.3.2变量作用域变量按作用域分,可分为局部量、模块级量和全局量3种。1.局部量在事件、函数、Sub过程中声明的变量(包括数组)、或用Const语句声明的符号常量是局部量。局部量的作用域限于它们所在的过程,而不能被其他过程引用。如:在例4-10中,函数过程delkg、命令过程Command1中都声明了变量i,它们是不同的变量、作用域局限于各自所在的过程。如果在函数过程delkg中对变量i不作显式声明,该过程中的i也是局部量,因为在该窗体的代码窗口中没有声明模块级的变量i,是变体类型的局部量。2.模块级量在模块的通用对象声明部分,没有用Public声明的变量(包括数组)、符号常量是模块级量。模块级量的作用域限于它们所在的模块,不能被其他模块的过程引用。4.3.2变量作用域3.全局量在模块的通用对象声明部分,用Public语句声明的变量、符号常量是全局量。全局量可以在整个工程中被引用,其他窗体引用时,在变量名或符号常量名前,必须指出窗体名称。例如,在窗体Form1中的语句“x=Form2.k”,所引用的变量k必定是在窗体Form2的代码窗口中、通用模块部分、用Public声明的全局变量,否则不可以跨窗体引用。数组、定长字符串不可以用Public声明。4.3.3变量生存期从变量的作用空间来说,变量有作用域之分。从变量的作用时间来说,变量有生存期之分。根据变量在程序运行期间的生命周期,把变量分为静态变量(Static)和动态变量(Dynamic)。1.动态变量动态变量是指程序运行进入变量所在的过程时,才分配给该变量内存空间,退出该过程时,变量所占的内存空间自动释放,其值消失。使用Dim语句在过程中声明的局部变量就属于动态变量,在过程执行结束后,变量的值不被保留,在每一次重新执行过程时,变量重新声明并分配存储空间。4.3.3变量生存期2.静态变量静态变量是指程序运行期间虽然退出变量所在的过程,其值仍被保留的变量,即变量所占的内存空间没有释放。当以后再次进入该过程时,继续使用变量的值。使用Static语句在过程中声明的局部变量就属于静态变量。静态变量只能在过程中声明,而不能在通用对象声明部分声明。为使过程中所有的局部变量都为静态变量,可在过程头部加上关键字Static。如:PrivateStaticSubaa()这样,在Sub过程aa中,无论用Static、Dim或Private声明的变量,还是隐式声明的变量,都成为静态变量。函数过程、自定义过程均可以在过程头部加上关键字Static,不再赘述。4.4小结程序中多次重复出现的操作过程,若不能通过调用系统函数实现,VB允许用户将这些操作自定义为函数过程或Sub过程。定义函数过程或Sub过程,必须熟悉过程定义的格式,以及调用程序与所定义的过程之间参数的传递方式和规则。必须为工程中其他模块所调用的通用过程,应当用关键字Public声明,可以将多个通用过程集中在标准模块中。
本文标题:《VB程序设计基础》第4章 函数与过程
链接地址:https://www.777doc.com/doc-3374310 .html