若一个工程包含多个标准模块,且其中过程名不惟一,在调用时为了区分不同的过程,应在过程名前加标准模块名。下面将模块级过程和全局级过程在定义方式、调用方式等方面的不同进行总结,如表6-1所示。
表6-1 过程的作用域
过程作用域 定义方式 能否被本模块的其他过程调用 能够被本应用程序的其他模块调用
模块级(私有)
窗体模块
标准模块
全局级(公用)
窗体模块
标准模块
子过程名前加Private 子过程名前加Public
能 能 能
能,但必须在过程名前加窗体名
能
能,但过程名必须唯一,否则要加标准模块名
不能 不能
6.4.2 变量的作用域
变量的作用域可分为过程级、模块级和全局级。过程级和模块级常被称为私有级变量,而全局级也常被称为公有级变量。 1.过程级变量
过程级变量的作用范围限制在声明它的过程内部,只有该过程内部的代码才能访问或改变变量的值。该类变量通常用来存储过程中的临时数据,在过程内部使用Dim或Static关键字来声明变量。例如:
Dim a As integer,b As Single Static a As String
如果在过程中未说明而直接使用了某个变量,则该变量被默认为局部于该过程的过程级变量。
用Static声明的变量称为静态变量,该类变量在过程执行结束后一直存在,直到窗体关闭。而用Dim声明的变量只在过程执行时存在,退出过程后这类变量就会消失。请看下面的代码段:
Private Sub Form_Click() Dim i As Integer i = i + 1 Print i End Sub
每次单击窗体,窗体上均显示相同的数“1”。这是因为,过程每次运行时,为变量i分配存储空间,过程运行结束后,变量i所占用的存储空间被释放,再次运行时变量i重新被分配内存空间。
再看下面的代码段:
Private Sub Form_Click() Static i As Integer i = i + 1 Print i End Sub
每单击一次窗体,过程变量i累加1次,第n次运行i的值为“n”。原因是用Static定义的变量为静态变量,过程第一次运行时,为变量i分配存储空间,运行结束后,i所占用
-149-
的存储空间被保护起来,其值也被保留下来,再次运行时,变量i 还使用原来的存储空间,其值也是上一次保留下来的值,所以之后的运算也就是在上一次值的基础上进行的。 2.窗体(模块)级变量
窗体(模块)级变量的作用域限制在声明它的窗体(模块)中,该窗体(模块)中的所有过程均可访问该变量,其它窗体(模块)则不能。该类变量在窗体(模块)的通用段中用Private或Dim关键字声明。
例6-8 窗体级变量的作用范围示例(结果如图6-3所示)。
Dim a As Integer, b As Integer, c As Integer Sub prod() c = a * b
Print \子程序\End Sub
图6-3 窗体级变量作用范围
Sub sum() c = a + b
Print \子程序\End Sub
Private Sub Form_Click() a = 5: b = 3
Print Tab(16); \ Print \调用prod前\ Call prod
Print \调用prod后\
Print Tab(16); \ Print \调用sum前\ Call sum
Print \调用sum后\ Call sum End Sub
3.全局级变量
全局级变量在所有模块的所有过程都能访问,它的作用范围是整个应用程序,该类变量在模块的通用段中使用Public关键字声明。
例6-9 变量的作用范围综合示例(结果如图6-4所示)。
Public tt As Integer ' 声名全局变量tt
-150-
Private Sub test1()
tt = tt + 10 ' 全局变量tt Print tt ' 显示110 End Sub
Private Sub test2()
Dim tt As Integer ' 声名局部变量tt
tt = tt + 20 ' 局部变量tt,本过程无法访问全局变量tt Print tt ' 显示20 End Sub
Private Sub Form_Click()
tt = 100 ' 全局变量tt Print tt ' 显示100 Call test1
Print tt ' 显示110 Call test2 图6-4 变量作用范围示例 Print tt ' 显示110 End Sub
从运行结果可出看出:当变量名相同而作用域不同时,将优先访问作用域小的变量。 在定义变量时应将变量声明为哪一个级别呢?这主要取决于变量要在什么范围内使用。 (1) 如果变量只在某一个过程中使用,它的运算结果也不被其它过程再次使用,则可以声明为过程级变量。如本书中的大部分例题,采用的都是这种级别的变量。
(2) 如果变量将在同一窗体的多个过程中被用到,且彼此之间还有相互关系,则可以声明为窗体(模块)级变量。
(3) 如果变量将在多个窗体被用到,且彼此之间还有相互关系,则可以声明为全局变量。 建议除非必需,尽量使用作用域小的变量,因为大型程序的开发一般由多人合作完成,分工编写不同的模块。变量的局部化使合作者不必担心各模块中使用的变量是否同名而相互影响。
下面将不同作用域变量之间的区别总结如表6-2所示。
表6-2 变量的作用域
变量作用域 局部变量 模块级变量 全局变量
声明方式 Dim或Static
声明位置 在过程中
被本模块访问 不能 能 能
被其他模块访问 不能 不能
能,如果是在窗体模块中定义,调用时必须加上声明窗体对象的名称
Dim或Private 模块的通用声明段 Public
模块的通用声明段
6.5 应用举例
例6-10 编程对键盘上输入的任意个数排序。
分析:排序算法在第5章已经介绍过,这里回顾一下算法过程。 (1) 定义数组;
(2) 为数组元素赋值;
(3) 输出排序前的数组元素值;
(4) 选择一种排序算法对数组各元素排序;
-151-
(5) 输出排序后的数组元素值; (6) 结束。
在这个算法中输出数组元素值的程序段被执行了两次,不需要返回值,可以将其写成一个Sub过程。排序是对数组中元素进行了重新排列,因为数组是传地址的,在过程中对形参数组排好序实际上会直接反映在实参中,没有其它结果需要返回,所以也用Sub过程
在窗体上添加1个文本框,用于输入待排序的数据,数据之间用逗号分隔,1个图片框用于显示排序前的数组及排序后的数组,1个Option1控件数组,元素分别为Option1(0)、Option1(1),用于选择是按升序还是降序排序,它们被置于框架Frame1中,窗体界面如图6-5所示,各控件属性设置放在Form_Load事件中,排序代码放在Option1控件数组的DblClick事件中,程序运行结果如图6-6所示。
代码如下:
'输出一维数组的过程,因为过程不需要返回值,所以定义为Sub过程 Sub parray(x$()) '因为数组是通过split函数赋值的,数组必须是字符型 Dim i%
For i = LBound(x) To UBound(x) Picture1.Print x(i); \ Next i
Picture1.Print End Sub
图6-5 窗体界面 图6-6 程序运行结果
Sub sort(y$(), Byval p%)
'排序过程,参数P用于判断是升序还是降序 Dim i%, j%, k%, t%
For i = LBound(y) To UBound(y) - 1 k = i
For j = i + 1 To UBound(y) If p = 0 Then
If Val(y(k)) > Val(y(j)) Then k = j Else
If Val(y(k)) < Val(y(j)) Then k = j End If
-152-
Next j
t = y(k): y(k) = y(i): y(i) = t Next i End Sub
Private Sub Form_Load() '设置控件属性 Text1 = \
Frame1.Caption = \排序选择\ Option1(0).Caption = \升序\ Option1(0).Value = True Option1(1).Caption = \降序\End Sub
Private Sub Option1_DblClick(Index As Integer)
'对Option1控件数组的双击事件编程,由Index来决定是升序还是降序 Dim a() As String
a = Split(Text1.Text, \
Picture1.Print \排序前的数据:\
Call parray(a()) '调用一维数组输出过程 Call sort(a(), Index) '调用排序过程 Picture1.Print Option1(Index).Caption & \排序后的数据:\ Call parray(a()) End Sub
本例中定义了两个Sub过程,一个用于输出一维数组,一个用于排序,前者有一个数组参数,后者除了一个数组参数外,还有一个决定升降序的参数。
例6-11 判断一个整数是否是回文数。所谓回文数是这样的数,将这个数从左向右读和从右向左读值相等。如121就是回文数,345就不是回文数。
分析:判断回文数可以有很多方法,由于VB中可以自动进行数值与数字字符串的类型互换,所以这里可以将输入的数当成字符串来处理。
Function hw(ByVal x As String) As Boolean '只需判断是与非,因此定义为布尔型 Dim n%, i% n = Len(x)
For i = 1 To n \\ 2
If Mid(x, i, 1) <> Mid(x, n - i + 1, 1) Then hw = False Exit Function End If Next i hw = True End Function
Private Sub Command1_Click() Dim x$
x = InputBox(\请输入一个整数\ If hw(x) Then
MsgBox x & \是回文数\
-153-
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第06章 模块化程序设计(3)在线全文阅读。
相关推荐: