最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

VB基础教程

来源:动视网 责编:小OO 时间:2025-09-27 08:14:15
文档

VB基础教程

代码模块VisualBasic的代码存储在模块中。模块有三种类型:窗体、标准和类。简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。最终可能会发现在几个窗体中都有要执行的公共代码。因为不希望在两个窗体中重复代码,所以要创建一个模块,它包含实现公共代码的过程。模块应为标准模块。此后可以建立一个包含共享过程的模块库。每个标准模块、类模块和窗体模块都可包含:声明。可将常数、类型、变量和动态链接库(DLL)过程的声明放在窗体、类或标准模
推荐度:
导读代码模块VisualBasic的代码存储在模块中。模块有三种类型:窗体、标准和类。简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。最终可能会发现在几个窗体中都有要执行的公共代码。因为不希望在两个窗体中重复代码,所以要创建一个模块,它包含实现公共代码的过程。模块应为标准模块。此后可以建立一个包含共享过程的模块库。每个标准模块、类模块和窗体模块都可包含:声明。可将常数、类型、变量和动态链接库(DLL)过程的声明放在窗体、类或标准模
代码模块

Visual Basic 的代码存储在模块中。模块有三种类型:窗体、标准和类。

简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。最终可能会发现在几个窗体中都有要执行的公共代码。因为不希望在两个窗体中重复代码,所以要创建一个模块,它包含实现公共代码的过程。模块应为标准模块。此后可以建立一个包含共享过程的模块库。

每个标准模块、类模块和窗体模块都可包含: 

声明。可将常数、类型、变量和动态链接库 (DLL) 过程的声明放在窗体、类或标准模块的模块级。

过程。Sub、Function 或者 Property 过程包含可以作为单元来执行的代码片段。本章后面的“过程概述”一节中将讨论这些内容。 

窗体模块

窗体模块(文件扩展名为 .FRM )是大多数 Visual Basic 应用程序的基础。窗体模块可以包含处理事件的过程、通用过程以及变量、常数、类型和外部过程的窗体级声明。如果要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性设置值。写入窗体模块的代码是该窗体所属的具体应用程序专用的;它也可以引用该应用程序内的其它窗体或对象。

标准模块

标准模块(文件扩展名为 .BAS)是应用程序内其它模块访问的过程和声明的容器。它们可以包含变量、常数、类型、外部过程和全局过程的全局(在整个应用程序范围内有效的)声明或模块级声明。写入标准模块的代码不必绑在特定的应用程序上;如果不小心用名称引用窗体和控件,则在许多不同的应用程序中可以重用标准模块。

类模块

在 Visual Basic 中类模块(文件扩展名为 .CLS)是面向对象编程的基础。可在类模块中编写代码建立新对象。这些新对象可以包含自定义的属性和方法。实际上,窗体正是这样一种类模块,在其上可安放控件、可显示窗体窗口。

详细信息 关于在类模块中编写代码的更详细的信息,请参阅“用对象编程”。

注意 Visual Basic 的专业版和企业版也包含 ActiveX 文档、ActiveX 设计器和用户控件。它们介绍了具有不同文件扩展名的新模块类型。从编写代码的角度来看,这些模块应视同为窗体模块。

使用“代码编辑器”

Visual Basic “代码编辑器” 是一个窗口,大多数代码都在此窗口上编写。它象一个高度专门化的字处理软件,有许多便于编写 Visual Basic 代码的功能。图 5.4所为示“代码编辑器”窗口。

图 5.4“代码编辑器”窗口

因为要操作模块中的 Visual Basic 代码,所以要为每一个从“工程资源管理器”中选择的模块打开一个的“代码编辑器”窗口。在每个模块中,对于模块中所包含的每个对象,将模块中的代码再细分出与对象对应的部分。用“对象列表框”实现各部分间的切换。 在窗体模块中,该列表包含一个通用段,一个属于窗体自身的段以及窗体所包含的每一控件的段。对于类模块,列表包括一个通用段和一个类段;对于标准模块,只有一个通用段被显示。

每一段代码都可包含几个用“过程列表框”访问的不同过程。对窗体或控件的每一个事件过程,窗体模块的过程列表都包含一个的段。例如,Label 控件的过程列表就包含 Change 事件段、Click 事件段和 DblClick 事件段等等。类模块只列举类本身的事件过程— 初始化和终止。标准模块不列举任何事件过程,因为标准模块不支持事件。

