VB过程(函数)之间的参数传递

标签:
杂谈 |
分类: QTP/VBS20100524 |
一、
1 形式参数:就是在定义函数或过程的时候命名的参数。通俗讲就是一个记号。
2 实际参数:就是在执行时,调用函数或过程时,传递给函数或过程的参数。通俗讲就是实际值。
3 参数嘛,就是一个可变量,它随着使用者的不同而发生变化。举个例子,在中学的时候学过sin(x)函数,这里的x就是形式参数,当你需要求1的正弦值时,你会使用sin(1),这里的1就是实际参数。
4 形参和实参间的关系:两者是在调用的时候进行结合的,通常实参会将取值传递给形参,形参去之后进行函数过程运算,然后可能将某些值经过参数或函数符号返回给调用者。
在过程之间传递参数,形式参数和实际参数是很重要的概念。我们通常说形式参数是过程为了运行的需要预先在内存中保留的地址单元,而实际参数就是在调用过程时放入这些内存地址中进行处理的数据。如果形式参数是一个盒子,那么实际参数就是盒子里面装的东西。在参数传递的过程中,形式参数和实际参数的数据类型要一致。
二、
函数参数的传递方式有两种,一种是按地址传递,一种是按值传递。
按地址传递:调用函数时,不直接把实参的值“告诉”函数,而是把地址“告诉”它,函数根据这个地址来寻找并处理值,如果函数修改了这个值,也就修改了这个地址对应的值。
按值传递:把值复制一份再给函数,这个值只属于函数,函数对这个值的修改不影响原值。
VBScript
中,要按地址传递可在形参前加 ByRef,要按值传递得在形参前加
1)
如果在声明过程时,形式参数名前面加上关键字“ByVal”,即规定了在调用此过程时该参数是按值传递的。按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所做的改动只影响副本而不会影响变量本身。
代码1
**********************************
Private Sub Command1_Click()
Print
num1
Print
num1
End Sub
Private Sub MySub(ByVal A As Integer)
End Sub
Private Sub MySub2(ByVal A As String)
End Sub
**********************************
如果过程中的形式参数设定为按值传递,就不要求调用时相应实参数的类型必须与其一致,只要实参数的值能够转换为形参的类型即可。
代码2
**********************************
Private Sub Command1_Click()
Print
num1
End Sub
Private Sub MySub2(ByVal A As String)
End Sub
**********************************
2)
按地址传递参数时,过程用变量的内存地址去访问实际变量的内容,将结果的变量传递给过程时,通用过程可永远改变该变量值。ByRef 是 Visual Basic 的缺省选项。
如果指定按地址传递参数的数据类型,就必须将这种类型的值传给参数,即如果过程中的形式参数设定为按地址传递,就必须要求调用时相应实参数的类型必须与其一致。
按地址传递参数时,传递给所调用过程的形参实际是实参的地址。如果过程改变了这个值,则所做的变动也会影响实参变量本身。
代码3
******************************************
Private Sub Command1_Click()
End Sub
Private Sub MySubByRef(ByRef A As Integer)
End Sub
Private Sub MySubByRef2(A As Integer)
End Sub
******************************************
3)
ByVal
传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。
ByRef
传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。
ByVal
可选的。表示该参数按值传递。
ByRef
表示该参数按地址传递。 ByRef
是 Visual Basic
的缺省选项。
ByVal是传递值,源数据不会被修改。你可以把这个值当作自己的局部变量来使用
ByRef是传递地址,源数据可能被修改。你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉。
4)
下面演示了实参变量通过加上一个额外的小括号来强制其以单个变量为实参进行按值传递,在这里默认的byRef已经失效。
代码4
******************************************
Private Sub Command1_Click()
End Sub
Private Sub MySubByRef2 (A As Integer)
End Sub
******************************************************
5)
A.
B.
C.
D.
E.
附图: