第四章VisualBasic程序设计•过程•过程调用•参数传递•SubMain过程与快速启动窗体•程序举例4.1过程:过程:将复杂的程序分割成的较小的逻辑部件。每个过程编写一段程序。一个过程可以被另一个过程调用VB的过程:子程序过程(SubProcedure)、函数过程(FunctionProcedure)、属性过程(PropertyProcedure)一、Sub过程:无返回值可以放在窗体模块或标准模块中。有两种类型:事件过程和普通过程。语法:[Private|Public][Static]Sub过程名([参数列表])[局部变量和常量声明]语句组EndSub1.事件过程:对象的某个事件发生时执行的代码分类:窗体事件过程和控件事件过程。事件过程前面的声明都是Private窗体事件过程的定义均为:PrivateSubForm_事件名([参数列表])EndSubMDI窗体的事件过程名为:MDIForm_事件名控件事件过程名的定义:PrivateSub控件名_事件名([参数列表])EndSub建立事件过程:双击控件/窗体,进入代码编辑窗口在事件列表中选事件点击“工程资源管理器/察看代码”,进入代码编辑窗口在对象列表中选对象后,在事件列表中选事件。2.通用过程:C中的子程序可以保存在两种模块中:窗体模块(frm)和标准模块(bas)中(1)定义语法:[Private|Public][Static]Sub过程名([参数列表])[局部变量和常量声明][Exitsub]语句组EndSub•Private|Public,默认Public•Static:局部静态变量,在调用结束后仍保留sub过程中的变量值•局部变量和常量声明:过程内部用到的变量和常量•Exitsub:结束本过程的执行,返回到调用者过程,执行调用语句的下一条语句。•sub过程不能嵌套定义,但可以嵌套调用•参数列表:形式参数,接受从调用者处传来的参数语法:[ByVal|ByRef]变量名[()]As数据类型]ByVal:该参数按值传递ByRef:该参数按地址传递(2)通用过程的建立方法一:•打开“代码编辑器”•工具/添加过程•在添加过程对话框输入过程名单击“确定”按钮方法一:•打开“代码编辑器”•对象列表框中的“通用”•输入:PublicSubAAA()•“回车”二、Function过程:有返回值语法:[Private|Public][Static]Function函数名([参数列表])[As数据类型][局部变量和常量声明][函数名=表达式][ExitFunction]语句组[函数名=表达式]EndFunction4.2过程的调用:一、调用Sub事件过程两种调用方法:发生的事件自动调用在其他过程中用于据调用,语法:Call过程名[(参数列表)]或过程名[(参数列表)•参数列表:实参PrivateSubCommand1_Click()Text1.Text=HelloEndSubPrivateSubForm_DblClick()CallCommand1_ClickEndSub二、调用Sub通用过程在其他过程中用于据调用,语法:Call过程名[(参数列表)]或过程名[(参数列表)PrivateSubForm_Click()CallaaaEndSubPublicSubaaa()PrintHelloEndSub三、调用Function过程语法:Function函数名([参数列表])或Call函数名([参数列表])或函数名([参数列表])说明:无参数时,()不能省略调用方法同系统内部函数例:用辗转相除法求最大公约数PublicFunctionDivisor(ByValxAsInteger,ByValyAsInteger)'计算x,y的最大公约数DimrAsIntegerr=xModyDoWhiler0x=yy=rr=xModyLoopDivisor=yEndFunctionPrivateSubForm_Click()Dima,b,cAsIntegera=InputBox(pleaseinputa)b=InputBox(pleaseinputb)c=Divisor(a,b)MsgBoxStr$(a)+与+Str$(b)+的最大公约数为:+Str$(c)EndSub4.3参数的传递一、形参与实参1.形参:被调用过程中的参数2.实参:主调过程中的参数3.形参的数据类型:没有声明时默认为Variant4.形参与实参的类型以及个数必须一致,否则会出错。5.使用可选的参数:在参数中含有Optional关键字的参数是可选的,如果某一参数为可选参数,则参数表中此参数后的其他参数也必须是可选的,并要用optional来声明。例:PublicSubexam(OptionalaAsInteger,OptionalbAsInteger)EndSub二、参数的按值传递和按地址传递1.按值传递参数将参数值传递给普通过程,如果普通过程中对该变量进行了操作,变量的值发生变化,那么变化后的该参数变量的新值不会通过其地址传出来。传值时参数变量前面要加上“Byval”例:Subzerox(Byvalxassingle)PrivateSubForm_Click()x=x-xDimxasSingleEndSubx=5zeroxxprintxEndSub执行结果为:52.按地址传参数将参数变量的地址传递给普通过程,如果普通过程中对该变量进行了操作,变量的值发生变化,那么变化后的该参数变量的新值将通过其地址传出来。例:Subzerox(aAsSingle)a=a-aEndSubA与x共用一个地址运行结果:0PrivateSubForm_Click()DimxAsSinglex=5zeroxxPrintxEndSub3.例:求5!+4!+3!+2!+1!PrivateSubForm_Click()DimsumAsInteger,iAsIntegerFori=5To1Step-1sum=sum+multiply(i)NextiPrintsum=;sumEndSubPublicFunctionmultiply(nAsInteger)AsIntegermultiply=1Fori=1Tonmultiply=multiply*iNextiEndFunction运行结果:153PrivateSubForm_Click()DimsumAsInteger,iAsIntegerFori=5To1Step-1sum=sum+multiply(i)NextiPrintsum=;sumEndSubPublicFunctionmultiply(nAsInteger)AsIntegermultiply=1DoWhilen0multiply=multiply*nn=n-1LoopEndFunction运行结果:120PrivateSubForm_Click()DimsumAsInteger,iAsIntegerFori=5To1Step-1sum=sum+multiply(i)NextiPrintsum=;sumEndSubPublicFunctionmultiply(byValnAsInteger)AsIntegermultiply=1DoWhilen0multiply=multiply*nn=n-1LoopEndFunction运行结果:153全局变量定义的方法:工程/填加模块/打开,进入定义界面。定义之后按保存按钮,将对全局变量的定义以.bas文件的形式保存到工程中,再打开时,从“工程资源管理器”窗口中找“模块”,再从中找到要打开的定义。二、静态变量静态变量的存活期:整个应用程序运行期间作用范围:取决于该变量是模块级、局部级还是全局级PrivateSubForm_Click()StaticiAsIntegeri=i+1PrintiEndSub例:各种不同变量的作用域。在一个窗体中填加两个按钮,其中一个的Caption属性改为“点击”,另一个改为“退出”。当“点击”按钮按下时,在第一个标签中显示点击次数,测试静态变量的作用域,同时计算变量a和b的值,其中a由一个全局子过程进行计算,目的是练习全局变量的作用域,b是一个模块变量,主要练习模块变量的作用域。实现步骤:1.建立一个窗体,在窗体上创建两个标签,其Caption属性分别改为:“点击次数”、“a的值”;创建两个文本框,其Caption属性均改为空格;创建两个按钮,其Caption属性分别改为:“点击”、“退出”。2.选中“点击”按钮,转入代码窗口,在该窗口中的general中输入DimbAsInteger,然后在其Click事件中写入下列代码:PrivateSubCommand1_Click()StaticcAsInteger‘将变量c定义成静态变量c++‘c自增1b=c*pi‘b赋值为c*pi,pi为常量compute_a‘调用计算a的过程Text1.Caption=Str$(c)‘将c的值和a的值在文本框中显示Text2.Caption=Str$(a)EndSub3.选中“退出”按钮,转入代码窗口,在其Click事件中写入下列代码:PrivateSubCommand2_Click()ifb*b*pi300then‘给定退出系统的条件endelseprint“不能退出”endifprintc‘显示c的值EndSub4.在Project菜单中选AddModule命令,在general中输入GlobalaAsSingle及GlobalConstpi=3.14159,在其下面直接写入下列代码:Subcompute_aa=1a=pi*aEndSub5.按执行按钮运行程序,反复按下点击按钮,看程序的运行结果。分析结果。6.将对变量b的定义移到Command1的Click事件中,看运行结果。Why?7.将a和pi的定义移到compute_a下面,看运行结果,why?三、过程的作用范围Public:全局过程,所有模块的其他过程都可以访问这个过程Private:局部过程,只有本模块中的其他过程才可以访问这个过程过程的外部调用:调用其他模块中的过程语法:Call窗体名.全局过程名[(实参列表)]四、使用同名变量1.不同模块中的全局变量名同名:通过引用“模块名.变量名”PrivateSubForm_Click()PrintModule1.a1,Module2.a1EndSubPrivateSubForm_Load()Module1.a1=7Module2.a1=9EndSubModule1中Globala1AsIntegerModule2中Globala1AsInteger2.全局变量名与局部变量名相同:过程内局部变量有效,过程外全局变量有效Module1中PublicaAsIntegerPrivateSubForm_Click()DimaAsIntegerPrintaa=8EndSubPrivateSubForm_DblClick()PrintaEndSubPrivateSubForm_Load()AutoRedraw=Truea=5PrintaEndSub4.4SubMain过程与快速启动窗体1.通过SubMain过程启动应用程序当应用程序不加载任何窗体,可以通过在标准模块中创建一个SubMain过程,然后再SubMain的过程中编写启动时执行的代码,每个工程只能有一个SubMain的子过程。工程/添加模块工程/工程1属性/启动窗体—subMainSubmain()MsgBox确定EndSub2.启动时快速显示:通常是显示应用程序名、版权信息、简单的位图等PrivateSubTimer1_Timer()Timer1.Enabled=FalseForm1.ShowUnloadfrmSplashEndSub4.5程序举例1.计算组合公式:OptionExplicitFunctioncalC(ByValxAsInteger,ByValyAsInteger)AsIntegerIfx2*yTheny=x-y