模块通用段的过程列表只包含唯一段— 声明段,其中放置模块级的变量、常数和 DLL 声明。当在模块中添加子过程或函数过程时,那些过程被添加到声明段下方的“过程列表框”中。

代码的两种不同视图都可用于“代码编辑器”窗口。可以一次只查看一个过程,也可以查看模块中的所有过程,这些过程彼此之间用线隔开(如图 5.4 所示)。为了在两个视图之间进行切换,利用编辑器窗口左下角的“查看选择”按钮。

自动完成编码

Visual Basic 能自动填充语句、属性和参数,这些性能使编写代码更加方便。在输入代码时,编辑器列举适当的选择、语句或函数原型或值。通过“工具”菜单上的“选项”命令访问“选项”对话框,在“选项”对话框的“编辑器”选项卡上可用这样的选项,由它们决定是允许还是禁止各代码的设置值。

在代码中输入一控件名时,“自动列出成员特性”会亮出这个控件的下拉式属性表(图 5.5)。键入属性名的前几个字母,就会从表中选中该名字,按 Tab 键将完成这次输入。当不能确认给定的控件有什么样的属性时,这个选项是非常有帮助的。即使选择了禁止“自动列出成员特性”,仍可使用 CTRL + J 组合键得到这种性能。

图 5.5 “自动列表成员功能”

“自动快速信息”功能显示语句和函数的语法(图 5.6)。当输入合法的 Visual Basic 语句或函数名之后,语法立即显示在当前行的下面,并用黑体字显示它的第一个参数。在输入第一个参数值之后,第二个参数又出现了,同样也是黑体字。“自动快速信息”也可以用 CTRL+I 组合键得到。

图 5.6 “自动快速信息”

书签

在代码编辑器中书签可用来标记代码的某些行,以便您以后可以很容易地返回这些行。书签开关的切换以及定位到已有书签的命令可以在编辑、书签菜单项或编辑工具栏中得到。

详细信息 关于如何使用组合键使用“代码编辑器”窗口的各种功能的更详细信息,请参阅“代码窗口的快捷键”。

编码基础

这一部分介绍代码编写机制,包括如何中断和合并代码行、如何添加注释、如何使用数字以及 Visual Basic 命名约定。

将单行语句分成多行

可以在“代码”窗口中用续行符(一个空格后面跟一个下划线)将长语句分成多行。由于使用续行符,无论在计算机上还是打印出来的代码都变得易读。下面用续行符 ( _) 将代码分成若干行:

Data1.RecordSource = _

"SELECT * FROM Titles, Publishers" _

& "WHERE Publishers.PubId = Titles.PubID" _

& "AND Publishers.State = 'CA'"

在同一行内,续行符后面不能加注释。至于在什么地方可以使用续行符,还是有某些的。

将多个语句合并到同一行上

通常,一行之中有一个 Visual Basic 语句,而且不用语句终结符。但是也可以将两个或多个语句放在同一行,只是要用冒号 (:) 将它们分开。

Text1.Text = "Hello" : Red = 255 : Text1.BackColor = _

Red

但是,为了便于阅读代码,最好还是一行放一个语句。 .

详细信息 关于详细信息,请参阅“Visual Basic 的规范、和文件格式”。

在代码中添加注释

