Sub过程
visual Basic 程序是由过程组成的,除了定义常量和变量外,全部工作就是编写工作,过程可以看作是编写程序的功能模块。
使用过程就 ------- 是扩充功能以适应某种需要
我们已经使用过很多次事件过程了,当发生某个事件,对该事件作出响应的程序段,这种事件构成了vb的主体。
多个事件可能需要使用到相同的 程序代码,所以我们可以把这段代码独立出来,作为一个过程,这样的过程就叫做,“通用过程”,他可以单独建立,供事件过程其他过程调用。
定义sub过程
private Sub Subtest
PRINT "this is a sub procedure"
End Sub
- Sub过程 sub开头,end sub 结束,sub 和 end sub 之间是描述 过程操作的语句块, 叫做过程体
- Static 指定局部变量在内存的存储方式,使用Static 过程中的所有变量都是Static 型的,每次调用局部变量保持不变,没有的化,每次调用,局部变量初始为-
- Private public private 只能被本模块的其他过程访问,public 可以在程序任意部分调用他。窗体层定义的通用过程一般在本窗体访问,如果在别的地方访问要加上啊窗体名作为前缀
- 参数列表 byval 说明参数是传值
- 不可嵌套
sub tryout(x as integer,ByVal y As Integer)
x = x + 100
y = y * 6
End Sub
调用sub过程
- 使用 call 来调用sub 过程
Call TryOut(a,b) - 过程名作为语句来使用
Tryout a,bStatic Sub DelayLoop(DelayTime) Const SecondsInDay = 24& * 60& * 60& LoopFinish = TImer + DelayTime if LoopFinish > SecondsInDay Then LoopFinish = LoopFinish - SecondsInDay Do while Timer > LoopFinish Loop End if Do While Timer > LoopFinish Loop
DelayLoop 5
Call DelayLoop(5)
```
通用过程与事件过程
事件过程也是Sub 过程,他是附加在窗口和空间上的,窗体的事件过程不可以由用户决定,只能由系统指定,
模块名. 过程名
如果不同的模块有先相同的过程名
Function 过程
Sub 过程不直接返回值,可以作为独立的基本语句调用。
例子
Function BinarySearch(Lower,Upper As Integer) As Boolean
if lower = Upper Then
BinarySearch = True
Exit Function
Else
BinarySearch = Flase
End if
End function
说明
- 该例子 有两个参数,返回值是Boolean
- Function 以function 开头 End Function 结尾, 中间的是语句块, 比sub不同的是 Function 有返回值,
- Sub过程相当于执行一个语句,调用function过程需要放回一个值,我们可以像内部函数一样在表达式中使用,过程名= 表达式 来把值赋给function 没有 这个 “BinarySearch = Flase 的话 ” 系统会默认返回
例子 9.3 编写一个最大公约数的函数过程
Function gcd(ByVal x As Integer,ByVal y As Integer)As Integer
Do While y<>0
reminder = x Mod y
x = y
y = reminder
Loop
gcd = x
调用Function过程
使用visual Basic 内部函数一样来调用Function 过程。
比如我们可以这样调用前面编写的 gcd
Sub Form_Click()
Dim a As Integer, b As Integer
a = 96: b = 64
x = gcd(a,b)
Print "G.C.D =";x
END Sub
x = gcd(a,b)就是调用gcd 函数的语句
9.4
窗体模块 可以定义和编写子程序过程,函数过程,事件过程。
标准模块只能定义程序过程和函数过程
参数传递
调用一个过程,必须把实际参数传送给过程,完成形式参数和实际参数的结合。 我们实际上使用实际参数来执行调用的过程
形式参数就是参数
实际参数叫做自变量,也叫实参
- 形参和实际参数
a. 按位置传送 也就是 实际参数必须和形式参数匹配,也就是位置次序必须一致。
Sub TestSub(p1 As Integer,p2 As Single,p3 As String)
p1 p2 p3 就是形式参数
调用
Call TestSub(A%,B!,“Test”)
顺序类型必须相同 - 指名传送
“‘:= ”
Sub add_num(firstvar As Integer,second As Integer,thirdvar As Integer)
c = (firstvar + secondvar) * thirdvar
Print c
End Sub
add_num 4,6,8 这就是按位置结合的方式
add_num firstvar:=4,secondvar:=6,thirdvar:=8
这样就是指名传送
我们也就可以不按顺序了
引用
Sub Tryout(x As Integer,y As Integer)
x = x + 100
y = y * 6
Print "x = ";x,"y = " ,y
End Sub
Sub Form_Click()
Dim a As Integer,b As Integer
a = 10 : b =20
tryout a, b
Print "a = "; a,"b=";b
End Sub
我们发现一个 x = 110 y = 120
a = 110 b = 120
这种参数传送方式就是 传地址(引用) , 通过引用我们可以改变传送给过程的变量的值
原因求解:
变量的值是放在内存中的某个地址的,通过引用来调用一个过程,我们向该过程传送变量,实际上是把变量的地址传送给了该过程,也可以说是把引用传递给了该过程
我们实验一下副作用
Funciton Fun(x As Integer,y As Integer)As Integer
x = x + y
if x<>0 Then
Fun = x
Else
Fun = y
End if
End funciton
Private Sub Command1_Click()
Dim a As Integer, b As Integer
a = 2
b = 3
Text1.Text = Fun(a,b)
Text1.Text = Fun(a,b)
Text3.Text = Fun(a,b)
End Sub
TEXT1.TEXT = 5
TEXT2.TEXT = 8
TEXT3.TEXT = 11
传值
Function power(x As SIngle,ByVal y As Integer)
Dim result As Single
result = 1
Do While y > 0
result = result * x
y = y - 1
Loop
power = result
End Function
Sub Form_Click()
For i = 1 To 5
r = power(5,i)
Print r
Next i
End Sub
很明显,当调用要对形式参数进行改变的时候,而内部又有对形式参数改变的逻辑时,我们必须通过,ByVal 传值来解决。
Sub函数 不能通过过程名放回值,但是我们可以返回多个值
Sub S(ByVal x As Integer,ByVal y As Integer,m As Integer,n As Integer)
m = x+ y
n = x * y
End Sub
DIm Sum As Integer , Mul As Integer
S 20,30,Sum,Mul
Print Sum,Mul
数组的参数传送
viusal Basic 允许把数组作为实际参数传送到过程中。例如,
Sub S(a(),b())
End Sub
该过程有两个形参,都是数组。
我们可以用
Call S(p(),q())
来调用该过程
当使用数组作为参数的时候,使用“传地址的方式” 而不是传值的方式,我们是直接将
p()数组的地址传给a()的。 a()数组和p()数组拥有了 相同的起始地址。
我们就有了一个特点:
形参数组中的各元素的改变将会被带会实参
Private Function FindMax(a()As Integer)
Dim Start As Integer,Finish As Integer, i As Integer
Start = LBound(a)
Finish = UBound(a)
For i = start To Finish
if a(i)>Max Then Max = a(i)
Next i
FindMax = Max
End Function
可选参数 与 可变参数
灵活而又安全的参数传送方式,允许使用可选参数和可变参数,在调用一个过程的时候,可以向过程传送任意数量的参数,或者可选参数
可选参数 : Optional 关键字,IsMissing 函数中测试调用时是否可以传送可选参数
Optinal 指定的参数是Variant Ismissing 返回 boolean 变量
可变参数
ParamArray
Sub 过程名 (ParamArray 数组名)
例如
对象参数、
我们一般使用 变量 作为 形式参数
vb允许对象,窗体,控件作为通用过程的参数,这可以提高效率。
对象只能通过传地址方式调用
局部内存分配
局部变量会在过程结束的时候清楚这些变量,
如果设置了Static就不会