• 沒有找到結果。

变量作用范围

在文檔中 第 2 章 Visual Basic 语言基础 (頁 32-35)

每个变量都有自己的作用域,即变量的作用范围。如果在变量的作用域之外使用该变量,

将产生编译错误。VB 允许在声明变量时指定其有效范围。一般来说,声明变量时,尽量选择 较小的作用域,保持较小的作用域有助于节省内存并减少代码指向非法变量的可能性。

在一个过程内部声明的变量,只有该过程内的代码才能访问或改变其值。若要使变量的 值在同一模块的所有过程中都有效, 甚至在整个应用程序的所有过程都有效, 必须在声明变量 时指定其作用范围。 

1.过程级变量

只有在声明该变量的过程中才能被使用,又称局部变量。所有过程或函数中定义的变量 都是局部变量。

用关键字“Dim”声明过程级变量。这种变量只有在执行该过程时才存在,过程结束,该 变量的值即不存在,变量占用的内存被释放;下一次再执行该过程时,其中的局部变量重新初 始化。

由于在一个过程中声明的变量只有在本过程中才可以使用,在其他过程中无法使用,因 而在不同的过程中可以使用相同的变量名。

例 2­34  在窗体上添加一个 Command1 命令按钮,并添加以下代码,单击命令按钮时,

显示的结果是什么?

【程序代码】

Private Sub Command1_Click()  MsgBox i 

End Sub 

Private Sub Form_Load()  Dim i As Integer  i = 100 

End Sub

【分析】

程序启动时,首先触发窗体的 Load 事件,执行 Load 事件中的代码,即定义变量 i 并使其 值为 100。当窗体显示出来时,该过程已经结束,则过程变量 i 已经不存在。

单击 Command1 命令按钮时,执行其 Click 事件中的代码。该代码中的变量 i 不再是 Load  事件过程中的变量  i,而是新定义的变体类型的变量  i。因此,单击命令按钮时,将显示空对 话框,然后该变量从内存中消失。 

2.模块级变量

在模块的声明段中,使用 Private 或 Dim 关键字声明的变量,其作用范围是该模块中的所 有过程。Private 表示私有的,相对应的关键字是公有的 Public;用 Private 声明的变量只能在 本模块中使用,其他模块的代码不可用;用  Public  声明的变量不但本模块可以使用,其他模 块也可以使用。

窗体代码文件中,在所有过程或函数之外(代码声明部分)定义的变量,即为模块级变 量。若在任何过程中改变了该变量,该变量最终的值是最后一次改变的值。

模块级变量定义中,Private 和 Dim 之间没什么区别。另外,在过程(如事件过程和后面 讲到的自定义过程)和自定义函数中,不能用 Private 和 Public 关键字声明变量。

例 2­35  在窗体上添加三个命令按钮, 名称分别为 Command1、 Command2 和 Command3。

分析以下代码的执行结果:

Dim a  As Integer  '对 a 赋值

Private Sub Command1_Click()  a = 100 

End Sub  '对 a 赋值

Private Sub Command2_Click()  a = 200 

End Sub  '查看 a 的值

Private Sub Command3_Click()  MsgBox a 

End Sub

【分析】

程序运行时,如果单击 Command1 后再单击 Command2,则单击 Command3 时,变量 a  的值将是 200; 然后再单击 Command1, 变量 a 的值是 100。 即无论按什么顺序单击 Command1  或 Command2,再单击 Command3 时显示的变量 a 的值都是最后一次赋的值。

例 2­36  先在窗体 Form1 定义用户名变量 UserName,然后在窗体 Form2 中显示出来。

【分析】

添加两个窗体, 名称分别为 Form1 和 Form2。 为了在窗体模块 Form2 中使用窗体模块 Form1  中定义的变量,该变量必须使用关键字 Public 定义。

在现有工程中添加窗体的方法:在菜单栏上选择“工程→添加窗体”选项,弹出“添加 窗体”对话框,在“新建”选项卡中选择“窗体” ,单击“打开”按钮。

【程序代码】

(1)窗体 Form1 的代码 Public UserName As String  Private Sub Form_Load() 

UserName = "张三" 

End Sub 

Private Sub Command1_Click()  Form2.Show 

End Sub

(2)窗体 Form2 的代码 Private Sub Form_Load() 

Me.Caption = "欢迎你," & Form1.UserName  End Sub

工程中的代码如图 2­33 所示。

【代码说明】

如果要使用一个窗体模块中的公有变量,需要通过如下格式引用:

窗体名.变量名

【运行结果】

如图 2­32 所示。

图 2­32  运行结果

从上面的例子中可以看出,一个窗体使用另一个窗体定义的变量时,需要使用“窗体名. 

变量名”格式。实际上,如果一个变量(后面还会使用到公有的自定义过程和函数)需要在多 个模块中使用到,一般将该变量定义在全局的标准模块文件中。

标准模块文件建立的方法:在菜单栏上选择“工程→添加模块”选项,弹出“添加模块”

对话框,在“新建”选项卡中选择“模块” ,单击“打开”按钮。

模块文件默认文件名为 Module1,内容为空白。

例 2­37  改写例 2­36,将变量 UserName 定义为标准模块文件中的变量。

【分析】

在例  2­36  的基础上,新添加标准模块文件  Module1,将  Form1  中定义的代码  Public  UserName As String 移动到 Module1 中,如图 2­33 所示。

图 2­33  工程中的代码

【运行结果】

和例 2­36 一样。

可见,在  Module1  文件中定义的公有变量,其他模块都可以直接使用,不需要在变量名 前加“模块名” 。在 Module1 中用 Private 或 Dim 定义的变量,只能在本模块中使用,其他模 块是不能使用的。

3.静态变量

用 Static 关键字声明的局部变量,变量值在程序运行中一直有效。将局部变量定义为静态 时, 可保留变量的值。 若希望过程中所有的局部变量为静态变量, 可在过程的起始处加上 Static  关键字。

例如:Static Sub RunningTotal (num) 

对于 Dim 声明的局部变量以及声明局部变量的过程,仅当过程在执行时,这些变量才存 在。通常,执行一个过程时,所有局部变量将重新初始化。若需要过程结束后仍然保持过程中 某些局部变量的值,应将这些变量声明为静态变量。 

[练习]  试分析下面两段代码中,每次单击命令按钮 Command1 时,变量 num 的值。

(1)代码 1 

Private Sub Command1_Click()  Static num As Integer  num = num + 1 

MsgBox num  End Sub

(2)代码 2 

Private Sub Command1_Click()  Dim num As Integer 

num = num + 1  MsgBox num  End Sub

注意:静态变量在被声明的方法或类的范围内值保持不变。一个静态变量可以保持其值,

直到该变量的值被重新设置,或者应用程序结束。 

在文檔中 第 2 章 Visual Basic 语言基础 (頁 32-35)

相關文件