两种调用方式示意图如图5-8所示。
ByVal传值 a 传址 b 10 20 10 b的地址 x y 实参 形参
图5-8 两种参数传递方式示意图
Visual Basic允许参数是数组。当用数组作为参数时,使用的是传址方式,而不是传值方式,即将实参数组的地址传给被调用过程的形参数组。
在传递数组时还要注意以下:
1.在实参列表和形参列表中写数组名,忽略维数的定义,但圆括号不能省。
2.被调过程可通过Lbound和Ubound函数确定实参数组的下界和上界。
Lbound和Ubound函数的形式如下:
{L|U}bound (数组名[,维数])
其中:维数指明要测试的是第几维的下标值,缺省是一维数组。
例5-4 求数组元素的和。
设计步骤如下:
(1)设计程序界面和设置对象属性,如图5-9所示。


图5-9 数组求和
(2)编写代码。
Public Function sum (p())
Dim m%, n%
For m = LBound (p, 1) To UBound (p, 1)
For n = LBoun d(p, 2) To UBound (p, 2)
sum = sum + p (m, n)
Next n,m
End Function
Private Sub Command1_Click()
Dim s(), a%, b%, k%, sums%
Cls
a = CInt (Text1.Text):b = CInt (Text2.Text)
ReDim s(1 To a, 1 To b)
For i = 1 To a
For j = 1 To b
s(i, j) = Int(90 * Rnd + 10)
Print s(i, j);
Next j
Next i
sums = sum (s ())
Print "sums="; sums
End Sub
程序运行结果如图5-9所示。
例5-5 利用顺序查找法找出数组中的某个数。
设计如图5-10所示的程序运行界面。在窗体中添加一个图片框和两个命令按钮:Command1(Name属性为“CmdCrea”,Caption属性为“产生随机数”),Command2(Name属性为“CmdFind”,Caption属性为“查找数据”)。按下“产生随机数”按钮时,在图片框中显示产生的随机数,按下“查找数据”执行数据查找功能,执行结果如图5-11所示。
图5-10 查找数据运行界面1



图5-11 查找数据运行界面2
程序代码为:
Dim a()
Public Sub search (p (), ByVal keyword, record As Integer)
Dim x As Integer
record = -1
For x = LBound (p) To UBound (p)
If p(x) = keyword Then
record = x:
Exit For
End If
Next
End Sub
Private Sub CmdCrea_Click()
Dim i As Integer
ReDim a(1 To 50)
For i = 1 To 50
a(i) = Int(Rnd * 90 + 10)
If i Mod 10 = 0 Then
Picture1.Print a(i)
Else
Picture1.Print a(i);
End If
Next i
End Sub
Private Sub CmdFind_Click()
Dim myrecord As Integer
myword = Val(InputBox("请输入要查找的关键字"))
Call search(a, myword, myrecord)
If myrecord = -1 Then
MsgBox "没有要查找的关键字", vbInformation + vbOKOnly, "查询结果"
Else
MsgBox "关键字位置为" & myrecord, vbInformation + vbOKOnly, "查询结果"
End If
End Sub
Visual Basic应用程序由若干过程组成,这些过程一般保存在窗体文件(.Frm)或标准模块文件(.Bas)中。变量在过程中是必不可少的。一个变量、过程随所处的位置不同,可被访问的范围不同,变量、过程可被访问的范围称为变量、过程的作用域。
一般Visual Basic的应用程序组成可用图5-12描述。
应用程序 (.vbp) 至少一个或若干个窗体模块(.Frm)文件 一个或若干个标准模块(.Bas)文件或没有 一个或若干个类模块(.Cls)文件或没有 事件过程(Sub) 自定义子过程(Sub) 自定义函数过程(Function) 自定义子过程(Sub) 自定义函数过程(Function) 自定义属性过程( Property) 自定义方法过程(Sub或Function) 自定义事件过程(Event)
图5-12 Visual Basic应用程序组成
本章只讨论窗体和标准模块文件。前面所讲内容只涉及到了窗体模块,与窗体模块不同,标准模块不含窗体和控件的内容,只含有由程序代码组成的一般过程和函数。在工程中添加标准模块的方法为:
选取“工程”菜单中的“添加模块”命令,在弹出的“添加模块”对话框中,单击“打开”按钮,就会打开新建标准模块窗口,然后在代码窗口中添加过程代码。
过程的作用域分为:窗体/模块级和全局级。
1.窗体/模块级
在某个窗体或标准模块中定义的过程前加上Private关键字,则该过程只能被本窗体或本标准模块中的过程调用。
2.全局级
在某个窗体或标准模块中定义的过程前加上Pulbic关键字或缺省,则该过程可以被应用程序的所有窗体或标准模块中的过程调用。其调用方式根据过程所处的位置有如下两种:
(1)在窗体中定义的过程,当外部过程要调用时,应在被调用的过程名前加上所处的窗体名。
(2)在标准模块中定义的过程,如果过程名唯一,则任何外部过程都可以直接调用,否则应在被调用的过程名前加上所处的标准模块名。有关规则如表5-1所示。
表5-1 过程的作用域
|
作用范围 |
模 块 级 |
全 局 级 | ||
|
窗体 |
标准模块 |
窗体 |
标准模块 | |
|
定义方式 |
过程名前加Private 例: Private Sub Sub1(形参表) |
过程名前加Pulbic或缺省 例:Pulbic Sub Sub2(形参表) | ||
|
能否被本模块 其他过程调用 |
能 |
能 |
能 |
能 |
|
能否被本应用程 序其他模块调用 |
不能 |
不能 |
能,但必须在过程名前加窗 体名,例: Call 窗体名. Sub2(实参表) |
能,但过程名必须唯一,否则要 加标准模块名,例: Call 标准模块名. Sub2(实参表) |