单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Visual BASIC,程序设计,Visual Basic程序设计第八章 过程 子程序和函数,主要内容,子程序Sub过程,函数Function过程,参数传递,过程的嵌套调用和递归调用,鼠标和键盘事件,自定义子程序,Public|Private|Static Sub,参数及其类型列表,End Sub,例如:交换两个变量内容的子程序:,Public Sub Swap(x,y),dim t,t=x :x=y:y=t,End Sub,自定义函数,Public|Private|Static Function,参数及其类型列表 As,(内含:=),End Function,注意:函数与子程序的区别,1函数必须有返回值,子程序没有。,2如果不指明函数的类型即其返回值的类型,,那么其类型是变体型Variant型,3函数用在表达式中,子程序不能。,子程序的调用,格式:,Call (,参数列表,),或者,参数列表,子程序和函数的参数,形参形式参数,定义局部所使用的参数。,实参实在实际参数,调用时传递给子程序或函数的参数。,例如:下面的x和y是形参,a和b是实参。,定义子程序 Swap:,Sub Swap(x,y),Dim t,t=x:x=y:y=x,End Sub,调用子程序 Swap:,.,Swap a,b,交换,.,参数的传递方式,在子程序或函数的调用过程中,实参内容传递给相应的形参可以有两种方式:,传址,和,传值,传址,(ByRef):将实参地址传给形参。,传值,(ByVal):将实参的值传给形参。,区别,:,传址,时,形参与实参是同一个内存区域,因而实参随形参的改变而改变。,传值,时,形参被单独分配内存并获得实参的值,因而形参的改变并不改变实参的值。,传值和传址的区别,形参 x,实参a:,形参 y,实参 b:,543,21,定义子程序 Swap:,Sub Swap(x,y),Dim t,t=x:x=y:y=x,End Sub,调用子程序 Swap:,.,Swap a,b,交换,.,Swap,传址,x:,a:,y:,b:,543,21,Swap,传值,543,21,实例:,求直角三角形的斜边,Private Sub Root(ByVal a,ByVal b,c),c=Sqr(a 2+b 2),End Sub,调用:,Root 3,4,z,Print z,打印结果,5,c b,a,自定义函数的实例,用函数求直角三角形的斜边,Public Function Hyp(x!,y!)As Single,Hyp=Sqr(x 2+y 2),End Function,调用:,Print Hyp(3,4),打印结果,5,变量与过程的作用域,在声明变量和过程时:,在什么地方声明?,过程内部,过程外部模块的通用段,用什么关键字?,Dim,Static,Private,Public,变量的作用域,过程级,模块级,全局变量,过程的作用域,模块级,全局级,Static:作用?,变量声明,格式:,Dim|Public|Private|Static as,有效范围:过程模块全局公用,隐式声明和显式声明:Option Explicit,组合声明:,例:dim i as integer,j as single,s as string,或:dim i%,j!,s$,VB应用程序的组成,VB应用程序,.vbp,窗体模块,.frm,标准模块,.bas,类模块,.cls,函数过程,(Function),事件过程,子程序,(Sub),函数过程,(Function),子程序,(Sub),变量的作用域,过程级:在过程内部声明,使用Dim或Static关键字。只能在过程内部使用。,模块级:在模块的通用段声明,使用Dim 或Private关键字。可以在该模块的所有过程中使用。,全局:在模块的通用段声明,使用Public关键字。可以在整个应用程序中使用。如果是在窗体模块内声明,那么引用时需要在变量名前面加窗体名。例如:Form1.a,变量的生存期,动态变量:声明时产生分配内存,过程结束立即释放。用Dim声明。,静态变量:过程结束后不释放内存,其值保存。下次访问该过程时仍有效。用Static声明。,变量的作用域,作用域:,过程级,模块级,全局变量,窗体,标准模块,声明方式,Dim,Static,Dim,Private,Public,声明在:,过程内,模块的通用声明段,本模块其他过程:,不能用,能用,其他模块:,不能用,能用,但要加,窗体名.,能用,过程的作用域,模块级:用Private关键字声明,全局级:用Public关键字声明,在标准模块内声明:可以直接调用,在窗体模块内声明:需要在过程名前面指定对象窗体名。,静态Static):该过程内所有过程级变量均为静态变量。,鼠标事件,Click单击,DblClick双击,MouseDown按下,MouseUp放开,MouseMove移动,DragDrop拖放,DragOver拖过,有关问题,同时发生时的先后次序,事件过程中的参数,Button,区分左右键,Shift,键盘配合,X,Y,指针位置,有关属性,有关方法,例,MouseDown和MouseUp事件,Button参数,由按下的鼠标键决定:,1左键,2右键,4中键,Shift参数,由先按下的键盘键决定:,1键,2键,4 键,先按下多键时,数值相加,与鼠标有关的属性,MousePointer指针形状,MouseIcon 自定义指针形状当MousePointer99时的指针形状,DragMode,0手工,1自动,自动:可以拖动,此时Click事件和 MouseDown事件失效,手工:需编程(用Drag方法)才能拖动,DragDrop事件,发生在目标对象,而不是被拖动对象上,参数:Source As Control,X As Single,Y As Single,Source 被拖动对象,X,Y 放下时的X,Y坐标,有关属性,DragMode:0手工,1自动,DragIcon:拖动时的图标,Drag方法:Drag Action,Action:0取消,1开始缺省,2结束,例,DragOver事件,在拖动越过一对象时发生,参数:,Source As Control,X As Single,Y As Single,Source,被拖动对象,X,Y,放下时的X,Y坐标,State,0进入时,1退出时,2在其中,例,