[第 6章 过程、模块与类 ]
6.1 VB的过程
6.2 VB的代码模块
6.3 VB的标准模块
6.4 VB的类
6.1 VB的过程
? Sub ( 子程序)过程
? Function( 函数) 过程
? Property ( 属性)过程
?三种过程
What are the differences?
1,子过程( Sub)
? 作用域不同 ([Private | Public | Friend])
? 生命期不同 ([Static])
子过程的语法是:
[Pr iva te | Publ ic | Fri en d] [ Sta ti c] Sub nam e [( ar glist) ]
[ st at em ent s]
[Exit S ub]
[ st at em ent s]
End S u b
[Optional] [ByVal | ByRef] [ParamArray]
varname[( )] [As type] [= defaultvalue]
其中的 arglist 参数的语法,
Notice:
Sub 过程可以是递归的 (后面会告诉你 )
Sub 过程不能出现在等号的右侧
Exit Sub 语句任何位置都可以有
For example
*我们创建这样一个应用程序,它包含一个按钮,当用户在
窗体上单击时,计算机的喇叭会发出 3声“嘟”的声音 ;如果
用户在按钮上单击,喇叭响五下,
我们定义一个控制计算机操作的过程,命名为 BeepSound,
喇叭的次数作为参数有调入者传入,参数命名为 n.
过程 BeepSound如下,
Sub BeepSound(n As Interger)
Dim i As Interger,j As Long
For i= 1 to n
Beep
For j= 0 to 1000000
Next
Next
End Sub
我们可以用 Call BeepSound(5) 或 BeepSound 5 调用 BeepSound,
所以我们可以在窗体 Form1和按钮 Command1的 Click事件过程
中调用 BeepSound过程 (如下,)
Private Sub Command1_click( )
Call BeepSound(5)
End Sub
Private Sub Form_Click()
BeepSound 3
End Sub
我们可以通过此图来了解这一操作,
事件过程
Command1_Click
事件过程
Form_Click
通用过程
BeepSound
调用
返回
调用
返回
由上可知,子过程分为两种,通用过程 和 事件过程
一点补充,(课本 P164)
可以使用 Option Explicit 语句来强制显式定义变量。
为了更清楚地说明这个问题,我们运行下例,
'Option Explicit
Public X As Single
Private Sub Form_Load()
‘Dim X As Integer ’如果注释掉有什么效果?
X = X + 0.1
Debug.Print "X="; X
Debug.Print TypeName(X)
End Sub
建议使用 Option Explicit 语句来强制显式定义变量
2,函数过程
Visual Basic 包含内置的或内部的函数,如 Sqr,Cos 或
Chr。 此外,还可用 Function 语句编写自己的 Function 过程。
函数过程的语法是:
[Public | Private | Friend] [Static] Function name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
? 作用域不同 ([Private | Public | Friend])
? 生命期不同 ([Static])
? 但是 arglist语法较简单:可选的。代表在调用时要传递给
Function 过程的参数变量列表。多个变量应用逗号隔开。
一点注意,若 Function 过程会改变某个数学表达式中变
量的值,则应避免在此表达式中使用该函数。例如:
I=2
J=3
X=(Sum (I,J)+1)/Sum(I,J)
Function Sum (A As Integer,B As Integer) As String
A=A+2
Sum=A+B
End Function
结果如何? 怎么修改?
3,属性过程
可以对类模块添加和操作属性的过程称属性过程。
以 Property Let,Property Get,或 Property Set 语句
开始,而以 End Property 语句退出。
Visual Basic 提供下面所列的三种属性过程:
Property Get 返回属性的值。
Property Let 设置属性的值。
Property Set 设置对象属性的值(即该属性含有对象引用)。
一个特殊的子过程 Sub Main过程,
这个过程必须是一个子过程,且不能在窗体模块内,只能在
标准模块内建立。
?过程的创建与调用
1,创建新过程
要创建新的通用过程,可以通过二种方法:
⑴ 在, 代码, 窗口输入过程头并按下回车键 。 过程头以
Sub 或 Function 打头, 再接一个名字 。 例如,
Sub UpdateForm ()
Function GetCoord ()
⑵ 最常用的还是 通过, 添加过程, 菜单完成新过程的创
建 。 2,编辑, 修改现有过程
3,调用过程
⑴ 调用 Sub 过程
⑵ 调用函数过程
4,调用其它模块过程
下面分别对被调用过程在窗体模块、类模块和标准模块三种
情况说明,
① 窗体中的过程
② 类模块中的过程
③ 标准模块中的过程
一个很好的例子, 交通信号灯控制的例子
一个重要的思想 (递归 )
? 递归就是一个过程调用自己来完成某个特定的
任务。在递归过程中,一个过程的某一步要用
到其自身的上一步或几步的结果。递归分为两
种类型:直接递归和间接递归。 Visual Basic的
过程具有递归调用功能。
? 递归可能会导致堆栈上溢。通常 Static 关键字
和递归过程不在一起使用。使用递归过程要特
别小心,不加控制的递归通常会引起溢出堆栈
空间错误信息。如下例,
例,监视调用堆栈及递归调用次数。
Option Explicit
Sub Main()
Static intX As Integer
intX = intX + 1
Debug.Print intX
Main
End Sub
Private Sub Form_Click()
Main
End Sub
结果是什么?
例 6-3:编写程序计算 N的阶乘。( N=0~12)
由数学定义,0的阶乘为 1,正数 N的阶乘为:
N!=N*(N-1)*(N-2)*……*2*1
源程序为:
Option Explicit
Private Sub Form_Load()
Dim N As Long
Dim Msg As String
Dim L As Long
Do
N = Val(InputBox("Enter a number from 0 to 12 (or -1 to end)"))
If N >= 0 And N <= 12 Then
L = Factorial(N)
Msg = Str$(N) & " Factorial is " & Str$(L)
MsgBox Msg
End If
Msg = ""
Loop While N >= 0
End Sub
Public Function Factorial(N As Long) as Long
If N >0 Then
Factorial = N * Factorial(N - 1)
Else
Factorial = 1
End If
End Function
可以用递归算法解决的问题一般必须具备下列两个条件:
可以将原问题转化为较低级别的同样的问题
存在边界条件,即经过若干次递推后能够找到一个已知结果。
?如何向过程传递参数
*什么是参数的数据类型
过程中的代码通常需要某些关于程序状态的信息才能完成它的
工作。信息包括在调用过程时传递到过程内的变量。当将变量
传递到过程时,称变量为参数。
参数的传递方式有一下几种,
1.按数值传递参数
按值传递参数时,传递的只是变量的副本。如果过程改变了这
个值,则所作变动只影响副本而不会影响变量本身。
例如:
Sub PostAccounts (ByVal intAcctNum as Integer)
,'这里放语句。
End Sub
2.按地址传递参数
按地址传递参数使过程用变量的内存地址去访问实际变量
的内容。结果,将变量传递给过程时,通过过程可永远改
变变量值。按地址传递参数在 Visual Basic 中是缺省的。
例如:
Sub PostAccounts (intAcctNum as Integer)
,'这里放语句。
End Sub
3.使用可选的参数
4.提供可选参数的缺省值
5.使用不定数量的参数
什么时候应用值传递和什么时候应用地址
传递
6.2 VB的代码模块
VB 的代码存储在模块中。模块有三种类型:窗体、标准和类。
每个标准模块、类模块和窗体模块都可包含:
声明:可将常数、类型、变量和动态链接库 (DLL) 过程的声明
放在窗体、类或标准模块的模块级。声明通常放在模块的开头
部分。
过程,Sub,Function 或者 Property 过程包含可以作为单元来执
行的代码片段。
⑴ 窗体模块 (什么情况 )
⑵ 标准模块 (什么情况 )
⑶ 类模块
6.3 VB的标准模块
在标准模块中,一般只包含过程、类型以及数据的声明和定
义。模块级别声明和定义都被默认为 Public。 标准模块不属
于任何窗体,但可以指定窗体的内容,可以在标准模块中建
立新的窗体,然后在窗体模块中对窗体进行处理。
6.4 VB的类
类是支持面向对象思想的重要概念,它是实现数据隐蔽和封装
的基本单元,是实现面向对象其他特性的基础,类模块用于建立
用户定制类。类模块看起来几乎和普通的标准模块一模一样,
用户也可以在其中编制代码,完成几乎完全一样的功能。但
其实又很大区别,
6.1 VB的过程
6.2 VB的代码模块
6.3 VB的标准模块
6.4 VB的类
6.1 VB的过程
? Sub ( 子程序)过程
? Function( 函数) 过程
? Property ( 属性)过程
?三种过程
What are the differences?
1,子过程( Sub)
? 作用域不同 ([Private | Public | Friend])
? 生命期不同 ([Static])
子过程的语法是:
[Pr iva te | Publ ic | Fri en d] [ Sta ti c] Sub nam e [( ar glist) ]
[ st at em ent s]
[Exit S ub]
[ st at em ent s]
End S u b
[Optional] [ByVal | ByRef] [ParamArray]
varname[( )] [As type] [= defaultvalue]
其中的 arglist 参数的语法,
Notice:
Sub 过程可以是递归的 (后面会告诉你 )
Sub 过程不能出现在等号的右侧
Exit Sub 语句任何位置都可以有
For example
*我们创建这样一个应用程序,它包含一个按钮,当用户在
窗体上单击时,计算机的喇叭会发出 3声“嘟”的声音 ;如果
用户在按钮上单击,喇叭响五下,
我们定义一个控制计算机操作的过程,命名为 BeepSound,
喇叭的次数作为参数有调入者传入,参数命名为 n.
过程 BeepSound如下,
Sub BeepSound(n As Interger)
Dim i As Interger,j As Long
For i= 1 to n
Beep
For j= 0 to 1000000
Next
Next
End Sub
我们可以用 Call BeepSound(5) 或 BeepSound 5 调用 BeepSound,
所以我们可以在窗体 Form1和按钮 Command1的 Click事件过程
中调用 BeepSound过程 (如下,)
Private Sub Command1_click( )
Call BeepSound(5)
End Sub
Private Sub Form_Click()
BeepSound 3
End Sub
我们可以通过此图来了解这一操作,
事件过程
Command1_Click
事件过程
Form_Click
通用过程
BeepSound
调用
返回
调用
返回
由上可知,子过程分为两种,通用过程 和 事件过程
一点补充,(课本 P164)
可以使用 Option Explicit 语句来强制显式定义变量。
为了更清楚地说明这个问题,我们运行下例,
'Option Explicit
Public X As Single
Private Sub Form_Load()
‘Dim X As Integer ’如果注释掉有什么效果?
X = X + 0.1
Debug.Print "X="; X
Debug.Print TypeName(X)
End Sub
建议使用 Option Explicit 语句来强制显式定义变量
2,函数过程
Visual Basic 包含内置的或内部的函数,如 Sqr,Cos 或
Chr。 此外,还可用 Function 语句编写自己的 Function 过程。
函数过程的语法是:
[Public | Private | Friend] [Static] Function name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
? 作用域不同 ([Private | Public | Friend])
? 生命期不同 ([Static])
? 但是 arglist语法较简单:可选的。代表在调用时要传递给
Function 过程的参数变量列表。多个变量应用逗号隔开。
一点注意,若 Function 过程会改变某个数学表达式中变
量的值,则应避免在此表达式中使用该函数。例如:
I=2
J=3
X=(Sum (I,J)+1)/Sum(I,J)
Function Sum (A As Integer,B As Integer) As String
A=A+2
Sum=A+B
End Function
结果如何? 怎么修改?
3,属性过程
可以对类模块添加和操作属性的过程称属性过程。
以 Property Let,Property Get,或 Property Set 语句
开始,而以 End Property 语句退出。
Visual Basic 提供下面所列的三种属性过程:
Property Get 返回属性的值。
Property Let 设置属性的值。
Property Set 设置对象属性的值(即该属性含有对象引用)。
一个特殊的子过程 Sub Main过程,
这个过程必须是一个子过程,且不能在窗体模块内,只能在
标准模块内建立。
?过程的创建与调用
1,创建新过程
要创建新的通用过程,可以通过二种方法:
⑴ 在, 代码, 窗口输入过程头并按下回车键 。 过程头以
Sub 或 Function 打头, 再接一个名字 。 例如,
Sub UpdateForm ()
Function GetCoord ()
⑵ 最常用的还是 通过, 添加过程, 菜单完成新过程的创
建 。 2,编辑, 修改现有过程
3,调用过程
⑴ 调用 Sub 过程
⑵ 调用函数过程
4,调用其它模块过程
下面分别对被调用过程在窗体模块、类模块和标准模块三种
情况说明,
① 窗体中的过程
② 类模块中的过程
③ 标准模块中的过程
一个很好的例子, 交通信号灯控制的例子
一个重要的思想 (递归 )
? 递归就是一个过程调用自己来完成某个特定的
任务。在递归过程中,一个过程的某一步要用
到其自身的上一步或几步的结果。递归分为两
种类型:直接递归和间接递归。 Visual Basic的
过程具有递归调用功能。
? 递归可能会导致堆栈上溢。通常 Static 关键字
和递归过程不在一起使用。使用递归过程要特
别小心,不加控制的递归通常会引起溢出堆栈
空间错误信息。如下例,
例,监视调用堆栈及递归调用次数。
Option Explicit
Sub Main()
Static intX As Integer
intX = intX + 1
Debug.Print intX
Main
End Sub
Private Sub Form_Click()
Main
End Sub
结果是什么?
例 6-3:编写程序计算 N的阶乘。( N=0~12)
由数学定义,0的阶乘为 1,正数 N的阶乘为:
N!=N*(N-1)*(N-2)*……*2*1
源程序为:
Option Explicit
Private Sub Form_Load()
Dim N As Long
Dim Msg As String
Dim L As Long
Do
N = Val(InputBox("Enter a number from 0 to 12 (or -1 to end)"))
If N >= 0 And N <= 12 Then
L = Factorial(N)
Msg = Str$(N) & " Factorial is " & Str$(L)
MsgBox Msg
End If
Msg = ""
Loop While N >= 0
End Sub
Public Function Factorial(N As Long) as Long
If N >0 Then
Factorial = N * Factorial(N - 1)
Else
Factorial = 1
End If
End Function
可以用递归算法解决的问题一般必须具备下列两个条件:
可以将原问题转化为较低级别的同样的问题
存在边界条件,即经过若干次递推后能够找到一个已知结果。
?如何向过程传递参数
*什么是参数的数据类型
过程中的代码通常需要某些关于程序状态的信息才能完成它的
工作。信息包括在调用过程时传递到过程内的变量。当将变量
传递到过程时,称变量为参数。
参数的传递方式有一下几种,
1.按数值传递参数
按值传递参数时,传递的只是变量的副本。如果过程改变了这
个值,则所作变动只影响副本而不会影响变量本身。
例如:
Sub PostAccounts (ByVal intAcctNum as Integer)
,'这里放语句。
End Sub
2.按地址传递参数
按地址传递参数使过程用变量的内存地址去访问实际变量
的内容。结果,将变量传递给过程时,通过过程可永远改
变变量值。按地址传递参数在 Visual Basic 中是缺省的。
例如:
Sub PostAccounts (intAcctNum as Integer)
,'这里放语句。
End Sub
3.使用可选的参数
4.提供可选参数的缺省值
5.使用不定数量的参数
什么时候应用值传递和什么时候应用地址
传递
6.2 VB的代码模块
VB 的代码存储在模块中。模块有三种类型:窗体、标准和类。
每个标准模块、类模块和窗体模块都可包含:
声明:可将常数、类型、变量和动态链接库 (DLL) 过程的声明
放在窗体、类或标准模块的模块级。声明通常放在模块的开头
部分。
过程,Sub,Function 或者 Property 过程包含可以作为单元来执
行的代码片段。
⑴ 窗体模块 (什么情况 )
⑵ 标准模块 (什么情况 )
⑶ 类模块
6.3 VB的标准模块
在标准模块中,一般只包含过程、类型以及数据的声明和定
义。模块级别声明和定义都被默认为 Public。 标准模块不属
于任何窗体,但可以指定窗体的内容,可以在标准模块中建
立新的窗体,然后在窗体模块中对窗体进行处理。
6.4 VB的类
类是支持面向对象思想的重要概念,它是实现数据隐蔽和封装
的基本单元,是实现面向对象其他特性的基础,类模块用于建立
用户定制类。类模块看起来几乎和普通的标准模块一模一样,
用户也可以在其中编制代码,完成几乎完全一样的功能。但
其实又很大区别,