收藏 分销(赏)

visualbasic第九章.ppt

上传人:仙人****88 文档编号:14757959 上传时间:2026-11-14 格式:PPT 页数:69 大小:378KB 下载积分:10 金币
下载 相关
visualbasic第九章.ppt_第1页
第1页 / 共69页
visualbasic第九章.ppt_第2页
第2页 / 共69页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第九章 过程,VB,应用程序(又称工程或项目)由若干过程组成的。在写程序时,除了定义常量和变量外,全部的工作是编写过程。过程是一段程序代码,是相对独立的逻辑模块。前面我们已学过事件过程,这样的过程是当发生某个事件时,对该事件做出响应的程序段。但有时多个事件过程可能需要执行相同的一段程序代码,可以把该段代码独立出来,作为一个过程。这样的过程称为通用过程,,通用过程可单独建立,供事件过程或其他通用过程调用。,VB,中,通用过程分两类,:,子程序,(Sub),过程和,函数,(,Function),过程。,9.1,子过程(,Sub,过程)一、建立,Sub,过程:,定义格式:,StaticPublic|Private,Sub,子过程名,(参数表列),语句序列,Exit Sub ,语句序列,End Sub,如:,Sub sum,(,x%,,,y%,,,s%,),s=x+y End Sub,含义:,定义了一个名为,sum,的子过程,该过程是公有过程,可在程序的任何地方调用它。,说明:,Static,:,表示过程中定义的局部变量是,Static,型,,每次调用该过程时,局部变量的值不变。若省略,Static,则局部变量为自动型,每次调用该过程时,局部变量被清零或清空。,Private,:,表示模块级子过程,只能被本模块中其他过程访问。,Public,:,表示全局级子过程,(,缺省值),可在程序的任何地方调用它,各窗体通用的过程一般在标准模块中用,Public,定义。,子过程名:,符合,VB,标识符,的命名约定,但同个模块中,Sub,过程和,Function,过程不能同名。,参数表列,:可以是空表,(,不带参数,即,无参过程,),,也可以含有在调用时传给该过程的简单变量或数组名,(,要在数组名后加括号,),,,参数表列中,的,参数称为形式参数,,各名字之间用逗号隔开。,如:,Public Sub,Sum(X,As Integer,Y As Integer),注意:,不能用定长字符串变量或定长字符串数组作,形式参数。,每个,Sub,过程,必须有一个,End Sub,子句,。程序执行到该子句时,将退出该过程,返回到调用语句下面的语句。过程中也可有若干个,Exit,Sub,语句。,Sub,过程不能嵌套定义,,即在过程中不能再定义子过程或函数过程;不能用,GoTo,语句进入或转出,可嵌套调用。,建立,Sub,过程:,这类过程,与对象无关,,是用户创建的一段共享代码。不能放在事件过程中建立。可在,标准模块中建立,,也可在,窗体模块中建立,。,方法一:,在模块的“通用”段中输入过程名,按回车后系统自动添加,End Sub,。如在,代码窗口,的对象框中选,通用,,在过程框中选,声明,键入:,Sub,abc,按回车后显示:,Sub,abc,(),abc,为过程名,可在此处键入代码,End Sub,方法二:,(1),执行,工程菜单,中的,添加模块,命令,打开添加模块对话框,在该对话框选,新建,选项卡,双击,模块,图标,打开模块代码窗口;,(2),执行,工具菜单,中,添加过程,命令,打开添加过程对话框;,(3),在,名称框,中输入过程名,如图;,(4),在,类型栏,选要建立的过程类型;,(5),在,范围栏,中选择过程适用范围;,(6),单击,确定,按钮,回到模块代码窗口,此时可在,Sub,与,End Sub,之间键入程序代码。,方法三:,执行,工程菜单,中的,添加模块,命令,打开添加模块对话框,在该对话框选,新建,选项卡,双击,模块,图标,打开模块代码窗口,键入过程名,如:键入,Sub,Print_line,(),,按回车后显示:,Sub,Print_line,(),可在此处键入代码,End Sub,注意:,可在工程资源管理器中找到建好的,Sub,过程。,事件过程的定义与建立:,事件过程也是,Sub,过程,是一种特殊的,Sub,过程,这类过程,与对象有关,,对象事件触发后被调用。事件过程的过程名由系统自动指定。,定义格式:,Private|Public,控件名,_,事件名,(,参数表,),语句组,End Sub,说明:,(,1,)通常是在事件过程中调用通用过程,事件过程也可被其他过程调用(包括事件过程与通用过程),调用形式如:,Call Command1_Click,(,2,)通用过程可放在窗体模块中,也可放在标准模块中,而事件过程只能放在窗体模块中。,事件过程的建立:,“对象”,“事件过程”,二、调用,Sub,过程:格式,1,用,Call,语句调用,Sub,过程,,格式:,Call,过程名,(,实参表列,),例如:,Call sum,(,a,,,b,,,c,)格式,2,把过程名作为一个语句来使用,格式:,过程名,实参表列,例如:,sum a,,,b,,,c,例,1,:编一个求,n!,的,Sub,过程,然后调用它计算,7,!,+11,!,-10,!。,Sub,jch(,n,%,p,&),Dim i%,p=1,For i=1 To n,p=p*i,Next i,End Sub,Private Sub,Form_Click,(),Dim a&,b&,c&,d&,Call jch(,7,a,),Call jch(,11,b,),Call jch(,10,c,),d=a+b-c,Print 7!+11!-10!=;d,End Sub,例,2,:,用随机函数生成表中数据,计算总分并输出。,表格横线用通用过程,Print_Line,绘出,在主程序中多次调用,Sub,Print_Line,()Dim I As Integer Print Tab(10);For I=1 To,25,Print-;Next I Print End Sub,定长,Private Sub Command1_Click()Randomize Timer Dim sx%(5),wl%(5),hx%(5),i%For i=1 To 5,用随机函数生成表中数据,sx(i,)=60+40*,Rnd,:,wl(i,)=60+40*,Rnd,:,hx(i,)=60+40*,Rnd,Next i,Print_Line,调用画线过程,Print Tab(10);“,数学,”,;Tab(20);“,物理,”,;Tab(30);“,化学,”,Print_Line,调用画线过程,For i=1 To 5,打印表中数据,并统计各科总分,Print Tab(10);,sx(i,);Tab(20);,wl(i,);Tab(30);,hx(i,)sx(0)=sx(0)+,sx(i,):wl(0)=wl(0)+,wl(i,):hx(0)=hx(0)+,hx(i,)Next i,Print_Line,调用画线过程,Print Tab(10);sx(0);Tab(20);wl(0);Tab(30);hx(0),Print_Line,调用画线过程,End Sub,将,Print_Line,过程改写如下:,Sub,Print_Line(,n,As Integer,)Dim I As Integer Print Tab(10);For I=1 To n Print-;Next I Print End Sub,n,为形参,调用语句改为:,Print_Line,实参,或,Call Print_Line(,实参,),例如,,Print_Line 30,或,Call Print_Line(30,),调用过程时,实参将值交给形参,由形参带入子过程中执行。,例,3,:,用不同的方式分别调用带有形式参数的求和通用过程,Add,和求差通用过程,Subst,。,Private Sub Command1_Click(),Dim X%,Y%,X=,InputBox,(,请输入数据,),Y=,InputBox,(,请输入数据,),Call Add(,X,Y,),调用求和通用过程,Subst,X,Y,调用求差通用过程,End Sub,Sub Add(,A,B,),Dim C%,C=A+B:Print C,End Sub,Sub,Subst(,A,B,),Dim C%,C=A-B:Print C,End Sub,9.2 Function,过程函数过程是自定义过程的另一种形式。,VB,提供了许多内部函数,如,Sin(),,,Sqr,(),等,在编写程序时,只需写出函数名和相应的参数,就可得到函数值。另外,,VB,还允许用户自己定义函数过程。同内部函数一样,,函数过程也有一个返回值,。而之前介绍的,Sub,过程不直接返回值,可作为独立的基本语句使用,。,一、建立,Function,过程:,定义格式:,StaticPublic|Private,Function,过程名,(,参数表列,)As,类型,语句序列,过程名,=,表达式,Exit,Function,语句序列,End,Function,说明:,Private,、,Public,、,Statc,及参数的含义同,Sub,过程,;,As,类型:,是由,Function,过程返回值的数据类型,若省略,则为变体型,;,通常由,Function,过程返回的值放在表达式中,并赋给过程名,形式为:,过程名,=,表达式,,若省略该句,则该过程返回一默认值,数值函数过程返回,0,,字符串函数过程返回,空字符串,;,Function,过程也不能嵌套定义;,建立方式:有三种方法,参见,Sub,过程的建立;当用第一种方法时,在类型栏中应选择“,函数,”,其他方法中,Sub,应换成,Function,。,二、调用,Function,过程由于调用,Function,过程,可以由过程名带回一个值给调用程序,这点与,VB,的内部函数,(,Chr,、,Str,、,Sqr,等,),没有区别,因此也可以将它,看成是一个函数,。只不过内部函数由,VB,系统定义,而,Function,过程由用户定义。因此,与,Sub,过程的调用方式不同,,Function,过程不能作为单独的语句加以调用。最简单的情况就是在赋值语句中调用,Function,过程,其形式为:,变量名,=,函数过程名(,参数表列,),即把,调用,Function,过程的,返回值赋给一个变量。,例,1,:编一个求,n!,的,Function,过程,然后调用它计算,7,!,+11,!,-10,!。,Private Sub,Form_Click,(),Dim d&,d=jch(,7,)+jch(,11,)-jch(,10,),Print 7!+11!,10!=;d,End Sub,Function,jch&(,n,%),Dim i%,x&,x=1,For i=1 To n,x=x*i,Next i,jch,=x,End Function,例,2,:计算,e=1+1/1!+1/2!+1/10!,Function,Fa,(,X,As Integer,)As Long,Dim I As Integer,T As Long,T=1,For I=1 To X,计算,X!,T=T*I,Next I,Fa,=,T,End Function,Private Sub Com1_Click(),Dim I%,Dim e!,F&,For I=0 To 10,F=,Fa,(,I,),计算,I!,e=e+1/F,Next I,Print e=;e,End Sub,9.3,参数传送在调用过程时,一般主调过程与被调过程之间有数据传递,即将,主调过程,的,实参,传递给,被调过程,的,形参,,完成实参与形参的结合,然后执行被调过程体。一、实参与形参,实参:,在调用,Sub,或,Function,过程时传给,Sub,或,Function,过程的,常数,、,变量,、,表达式,或,数组,;,实参表中各项须用逗号隔开。,形参:,Sub,或,Function,过程定义中出现的变量名;,形参表中各项须用逗号隔开,表中变量可以是,除定长字符串之外,的,变量名,或是,跟有左、右括号,的,数组名,.,说明:,在传送参数时,实参与形参的个数须相同,对应参数的类型也必须相同,若类型不同,通常将实参类型强制转为相应形参的类型。,二、参数之间的传递方式,在,VB,中,,在,调用,Sub,过程和,Function,过程时,参数的传递有两种方式:,按,地址传递,和,按值传递,,简称,传地址,和,传值。,传地址是默认的方法。两种,传递,方法的,区分标志,是“,ByVal,”,,形参前加“,ByVal,”,关键字时是传值,否则为传址。,传地址:,传址的参数传递过程是:当调用一个过程时,它将,实参的地址传递给形参,。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,因此实参的值就会随形参的改变而改变。当参数是字符串或数组时,使用传址传递直接将实参的地址传递给过程,会使程序的效率提高。,主调过程实参与被调过程形参,共享同一存储单元,;,形式参数与实际参数是,同一个变量,;,定义被调过程时,各形参前加,ByRef,(可缺省)。,例,1,:写出下列程序运行结果,,Private Sub,Form_Click,(),Dim a%,b%,a=10:b=20,hjm,a,b,Print a=;a,b=;b,End Sub,Sub hjm(,x,%,y,%),x=x+10,y=y*5,Form1.Print,x=;x,y=;y,End Sub,x=20 y=100,a=20 b=100,若在标准模块中建立,Sub,过程,必须加对象名,例,2,:在窗体上画一个命令按钮和三个文本框,编写如下事件过程和通用过程,运行程序后,单击命令按钮,三个文本框的显示结果是多少?,Private Sub Command1_Click(),Dim a%,b%,a=2:b=3,Text1.Text=,Fun(,a,b,),Text2.Text=,Fun(,a,b,),Text3.Text=,Fun(,a,b,),End Sub,Function,Fun%(,x,%,y,%),x=x+y,If x 0 Then,Fun,=x,Else,Fun,=y,End If,End Function,传值:,传值的参数传递过程是:当调用一个过程时,系统将实参的值复制给形参,之后实参与形参便断开了联系。被调过程对形参的操作是在,形参,自己的,临时存储单元,中进行,当过程调用结束时,这些形参所占用的存储单元也同时被释放。因此在过程中对形参的任何操作都不会影响到实参。,主调过程的实参与被调过程的形参,各有自己的存储单元,;,调用时:主调过程的实参值复制给被调过程的形参,;,定义被调过程时,各,形参前须加,ByVal,。,例,1,:写出下列程序运行结果,,Private Sub,Form_Click,(),Dim a%,b%,a=10:b=20,hjm,a,b,Print a=;a,b=;b,End Sub,Sub hjm(,ByVal,x,%,ByVal,y,%),x=x+10,y=y*5,Form1.Print,x=;x,y=;y,End Sub,x=20 y=100,a=10 b=20,若在标准模块中建立,Sub,过程,必须加对象名,例,2,:写结果,,Sub Command1_Click(),Dim A%,B%,A=100:B=900,Print A=;A,B=;B,Print,Call,Ex1,(,A,B,),Print A=;A,B=;B,Print,Call,Ex2,(,A,B,),Print A=;A,B=;B,End Sub,Sub,Ex1,(,ByVal,X%,ByVal,Y%),T=X:X=Y:Y=T,Print X=;X,Y=;Y,End Sub,在窗体模块中建立,Sub,Ex2,(,ByRef,X%,ByRef,Y%),T=X:X=Y:Y=T,Print X=;X,Y=;Y,End Sub,何时用传值,何时用传地址?,若不希望修改实参值,则用,传值,方式;,为提高效率,,字符串,与,数组,用,传地址,方式;,用户自定义的类型(记录)只能用,传地址,方式;,Function,过程,可通过过程名返回值,但,只能返回一个值,;而,Sub,过程,不能通过过程名返回值,但可通过参数返回值,,可返回多个值,。,传值,或,传地址,有时取决于所开发的应用程序。,例,3,:,编一个,Function,过程,分别计算出:,6,、,6*6,、,、,6*6*6*6*6,的值。,Sub,Form_Click,(),For i=1 To 5,r=,cm,(,6,i,),Print r,Next i,End Sub,Function,cm(,x,!,ByVal,y,%),Dim z!,z=1,Do While,y 0,z=z*x,y=y-1,Loop,cm,=z,End Function,Do,循环用来求,x,的,y,次幂,形参,y,指定要执行乘法的次数,每执行一次乘法,,y,值减,1,,,y,为,0,时结束循环。若,去掉,y,前的,ByVal,,则结果出错,,这是因首次调用,cm,后,,i,也被重新置为,0,(,y,与,i,同地址),,然后,For,循环又使,i,加,1,再循环,在调用,cm,过程,此时,cm,过程总是使,i,置,0,,导致,For,死循环。,例,4,:,Sub cs(ByVal x%,ByVal y%,m,%,n,%),m,=x+y,n,=x*y,End Sub,Private Sub,Form_Click,(),Dim sum%,mul,%,cs,20,30,sum,mul,Print sum,mul,End Sub,该例中实参,sum,与,mul,用来存放计算结果,单击窗体调用,cs,过程,返回两个数的和,(sum),与积,(,mul,),。此时,cs,过程中的形参,m,与,n,须使用传地址方式。,三、数组参数的传送,VB,中,数组可以作为过程的参数。过程定义时,形参表列中的数组用,数组名后加一对空的圆括号,表示。在过程调用时,实际参数表中的数组通常也用,数组名后加一对空的圆括号,表示。当用,数组作为过程的参数,时,进行的不是“值”的传递,而是,“地址”的传递,。如:定义过程:,Sub S(a(),,,b().End Sub,则可用下面的语句调用上面的,S,过程:,Call S(p(),,,q(),执行调用语句后,分别把,实参,p,和,q,数组的,起始地址,传给,形参,a,和,b,。设,p,数组有,4,个元素,在内存中起始地址为,3000,,在调用过程,S,时,,p,起始地址传给,a,,因此,在执行,S,期间,,p,与,a,同占一段内存单元,,a(0),值也是,2,,等于,p(0),的值,若在,S,中改变,a,数组的值,如:,a(2)=15,,则执行完过程,S,后,,p(2),值也为,15,。,3000,因此,,用数组作过程参数时,形参数组中各元素的值若改变将带回到实参数组中。,2,6,9,12,P,数组,,a,数组,说明:,若只传送指定的单个元素,须在数组名后的括号中加上该元素的下标;如:,Dim,tet,()As Integer Static Sub,sqval(,a,%)a=,Sqr(Abs(a,)End Sub Private Sub,Form_Click,(),ReDim,tet(1 To 5,1 To 3)tet(5,3)=-36 Print tet(5,3)Call,sqval,(,tet(5,3),)Print tet(5,3)End Sub,输出:,-36,6,在传送整个数组时,实参和形参中无需说明数组的维数,,可用,Lbound,和,Ubound,函数确定传送给过程的数组的大小,即,数组的下界和上界可用,Lbound,和,Ubound,函数测出;,如:,Static Sub,Prt(a,()For row=,Lbound(a,1)To,Ubound(a,1)For,col,=,Lbound(a,2)To,Ubound(a,2)Print,a(row,col,)Next,col,Next row End Sub,例,1,:编写一个,Function,过程,求一维数组的最大值,,Private Function,smax(,a,%(),),Dim,ks,%,js,%,i%,ks,=,LBound,(a,),js,=,UBound,(a,),Max=,a(ks,),For i=,ks,+1 To,js,If,a(i,)Max Then Max=,a(i,),Next i,smax,=Max,End Function,Sub,Form_Click,(),Dim b%(4),b(1)=30:b(2)=80,b(3)=456:b(4)=80,c=,smax(b,(),Print c,End Sub,输出:,456,例,2,:,将一个数值型一维数组按升序排序输出,排序在,Sub,过程,Sort,中进行,采用冒泡法排序。,Private Sub Command1_Click()Dim Data(5 To 14)As Integer,定义,5-14,为有效的下标范围,Dim I%,For,I=5 To 14,数组赋值,Data(I,)=30-I,Next,I Print ,排序前:,For,I=5 To 14 Print,Data(I,);,Next,I Print:Print,排序后:,Call,Sort,(,Data(),),For,I=5 To 14 Print,Data(I,);,Next,IEnd Sub,Private Sub,Sort,(,Element(),As Integer)Dim I%,J%,T%,For,I=,LBound(Element,)To,UBound(Element,)1,For,J=I+1 To,UBound(Element,),If,Element(I,),Element(J,)Then T=,Element(I,),Element(I,)=,Element(J,),Element(J,)=T End If,Next,J,Next,IEnd Sub,LBound(Element,)=5,UBound(Element,)=14,9.4,可选参数与可变参数,VB,在调用过程时,还可以向过程传送可选的参数或任意数量的参数。一、可选参数:,格式:,Optional,可选参数表,说明:,可选参数须放其他参数表的,最后,,,只能,是,变体型;,在通用过程中用,IsMissing,函数,测试是否向可选参数传送实参值;,IsMissing,函数,格式如下:,IsMissing,(,可选参数名,),含义:,函数值为,Boolean,型,在调用过程时,若没有向可选参数传送实参,则函数返回值为,True,,否则返回值为,False,。,例:写结果,,Sub,Mul,(fir%,sec%,Optional,thir,),n=fir*sec,If,Not,IsMissing,(,thir,)Then,n=n*,thir,End If,Print n,End Sub,sub Form _ click(),Mul,10,20,End Sub,输出:,200,sub Form _ click(),Mul,10,20,30,End Sub,输出:,6000,在调用时,可提供两个参数,也可提供三个参数。先计算两个参数的积,结果赋给,n,,再测试第三个参数,(,可选参数,),是否存在,若存在,则将第三个参数与,n,相乘,,二、可变参数:在,C,语言中,用,printf,函数可输出一个或多个数据,要输出的数据就是函数的参数,,printf,是一个可变参数函数。在,VB,中也可以建立与,printf,类似的过程。,格式:,Sub,过程名,(,ParamArray,数组名,),说明:,数组名为形参,只有,名字,和,括号,,是,Variant,型。,For EachNext,语句,:,(1),格式:,For,Each,成员,In,数组名 循环体,Exit For ,Next,成员,(2),说明:,类似,ForNext,循环,a),成员:变体变量,是数组中的每个元素,无需提供初值与终值;,b),数组名:没有括号和上下界;,c),循环次数:由数组中元素个数决定,有多少个 元素,就自动重复执行多少次。例,1,:,Private Sub,Form_Click,()Dim a a=Array(1,5,3,2,6),For Each x In a,Print x;,Next x,End Sub,输出:,1 5 3 2 6,例,2,:写一,Sub,过程,用该过程可求任意多个数的乘积,,Sub,multi(,ParamArray,num(),n=1,For Each,x,In,num,n=n*x,Next x,Print n,Print,LBound(num,),UBound(num,),End Sub,Sub,Form_Click,(),multi,2,3,4,5,6,End Sub,输出:,720,0 4,Sub,Form_Click,(),Dim a%,b&,c,d%,a=6:b=20,c=10:d=5,multi,a,b,c,d,End Sub,由于可变参数过程中的参数是,Variant,型,因此可把任何类型的实参传给该过程,输出结果为:,6000,0 3,9.5,对象参数,VB,还可用,对象,(,窗体,或,控件,),作为通用过程的参数,,格式:,Sub,过程名,(,形参表,),语句块,Exit Sub,语句块,End Sub,说明:,形参表中参数类型为,Control,或,Form,;,对象只能通过传地址方式传送;,不能在形参前加关键字,ByVal,。,一、窗体参数:,例:设计一个含有三个窗体的程序,要求这三个的位置、大小都相同(见演示,子程序,1.exe,)。,说明:,与多重窗体有关的方法:,(1),Show,方法,:格式:,窗体名称,.Show,模式,功能:装入和显示窗体,,说明:,a),若省略,窗体名称,,则显示当前窗体;,b),模式,有两个值,(0,或,1),用来确定窗体状态,若为,1,鼠标只在该窗体内起作用,不能到其他窗体操作,只有在关闭该窗口后才能对其他窗口操作。,若为,0,(,缺省,),,则不用关闭该窗体就可对其他窗口操作。,c),若窗体不在内存中,则,Show,自动将窗体装入内存 并显示。,(2),Hide,方法,:格式:,窗体名称,.Hide,功能:隐藏窗体,不在屏幕上显示,但仍在内存中,.,如何添加窗体?执行,工程菜单,中,添加窗体,命令。,窗体大小和位置可通过,Left,、,Top,、,Width,及,Height,属性来设置。,分析,1,:,每个窗体可用四个语句确定其大小、位置,除窗体名称不同,其他都一样,因此,可用,窗体作为参数,,编写一通用过程:,Sub,formset,(,fonum,As,Form,),fonum.Left,=2000,fonum.Top,=3000,fonum.Width,=5000,fonum.Height,=3000 End Sub,该过程有一个形参,(,fonum,),,类型为窗体,(,Form,),。调用时可用窗体作为实参,如:,formset,Form1,分析,2,:,为了调用上面的通用过程,先用,工程菜单,中,添加窗体,命令建立,3,个窗体,即,Form1,、,Form2,、,Form3,。,默认为第一个建立的窗体,(,Form1,),是启动窗体。接着对,Form1,编写如下事件过程:,Private Sub,Form_Load,(),formset,Form1,formset,Form2,formset,Form3End Sub,对,3,个窗体分别编写如下事件过程:,Private Sub,Form_Click,(),Form1.Hide ,隐藏窗体,Form1,Form2.Show ,显示窗体,Form2,Form2.Print,第二个窗体,End Sub,Sub,Form_Click,(),Form2.Hide,Form3.Show,Form3.Print,第三个窗体,End Sub,Sub,Form_Click,(),Form3.Hide,Form1.Show,Form1.Print,第一个窗体,End Sub,运行后,首先显示,Form1,;单击该窗体后,,Form1,消失,显示,Form2,,单击,Form2,窗体后,,Form2,消失,显示,Form3.,,所显示的每个窗体的大小与位置均相同。,二、控件参数控件作为通用过程的参数时,一般是在一个通用过程中设置相同性质控件所需要的属性,然后用不同的控件调用此通用过程。例:编写一通用过程,在该过程中设置字体的部分属性;在窗体上画两个文本框,运行程序,单击窗体后两个文本框中显示的字体的大小、类型均不相同。(见演示,子程序,2.exe,),通用过程如下:,Sub,fout,(tes1 As,Control,tes2 As,Control,),tes1,.FontSize=,16,tes1.FontName=,幼圆,tes1.FontBold=True tes1.Text=2006,世界杯开幕,tes2,.FontSize=,24,tes2.FontName=,隶书,tes2.FontBold=True tes2.Text=,祝你喜欢的球队胜利,End Sub,其他事件过程:,Private Sub,Form_Click,(),fout,Text1,Text2 End Sub,若在窗体上画一个图片框,能否改为下面的事件过程?,Private Sub,Form_Click,(),fout,Text1,Picture1,出错,无,Text,属性,End Sub,注意:,在用控件作参数时,须考虑到作为实参的控件是否具有通用过程中所列的控件的属性!为此,,VB,提供了一个专用语句,用来,限定控件参数类型,格式,为:,If|,ElseIf,TypeOf,控件名称,Is,控件类型该语句说明:,该语句只能放在通用过程中;,控件名称:,控件参数,(,形参,),的名字;,控件类型:,各种不同控件的关键字,如,Label,、,ListBox,、,TextBox,、,Timer,将上例的通用过程改为:,Sub fout(tes1 As Control,tes2 As Control),tes1.FontSize=18,tes1.FontName=,幼圆,tes1.FontBold=True,If,TypeOf,tes1 Is,TextBox,Then,tes1.Text=2006,世界杯开幕,End If,tes2.FontSize=24,tes2.FontName=,隶书,tes2.FontBold=True,If,TypeOf,tes2 Is,TextBox,Then,tes2.Text=,祝你喜欢的球队胜利,End If,End Sub,上述过程中加了,TypeOf,测试,只有用文本框,(,TextBox,),调用该过程时,才会把字符串赋给,Text,属性,若没有,Text,属性的控件作为实参调用该过程,也不会出错。在窗体上再建立一个命令按钮,将窗体单击事件过程改为:(见演示,子程序,3.exe,),Private Sub Form _ Click(),fout,Text1,,,Command1,不会出错,有,TypeOf,测试,End Sub,9.6,过程与变量的作用域,应用程序中的过程、变量是有作用域的。所谓,作用域,,就是,过程、变量可以在哪些地方被使用,。作用域的大小和过程、变量所处的位置及定义方式有关。,一、,过程的作用域,对过程而言,也有,模块级过程,和,全局级过程,之分。,1.,模块级过程,在一个窗体模块中以,Private,定义的过程为模块级过程,可为本模块内的各个过程引用。,2.,全局级过程,在一个,窗体模块,中以,Public,定义的过程为全局级过程,其他窗体可通过“,窗体模块名,.,过程名,”引用;在,标准模块,中定义的全局过程可直接通过,过程名,引用。,二、变量的作用域,变量的作用域决定了哪些子过程和函数过程可访问该变量。变量的作用域分为,局部变量,(,过程级,),、,模块变量,(,模块级,),和,全局变量,(,全局级,),。例:,通过本例学习不同作用域变量的使用。在,Form1,窗体代码窗口输入如下程序:,Private a%,窗体,/,模块级变量,Private Sub,Form_Click,(),Dim c%,,,s%,局部变量,c=20 s=a+,Form2.b,+c,引用各级变量,Print s=,;,s End Sub,在,Form1,窗体下:,Private Sub,Form_Load,(),a=10,给窗体,/,模块级变量赋值,Form2.Show,无此句时,b,值为,0,End Sub,添加,Form2,窗体,,在它的代码窗口输入如下代码:,Public b%,定义全局变量,Private Sub,Form_Load,(),b=30,给全局变量赋值,End Sub,运行程序,,,单击,Form1,窗体,,结果如下:,s=60,在本例中,我们在,Form1,窗体的,Click,事件过程中引用了,Form2,窗体中定义的,全局级变量,b,,由此可以看出在代码窗口“通用声明”段中用,Public,定义的变量确实是在整个应用程序中起作用的。如果将,Form1,代码窗口中的,Form_Click,事件过程做如下变动:,Private Sub,Form_Click,(),Dim c%,,,s%,,,b%,局部变量,c=20 b=40 s=a+b+c Print s=,;,s End Sub,运行结果变为:,s=70,结果发生了变化。原因是在,VB,中,当同一应用程序中,定义了不同级别的同名变量,时,,系统优先访问作用域小的变量,。上例改动后,系统优先访问了局部变量,b,,因此结果当然也相应地改变了。如果想优先访问全局变量,则应在,全局变量前加上窗体,/,模块名,。,三、静态变量局部变量除了用,Dim,语句声明外,还可用,Static,语句将变量声明为,静态变量,,它在程序运行过程中可保留变量的值。也就是说,,每次调用过程后,,,用,Static,说明的变量会保留运行后的结果,;而在过程内用,Dim,说明的变量(在函数名、过程名前加,Static,除外),每次调用过程结束,都会将这些局部变量释放掉。静态变量定义格式如下:,格式,:,Static,变量名,As,类型,Static Function,函数名(,参数列表,),As,类型,Static Sub,过程名,(参数列表),若在函数名、过程名前加,Static,,则表示该函数、过程内的局部变量都是静态变量。,说明,:,当数组作为局部变量放在,Static,语句,中时,在使用前应标出维数,如:,Sub,medx,()Static Arr(-3 To 3)As Integer .End Sub,例,1,:调用函数实现变量自动增,1,的功能。,Static Function s%()Dim sum%sum=,sum,+1s=sum,End Function,Sub,Form_Click,(),Dim i%,For i=1 To 5,Print,第,&i&,次结果,&s(),Next i,End Sub,若将上例,函数过程,(,窗体模块中建立,),头一句改为:,Private,Static Function s%().End Function,调用该函数过程后结果是否相同?(是),若头一句改为:,Function s%().,则结果为:,例,2,:写出下列程序执行结果:,Sub,Form_Click,(),Print“x,“y,For i%=1 To 5,testsub,Next i%,End Sub,Sub testsub(),Static,y,x=x+
展开阅读全文

开通  VIP、SVIP  下载更划算
下载10份以上建议开通 VIP 会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        关注我们

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服