1教学目的要求:•掌握过程的概念和调用•掌握子过程和函数的应用•掌握虚实结合和变量的作用域教学重点:•子过程和函数第4.5章过程2VB应用程序是由过程组成的,除了定义一些公共的常量、变量或数组外,编写代码都是在过程中进行的。事件过程由VB预先定义,编程人员所要做的工作就是在已经存在的过程中编写代码。实际应用中,为了使程序结构清楚,或减少代码的重复性,可将重复性较大的代码段独立出来形成一个过程,在需要使用该过程的位置可根据不同的参数调用该过程,实现该过程所规定的功能。这种独立定义的过程叫做“通用过程”。通用过程由编程人员建立,供事件过程或其他通用过程使用(调用),通用过程也称为“子过程”或“子程序”,可以被多次调用。而调用该子过程的过程称为“调用过程”。VB中,通用过程分为两类:Function过程和Sub过程3调用过程调用Sprg1调用Sprg1调用Sprg2子过程:Sprg1子过程:Sprg2过程调用4VB提供了丰富的内部函数供用户使用,如Sin函数、Sqr函数,使用这些函数时只需写出函数名称,并指定相应的参数就能得到函数值。当在程序中要重复使用某一公式或处理某一函数关系,而又没有现成的内部函数可以使用时,可以自己定义函数,并采用与调用内部函数相同的方法来调用自定义函数。自定义函数通过Function过程实现。Function过程也称为函数过程。一、Function过程5(一)Function过程的定义1.Function过程的格式[Public|Private|Static]Function函数过程名([形参表])[As类型][语句组][函数过程名=表达式][ExitFunction]EndFunction62.说明•Public:可选项,缺省值。使用Public时表示所有模块的所有其他过程都可以调用该Function过程。•Private:可选项。使用Private时表示只有本模块中的其他过程才可以调用该Function过程。•Static:可选项。如果使用该选项,则VB只给过程中的所有局部变量分配一次存储空间,即在应用程序执行期间,每次调用该Function过程时将保留该过程中的局部变量值。若没有使用该选项,则每次调用该Function过程时,其中的局部变量都要被重新初始化。•函数过程名:Function过程的名称,遵循变量的命名规则。7•形参表:可选项。表示在调用时要传递给Function过程的参数变量列表。多个变量之间用逗号隔开。形参表的格式为:[ByVal|ByRef]变量名[()][As类型]其中:ByVal为可选项,表示该参数按值传递;ByRef为可选项,缺省值,表示该参数按地址传递。变量名遵循变量命名规则的任何变量名或数组名。()当参数为数组时使用。As类型为可选项,用于声明参数的数据类型。8•As类型:可选项。Function过程的返回值的数据类型,可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Date、String(固定长度除外)、Object、Variant或用户自定义类型。•语句组:可选项。语句组中可以有一条或多条ExitFunction语句。•ExitFunction语句:从Function过程中退出。•表达式:可选项。Function过程通过赋值语句“函数过程名=表达式”将函数的返回值赋给函数过程名。如果省略该语句,则数值函数过程返回0,字符串函数过程返回空串。9Function过程的建立可以在窗体模块中进行,也可以在标准模块中进行。建立的方法有以下两种:Function过程的定义不能嵌套,即不能在Function过程中再定义Function过程或Sub过程。例如,FunctionFact(NAsInteger),回车后,此时代码窗口中即可在Function语句和EndFunction语句之间输入程序代码。1)直接在代码窗口中输入在代码窗口中的所有过程之外,输入过程的第一条语句。102)使用“添加过程’’命令。打开代码窗口,执行“工具”菜单中的“添加过程”命令,弹出‘‘添加过程’’对话框,输入过程名选择类型选择范围11(二)Function过程的调用定义函数过程的目的是为了在其他过程中调用,通过调用将一些参数值传递给函数过程,在函数过程中利用参数值计算并返回函数值。Function过程的调用与内部函数的调用类似,即可以直接在表达式中调用。格式:函数过程名([实参表])其中,函数过程名为要调用的Function过程的名称;实参表为要传送给Function过程的常量、变量或表达式,各参数之间用逗号分隔,如果是数组,在数组名之后必须跟一对空括号。12Function过程定义及调用举例过程定义Label2Label3Text113例4-19输入n,计算1!+2!+3!+…+n!(用函数过程实现)Functionfact(x)t=1Fori=1Toxt=t*iNextifact=tEndFunctionPrivateSubCommand1_Click()n=inputbox(“输入n值”)sum=0Fori=1Tonsum=sum+fact(i)NextiText1.Text=sumEndSub14当需要定义的过程返回一个值时,使用前面介绍的Function过程很容易实现,但在实际应用中,可能希望过程不需要返回值,例如,使用过程打印一个图形,或需要返回多个值;如,利用过程对一批数据进行排序,或者要进行较复杂的操作,等等。在这些情况下就要利用Sub过程来实现。二、Sub过程15(一)Sub过程的定义1.Sub过程的格式[Private|Public][Static]Sub过程名[(形参表)][语句组][ExitSub]EndSub162.说明•格式中各项含义同Function过程。ExitSub用于退出Sub过程。•Sub过程的过程名与Function过程的函数过程名的含义与作用不同,过程名只在调用Sub过程时使用,不具有值的意义,在Sub过程中不能给过程名赋值,也不能给过程名定义类型。•过程可以返回0到多个值,且由形参表中的参数返回这些值。因此,使用函数过程可以实现的功能,也可以用Sub过程实现。•Sub过程的建立方法与Function过程的建立方法相同,可以在代码窗口中直接输入,也可通过执行“工具”菜单中的“添加过程”命令生成过程模板。17(二)Sub过程的调用定义一个Sub过程之后,必须使用Call语句调用该过程。调用格式一:Call过程名[(实参表)]调用格式二:过程名[实参表]·过程名:要调用的Sub过程名。·实参表:要传送给Sub过程的常量、变量或表达式,各参数之间用逗号分隔。如果是数组参数,则要在数组名之后跟一对空括号。·用Call语句调用一个Sub过程时,如果过程本身没有参数,则省略实参表和括号。.格式二省略了Call关键字,同时实参表两边也不能带括号。18例:在窗体上输出n行*号Subab(n)forI=1tonprint“*****”nextIEndsubPrivatesubcommand1-click()x=val(text1.text)callab(x)Endsub例4-18(89页)19(一)形参和实参形参是在Sub过程、Function过程的定义中出现的变量名,实参则是在调用Sub过程或Function过程时传送给Sub过程或Function过程的常量、变量、表达式或数组。在调用一个过程时,必须把实参传送给过程,完成形参与实参的结合,然后用实参执行调用的过程。这种参数的传递也称为参数的结合。三、参数的传递20例如,定义如下一个过程:SubSubTest(nAsInteger,SumAsSingle)…EndSub如果有以下调用语句:CallSubTest(a,s)则其形参与实参的结合关系如下:过程调用:CallSubTest(a,s)过程定义:SubSubTest(nAsInteger,SumAsSingle)在传递参数时,形参表与实参表中对应参数的名字不必相同,但要求形参表与实参表中参数的个数、类型、位置顺序必须一一对应。形参表中的参数可以是:除固定长度字符串之外的合法变量名,后面带一对圆括号的数组名。实参表中的参数可以是:常量、变量、表达式、后面带一对圆括号的数组名。VB中,形参与实参的结合有两种方式:按值传递和按地址传递。21(二)按值传递和按地址传递1.按值传递按值传递是指实参把其值传递给形参而不传递实参的地址。在这种情况下,系统把需要传递的参数复制到一个临时存储单元中,然后把临时存储单元与形参结合,在子程序执行过程中,形参值的改变不会影响主程序中实参的值,因此,数据的传递是单向的。例:subpower2(byvalyasinteger)y=y^2print“y=“;yendsubprivatesubform_click()dimxasintegerx=10callpower2(x)print“x=“;xendsub222.按地址传递按地址传递即指将实参的地址传给形参,使形参和实参具有相同的地址,即形参与实参共享同一存储单元。当实参为变量或数组时,形参使用关键字ByRef定义(或省略),表示要按地址传递。当参数是数组时,数组名之后必须使用一对空的圆括号。按地址传递可以实现调用过程与子过程之间数据的双向传递。……subpower(byrefyasinteger)……233.传递数组在VB中可以把数组或数组元素作为实参传送给形参,若传递整个数组,需在实参和形参上都要写上数组名和一对括号,若要传递数组的元素,则在实参上写上该数组元素。例4-20随机生成有10个元素的一维数组,并求其平方和。24在一个过程执行期间又调用另一个过程,称为过程的嵌套.程序S1S2四、过程的嵌套调用调用25•程序的递归过程(过程调用自身)26VB的程序模块由一些过程组成,在过程中会使用到变量,包括在形参表中出现的变量以及不在形参数表中出现的变量。本节要讨论的是不在形参表中出现的变量。变量的定义位置不同,定义方式不同,允许被访问的范围和作用时间也不相同。变量的作用域即指变量的有效范围。变量的生存期即指变量的作用时间。4.6变量的作用域与生存期274.6.1变量的作用域变量的作用域决定了应用程序中哪些过程可以访问该变量。按变量的作用域不同,可以将变量分为:局部变量、窗体/模块级变量和全局变量。1.局部变量局部变量指在过程内用Dim语句声明的变量、未声明而直接使用的变量、用Static声明的变量。这种变量只能在本过程中使用,不能被其他过程访问。在其他过程中如果有同名的变量,也与本过程的变量无关,即不同的过程中可以使用同名的变量。除了用Static声明的变量外,局部变量在其所在的过程每次运行时都被初始化。282.模块级变量模块级变量指在窗体模块或标准模块的通用声明段中用Dim语句或Private语句声明的变量。模块级变量的作用范围为其定义位置所在的模块,可以被本模块中的所有过程访问。模块级变量在其所在的模块运行时被初始化。例如:在“通用声明”段声明如下变量PrivatesAsStringDimaAsInteger,bAsSingle3.全局变量全局变量指在模块的通用声明段中用Public语句声明的变量,其作用范围为应用程序的所有过程。全局变量在应用程序运行时被初始化。29例如:在标准模块文件中进行不同级的变量声明PublicpaAsinteger’全局变量PrivateMbasstring*10’窗体/模块级变量SubF1()DimFaAsinteger’局部变量…EndSubSubF2()DimFbAsSingle’局部变量…EndSub30同时还要说,若在不同级声明相同变量名,如:PublicTempAsinteger‘全局变量SubForm_Click()DimTempAs