资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,模块,3,Visual,Basic,的过程,任务,1,过程的定义与调用,任务,2,参数传送,返回,任务,1,过程的定义与调用,3.1.1,过程的定义,1.,利用“添加过程”对话框定义,打开窗体或模块的代码窗口,选择“工具”菜单中的“添加过程”命令,即可打开“添加过程”对话框,然后按对话框中的提示输入相应内容即可。在“名称”文本框内输入待定义过程的名称,在“类型”选项组中选中“子程序”单选按钮。要定义一个标准模块级或窗体级的局部过程,则选中“范围”选项组中的“私有的”单选按钮,然后单击“确定”按钮,则可建立一个子过程的模板,再编写所需的代码。可以根据需要选中“所有本地变量为静态变量”复选框。,下一页,返回,任务,1,过程的定义与调用,2.,直接在代码窗口定义,进入代码窗口后,在左侧显示对象名的下拉列表框中选择“,(,通用,)”,,另外,在右侧显示过程的下拉列表框中选择“,(,声明,)”,,然后输入,Sub,及子程序名即可。系统会自动加上,End Sub,与子程序后的一对括号,(),,此时,即可输入子程序语句了。,格式,:,Private|Public Static Sub(),Exit Sub,End Sub,上一页,下一页,返回,任务,1,过程的定义与调用,其中,:,Public|Private:,表示过程是“公用”或“私用”。,Public,过程可在整个程序范围内被调用,但必须指明该子过程所在的对象,(,如在,Form 1,中定义了,Sub1,,在,Form2,中想调用时,应该用,Call Form1.Sub1,,而,Private,过程只能在本窗体或模块中被调用。,Static:,表示过程中的局部变量是静态变量,在过程被调用后,其值仍然被保留。,():,格式为,ByVal,|,Bef,As,ByVal,:,表示参数为值传递方式,实参的值不随形参值的变化而变化。,Bef,:,表示参数为地址传递方式,实参的值随形参值的改变而改变。该项为默认项。参数,:,可以是变量名或数组名,当为数组名时,形参和实参在参数声明时应省略其维数,但括号,不能省略。多项时,中间用逗号隔开。,Exit Sub:,退出过程。,上一页,下一页,返回,任务,1,过程的定义与调用,例如,:,Private Sub cp(a As Integer,b As Integer),Ifa,=0 Then,Exit Sub,End If,c1=,a+b,c2=a-b,Print c1=,;c1;,c2=;c2,End Sub,上一页,下一页,返回,任务,1,过程的定义与调用,3.1.2,过程的调用,1.,使用,can,语句调用,格式,:Call,过程名,(,实参列表,),其中,:,实参的个数,数据类型都应与被调用过程的形参一一对应。如无参数,可以省略,(),。例如,:,Private Sub Command1,Click(),str1$=“,输入对活框,”,va,=,InputBox,(,va,=,,,str1$),vb,=,InputBox(vb,=,,,str1$),Call cp(,va,,,vb,),End Sub,此时,将输入的值,(,va,vb,),传递给形参,a,b,,然后在过程中计算。如果,a=0,,则退出该过程不作任何处理。,上一页,下一页,返回,任务,1,过程的定义与调用,2.,直接使用过程名调用,格式,:,过程名,实参,,实参,即:,cp,va,vb,过程中的代码通常需要某些有关程序执行状态的信息才能完成其工作。信息包括在调用过程时传递到过程内的变量。当将变量传递到过程时,称变量为参数。,上一页,返回,任务,2,参数传送,3.2.1,形式参数和实际参数,过程的参数分为形参和实参两种。形参出现在过程定义中,在整个过程内都可以使用,离开该过程则不能使用。实参出现在主调过程中,进入被调过程后,实参变量也不能使用。形参和实参的功能是进行数据传送。在函数调用时,主调过程把实参的值传送给被调过程的形参,从而实现主调过程向被调过程的数据传送。,下一页,返回,任务,2,参数传送,过程的形参和实参具有以下特点。,(1),形参只在过程内部有效,过程调用结束返回主调过程后则不能再使用该形参变量。一般情况下,实参在过程内部无效,而在主调过程中有效。,(2),实参可以是常量、变量和表达式等,在进行过程调用时,它们应该具有确定的值,以便把这些值传送给形参。,(3),实参和形参在数量上、类型上和顺序上要保持一致,防止对应错误。,上一页,下一页,返回,任务,2,参数传送,下面举例说明参数的传递过程,假如定义过程的代码为,:,Subadd,(a As Long,,,b As Long),Dim c As Long,c=a*a+b*b,Print c,End,Sub,调用函数的代码为,:,Dim x As Long,,,y As Long,x=5,v=10,Call add(5,6),程序中调用,add,过程时,将需要准备两个变量,x,和,J,作为实参,目的是通过调用,add,使变量,x,和,Y,的数值传递到过程,add,中去进行计算,各个变量的相互关系可用,图,3,一,1,来描述。,上一页,下一页,返回,任务,2,参数传送,3.2.2,按值传递参数,按值传递参数时,传递的只是变量的副本。如果在过程中改变了这个形参的值,则所进行的变动只影响副本而不会影响实参变量本身。可使用,ByVal,关键字指出参数是按值来传递的,例如,:,PrivateSub,Form Click(),Dim,x As Long,,,y As Long,,,z As Long,x=5:y,=10:z=15,add1 x,,,v,,,z,Print,z,因为是按值传递,z,的值并没有发生改变,保持,15,End,Sub,形参,c,是按值传递,Subadd1(a As Long,,,b As Long,,,ByVal,c As Long),c=a*a+b*b,End,Sub,add1,过程的功能与,add,过程相似,只不过,add1,中形参,c,是按值传递的。,上一页,下一页,返回,任务,2,参数传送,3.2.3,按地址传递参数,按地址传递参数使过程用变量的内存地址去访问实参变量的内容。结果将实参变量传递给过程时,通过调用过程改变实参变量的值。使用,ByRef,关键字指出参数是按地址来传递的,在,VB,中参数传递默认是按地址传递的,例如,:,PrivateSub,Form Click(),Dim,x As Long,,,y As Long,,,z As Long,x=5:y,=10:z=15,add1,x,,,v,,,z,Print z,因为是地址传递的,,z,的值变为,125,End Sub,形参,c,是地址传递,Subadd1(a As Long,,,h As Long,,,ByRef,c As Long),c=a*a,+b*b,End Sub,上一页,下一页,返回,任务,2,参数传送,add2,的过程跟,add 1,的区别就在于把形参,c,前面的,ByVal,修改成了,ByRel,,结果在,Form_ Click,事件过程中,Print,语句显示的结果就完全不同了。,VB,中默认的是按地址传递参数,如果某形参是按地址传递参数,可以省略,ByRef,关键字。通常情况下,一个过程都有一个按地址传递参数,用以返回执行后的结果。即使形参指定是按地址传递参数,但当实参是一个表达式时,此时参数传递变成按值传递参数。例如,一个窗体上只有一个命令按钮,Command 1,该窗体上设计如下事件过程,:,上一页,下一页,返回,任务,2,参数传送,Private Sub Command1 Click(),Dim x As Integer,x=10,Call proc(x),Print x,End Sub,Private Sub proc(,ByRef,a As Integer)Sub,过程,a=a+1,Print a,End Sub,上一页,下一页,返回,任务,2,参数传送,在运行窗体时,单击该命令按钮,在窗体上输出的值分别为,11,和,10,。因为尽管,pros,的形参,a,是按地址传递参数,但调用它的实参为“,(x)”,,是一个表达式,所以在调用,pros,后不会改变实参,x,的值。,所以,当一个过程的参数是按地址传递的,而某次调用不会进行地址传递,可以将实参变量用括号括起来,变为一个表达式,这样调用过程时改为按值传递参数。,上一页,下一页,返回,任务,2,参数传送,3.2.4,传递一个数组,在,vB,中允许参数是数组,数组只能通过传地址方式进行传递。在传递数组时还要注意以下事项。,(1),在实参列表和形参列表中放入数组名,忽略维数的定义,但圆括号不能省。,(2),如果被调过程不知道实参数组的上下界,可用,LBound,和,UBound,函数确定实参数组的下界和上界。,上一页,下一页,返回,任务,2,参数传送,例如,以下过程用于求形参一维数组,a,的所有元素之和。,Private Sub,comparray(a()As,Integer,,,ByRef,s As Integer),Dim i,,,m,,,n As Integer,m=,LBound(a):n,=,UBound(a,),s=0,For i=m To n,s=,s+a,(i,j),Next i,End Sub,若有以下语句说明的数组,:,Dim A(10)As Integer,给,A,数组元素赋值,调用上述函数的语句为,:,Call,comparray(A,,*,),输出,s,上一页,返回,图,3-1,参数传递过程,返回,
展开阅读全文