阅读本手册的例子时常会遇到注释符 (')。这个符号告诉 Visual Basic,忽略该符号后面的内容。这些内容是代码段中的注释,既是为了方便开发者,也是为了方便以后可能检查源代码的其他程序员。例如:

' 这是从屏幕左边

' 开始的注释。

Text1.Text = "Hi!"      '在文本框中放

                     '欢迎词。

注释可以和语句在同一行并写在语句的后面,也可占据一整行。上述代码对这两种情况都作了示范。记住,不能在同一行上,将注释接在续行符之后。

注意 您可以通过选中两行或多行代码并在“编辑”工具栏上通过选择“注释块”或“删除注释块”按钮来对该代码块添加或删除注释符号。

理解数字系统

在本文档中,大多数的数值都是十进制的(基数为 10)。但有时用十六进制数(基数为 16)或八进制数(基数为 8)更方便。Visual Basic 用前缀 &H 表示十六进制数,而用 &O 表示八进制数。下表说明同一个数的十进制、八进制和十六进制表示。

十进制 八进制 十六进制 

9 &O11 &H9 

15 &O17 &HF 

16 &O20 &H10 

20 &O24 &H14 

255 &O377 &HFF 

通常不必掌握十六进制或八进制数制,因为计算机可以用任何数制的数工作。但是,对某些任务来说,有的数系就比其它数系更合适,例如利用十六进制数设置屏幕和控件的颜色。

Visual Basic 的命名约定

在编写 Visual Basic 代码时,要声明和命名许多元素(Sub 和 Function 过程、变量、常数等等)。在 Visual Basic 代码中声明的过程、变量和常数的名字,必须遵循这些规则: 

它们必须以字母开头。

它们不可以包含嵌入的句号或者类型声明字符(规定数据类型的特殊字符)。

它们不能超过 255 个字符。控件、窗体、类和模块的名字不能超过 40 个字符。

它们不能和受到的关键字同名。 

受到的关键字是 Visual Basic 使用的词,是语言的组成部分。其中包括预定义语句(比如 If 和 Loop)、函数(比如 Len 和 Abs)和操作符(比如 Or 和 Mod)。

详细信息 关于关键字表的更详细信息,请参阅语言参考。

窗体和控件可以和受到的关键字同名。例如,可以将某个控件命名为 Loop。但在代码中不能用通常的方法引用该控件,因为 Visual Basic 会认为 Loop 意味着关键字。例如,这样的代码就会出错。

Loop.Visible = True            ' 出错。

为了引用那些和受到的关键字同名的窗体或控件,就必须限定它们,或者将其用方括号 [ ] 括起来。例如,下面的代码就不会出错。

MyForm.Loop.Visible = True      '用窗体名

                              '将其限定。

[Loop].Visible = True         '方括号

                              '起了作用。

在引用窗体和控件时都可以用这种方式使用方括号,但在声明变量或定义过程期间,当变量名或过程名与受到的关键字相同时,这种方式是不能使用的。方括号还可以用来强制 Visual Basic 接受其它类型库提供的名称,这些名称与受到的关键字冲突。

注意 因为键入方括号也是令人厌倦的事情,所以希望少用受到的关键字作窗体或控件名。但是,如果 Visual Basic 的新版本定义了与现有窗体或控件冲突的新关键字,那么,在为使用新版本而更新代码时,可以使用这个技巧。

变量

在 Visual Basic 中执行应用程序期间,用变量临时存储数值。变量有名字(用来引用变量所包含的值的词)和数据类型(确定变量能够存储的数据的种类)。

可以把变量看作内存中存放未知值的所在处。例如,假定正在为水果铺编一个销售苹果的软件。在销售实际发生之前并不知道苹果的价格和销量。此时,可以设计两个变量来保存未知数— 将它们命名为 ApplePrice 和 ApplesSold。每次运行程序时,用户就这两个变量提供具体值。为了计算总的销售额,并且将结果显示在名叫 txtSales 的文本框中,代码应该是这样的:

txtSales.txt = ApplePrice * ApplesSold

每次根据用户提供的数值,这个表达式返回不同的金额。由于有了变量,就可以设计一个算式,而不必事先知道实际的输入是多少。

在这个例子中,ApplePrice 的数据类型是货币,而 ApplesSold 的数据类型是整数。变量还可以表示许多其它数值,比如:文本数值、日期、各种数值类型,甚至对象也在此列。

存储和检索变量中的数据

用赋值语句进行计算,并将结果赋予变量:

ApplesSold = 10      '将值 10

                  '传给变量。

ApplesSold = ApplesSold + 1      '变量值

                              '增一。

注意,例子中的等号是赋值符,并不是等于操作符;它将数值 (10) 赋予变量 (ApplesSold)。

声明变量

声明变量就是事先将变量通知程序。要用 Dim 语句声明变量,Dim 语句提供了变量名:

Dim variablename [As type]

在过程内部用 Dim 语句声明的变量,只有在该过程执行时才存在。过程一结束,该变量的值也就消失了。此外,过程中的变量值对过程来说是局部的— 也就是说,无法在一个过程中访问另一个过程中的变量。由于这些特点,在不同过程中就可使用相同的变量名,而不必担心有什么冲突和意想不到变故。

变量名: 

必须以字母开头。

不能包含嵌入的句号或者嵌入的类型声明字符。

不得超过 255 个字符。

在同一个范围内必须是唯一的。范围就是可以引用变量的变化域— 一个过程、一个窗体等等。 

由于 Dim 语句中的可选的 As type 子句,可以定义被声明变量的数据类型或对象类型。数据类型定义了变量所存储信息的类型。String、Integer 和 Currency 都是数据类型的例子。变量也可以包含来自 Visual Basic 或其它应用程序的对象。Object、Form1 和 TextBox 都是 Visual Basic 对象类型或类的实例。

详细信息 关于对象的更详细的信息,请参阅“用对象编程”和“用部件编程”。在本章后面的“数据类型”部分将详细讨论数据类型。

声明变量的其它方式: 

不在过程内部,而在窗体、标准或类模块的声明段声明变量,这将使变量对模块中的所有过程有效。

用 Public 关键字声明变量,这将使变量在整个应用程序中有效。

用 Static 关键字声明一个局部变量,那么,即使过程结束,变量的值也仍然保留着。 

隐式声明

在使用一个变量之前并不必先声明这个变量。 例如,可以书写这样一个函数,在其中就不必在使用变量 TempVal 之前先声明它:

Function SafeSqr (num)

   TempVal = Abs (num)

   SafeSqr = Sqr (TempVal)

End Function

Visual Basic 用这个名字自动创建一个变量,使用这个变量时,可以认为它就是显式声明的。虽然这种方法很方便,但是如果把变量名拼错了的话,会导致一个难以查找的错误。例如,假定写了这样一个函数:

Function SafeSqr (num)

   TempVal = Abs (num)

   SafeSqr = Sqr (TemVal)

End Function

乍看起来,这两段代码好象是一样的。但是因为在倒数第二行把 TempVal 变量名写错了,所以函数总是返回 0。当 Visual Basic 遇到新名字,它分辨不出这是意味着隐式声明了一个新变量呢,还是仅仅把一个现有变量名写错了,于是只好用这个名字再创建一个新变量。

显式声明

为了避免写错变量名引起的麻烦,可以规定,只要遇到一个未经明确声明就当成变量的名字,Visual Basic 都发出错误警告。

要显式声明变量,请 

在类模块、窗体模块或标准模块的声明段中加入这个语句: 

Option Explicit

—或—

在“工具”菜单中选取“选项”,单击“编辑器”选项卡,再复选“要求变量声明”选项。这样就在任何新模块中自动插入 Option Explicit 语句,但不会在已经建立起来的模块中自动插入;所以在工程内部,只能用手工方法向现有模块添加 Option Explicit。

如果对包含 SafeSqr 函数的窗体或标准模块执行该语句,那么 Visual Basic 将认定 TempVal 和 TemVal 都是未经声明变量,并为两者都发出错误信息。随后就可以显式声明 TempVal。

Function SafeSqr (num)

   Dim TempVal

   TempVal = Abs (num)

   SafeSqr = Sqr (TemVal)

End Function

因为 Visual Basic 对拼错了的 TemVal 显示错误信息,所以能够立刻明白是什么问题。由于 Option Explicit 语句有助于抓住这些类型的错误,所以最好在所有代码中使用它。

注意 Option Explicit 语句的作用范围仅限于语句所在模块,所以,对每个需要 Visual Basic 强制显式变量声明的窗体模块、标准模块及类模块,必须将 Option Explicit 语句放在这些模块的声明段中。如果选择“要求变量声明”,Visual Basic 会在后续的窗体模块、标准模块及类模块中自动插入 Option Explicit,但是不会将它加入到现有代码中。必须在工程中通过手工将 Option Explicit 语句加到任何现有模块中。

理解变量的范围

变量的范围确定了能够知晓该变量存在的那部分代码。在一个过程内部声明变量时,只有过程内部的代码才能访问或改变那个变量的值;它有一个范围,对该过程来说是局部的。但是,有时需要使用具有更大范围的变量,例如这样一个变量,其值对于同一模块内的所有过程都有效,甚至对于整个应用程序的所有过程都有效。Visual Basic 允许在声明变量时指定它的范围。

指定变量的有效范围

一个变量在划定范围时被看作是过程级(局部)变量,还是模块级变量,这取决于声明该变量时采用的方式。

范围 专用 公用 

过程级 变量对于这种过程是专用的,在该过程中出现了这些变量。 不可使用。不能在一个过程中声明公用变量。 

模块级 变量对于这种过程是专用的,在该过程中出现了这些变量。 变量可用于所有模块。 

过程内部使用的变量

过程级变量只有在声明它们的过程中才能被识别。也称它们为局部变量。用 Dim 或者 Static 关键字来声明它们。例如:

Dim intTemp As Integer

— 或者 —

Static intPermanent As Integer

在整个应用程序运行时,用 Static 声明的局部变量中的值一直存在,而用 Dim 声明的变量只在过程执行期间才存在。

对任何临时计算来说,局部变量是最佳选择。例如,可以建立十来个不同的过程,每个过程都包含称作 intTemp 的变量。只要每个 intTemp 都声明为局部变量,那么每个过程只识别它自己的 intTemp 版本。任何一个过程都能够改变它自己的局部的 intTemp 变量的值,而不会影响别的过程中的 intTemp 变量。

模块内部使用的变量

按照缺省规定,模块级变量对该模块的所有过程都可用,但对其它模块的代码不可用。可在模块顶部的声明段用 Private 关键字声明模块级变量,从而建立模块级变量。例如:

Private intTemp As Integer

在模块级,Private 和 Dim 之间没有什么区别,但 Private 更好些,因为很容易把它和 Public 区别开来,使代码更容易理解。

所有模块使用的变量

为了使模块级的变量在其它模块中也有效,用 Public 关键字声明变量。公用变量中的值可用于应用程序的所有过程。和所有模块级变量一样,也在模块顶部的声明段来声明公用变量。例如:

Public intTemp As Integer

注意 不能在过程中声明公用变量,只能在模块的声明段中声明公用变量。

详细信息 有关变量的其它信息,请参阅 “高级变量主题”。

高级变量主题

使用多个同名的变量

如果不同模块中的公用变量使用同一名字,则通过同时引用模块名和变量名就可以在代码中区分它们。例如,如果有一个在 Form1 和 Module1 中都声明了的公用 Integer 变量 intX,则把它们作为 Module1.intX 和 Form1.intX 来引用便得到正确值。

为了看清这是如何工作的,在一个新工程中插入两个标准模块,并在窗体上画上三个命令按钮。

在第一个标准模块 Module1 之中声明一个变量 intX。Test 过程设置它的值:

Public intX As Integer      '声明 Module1 的 intX。

Sub Test ()

   '设置 Module1 的 intX 变量的值。

   intX = 1   

End Sub

在第二个标准模块 Module2 中声明了第二个变量 intX,它有相同的名字。又是名为 Test 的过程设置它的值:

Public intX As Integer      '声明了 Module2 的 intX。

Sub Test ()

   '设置 Module2 的 intX 变量的值。

   intX = 2   

End Sub

在窗体模块中声明了第三个变量 intX。名为 Test 的过程又一次设置它的值。

Public intX As Integer      '声明了该窗体的 intX 变量。

Sub Test ()

   ' 设置 form 中的 intX 变量值。

   intX = 3

End Sub

在三个命令按钮的 Click 事件过程中,每一个都调用了相应的 Test 过程,并用 MsgBox 来显示这三个变量的值。

Private Sub Command1_Click ()

   Module1.Test               ' 调用 Module1 中的 Test。

   MsgBox Module1.intX         ' 显示 Module1 的 intX。

End Sub

Private Sub Command2_Click ()

   Module2.Test               ' 调用 Module2 中的 Test。

   MsgBox Module2.intX         ' 显示 Module2 的 intX。

End Sub

Private Sub Command3_Click ()

   Test                     ' 调用 Form1 中的 Test。

   MsgBox intX               ' 显示 Form1 的 intX。

End Sub

运行应用程序,单击三个命令按钮中的每一个按钮。于是将看到三个公用变量被分别引用。注意在第三个命令按钮的 Click 事件过程中,在调用 Form1 的 Test 过程时不必指定 Form1.Test,在调用 Form1 的 Integer 变量的值时也不必指定 Form1.intX 。如果多个过程或变量同名,则 Visual Basic 会取变化更受的值,在这个例子中,就是 Form1 变量。

公用变量与局部变量的比较

在不同的范围内也可有同名的变量。例如,可有名为 Temp 的公用变量,然后在过程中声明名为 Temp 的局部变量。在过程内通过引用名字 Temp 来访问局部变量;而在过程外则通过引用名字 Temp 来访问公用变量。通过用模块名限定模块级变量就可在过程内访问这样的变量。

Public Temp As Integer

Sub Test ()

   Dim Temp As Integer

   Temp = 2                  ' Temp 的值为 2。

   MsgBox Form1.Temp         ' Form1.Temp 的值为 1。

End Sub

Private Sub Form_Load ()

   Temp = 1                  ' 将 Form1.Temp 的值设置成 1。

End Sub 

Private Sub Command1_Click ()

   Test   

End Sub

一般说来,当变量名称相同而范围不同时,局限性大的变量总会用“阴影”遮住局限性不太大的变量(即优先访问局限性大的变量)。所以,如果还有名为 Temp 的过程级变量,则它会用“阴影”遮住模块内部的公用变量 Temp。

阴影窗体属性和控件

由于阴影效应,窗体属性、控件、常数和过程皆被视为窗体模块中的模块级变量。窗体属性或控件的名称与模块级变量、常数、自定义类型或过程的名称相同是不合法的,因为它们的范围相同。

在窗体模块内,和窗体中控件同名的局部变量将遮住同名控件。因此必须引用窗体名称或 Me 关键字来限定控件,才能设置或者得到该控件的值或它的属性值。例如:

Private Sub Form_Click ()

Dim Text 1 , BackColor

'假定该窗体有一个控件也叫做 Text1。

   Text1 = "Variable"       '变量用“阴影”遮住控件。

   Me.Text1 = "Control"       '要得到控件,必须用‘Me’限定。

   Text1.Top = 0          '导致出错!

   Me.Text1.Top = 0       '要得到控件,必须用‘Me’限定。

   BackColor = 0          '变量用“阴影”遮住属性。

   Me.BackColor = 0       '要得到窗体属性,必须用‘Me’限定。

End Sub

使用同名的变量和过程

专用模块级变量和公共模块级变量的名字也会和过程名冲突。模块中的变量不能和任何过程同名,也不能和模块中定义的类型同名。但可以和公用过程或其它模块中定义的类型或变量同名。在这种情况下,从别的模块访问这个变量时,就必须用模块名来限定。

虽然上面讨论阴影规则并不复杂,但是用阴影的方法可能会带来麻烦,而且会导致难以查找的错误。因此,对不同的变量使用不同的名称才是一种好的编程习惯。在窗体模块中应尽量使变量名和窗体中的控件名不一样。

静态变量

除范围之外,变量还有存活期,在这一期间变量能够保持它们的值。在应用程序的存活期内一直保持模块级变量和公用变量的值。但是,对于 Dim 声明的局部变量以及声明局部变量的过程,仅当过程在执行时这些局部变量才存在。通常,当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。

但可将局部变量定义成静态的,从而保留变量的值。在过程内部用 Static 关键字声明一个或多个变量,其用法和 Dim 语句完全一样:

Static Depth

例如,下面的函数将存储在静态变量 Accumulate 中的以前的运营总值与一个新值相加,以计算运营总值。

Function RunningTotal (num)

   Static ApplesSold

   ApplesSold = ApplesSold + num

   RunningTotal = ApplesSold

End Function

如果用 Dim 而不用 Static 声明 ApplesSold,则以前的累计值不会通过调用函数保留下来,函数只会简单地返回调用它的那个相同值。

在模块的声明段声明 ApplesSold,并使它成为模块级变量,由此也会收到同样效果。但是,这种方法一旦改变变量的范围,过程就不再对变量排他性存取。由于其它过程也可以访问和改变变量的值,所以运营总值也许不可靠,代码将更难于维护。

声明所有的局部变量为静态变量

为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static 关键字。例如:

Static Function RunningTotal (num)

这就使过程中的所有局部变量都变为静态,无论它们是用 Static、Dim 或 Private 声明的还是隐式声明的。可以将 Static 放在任何 Sub 或 Funtion 过程头的前面,包括事件过程和声明为 Private 的过程。

常数

经常会发现代码包含一些常数值,它们一次又一次地反复出现。还可发现,代码要用到很难记住的数字— 而那些数字没有明确意义。

在这些情况下,可用常数大幅度地改进代码的可读性和可维护性。常数是有意义的名字,取代永远不变的数值或字符串。尽管常数有点象变量,但不能象对变量那样修改常数,也不能对常数赋以新值。常数有两种来源: 

内部的或系统定义的常数是应用程序和控件提供的。在“对象浏览器”中的 Visual Basic ( VB ) 、和 Visual Basic for applications ( VBA ) 对象库中列举了 Visual Basic 的常数。其它提供对象库的应用程序,如 Microsoft Excel 和 Microsoft Project,也提供了常数列表,这些常数可与应用程序的对象、方法和属性一起使用。在每个 ActiveX 控件的对象库中也定义了常数 关于使用“对象浏览器”的详细信息,请参阅“用对象编程”。

符号的或用户定义的常数是用 Const 语句来声明的。下节“创建属于自己的常数”中将说明用户定义的常数。 

在 Visual Basic 中,常数名采用大小写混合的格式,其前缀表示定义常数的对象库名。来自 Visual Basic 和 Visual Basic for applications 对象库的常数以 "vb" 开头— 例如vbTileHorizontal。

设计前缀时应尽力防止发生意外冲突,不能出现常数名称相同但表示不同数值的情况。即使使用了前缀,两个对象库也仍可能包含表示不同值的相同常数。在这种情况下,引用哪个常数取决于哪个对象库具有更高的优先级。关于改变对象库优先级的信息,请参阅 “引用对话框”部分。

为了绝对确保不发生常数名字冲突,可用以下语法来限定对常数的引用:

[libname.][modulename.]constname

Libname 通常是控件或库的类名。Modulename 是定义常数的模块的名字。Constname 是常数名。在对象库中定义了每个元素,并能在“对象浏览器”中查看元素。

创建属于自己的常数

声明常数的语法是:

[Public|Private] Const constantname[As type] = expression

参数 constantname 是有效的符号名(其规则与建立变量名的规则一样),expression 由数值常数或字符串常数以及运算符组成;但在 expression 中不能使用函数调用。

Const 语句可以表示数量或 Date / Time 量:

Const conPi = 3.141592653579

Public Const conMaxPlanets As Integer = 9

Const conReleaseDate = #1/1/95#

也可用 Const 语句定义字符串常数:

Public Const conVersion = "07.10.A"

Const conCodeName = "Enigma"

如果用逗号进行分隔,则在一行中可放置多个常数声明:

Public Const conPi = 3.14, conMaxPlanets = 9, _

conWorldPop = 6E+09

等号 ( = ) 右边的表达式往往是数字或文字串,但也可以是其结果为数或字符串的表达式(尽管表达式不能包含函数调用)。甚至可用先前定义过的常数定义新常数。

Const conPi2 = conPi * 2

一旦已定义常数,就可将其放置在代码中,使代码更可读。例如:

Static SolarSystem (1 To conMaxPlanets)

If numPeople > conWorldPop Then Exit Sub

设定用户自定义常数的范围

和变量声明一样, Const 语句也有范围,也使用相同的规则: 

为创建仅存在于过程中的常数,请在这个过程内部声明常数。

为创建一常数,它对模块中所有过程都有效,但对模块之外任何代码都无效,请在模块的声明段中声明常数。

为创建在整个应用程序中有效的常数,请在标准模块的声明段中进行声明,并在 Const 前面放置 Public 关键字。在窗体模块或类模块中不能声明 Public 常数。 

详细信息 关于范围的更详细信息,请参阅本章前面的“理解变量的范围”一节。

避免循环引用

由于常数可以用其它常数定义,因此必须小心,在两个以上常数之间不要出现循环或循环引用。当程序中有两个以上的公用常数,而且每个公用常数都用另一个去定义时就会出现循环。

例如:

'在 Module1 中:

Public Const conA = conB * 2   '在整个应用程序

                            '中有效。

'在 Module 2:

Public Const conB = conA / 2   '在整个应用程序

                              '中有效。

如果出现循环,在试图运行此应用程序时,Visual Basic 就会产生错误信息。不解决循环引用就不能运行程序。为避免出现循环,可将公共常数在单一模块内,或最多只存在于少数几个模块内。

文档

VB基础教程

代码模块VisualBasic的代码存储在模块中。模块有三种类型:窗体、标准和类。简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。最终可能会发现在几个窗体中都有要执行的公共代码。因为不希望在两个窗体中重复代码,所以要创建一个模块,它包含实现公共代码的过程。模块应为标准模块。此后可以建立一个包含共享过程的模块库。每个标准模块、类模块和窗体模块都可包含:声明。可将常数、类型、变量和动态链接库(DLL)过程的声明放在窗体、类或标准模
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top