版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目七过程任务7.1事件过程任务7.2子过程任务7.3函数过程任务7.4参数传递
任务7.1事件过程
任务导入
事件过程是构成VB应用程序的主体。在前面的学习中,我们编写的程序几乎都使用了事件过程。本任务在以前学习的基础上,对事件过程的语法格式和使用时的注意事项进行归纳,便于学生系统、全面地掌握过程的设计方法。学习目标
(1)掌握事件过程的语法格式。
(2)了解使用事件过程的注意事项。
(3)了解常用的键盘事件。
(4)了解常用的鼠标事件。任务实施
1.理解事件过程的触发
对象事件在用户或系统发出动作时被触发,事件响应时执行的过程就是事件过程。事件过程一般由VB创建,用户不能增加或删除。当用户对某个对象发出一个动作时,Windows会通知VB产生了一个事件,VB会自动地调用与该事件相关的事件过程,即当对象对一个事件的发生做出认定时,VB便自动用相应事件的名字调用该事件的过程。由于名字在对象和代码之间建立了联系,因此说事件过程是依附于窗体和控件的。
2.掌握事件过程的语法格式
控件事件过程的语法格式为
PrivateSub〈控件名〉_〈事件名〉([形参表])
[〈语句组〉]
EndSub
窗体事件过程的语法格式为
PrivateSubForm_〈事件名〉([形参表])
[〈语句组〉]
EndSub
3.了解创建事件过程时的注意事项
(1)虽然用户可以手工键入首行的事件过程名,但使用模板会更方便,模板会自动将正确的过程名包括进来。使用模板创建事件过程的方法是:在对象列表框中选定活动的窗体中的对象名(如Command1),在过程列表框中选择事件名(如Click事件),系统就会在代码编辑器窗口中生成该对象所选事件的过程模板,如图7.1所示。然后在Sub和EndSub语句之间输入代码。图7.1使用模板创建事件过程
(2)事件过程名是由VB自动给出的,如Command1_Click,因此,在为新控件或对象编写事件代码之前,应先设置它的Name属性。图7.2中将Command1的Name属性设置为Cmdopen,因而事件过程名就自动给出为Cmdopen_Click。图7.2设置对象的Name属性
4.了解键盘事件
1) KeyPress键盘事件
当用户按下和松开一个ASCII字符键时发生KeyPress事件。该事件被触发时,被按键的ASCII码将自动传递给事件过程的KeyAscii参数。在程序中,通过访问该参数,可获知用户按下了哪一个键,并可识别字母的大小写。其语法格式为
PrivateSub
对象名_KeyPress(keyasciiAsInteger)
其中,参数keyascii是被按下字符键的标准ASCII码。对它进行改变可给对象发送一个不同的字符。将keyascii改变为0时可取消击键。
【说明】
(1)具有焦点的对象才能接收该事件。一个窗体仅在它没有可视和有效的控件或KeyPreview属性被设置为True时才能接收该事件。
(2) KeyPress事件可以引用任何可打印的键盘字符、来自标准字母表的字符或少数几个特殊字符之一的字符与Ctrl键的组合、Enter键或Backspace键。
2) KeyDown和KeyUp键盘事件
KeyDown和KeyUp事件是当一个对象具有焦点时按下或松开一个键时发生的。当控制焦点位于某对象上时,按下键盘中的任意一键,会在该对象上触发KeyDown事件,当释放该键时,将触发KeyUp事件,之后产生KeyPress事件。其语法格式为
PrivateSub
对象名_KeyDown(KeyCodeAsInteger,shiftAsInteger)
PrivateSub
对象名_KeyUp(KeyCodeAsInteger,shiftAsInteger)
【说明】
(1)参数KeyCode项用于返回被按键的扫描代码。由于扫描码主要反映物理键位,因此通过该参数不能区分字母大小写。
(2) shift参数返回一个整数,该整数相应于Shift、Ctrl和Alt键的状态。shift参数等于1、2和4分别表示Shift、Ctrl和Alt键被按下,而三数的部分和表示三个按钮部分地被同时按下。例如,Ctrl键和Alt键都被按下,则shift的值就是6。因此,可结合该参数项来判断输入字母的大小写。
(3) Tab键不能引用KeyDown和KeyUp事件;命令按钮的Default属性设置为True时,Enter键不能引用KeyDown和KeyUp事件;命令按钮的Cancel属性设置为True时,Esc键不能引用KeyDown和KeyUp事件。
5.了解鼠标事件
前面的例子中曾多次使用鼠标事件,即单击(Click)事件和双击(DblClick)事件,这些事件是通过快速按下并松开鼠标键而产生的。除此之外,VB还可以通过MouseDown、MouseUp、MouseMove事件使应用程序对鼠标位置及状态的变化做出响应(其中不包括拖放事件)。其实,Click事件是由MouseDown和MouseUp组成的,因此MouseDown和MouseUp是最基本的鼠标事件。
当鼠标指针位于无控件的窗体上方时,窗体将识别鼠标事件;当鼠标指针在控件上方时,控件将识别上述三种鼠标事件。如果鼠标被持续地按下,则第一次按下之后捕获鼠标的对象将接收全部鼠标事件,直至所有按钮被释放为止。
1) MouseDown和MouseUp鼠标事件
MouseDown和MouseUp事件在按下(MouseDown)或者释放(MouseUp)鼠标按钮时发生。其语法格式为
PrivateSub
对象名_MouseDown(buttonAsInteger,shiftAsInteger,xAsSingle,y
AsSingle)
PrivateSub
对象名_MouseUp(buttonAsInteger,shiftAsInteger,xAsSingle,yAs
Single)
【说明】
(1)参数button返回一个整数,其值分别等于1、2和4时,对应于左按钮、右按钮以及中间按钮的动作。注意:只能有一个按钮引起事件。
(2)与键盘事件一样,参数shift返回一个整数,在button参数指定的按钮被按下或被释放的情况下,该整数相应于Shift、Ctrl和Alt键的状态。
(3)参数x和y返回一个指定鼠标指针当前位置的数。
2) MouseMove鼠标事件
MouseMove事件在移动鼠标时发生。其语法格式为
PrivateSub
对象名_MouseMove(buttonAsInteger,shiftAsInteger,xAsSingle,yAsSingle)任务7.2子过程
任务导入
当有几个不同的事件过程需要执行相同的操作时,为了简化程序,可以将公共语句放入分离开的子过程(通用过程)中,并由事件过程来调用它。
子过程不与任何特定的事件相联系,只能由别的过程来调用,它可以存储在窗体或标准模块中。本任务学习子过程的创建和调用方法。学习目标
(1)会建立、调用子过程。
(2)能熟练使用子过程编写程序。任务实施
1.认知建立子过程的方法
子过程与事件过程不同,子过程不是由对象的某种事件激活的,也不依附于某一对象,故其创建的方法与事件过程的略有区别。建立子过程的方法有两种:
(1)使用“添加过程”对话框。
(2)直接在代码编辑窗口中输入过程代码。
2.使用“添加过程”对话框创建子过程
使用“添加过程”对话框创建子过程的步骤如下:
(1)打开代码编辑窗口。
(2)单击“工具”菜单中的“添加过程”命令,打开“添加过程”对话框,如图7.3所示。图7.3“添加过程”对话框
(3)在“名称”文本框中输入过程名,如“shuru”;在“类型”组中选择“子程序”项;从“范围”组中选择范围,相当于使用Public(公有的)或Private(私有的)关键字。
(4)单击“确定”按钮。可以看到在对象列表框中为“通用”,在过程列表框中为“aaa”,如图7.4所示。
图7.4代码编辑窗口
3.通过在代码窗口中输入语句的方法建立子过程
在代码编辑窗口中,把光标定位在已有过程的外面,然后按如下格式输入子过程:
[Private|Public][Static]Sub〈过程名〉([〈形参表〉])
[〈语句组〉]
[ExitSub]
[〈语句组〉]
EndSub
【说明】
(1)VB默认所有模块中的子过程是Public,表示在应用程序中随处都可调用它们;如果选用Private,则只有该过程所在模块中的程序才能调用该过程。
(2)如果使用Static(静态的)关键字,则该过程中的所有局部变量的存储空间只分配一次,且这些变量的值在整个程序运行期间都存在;如果省略Static,则过程每次被调用时重新为其变量分配存储空间,当该过程结束时释放其变量的存储空间。
(3)〈过程名〉与变量名的命名规则相同,长度不得超过40个字符。
(4)在过程内,不能再定义过程,但可以调用其他子过程或函数过程。
4.调用子过程
调用子过程的方法有两种:
(1)使用Call语句,语法格式为
Call〈过程名〉([〈实参表〉])
(2)直接使用过程名,语法格式为
〈过程名〉[〈实参表〉]例如,下面两个语句都能调用aaa子过程:
aaa12
Callaaa(12)
其中的12是实际参数。实际参数可以是常量、变量或表达式,如:
M=12
Callaaa(M)
【课堂演练】
【实例7-1】编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。
【实现步骤】
(1)问题分析。使用通用过程来计算并输出矩形的面积,它有两个形参,分别为矩形的长和宽。在窗体的单击事件过程Form_Click中,从键盘输入矩形的长和宽,并用它们作为实参调用通用过程。
(2)建立应用程序用户界面,并设置对象属性如图7.5所示。图7.5建立计算矩形面积的用户界面
(3)在代码窗口中直接输入通用事件代码:
Subrecarea(rlen,rwid)
Dimarea
area=rlen*rwid‘计算矩形面积
MsgBox“矩形的面积是:”&area’用消息框输出矩形面积
EndSub
(4)编写窗体Form的单击事件代码:
PrivateSubForm_click()
Dima,b
a=InputBox(“请输入矩形面积的长度:”) ‘用输入框输入矩形的长
b=InputBox(“请输入矩形面积的宽度:”) ’用输入框输入矩形的宽
recareaa,b‘调用recarea过程,也可以改为Callrecarea(a,b)
EndSub编写子过程与窗体的事件过程代码,如图7.6所示。图7.6编写子过程与窗体的事件过程代码
(5)运行工程。单击标准工具栏中的“启动”按钮,运行工程;单击窗体,依次输入矩形的长、宽,如图7.7所示,求得矩形面积如图7.8所示。图7.7输入矩形的长、宽图7.8矩形面积的计算结果
【实例7-2】编写一个用来延迟指定时间(秒)的Sub过程。通过调用该过程,按指定的时间间隔显示若干行信息。
【实现步骤】
(1)问题分析。用For循环可以实现时间延迟,但不精确。在此使用VB的内部函数Timer来编写较为精确的时间延迟过程。
Timer函数返回系统时钟从午夜开始计算的秒数,把Timer加上需要延迟的时间(秒)作为循环结束的时间,当Timer超过该时间时结束循环,即停止时间延迟时,用这种方法可以得到精确的时间延迟。
(2)为了简化操作,直接在窗体上输出,因此不再进行属性设置。(3)编写通用事件过程代码:
StaticSubdelayloop(delaytime)
Constsecinday=24&*60&*60&'一整天的秒数
loopfinish=Timer+delaytime'计算完成时间
Ifloopfinish>secindayThen'如果延迟时间从午夜前开始
loopfinish=loopfinish–secindayDoWhileTimer>loopfinish'利用空循环实现延迟
Loop
EndIf
DoWhileTimer<loopfinish'利用空循环实现延迟
Loop
EndSub一般情况下,Timer比loopfinish要小,因此可以用
DoWhileTimer<loopfinish
Loop
来控制时间延迟。但是,如果时间延迟从午夜前开始,到午夜后才结束,则Timer从0开始起算,在这种情况下,必须用
DoWhileTimer>loopfinish
Loop
来控制时间延迟。用上面的delayloop过程可以延迟指定的时间,调用时用需要延迟的时间(秒)作为实参。例如,延迟3秒可以用下面的代码实现:
delayloop3
(4)编写窗体Form的Click事件代码:
PrivateSubForm_Click()
Print“输出第一行内容。”
Print“请等3秒。”
delayloop3 ‘调用通用过程,延迟3秒
Print“输出第二行内容。”
Print“请等6秒。”
Calldelayloop(6)‘调用通用过程,延迟6秒
Print“输出第三行内容。”
EndSub
(5)运行程序。单击窗体,显示第一部分内容,等待3秒后,显示第二部分内容,再过6秒显示第三部分内容,如图7.9所示。图7.9时间延迟示例
任务7.3函数过程
任务导入
VB中包含了许多内部函数,如Int、Sqr等。用户在编写程序时,只需写出一个函数名并给定参数就能得出函数值。但是,如果用户在程序中需要多次用到某一公式或要处理某一函数关系,而又没有现成的内部函数可用时,则可以自己编写函数(Function)过程。函数过程与内部函数一样,可以在程序或函数嵌套中使用。学习目标
(1)会建立、调用函数过程。
(2)能熟练使用函数过程编写程序。任务实施
1.认知定义函数过程的方法
与子过程一样,函数过程也是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。与子过程不同的是,函数过程可返回给调用过程一个值。
函数过程的定义与子过程相似,可以使用“添加过程”对话框,也可以在代码编辑窗口中直接输入过程代码。
2.通过“添加过程”对话框定义函数
譬如,创建一个用于求某数阶乘的通用函数fact:先打开“添加过程”对话框,在“名称”文本框中键入过程名“fact”,在“类型”组中选择“函数”项,如图7.10所示,再单击“确定”按钮即可产生函数过程的框架。图7.10定义函数过程通常,由系统自动产生的函数过程框架还需要进行适当修改。由于函数过程有返回值,这个值就应该属于某种数据类型,因此,还需要在过程名后面加上对其返回值类型的定义和说明。另外,为了获得传递过来的参数,还需定义接收参数的变量等。
3.通过在代码编辑窗口输入代码来定义函数
定义函数过程的语法格式为
[Private|Public][Static]Function〈函数名〉([〈形参表〉])[As〈类型〉]
[〈语句组〉]
[〈函数名〉=〈表达式〉]
[ExitFunction]
[〈语句组〉]
[〈函数名〉=〈表达式〉]
EndFunction
【说明】
(1)〈表达式〉的值是函数返回的结果。在语法中通过赋值语句将值赋给〈函数名〉,该值就是函数过程返回的值。
(2)〈语句组〉中可以有一个或多个ExitFunction语句,以从函数过程中退出。
(3)其他部分的含义与子过程相同。
【课堂演练】
【实例7-3】编写求矩形面积的自定义函数。
【实现步骤】
在代码窗口中直接输入下面的代码即可:
PublicFunctionarea(aAsInteger,bAsInteger)AsLong
area=a*b ‘计算并返回函数值
EndFunction
【实例7-4】编写计算任意整数n的阶乘的Function过程fact。
【实现步骤】
具体代码如下:
Functionfact(xAsInteger)AsLong
DimpAsLong,iAsInteger
p=1
Fori=1Tox
p=p*i ‘累乘
Nexti
fact=p’返回函数值
EndFunction
4.直接调用函数
函数过程的调用很简单,与使用VB内部函数一样,可以在表达式中直接写上它的名字。例如,假设已经编有计算矩形面积的函数过程area(),则调用方法为
MsgBox"矩形面积为:"&area(5,6)
5.用Call语句调用函数
调用函数过程与调用子过程一样。利用下面的代码能调用同一个函数过程:
Callarea(2,4)
area2,4
当用这种方法调用函数时,VB放弃返回值。
6.调用无参函数
函数可以没有参数,在调用无参函数时不发生虚实结合。调用无参函数会得到一个固定的值,如对于无参函数:
FunctionF2
F2=“Followme.”
EndFunction
可如下调用:
Debug.PrintF2
【课堂演练】
【实例7-5】利用Function函数求矩形面积。
【实现步骤】
直接调用【实例7-3】中的area函数,代码如下:
PrivateSubForm_Load()
Show
Label3.Caption=area(5,6)‘通过实参调用area函数并输出
EndSub
图7.11(a)所示为输入的函数代码和事件过程代码。运行结果如图7.11(b)所示。图7.11利用Function函数求矩形面积
【实例7-6】求1到6的阶乘之和。
【实现步骤】
(1)问题分析。利用【实例7-4】中求阶乘的Function过程fact,主程序通过调用该函数依次求得1!、2!、3!……6!的值,然后把这些值累加。
(2)应用程序用户界面的建立与对象属性的设置参见图7.12。
(3) Function过程的代码参见【实例7-4】。下面写出命令按钮的Click事件代码:
PrivateSubCommand1_Click()
DimsumAsLong,iAsInteger‘定义数据类型
Fori=1To6’求1到6的阶乘
sum=sum+fact(i)‘累加阶乘和
Nexti
Label2.Caption=sum’输出结果
EndSub(4)代码输入窗口和程序运行结果如图7.12所示。图7.12求阶乘和
【实例7-7】编制随机整数Function过程,输出n个指定范围的随机数。
【实现步骤】
(1)问题分析。利用用户自定义函数定义随机整数函数,可以产生指定范围之内的随机整数。在主程序中指定范围和产生的个数。
(2)程序界面的设计和对象属性的设置参见图7.13。图7.13输出n个指定范围内的随机数
(3)编写代码。
首先自定义Function函数,用以返回指定范围之内的随机整数:
PrivateFunctionRandomnum(nAsInteger,mAsInteger)
RandomizeTimer ‘随机数种子
Randomnum=Int(Rnd*(b+1–a))+a’产生并返回随机数
EndFunction“生成”命令按钮Command1的Click事件代码为
PrivateSubCommand1_Click()
DimnAsInteger,xAsInteger,yAsInteger
n=Val(InputBox(“随机数的个数:”,“请输入”,“100”))
x=Val(Text1.Text)
y=Val(Text2.Text)
Fori=1Ton
List1.AddItemRandomnum(x,y)‘在列表框中添加随机数
Next
EndSub“清空”命令按钮Command2的Click事件代码为
PrivateSubCommand2_Click()
List1.Clear
EndSub
(4)运行程序,结果如图7.13所示。
【实例7-8】编写Function过程返回指定字符、长度的字符串,实现在窗体上输出如图7.14所示的图形。图7.14输出图形
【实现步骤】
(1)编写能够返回指定字符、长度字符串的Function过程:
PrivateFunctionstri(nAsInteger,fAsString)
p=“”
Fori=1Ton‘指定长度
p=p&“”&f’连接字符串
Next
stri=p‘返回函数值
EndFunction
(2)编写窗体的Click事件代码,调用上述stri过程:
PrivateSubForm_Click()
DimfAsString*1
f=InputBox(“显示的字符:”,“请输入”,“$”) ‘指定组成图形的字符
Iff=“”Thenf=“$”’输出字符,默认为“$”
Cls
Forn=1To7‘输出7行
PrintTab(2*n+2); ’定位
Printstri(15–2*n,f); ‘输出左半部分
PrintSpc(8);’左右两部分间的间隔
Printstri(2*n–1,f);‘输出右半部分
Print’换行
Next
EndSub
8.查看当前模块中的过程
若要查看现有的通用过程或函数过程,则可先在代码编辑器窗口的对象列表框中选择“通用”项,然后在过程列表框中选择过程名。
若要查看事件过程,则可先在代码编辑器窗口的对象列表框中选择适当的对象,然后在过程列表框中选择事件。
9.查看其他模块中的过程
在“视图”菜单中选取“对象浏览器”命令,打开窗口,如图7.15所示。在工程/库列表框中选择工程,在类/模块列表框中选择模块,并在成员列表框中选择过程,单击“查看定义”按钮。图7.15查看其他模块中的过程
任务7.4参数传递
任务导入
调用过程的目的就是在一定的条件下完成某一工作或计算某一函数值。外界需要把条件告诉过程,反过来,过程也需要把某些结果报告给外界,这就是过程与外界的数据传递。
过程与外界的数据传递方式有两种:一是通过非局部变量;二是通过参数。在过程体中使用非局部变量(如全程变量),就是直接处理外界的量。学习目标
(1)理解形式参数与实际参数的概念。
(2)理解按值传递与按地址传递的区别。
(3)会正确使用参数实现数据传递。
(4)会将数组或数组元素作为参数进行传递。任务实施
1.理解形式参数与实际参数的概念
形式参数是在子过程和函数过程的定义中出现的变量名;实际参数则是在调用子过程和函数过程时,传送给子过程和函数过程的常数、变量、表达式或数组。
在VB中,通常把形式参数叫做“形参”,把实际参数叫做“实参”。
形参表中的各个变量之间用逗号分隔,表中的变量可以是:
后面跟有左、右圆括号的数组名。
除定长字符串之外的合法变量名。在形参表中只能用如aAsString之类的变长字符串作为形参,不能用如aAsString*8之类的定长字符串作为形参,但定长字符串可以作为实参传递给过程。
实参表中的各项用逗号隔开,实参可以是:常量、表达式、合法的变量名或后面跟有左、右圆括号的数组名。形参与实参的对应关系为
【说明】
(1)在定义过程时,形参为实参保留位置。在调用过程时,实参被插入形参中对应的各变量处,第一个形参接收第一个实参的值,第二个形参接收第二个实参的值……
(2)实参表和形参表中对应的变量名不必相同,但是变量的个数必须相等,且各实参的类型必须与相应的形参相符。
2.了解传递参数的两种方式
在调用过程时,一般调用过程与定义过程之间有数据传递,即将调用过程的实参传递给定义过程,完成实参与形参的结合,然后执行调用过程。
在VB中,实参与形参的结合有两种方法,即“传址”和“传值”。传递参数的方式有两种:如果调用语句中的实际参数是常量或表达式,或者定义过程时选用ByVal关键字,就可以按值传递;如果调用语句中的实际参数为变量,或者定义过程时选用ByRefl关键字,就可以按地址传递。
3.学习传址调用
传址就是让过程根据变量的内存地址去访问实际变量的内容,即形参与实参使用相同的内存地址单元,这样,通过子过程就可以改变变量本身的值。系统默认按地址传递参数。
在传址调用时,实参必须是变量,常量或表达式无法传址。
【课堂演练】
【例7-9】传址调用示例。
现在有下面的通用过程:
Subtryout(xAsInteger,yAsInteger)
x=x+100‘在子程序中改变变量的值
y=y*6’在子程序中改变变量的值
Print“x=”;x,“y=”;y‘在子程序中输出变量的值
EndSub窗体Form的Click事件代码如下:
PrivateSubForm_Click()
DimaAsInteger,bAsInteger
a=10‘主程序中变量的原值
b=20’主程序中变量的原值
tryouta,b‘传址调用
Print“a=”;a,“b=”;b’在主程序中输出变量的值图7.16传址调用
EndSub图7.16传址调用在事件过程中,由于通过“tryouta,b”语句调用过程tryout,实参a和b的值分别为10和20,传送给tryout后进行计算,在通用过程中输出的x和y分别为110和120,而在事件过程中输出的a和b同样为110和120。
4.学习传值调用
传值就是通过值传送实参,即传送实参的值而不是传送它的地址。在这种情况下,系统把需要传送的变量复制到一个临时单元中,然后把该临时单元的地址传送给被调用的通用过程。由于通用过程没有访问变量(实参)的原始地址,因而不会改变原来变量的值,所有的变化都是在变量的副本上进行的。当要求变量按值传送时,可以用下面的方法:
把变量变成一个表达式。把变量转换成表达式的最简单的方法就是把它放在括号内,即把变量用括号括起来,把它变为一个表达式,如“(a)”。
定义过程时用ByVal关键字指出参数是按值来传递
的,如:
SubPostAc(ByValxAsInteger)
x=x+2
EndSub
【实例7-10】传值调用示例。将【实例7-9】改用传值方式编写通用过程,则运行结果将不同。
改为传值方式的通用过程如下:
Subtryout(ByValxAsInteger,ByValyAsInteger)
x=x+100‘在子程序中改变变量的值
y=y*6’在子程序中改变变量的值
Print“x=”;x,“y=”;y‘在子程序中输出变量的值
EndSub窗体Form的Click事件代码与【实例7-9】相同:
PrivateSubForm_Click()
DimaAsInteger,bAsInteger
a=10‘主程序中变量的原值
b=20’主程序中变量的原值
tryouta,b‘传值调用
Print“a=”;a,“b=”;b’在主程序中输出变量的值
EndSub运行程序后,输出结果如图7.17所示。图7.17传值调用示例过程中的变量名即使与主程序中使用的变量名相同,在内存中也会占用不同的内存单元地址。在执行过程时,即使其变量内容发生变化,主程序中的变量内容也不会随之改变。
用传值调用这种传递参数的方法只能传递计算值,如数值、字符串。采用值参数(传值)只能从外界向过程(函数)传入信息,但不能传出;而采用变量参数(传址)则既能传入,又能传出。正是由于不能传出,过程结束后,值参数的值就不会影响外界的任何量,因而在一定意义上说,值参数比较安全。变量参数和值参数各有特点,采用哪一种更合适则需要视情况而定。一般来说,需要传出参数值时应该用变量参数,否则采用值参数为好。
值参数与变量参数的一种重要区别是,值参数对应的实参是表达式,而变量参数对应的只能是变量。
5.使用可选的参数
在过程的形参表中加上Optional关键字,就可以指定过程的形式参数为可选的。如果指定了可选参数,则参数表中此参数后面的其他参数也必是可选的,并且每个参数都要用Optional关键字来声明。
【课堂演练】
【实例7-11】可选参数示例。使两个命令按钮的事件代码调用同一个过程,一个传递一个参数,而另一个传递两个参数,如图7.18所示。图7.18使用可选参数示例
【实现步骤】
(1)Sub过程ListText将传递过来的参数值添加到列表框中,其中第2个参数使用Optional关键字,该过程的代码为
PrivateSubListText(xAsString,OptionalyAsString)
IfIsMissing(y)Then‘用IsMissing函数测试丢失的可选参数
temp=Format(x,"@@@@@@@@@@")
Else
temp=Format(x,“@@@@@@@@@@”)&Format(y,“@@@@@@@@@@”)
EndIf
List1.AddItemtemp‘在列表框中添加项目
EndSub
(2)传递一个参数的命令按钮Command1的Click事件代
码为
PrivateSubCommand1_Click()
DimaAsString
a=InputBox(“”)‘通过输入框输入变量的值
CallListText(a)’带一个实参调用过程
EndSub
(3)传递两个参数的命令按钮Command2的Click事件代码为
PrivateSubCommand2_Click()
DimaAsString,bAsString
a=InputBox(“”)‘通过输入框输入变量的值
b=InputBox(“”) ’通过输入框输入变量的值
CallListText(a,b)‘带两个实参调用过程
EndSub
(4)运行程序,单击“一个参数”按钮,产生一个参数;单击“两个参数”按钮,产生两个参数,如图7.18所示。
6.提供可选参数的默认值
可以给可选参数指定默认值。
【课堂演练】
【例7-12】在【实例7-11】中,可以为未传递的参数指定一个缺省值,如图7.19所示。
【实现步骤】
只需修改Sub过程ListText的代码:
PrivateSubListText(xAsString,OptionalyAsString=“☆☆☆☆”)
temp=Format(x,“@@@@@@@@@@”)&Format(y,“@@@@@@@@@@”)
List1.AddItemtemp
EndSub图7.19为未传递的参数指定一个缺省值
7.使用不定数量的参数
一般来说,过程调用中的参数个数应等于过程说明中的参数个数。如果使用ParamArray关键字,则过程可以接受任意个数的参数。
【课堂演练】
【实例7-13】改写【实例7-11】中的Sub过程ListText,使之可以接收任意多个参数,如图7.20所示。图7.20接收任意多个参数
【实现步骤】
(1)Sub过程ListText的代码改为
PrivateSubListText(ParamArraystrx())
ForEachxInstrx
temp=temp&Format(x,“|@@@@@@”)
Next
List1.AddItemtemp
EndSub
(2)传递一个参数的命令按钮Command1的Click事件代
码为
PrivateSubCommand1_Click()
DimaAsString
a=Left(InputBox(“”),6)
CallListText(a)‘带一个参数调用过程
EndSub
(3)传递两个参数的命令按钮Command2的Click事件代
码为
PrivateSubCommand2_Click()
DimaAsString,bAsString
a=Left(InputBox(“”),6)
b=Left(InputBox(“”),6)
CallListText(a,b)‘带两个参数调用过程
EndSub
(4)传递三个参数的命令按钮Command3的Click事件代
码为
PrivateSubCommand3_Click()
DimaAsString,bAsString,cAsString
a=Left(InputBox(“”),6)
b=Left(InputBox(“”),6)
c=Left(InputBox(“”),6)
CallListText(a,b,c) ‘带三个参数调用过程
EndSub
8.传递数组
VB允许把数组作为实参传送到过程中。例如,假设定义了如下过程:
Subs(a(),b())
EndSub该过程有两个形参,这两个参数都是数组。注意,用数组作为过程的参数时,应在数组名的后面加上一对括号,以免与普通变量相混淆。可以用下面的语句调用过程:
Calls(p(),q())这样就把数组p和q传送给过程中的数组a和b。当用数组作为过程的参数时,使用的是传址方式,而不是传值方式,即不是把p数组中各元素的值一一传送给过程的a数组,而是把p数组的起始地址传给过程,使a数组也具有与p数组相同的起始
地址。
9.传递数组的全部元素
为了把一个数组的全部元素传送给一个过程,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省略。
【课堂演练】
【例7-14】传递数组中的全部元素示例。
【实现步骤】
(1)在窗体层声明如下数组:
Dimvalues()AsInteger
(2)编写如下通用过程:
StaticSubchangarray(minAsInteger,maxAsInteger,p()AsInteger)
Fori=minTomax
p(i)=i^3
Nexti
EndSub
StaticSubprintarray(minAsInteger,maxAsInteger,p()AsInteger)
Fori=minTomax
Printp(i);‘输出各数组元素的值
Nexti
EndSub
(3)编写窗体Form的Click事件代码为
PrivateSubForm_Click()
ReDimvalues(1To10)AsInteger
Callchangarray(1,10,values())‘调用通用过程
changarray
Callprintarray(1,10
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (高考英语作文炼句)第26篇译文老师笔记
- 开题报告:指向学习调节的学生自我评价机制与策略研究
- 开题报告:粤港澳跨域教师团队建设的边界阻隔与突破机制研究
- 开题报告:医学人文教育中的师生互动及影响机制研究
- 开题报告:新时代背景下高职汽车专业群学生职业核心能力提升路径研究
- 《上海移动怒江机房》课件
- 中考地理总复习阶段测试01 地球和地图(解析版)
- 2024年债务考量离婚合同书标准格式版B版
- 2024年商业门面租赁协议标准模板一
- 元器件识别与选用 第10章 数据手册的阅读
- 六年级人教版上册数学计算题练习题(及答案)100解析
- 开具死亡医学证明书登记表
- 《一片叶子》课件
- 2023秋期国开电大专科《机械制造基础》在线形考(形考任务一至四)试题及答案
- 华师大版 初中科学 八上《第3章 浮力》 基础练习(含答案)
- 高中数学人教A版必修第一册第三章3.2.1《函数的单调性》课件(21张PPT)
- 垃圾渗滤液处理站运维及渗滤液处理投标方案(技术标)
- GB/T 23220.2-2023烟叶储存保管方法第2部分:片烟
- 组蛋白的泛素化与去泛素化专家讲座
- 不同体型的服装搭配课件
- 主人调教协议书
评论
0/150
提交评论