(2)编写代码。
Sub triarea (area As Double, x As Double, y As Double, z As Double)
Dim s As Double
s = (x +y + z) / 2
area = Sqr ((s - x) * (s - y) * (s - z) * s)
End Sub
Sub suberr (intyorn As Integer)
intyorn = MsgBox ("请检查数据", vbYesNo + vbInformation, "数据错误")
End Sub
Private Sub Command1_Click()
Dim a As Double, b As Double, c As Double, s As Double
Dim intYesorNo As Integer
a = Val (Text1.Text): b = Val (Text2.Text): c = Val (Text3.Text)
If a + b > c And b + c > a And c + a > b Then
Call triarea (s, a, b, c) ' 使用Call关键字,实参用括号括起来
Picture1.Print " 面积 ="; s
Else
suberr intYesorNo ' 不使用Call关键字,实参不用括号
End If
End Sub
程序运行结果如图5-6所示。
前面介绍了子过程,它不返回值,可以作为独立的基本语句调用。而函数过程要返回一个值,通常出现在表达式中。
Visual Basic包含了许多内部函数,如Sin、Sqr和Date。另外用户可以自己定义函数过程。
函数过程的定义也有以下两种方法。
1.利用代码窗口直接定义
在窗体或标准模块的代码窗口中,把光标定位在已有过程之外,键入Function函数名即可。定义形式如下:
[Static] [Public|Private] Function 函数名 ([形参表]) [As 类型]
[局部变量或常数定义]
[语句序列]
[Exit Function]
[语句序列]
函数名=表达式
End Function
说明:
(1) As 类型指定Function过程返回值的类型。若缺省,则返回Variant。
(2) 无论函数有无参数,函数名后的括号不能省略。
(3) 表达式的值是函数返回的结果。在函数体内至少应该有一条为函数过程名赋值的语句。
(4) Exit Function语句从函数中退出。
Function语法中其他部分的含义与Sub相同。
2.利用“工具”菜单下的“添加过程”命令定义
步骤与定义子过程相似,只是在第3步“类型”组中选取“函数”即可。
通常,调用自定义函数过程的方法与调用Visual Basic内部函数的方法一样,即在表达式中写上它的名称。
调用函数过程的方法有三种:
1.把函数用于赋值语句,表达式中。
2.Call 函数过程名([实参表])
3.函数过程名 实参表
说明:后两种方法都忽略了函数的返回值。
例5-2 将例5-1中两个Sub过程改为Function过程。
程序代码为:
Function triarea (x As Double, y As Double, z As Double) As Double
Dim s As Double, area As Double
s = (x + y + z) / 2
area = Sqr ((s - x) * (s - y) * (s - z) * s)
triarea = area
End Function
Function suberr() As Integer
suberr = MsgBox ("请检查数据", vbYesNo + vbInformation, "数据错误")
End Function
Private Sub Command1_Click()
Dim a As Double, b As Double, c As Double, s As Double
Dim intYesorNo As Integer
a = Val (Text1.Text): b = Val (Text2.Text): c = Val (Text3.Text)
If a + b > c And b + c > a And c + a > b Then
Picture1.Print " 面积 ="; triarea (a, b, c)
else
intYesorNo = suberr() ' 无参数时,括号不能省略
End If
End Sub
定义Sub过程和Function函数过程中的参数称为形式参数(简称形参),在程序中调用Sub过程和Function函数过程时的参数称为实际参数(简称实参)。过程调用的过程,就是实参与形参结合的过程。
在调用过程时,一般主调过程与被调过程之间有数据传递,即将主调过程的实参传递给被调过程,完成实参与形参的结合,然后执行被调过程体。在Visual Basic中,实参与形参的结合有两种方法:传值与传址。其中传址又称为“引用”,是默认的方法。区分二者的方法是在要使用传值的形参前加“ByVal”。
1.传值
传值的结合过程是:当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。被调用过程中的操作是在形参自己的存储单元中进行,当过程调用结束时,这些形参所占用的存储单元也同时被释放。因此在过程中对形参的任何操作不会影响到实参。
2.传址
传址的结合过程是:当调用一个过程时,它将实参的地址传递给形参。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,因此实参的值就会随形参的改变而改变。当参数是字符串、数组时,使用传址传递直接将实参的地址传递给过程,会使程序的效率提高。
在传址调用时,实参必须是变量,常量或表达式无法传址。
例5-3 编写交换两个数的过程,Swap1用传值传递,Swap2用传址传递。
程序代码如下:
Sub Swap1 (ByVal x%, ByVal y%)
t% = x: x = y: y = t
End Sub
Sub Swap2 (x%, y%)
t% = x: x = y: y = t
End Sub
Private Sub Command1_Click()
a% = 10: b% = 20
Print "交换前: "; "A="; a, "B="; b
Swap1 a, b '传值
Print "传值交换后: ";"A="; a, "B="; b
a = 10: b = 20
Swap2 a, b '传地址
Print "传址交换后: ";"A="; a, "B="; b
End Sub
程序运行结果如图5-7所示。