VB学习资料__第七章 过程和变量的作用域
- 格式:doc
- 大小:152.00 KB
- 文档页数:17
Vb变量一、不指定变量类型,直接使用,如Private Sub Form_Load()a = 2b = 3c = a + bMsgBox cEnd Sub这时的变量类型是variant(变体型),由vb自动指定数据类型和进行类型转换如果指定变量类型,用dim进行声明,如Private Sub Form_Load()Dim a As Integer, b As Integer, c As Integera = 2b = 3c = a + bMsgBox cEnd Sub如果我们不对变量声明而是直接使用,如果拼错变量名的时候,vb就会自动创建一个新的变量。
为了防止这种情况的发生,vb提供了option explicit语句,就必须使用dim声明所有的变量。
Option explicit这一语句要写在声明段中,而不是写在过程中,如使用了option explicit语句,当未声明变量时,vb会弹出错误警告,如二、变量的作用域1、局部变量局部变量在过程内部定义,用dim或者是private定义,本模块的其他过程和其他模块的过程不能访问,只能应用在本过程中。
如单击command1按钮时的运行效果,i的值是8,此变量在本过程中被访问执行单击command2按纽时的运行效果,i的值是空,说明i是command2_click()事件过程中的值,而不能访问command1_click(),这两个i是不同的i,所以在不同的过程中可以声明相同名字的局部变量,它们各自独立互不干扰2、模块级变量模块级的变量在通用段处声明,用dim或者是private进行定义,不管是在窗体模块form中,还是在标准模块module中,对于本模块中的所有过程都有效。
下面的例子,首先设置程序的入口为sub main(),执行时module1中的i的值是0,而form1中的i的值都是8,说明模块级的私有变量仅在本模块中使用,对于其他模块不可用3、全局变量全局变量用public进行定义,所有模块都可以访问。
VB过程和变量的作用域VB中,过程是指一段完成特定任务的代码块,而变量则是用于存储数据的容器。
过程和变量的作用域则决定了它们能够被访问或使用的范围。
在VB中,有三种不同的作用域:过程级、模块级和全局级。
1.过程级作用域:过程级作用域是指变量的作用域限制在其所在的过程中。
在过程内声明的变量只在该过程的代码块中可见,超出该过程的范围就无法被访问。
过程级作用域适用于只在特定过程中使用的临时变量。
举个例子,在一个过程中声明如下的变量:```Sub SampleProcedureDim x As Integer'...End Sub```在上面的代码中,变量x只在SampleProcedure过程内部可见。
如果在该过程外部的其他过程或模块中尝试访问x,程序会报错。
2.模块级作用域:模块级作用域是指变量的作用域限制在其所在的模块中。
在模块的任何地方声明的变量,都可以被同一模块内的其他过程使用。
模块级作用域适用于多个过程之间需要共享数据的情况。
举个例子,在一个模块中声明如下的变量:```Dim x As IntegerSub Procedure1'使用变量xEnd SubSub Procedure2'修改变量x的值End Sub```在上面的代码中,变量x可以在Procedure1和Procedure2两个过程中使用和修改。
这是因为x的作用域限定在整个模块内。
然而,在其他模块中声明的变量,无法被本模块中的过程访问。
3.全局级作用域:全局级作用域是指变量的作用域在整个程序中都可见和访问。
全局变量可以在程序的任何地方声明,并且在程序执行期间一直存在,即使当前的过程已经结束。
全局变量适用于多个模块或过程之间需要共享数据的情况。
举个例子,在程序的任何地方声明如下的全局变量:```Public x As IntegerSub Procedure1'使用变量xEnd SubSub Procedure2'修改变量x的值End Sub```在上面的代码中,变量x可以在Procedure1和Procedure2两个过程中使用和修改。
变量的声明和作⽤域——VB⼀、声明变量变量在使⽤前,必须在代码中进⾏声明,即创建该变量。
在使⽤变量之前,⾸先需要声明变量。
就是说,必须事先告诉编译器在程序中使⽤了哪些变量,及这些变量的数据类型以及变量的长度。
这是因为在编译程序执⾏代码之前编译器需要知道如何给语句变量开辟存储区,这样可以优化程序的执⾏。
声明变量有两种⽅式:隐式声明、显式声明。
隐式声明:变量可以不经声明直接使⽤,此时VB给该变量赋予缺省的类型和值。
这种⽅式⽐较简单⽅便,在程序代码中可以随时命名并使⽤变量,但不易检查。
显式声明:⽤声明语句创建变量。
强制显式声明变量:为了避免写错变量名引起的⿇烦,⽤户可以规定,只要遇到⼀个未经明确声明就当成变量的名字,VB都发出错误警告。
⽅法是----强制显式声明变量。
要强制显式声明变量,只须在类模块、窗体模块或标准模块的声明段中加⼊这条语句: Option Explicit这条语句是⽤来规定在本模块中所有变量必须先声明再使⽤,即不能通过隐式声明来创建变量。
在添加Option Explicit语句后,VB将⾃动检查程序中是否有未定义的变量,发现后将显⽰错误信息。
如果要⾃动插⼊Option Explicit语句,⽤户只要在“⼯具”菜单中选取“选项”命令,然后单击“选项”对话框中的“编辑器”选项卡,再选中“要求变量声明”选项,如下图这样VB就会在任何新模块中⾃动插⼊Option Explicit语句,但只会在新建⽴的模块中⾃动插⼊。
所以对于已经建⽴的模块,只能⽤⼿⼯⽅法向现有模块添加Option Explicit语句(只有再重新启动VB,这项功能才有效)。
⼆、变量的作⽤域变量的作⽤域指的是变量的有效范围。
为了能正确地使⽤变量的值,应当明确可以在程序的什么地⽅访问该变量。
VB中变量可以分为3类:局部(Local)变量、模块(Module)变量及全局(Public)变量,其中模块变量包括窗体模块变量和标准模块变量。
关于在VB中变量的作用域及生命周期近日,连续碰到好几个朋友,询问有关VB中变量的声明以及作用域的问题,结合自己的理解和经验,写一篇文章,仅供参考,不当之处请指正。
一.VB应用程序的组成:为了了解变量的作用域,有必要回顾,在一个完整的VB工程项目中,包括了哪些组成部分?通常一个完整的VB程序里,会包括:窗体模块(.Frm文件)、标准模块(.Bas文件)和类模块(.Cls文件),见下图:根据变量的作用范围(作用域)可分为3个层次:局部变量(私有变量)、模块级变量和全局变量(公共变量)。
下面来详细说明三种变量的作用范围及使用规则。
二.局部变量:1.局部变量的作用域:顾名思义,就是只能在局部范围内被程序代码识别和访问的变量。
这类变量就是在过程(或函数)里,用Dim关键字进行声明的变量。
例如:在窗体上添加一个按钮,单击按钮,完成的功能是:输入2个数,计算并输出它们的和。
完整的代码如下:Option ExplicitPrivate Sub Command1_Click()Dim x As Single ‘声明局部变量Dim y As Single ‘声明局部变量Dim R As Single ‘声明局部变量x = Val(InputBox("请输入第1个加数:"))y = Val(InputBox("请输入第2个加数:"))R = x + yEnd Sub这里,是在按钮Command1的单击事件过程Click()里编写代码,用Dim声明了三个变量x、y、R,它们就属于局部变量。
它们只能被这个过程访问使用。
其它的过程里访问不到它们,甚至在一个程序的任何其它地方都访问不到它们。
这就是局部变量的作用域。
而且,这些变量只有在该过程的执行阶段才会存在,也就是说当系统执行这一段代码的时候:从Private Sub Command1_Click()进入过程的时候起,这3个变量才是存在的,当执行结束,从End Sub退出这段代码后,这些变量就消失了,这就是所谓的变量的生命周期。
§7.1代码模块的概述V B应用程序(通常称为工程)的组织结构,它由窗体模块、标准模块和类模块组成。
V B程序代码就保存在窗体模块文件(*.F r m)、标准模块文件(*.B a s)或类模块文件(*.C l s)中。
它们形成了工程的一种模块层次结构,如图7-1所示。
图7-1一、窗体模块(文件扩展名为.F R M)窗体模块可以包含处理事件的过程、通用过程以及变量、常数、类型和外部过程的窗体级声明。
如果要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性设置值。
写入窗体模块的代码是该窗体所属的具体应用程序专用的;它也可以引用该应用程序内的其它窗体或对象。
二、标准模块(文件扩展名为.B A S)标准模块可以包含变量、常数、类型、外部过程和全局过程的全局(在整个应用程序范围内有效的)声明或模块级声明。
写入标准模块的代码不必绑在特定的应用程序上,则在许多不同的应用程序中可以重用标准模块。
三、类模块(文件扩展名为.C L S)在V i s u a l B a s i c中类模块是面向对象编程的基础。
可在类模块中编写代码建立新对象。
这些新对象可以包含自定义的属性和方法。
实际上,窗体正是这样一种类模块,在其上可安放控件,可显示窗体窗口。
§7.2过程的作用域应用程序中的过程有作用域。
所谓作用域,就是过程可在哪些地方被使用。
作用域的大小和过程所处的位置及定义方式有关。
按过程的作用范围分为:窗体/模块级过程和全局级过程。
通用子过程和函数过程既可写在窗体模块中也可写在标准模块中,在定义时可选用关键字P r i v a t e(局部)和P u b l i c(全局),来决定它们能被调用的范围。
[P u b l i c|P r i v a t e]S u b子过程名([形式参数列表])……………E n d S u b1、窗体/模块级过程:加P r i v a t e关键字的过程,只能被定义的窗体或模块中的过程调用。
2、全局级过程:加P u b l i c关键字(或缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。
总结归纳过程的定义及作用域如表7-1所示。
表7-17.3.1 过程级变量——局部变量变量的作用域决定了哪些子过程和函数过程可访问该变量。
变量的作用域分为局部变量、窗体/模块级变量和全局变量。
三种变量作用范围及使用规则如表7-2所示。
表7-21、局部变量(过程级变量)2、窗体/模块级变量(私有的模块级变量,能被本模块的所有过程和函数使用)3、全局级变量(公有的模块级变量)过程级变量——局部变量局部变量:在过程内用声明的变量,在一个过程内部使用D i m或者S t a t i c关键字来声明的变量称为局部变量。
只能在本过程中使用,别的过程不可访问。
所以可以在不同的过程中声明相同名字的局部变量而互不影响。
【例】在一个窗体中可以定义相同名字的局部变量。
P r i v a t e S u b C o m m a n d1_C l i c k()D i m C o u n t A s I n t e g e rD i m S u m A s I n t e g e r. . .E n d S u bP r i v a t e S u b C o m m a n d2_C l i c k()D i m S u m A s I n t e g e r. . .E n d S u b7.3.2 窗体/模块级变量在“通用声明”段中用D i m语句或用P r i v a t e语句声明的变量,可被本窗体/模块的任何过程访问。
但其他窗体或模块却不能引用该变量。
以P u b l i c声明的变量,允许在其他窗体和模块中引用。
例如:在“通用声明”段声明变量如图7-2所示。
D i m t e m p A s S t r i n gP r i v a t e a A s I n t e g e r,b A s S i n g l e图7-27.3.3 全局变量一、全局变量全局变量也称公有的模块级变量,在窗体模块或标准模块的顶部的“通用”声明段用P u b l i c关键字声明,它的作用范围是整个应用程序,即可被本应用程序的任何过程或函数访问。
例如:P u b l i c a A s I n t e g e r,b A s s i n g l e二、应用举例不同作用域变量的使用。
在F o r m1窗体代码窗口输入如下程序:P r i v a t e a%'窗体/模块级变量P r i v a t e S u b F o r m_C l i c k()D i m c%,s%'局部变量c=20s=a+F o r m2.b+c'引用各级变量P r i n t"s=";sE n d S u bP r i v a t e S u b F o r m_L o a d()a=10'给窗体/模块级变量赋值F o r m2.S h o wE n d S u b添加F o r m2窗体,在它的代码窗口输入如下代码:P u b l i c b%'定义全局变量P r i v a t e S u b F o r m_L o a d()b=30'给全局变量赋值E n d S u b运行程序,单击F o r m1窗体,在本例中,在F o r m1窗体的C l i c k事件过程中引用了F o r m2窗体中定义的全局级变量b,由此可以看出在代码窗口“通用声明”段中用P u b l i c定义的变量确实是在整个应用程序中起作用的。
如果将F o r m1代码窗口中的F o r m_C l i c k事件过程做如下变动:P r i v a t e S u b F o r m_C l i c k()D i m c%,s%,b%'局部变量c=20b=40s=a+b+cP r i n t"s=";sE n d S u bs=70结果发生了变化。
原因是在V B中,当同一应用程序中定义了不同级别的同名变量时,系统优先访问作用域小的变量。
上例改动后,系统优先访问了局部变量b,因此结果当然也相应地改变了。
如果想优先访问全局变量,则应在全局变量前加上窗体/模块名。
7.3.4 关于多个变量同名一、公用变量与局部变量同名在不同过程中定义同名变量,它们互不影响,但若在一过程中定义使用了与全局变量同名的变量,则应注意。
在过程中,如果定义了与模块级变量(在通用部分使用P r i v a t e或D i m 声明的变量),则在该过程内不能引用同名的模块级变量。
例如:上面的例子中,如果将定义全局变量的语句P u b l i c T e m p A sI n t e g e r改为P r i v a t e T e m p A s I n t e g e r则在C o m m a n d1的单击事件中就不使用模块级的T e m p变量。
P u b l i c T e m p A s I n t e g e r'定义全局变量P r i v a t e S u b F o r m_L o a d()T e m p=1'将全局变量T e m p的值设置成1E n d S u bP r i v a t e S u b C o m m a n d1_C l i c k()D i m T e m p A s I n t e g e r'定义局部变量T e m p=2'将局部变量T e m p的值设置成2P r i n t"t e m p=";T e m pP r i n t"t e m p=";F o r m1.T e m pE n d S u bP r i v a t e S u b C o m m a n d2_C l i c k()P r i n t"t e m p=";T e m pE n d S u b二、全局变量同名如果不同模块中的全局变量使用同一名字,则通过同时引用模块名和变量名就可以在代码中区分它们。
例如:如果有一个在F o r m1和M o d u l e1中都声明了公用的I n t e g e r变量i n t X,则把它们作为M o d u l e1.i n t X和F o r m1.i n t X来引用便得到正确值。
也就是说如果不同模块中的全局变量使用同一名字,引用时就需要使用“模块名.变量名”的形式来区分它们。
7.3.5 静态变量局部变量除了用D i m语句声明外,还可用S t a t i c语句将变量声明为静态变量,它在程序运行过程中可保留变量的值。
也就是说,每次调用过程后,用S t a t i c说明的变量会保留运行后的结果;而在过程内用D i m说明的变量,每次调用过程结束,都会将这些局部变量释放掉。
当下一次执行该过程时,它的所有局部变量将重新初始化。
D i m声明:随过程的调用而分配存贮单元,变量的初始化;过程体结束,变量的内容自动消失,存贮单元释放。
S t a t i c声明:每次调用过程,变量保持上次调用结束时的值。
局部变量的存活期由其定义的关键词来决定。
局部变量声明形式:S t a t i c变量名[A s类型]S t a t i c F u n c t i o n函数过程名([参数列表])[A s类型]S t a t i c S u b子过程名[(参数列表)]注意:若在函数名、过程名前加S t a t i c,则表示该函数、过程内的局部变量都是静态变量。
【例】使用S t a t i c S u b语句的示例S t a t i c S u b S u b t e s t()D i m t A s I n t e g e r't为静态变量t=2*t+1P r i n t tE n d S u bP r i v a t e S u b C o m m a n d1_C l i c k()C a l l S u b t e s t'调用子过程S u b t e s tE n d S u b程序运行分析:单击窗体次数,比较使用模块变量和静态变量的差别。
运行后,多次单击命令按钮C o m m a n d1。
137……将S t a t i c S u b改为P r i v a t e S u b后,运行过程中多次单击命令按钮C o m m a n d1。
1117.4.1 设置启动对象一个稍微复杂的应用程序,不仅有多个窗体,还可能有标准模块和类模块,如图7-3所示。
在多模块程序中,有启动对象的设置、窗体的加载与卸载、窗体的加载与卸载时的事件、多模块间数据的传递等问题。