Visual Basic程序设计
第八章 过程
-子程序和函数
楼诗风
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
主要内容
?子程序 ( Sub过程 )
?函数 ( Function过程 )
?参数传递
?过程的嵌套调用和递归调用
?鼠标和键盘事件
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
自定义子程序
[Public|Private|Static] Sub <子程序名 >
( [参数及其类型列表 ] )
<程序代码 >
End Sub
例如:交换两个变量内容的子程序:
Public Sub Swap (x,y)
dim t
t=x, x=y, y=t
End Sub
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
自定义函数
[Public|Private|Static] Function <函数名 >
( [参数及其类型列表 ] ) [As <类型 >]
<程序代码 > (内含, <函数名 >=<返回值表达式 >)
End Function
注意:函数与子程序的区别
( 1)函数必须有返回值,子程序没有。
( 2)如果不指明函数的类型(即其返回值的类型),
则其类型是变体型( Variant型)
( 3)函数用在表达式中,子程序不能。
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
子程序的调用
?格式:
Call <子程序名 >(参数列表 )
或者
<子程序名 > 参数列表
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
子程序和函数的参数
?形参 -形式参数,定义部分所使用的参数。
?实参 -实在(实际)参数,调用时传递给
子程序或函数的参数。
例如:下面的 x和 y是形参,a和 b是实参。
定义子程序 Swap:
Sub Swap (x,y)
Dim t
t = x, x = y, y = x
End Sub
调用子程序 Swap:
…..
Swap a,b '交换
…..
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
参数的传递方式
? 在子程序或函数的调用过程中,实参内容传递
给相应的形参可以有两种方式,传址 和 传值
? 传址 (ByRef),将实参地址传给形参。
? 传值 (ByVal),将实参的值传给形参。
区别,
? 传址 时,形参与实参是同一个内存区域,因而实参随
形参的改变而改变。
? 传值 时,形参被单独分配内存并获得实参的值,因而
形参的改变并不改变实参的值。
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
传值和传址的区别
形参 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
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
实例:
‘求直角三角形的斜边
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
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
自定义函数的实例
‘用函数求直角三角形的斜边
Public Function Hyp(x !,y ! ) As Single
Hyp = Sqr(x ^ 2 + y ^ 2)
End Function
‘调用:
……
Print Hyp (3,4) ‘打印结果 5
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
变量与过程的作用域
? 在声明变量和过程时:
?在什么地方声明?
? 过程内部
? 过程外部(模块的通
用段)
?用什么关键字?
? Dim
? Static
? Private
? Public
? 变量的作用域
?过程级
?模块级
?全局变量
? 过程的作用域
?模块级
?全局级
? Static:作用?
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
变量声明
?格式:
Dim|Public|Private|Static <变量名 > [as <类型 >]
?有效范围:过程 → 模块 → 全局(公用)
?隐式声明和显式声明,Option Explicit
?组合声明,
例, dim i as integer,j as single,s as string
或, dim i%,j!,s$
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
VB应用程序的组成
VB应用程序,vbp
窗体模块,frm 标准模块,bas类模块,cls
函数过程
(Function) 事件过程
子程序
(Sub)
函数过程
(Function)
子程序
(Sub)
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
变量的作用域
? 过程级:在过程内部声明,使用 Dim或 Static关
键字。只能在过程内部使用。
? 模块级:在模块的通用段声明,使用 Dim 或
Private关键字。可以在该模块的所有过程中使
用。
? 全局:在模块的通用段声明,使用 Public关键
字。可以在整个应用程序中使用。如果是在窗
体模块内声明,则引用时需要在变量名前面加
窗体名。例如,Form1.a
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
变量的生存期
?动态变量:声明时产生(分配内存),
过程结束立即释放。用 Dim声明。
?静态变量:过程结束后不释放内存,其
值保留。下次访问该过程时仍有效。用
Static声明。
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
变量的作用域
作用域,过程级 模块级 全局变量窗体 标准模块
声明方式 DimStatic DimPrivate Public
声明在,过程内 模块的通用声明段
本模块其
他过程,不能用 能用
其他模块,不能用 能用,但要加 窗体名, 能用
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
过程的作用域
?模块级:用 Private关键字声明
?全局级:用 Public关键字声明
?在标准模块内声明:可以直接调用
?在窗体模块内声明:需要在过程名前面指定
对象(窗体)名。
?静态( Static):该过程内所有过程级变量
均为静态变量。
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
鼠标事件
? Click 单击
? DblClick 双击
? MouseDown 按下
? MouseUp 放开
? MouseMove 移动
? DragDrop 拖放
? DragOver 拖过
有关问题
同时发生时的先后次序
事件过程中的参数
Button 区分左右键
Shift 键盘配合
X,Y 指针位置
有关属性
有关方法

?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
MouseDown和 MouseUp事件
? Button参数,由按下的鼠标键决定:
1-左键,2-右键,4-中键
? Shift参数,由先按下的键盘键决定:
1- <Shift>键
2- <Ctrl>键
4- <Alt> 键
先按下多键时,数值相加
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
与鼠标有关的属性
? MousePointer 指针形状
? MouseIcon 自定义指针形状
当 MousePointer= 99时的指针形状
? DragMode
?0-手工,1-自动
?自动:可以拖动,此时 Click事件和
MouseDown事件失效
?手工:需编程 (用 Drag方法 )才能拖动
?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
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结束

?■
Vi
su
al
BA
SI
C




万 博 科 技 职 业 学 院
Wanbo Inst,Of Since & Tech.
DragOver事件
?在拖动越过一对象时发生
?参数:
Source As Control,X As Single,Y As Single
Source 被拖动对象
X,Y 放下时的 X,Y坐标
State 0-进入时,1-退出时,2-在其中