VB编码基础与语言基础

上传人:文*** 文档编号:61931583 上传时间:2022-03-13 格式:DOC 页数:36 大小:131KB
返回 下载 相关 举报
VB编码基础与语言基础_第1页
第1页 / 共36页
VB编码基础与语言基础_第2页
第2页 / 共36页
VB编码基础与语言基础_第3页
第3页 / 共36页
点击查看更多>>
资源描述
文档供参考,可复制、编制,期待您的好评与关注! 编码基础这一部分介绍代码编写机制,包括如何中断和合并代码行、如何添加注释、如何使用数字以及 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&H915&O17&HF16&O20&H1020&O24&H14255&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 方括号 起了作用。高级变量主题使用多个同名的变量如果不同模块中的公用变量使用同一名字,则通过同时引用模块名和变量名就可以在代码中区分它们。例如,如果有一个在 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 = 3End Sub在三个命令按钮的 Click 事件过程中,每一个都调用了相应的 Test 过程,并用 MsgBox 来显示这三个变量的值。Private Sub Command1_Click () Module1.Test 调用 Module1 中的 Test。 MsgBox Module1.intX 显示 Module1 的 intX。End SubPrivate Sub Command2_Click () Module2.Test 调用 Module2 中的 Test。 MsgBox Module2.intX 显示 Module2 的 intX。End SubPrivate 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 IntegerSub Test () Dim Temp As Integer Temp = 2 Temp 的值为 2。 MsgBox Form1.Temp Form1.Temp 的值为 1。End SubPrivate 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 = ApplesSoldEnd Function如果用 Dim 而不用 Static 声明 ApplesSold,则以前的累计值不会通过调用函数保留下来,函数只会简单地返回调用它的那个相同值。在模块的声明段声明 ApplesSold,并使它成为模块级变量,由此也会收到同样效果。但是,这种方法一旦改变变量的范围,过程就不再对变量排他性存取。由于其它过程也可以访问和改变变量的值,所以运营总值也许不可靠,代码将更难于维护。声明所有的局部变量为静态变量为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static 关键字。例如:Static Function RunningTotal (num)这就使过程中的所有局部变量都变为静态,无论它们是用 Static、Dim 或 Private 声明的还是隐式声明的。可以将 Static 放在任何 Sub 或 Funtion 过程头的前面,包括事件过程和声明为 Private 的过程。数据类型变量是用来存储值的所在处;它们有名字和数据类型。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。所有变量都具有数据类型,以决定能够存储哪种数据。根据缺省规定,如果在声明中没有说明数据类型,则令变量的数据类型为 Variant。Variant 数据类型很象一条变色龙 它可在不同场合代表不同数据类型。当指定变量为 Variant 变量时,不必在数据类型之间进行转换,Visual Basic 会自动完成各种必要的转换。但是,如果知道变量确实总是存储特定类型的数据,并且还声明了这种特定类型的变量,则 Visual Basic 会以更高的效率处理这个数据。例如,存储人名的变量最好表示成 String 数据类型,因为名字总是由字符组成。除变量外,数据类型也用于其它场合。在给属性赋值时,这个值就有数据类型;函数的参数也有数据类型。事实上,在 Visual Basic 中,凡是与数据有关的东西就与数据类型有关。也可声明任何基本类型的数组。详细信息 关于更详细信息,请参阅本章后面的“数组”部分。在“性能和兼容性的设计”中还将讨论通过选择数据类型来提高应用程序的性能。声明带数据类型的变量在使用非 Variant 变量之前,必须使用 Private、Public、Dim 或 Static 语句将变量声明为 As type。例如,下列语句分别声明了 Integer、Double、String 和 Currency 类型的变量:Private I As IntegerDim Amt As DoubleStatic YourName As StringPublic BillsPaid As Currency一个声明语句可将多个声明组合起来,请看下列语句:Private I As Integer,Amt As DoublePrivate YourName As String,BillsPaid As CurrencyPrivate Test,Amount,J As Integer注意 如果不提供数据类型,则指定变量为缺省类型。在上例中,变量 Test 和 Amount 是 Variant 数据类型。如果由于其它编程语言的经验使人感到同一个声明语句中的所有变量都有相同的指定数据类型(此例中为 Integer),那么,此处的结果可能会令人感到新鲜。Numeric 数据类型Visual Basic 支持几种 Numeric 数据类型 Integer(整型)、Long(长整型)、Single(单精度浮点型)、Double(双精度浮点型)和 Currency(货币型)。与 Variant 类型相比,Numeric 类型占用的存储空间通常要少。如果知道变量总是存放整数(如 12 )而不是带小数点的数字(如 3.57),就应当将它声明为 Integer 类型或 Long 类型。整数的运算速度较快,而且比其它数据类型占据的内存要少。在 For.Next 循环内作为计数器变量使用时,整数类型尤为有用。详细信息 关于控制结构的详细资料,请参阅本章后面的“控制结构概述”。如果变量包含小数,则可将它们声明为 Single、Double 或 Currency 变量。Currency 数据类型支持小数点右面 4 位和小数点左面 15 位;它是一个精确的定点数据类型,适用于货币计算。浮点(Single 和 Double)数比 Currency 的有效范围大得多,但有可能产生小的进位误差。注意 浮点数值可表示为 mmmEeee 或 mmmDeee ,其中 mmm 是假数,而 eee 是指数(以 10 为底的幂)。Single 数据类型的最大正数值为 3.402823E+38,或 3.4 乘以 10 的 38 次方;Double 数据类型的最大正数值是 1.79769313486232D+308 或 1.8 乘以 10 的 308 次方。用 D 将数值文字中的假数部分和指数部分隔开,就会导致将该值作为 Double 数据类型来处理。同样,用这种方式使用 E,也会导致将该值作为 Single 数据类型来处理。Byte 数据类型如果变量包含二进制数,则将它声明为 Byte 数据类型的数组。(本章后面的“数组”中将讨论数组)。在转换格式期间用 Byte 变量存储二进制数据就可保留数据。当 String 变量在 ANSI 和 Unicode 格式间进行转换时,变量中的任何二进制数据都会遭到破坏。在下列任何一种情况下,Visual Basic 都会自动在 ANSI 和 Unicode 之间进行转换: 读文件时 写文件时 调用 DLL 时 调用对象的方法和属性时 除一元减法外,所有可对整数进行操作的运算符均可操作 Byte 数据类型。因为 Byte 是从 0 - 255 的无符号类型,所以不能表示负数。因此,在进行一元减法运算时,Visual Basic 首先将 Byte 转换为符号整数。所有数值变量都可相互赋值,也可对 Variant 类型变量赋值。 在将浮点数赋予整数之前, Visual Basic要将浮点数的小数部分四舍五入,而不是将小数部分去掉。详细信息 关于 Unicode 和 ANSI 转换的详细信息,请参阅“国际化”。String 数据类型如果变量总是包含字符串而从不包含数值,就可将其声明为 String 类型。Private S As String然后可将字符串赋予这个变量,并用字符串函数对它进行操作。S = DatabaseS = Left (S,4)按照缺省规定,String 变量或参数是一个可变长度的字符串,随着对字符串赋予新数据,它的长度可增可减。 也可以声明字符串具有固定长度。可用以下语法声明一个定长字符串:String * size例如,为了声明一个长度为 50 字符的字符串,可用下列语句:Dim EmpName As String * 50如果赋予字符串的字符少于 50 个,则用空格将 EmpName 的不足部分填满。如果赋予字符串的长度太长,已不能成为定长字符串,则 Visual Basic 会直接截去超出部分的字符。因为定长字符串用空格填充尾部多余的空间,所以在处理定长字符串时可发现,删除空格的 Trim 和 RTrim 函数是很有用的。可将标准模块中的定长字符串声明为 Public 或 Private。在窗体和类模块中,必须将定长字符串声明为 Private。详细信息 请参阅语言参考中的“Ltrim、RTrim Function 和 Trim 函数”。交换字符串和数字如果字符串表示数值,则可将字符串赋予数值变量。也可将数值赋予字符串变量。例如,将命令按钮、文本框和列表框放置在窗体中。在命令按钮的 Click 事件中输入下列代码。运行应用程序并单击命令按钮。Private Sub Command1_Click () Dim intX As Integer Dim strY As String strY = 100.23 intX = strY 将字符串传递给数值变量。 List1.AddItem Cos (strY) 将字符串中数值的余弦值。 添加到列表框中。 strY = Cos (strY) 将余弦值传递给字符串变量。 Text1.Text = strY 在文本框中显示字符串。End SubVisual Basic 会自动强制变量为适当的数据类型。在转换字符串和数值时要小心;如果传送字符串中的值不是数值,则在运行时会出错。Boolean 数据类型若变量的值只是“true/false”、“yes/no”、“on/off”信息,则可将它声明为 Boolean 类型。Boolean 的缺省值为 False。在下面的例子中,blnRunning 是 Boolean 变量,存储简单的 yes/no 设置。Dim blnRunning As Boolean 查看磁带是否在转。 If Recorder.Direction = 1 Then blnRunning = TrueEnd ifDate 数据类型Date 和 Time 值既可包含在特定的 Date 数据类型中,又可包含在 Variant 变量中。一般的 Date 特性适用于这两种类型。详细信息 请参阅联机手册的“高级变量主题”中的“在 Variant 变量中存储 Date/Time 值”部分。当其它数值数据类型转换为 Date 时,小数点左边的值表示 Date 信息,小数点右边的值则代表 Time。午夜为 0,正午为 0.5。负数表示公元 1899 年 12 月 31 日之前的 Date。Object 数据类型Object 变量作为 32 位(4 个字节)地址来存储,该地址可引用应用程序中或某些其它应用程序中的对象。可以随后(用 Set 语句)指定一个被声明为 Object 的变量去引用应用程序所识别的任何实际对象。Dim objDb As ObjectSet objDb = OpenDatabase (c:Vb5Biblio.mdb)在声明对象变量时,请试用特定的类,而不用一般的 Object(例如用 TextBox 而不用 Control,或者象上面的例子那样,用 Database 取代 Object)。运行应用程序之前,Visual Basic 可以决定引用特定类型对象的属性和方法。因此,应用程序在运行时速度会更快。在“对象浏览器”中列举了特定的类。当使用其它应用程序的对象,并在“对象浏览器”中的“类”列表中列举对象时,不要用 Variant 或一般的 Object,而应声明对象。这样可确保 Visual Basic 能够识别引用的特定类型对象,在运行时解决引用问题。详细信息 关于创建和指定对象以及对象变量的更详细信息,请参阅本章后面的“创建对象”部分。转换数据类型Visual Basic 提供了几种转换函数,可用来将值转换成特定数据类型。例如,用 CCur 函数将值转换成 Currency 类型:PayPerWeek = CCur (hours * hourlyPay)转换函数将表达式转换成CboolBooleanCbyteByteCcurCurrencyCdateDateCDblDoubleCintIntegerCLngLongCSngSingleCStrStringCvarVariantCVErrError注意 对目标数据类型,传递到转换函数的值必须是有效的,否则会发生错误。例如,如果想把 Long 型数转换成 Integer 型数,那么,Long 型数必须在 Integer 数据类型的有效范围之内。详细信息 在联机帮助中查找指定的转换函数。Variant 数据类型Variant 变量能够存储所有系统定义类型的数据。如果把它们赋予 Variant 变量,则不必在这些数据的类型间进行转换; Visual Basic 会自动完成任何必要的转换。例如:Dim SomeValue 缺省为 Variant。SomeValue = 17 SomeValue包含 17(双字符的串)。SomeValue = SomeValue - 15 现在, SomeValue 包含数值 2。SomeValue = U & SomeValue 现在, SomeValue 包含 U2 (双字符的串)。不必过多关注 Variant 变量中数据的类型就可对 Variant 变量进行操作,但须避免落入陷阱。 如果对 Variant 变量进行数学运算或函数运算,则 Variant 必包含某个数。更详细的信息,请参阅联机手册中“高级变量主题”中的“变量中存储的 Numeric 值”部分。 如果正在连接两个字符串,则用 & 操作符而不用 + 操作符。更详细的信息,请参阅联机手册中“高级变量主题”中的“Variant 变量中存储的 Strings”部分。 除了可以像其它标准数据类型一样操作外,Variants 还包含三种特定值:Empty,Null 和 Error。Empty 值有时需要知道是否已将一个值赋予所创建的变量。在赋值之前,Variant 变量具有值 Empty。值 Empty 是异于0、零长度字符串 () 或 Null 值的特定值。可用 IsEmpty 函数测试 Empty 值:If IsEmpty (Z) Then Z = 0当 Variant 变量包含 Empty 值时,可在表达式中使用它;将其作为 0 或零长度字符串来处理,这要根据表达式来定。只要将任何值(包括 0、零长度字符串或 Null)赋予 Variant 变量,Empty 值就会消失。而将关键字 Empty 赋予 Variant 变量,就可将 Variant 变量恢复为 Empty。Null 值Variant 数据类型还可包含一特定值:Null。Null通常用于数据库应用程序,表示未知数据或丢失的数据。 由于在数据库中使用 Null 方法,Null 具有某些唯一的特性: 对包含 Null 的表达式,计算结果总是 Null。于是说 Null 通过表达式“传播”;如果表达式的部分之值为 Null,那么整个表达式的值也为 Null。 将 Null 值、含 Null 的 Variant 变量或计算结果为 Null 的表达式作为参数传递给大多数函数,将会使函数返回 Null。 Null 值经由返回 Variant 数据类型的内在函数传播。 也可用 Null 关键字指定 Null 值。Z = Null也可用 IsNull 函数测试 Variant 变量是否包含 Null 值。If IsNull (X) And IsNull (Y) Then Z = NullElse Z = 0End If如果将 Null 值赋予 Variant 以外的任何其它类型变量,则将出现可以捕获的错误。而将 Null 值赋予 Variant 则不会发生错误,Null 将通过包含 Variant 变量的表达式传播(尽管 Null 并不通过某些函数来传播)。可以从任何具有 Variant 返回值的函数过程返回 Null。除非明确将 Null 赋予变量,否则变量不会设置成 Null 值,所以,如果不在应用程序中使用 Null,就不必书写测试 Null 和处理 Null 的程序。详细信息 关于如何在表达式中使用 Null 的详细信息,请参阅语言参考的“Null”部分。Error 值在 Variant 中,Error 是特定值,指出已发生的过程中的错误状态。但是,与其它类型错误不同,这里并未发生正常的应用程序级的错误处理。因此,程序员或应用程序本身可根据 Error 值进行取舍。利用 CVErr 函数将实数转换成错误值就可建立 Error 值。详细信息 关于如何在表达式中使用 Error 值,请参阅语言参考中的“CVErr 函数”部分。关于错误处理的信息,请参阅“调试代码和处理错误”。有关 Variant 数据类型的更详细信息,请参阅联机手册中的“高级变量主题”。数组如果有过用其它语言编程的经历,那么想必会熟悉数组的概念。由于有了数组,可以用相同名字引用一系列变量,并用数字(索引)来识别它们。在许多场合,使用数组可以缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。数组有上界和下界,数组的元素在上下界内是连续的。因为 Visual Basic对每一个索引值都分配空间,所以不要不切实际声明一个太大的数组。注意 这一部分讨论的数组是程序中声明的变量数组。它们不同于控件数组,控件数组是在设计时通过设置控件的 Index 属性规定的。变量数组总是连续的;与控件数组不同的是,不能从一个数组的中部加载或卸载数组元素。一个数组中的所有元素具有相同的数据类型。当然,当数据类型为 Variant 时,各个元素能够包含不同种类的数据(对象、 字符串 、数值等等)。 可以声明任何基本数据类型的数组,包括用户自定义类型(请参阅 “再论编程”中的“创建自己的数据类型”)和对象变量(请参阅“用对象编程”)。在 Visual Basic 中有两种类型的数组:固定大小的数组 它总是保持同样的大小,以及在运行时大小可以改变的动态数组。在本章后面的“动态数组”中将要详细讨论动态数组。声明固定大小的数组有三种方法声明固定大小的数组,用哪一种方法取决于数组应有的有效范围: 建立公用数组,在模块的声明段用 Public 语句声明数组。 建立模块级数组,在模块的声明段用 Private 语句声明数组。 建立局部数组,在过程中用 Private 语句声明数组。 设定上下界声明数组时,在数组名之后跟一个用括号括起来的上界。上界不得超过 Long 数据类型的范围(-2,147,483,648 到 2,147,483,647)。例如,下列数组声明可出现在模块的声明段:Dim Counters (14) As Integer 15 个元素。Dim Sums (20) As Double 21 个元素。为建立公用数组,直接用 Public 取代 Dim。Public Counters (14) As IntegerPublic Sums (20) As Double在过程之中同样的声明使用 Dim:Dim Counters (14) As IntegerDim Sums (20) As Double第一个声明建立了一个有 15 个元素的数组,其索引号从 0 到 14 。第二个声明建立了一个有 21 个元素的数组,其索引号从 0 到 20 。缺省的下界为 0。为了规定下界,用关键字 To 显式提供下界(为 Long 数据类型):Dim Counters (1 To 15) As IntegerDim Sums (100 To 120) As String在前述声明中,Counters 的索引值范围从 1 到 15,而 Sums 的索引值范围从 100 到 200。包含其它数组的数组有可能建立 Variant 数据类型数组,并与不同数据类型的数组共居一处。以下代码建立两个数组,一个包含整数,而另一个包含 字符串。然后声明第三个 Variant 数组,并将整数和字符串数组放置其中:Private Sub Command1_Click () Dim intX As Integer 声明计数器变量。 声明并放置整数数组。 Dim countersA (5) As Integer For intX = 0 To 4 countersA (intX) = 5 Next intX 声明并放置字符串数组。 Dim countersB (5) As String For intX = 0 To 4 countersB (intX) = hello Next intX Dim arrX (2) As Variant 声明拥有两个成员的新数组。 arrX (1) = countersA () 将其它数组移居到数组。 arrX (2) = countersB () MsgBox arrX (1) (2) 显示每一个数组的成员。 MsgBox arrX (2) (3)End Sub多维数组有时需要追踪记录数组中的相关信息。例如,为了追踪记录计算机屏幕上的每一个像素,需要引用它的 X、Y 坐标。这时应该用多维数组存储值。可用 Visual Basic 声明多维数组。例如,下面的语句声明了一个过程内的 10 10 的二维数组。Static MatrixA (9, 9) As Double可用显式下界来声明两个维数或两个维数中的任何一个:Static MatrixA (1 To 10, 1 To 10) As Double可以将所有这些推广到二维以上的数组。例如:Dim MultiD (3, 1 To 10, 1 To 15)这个声明建立了三维数组,大小为 4 10 15。元素总数为三个维数的乘积,为 600。注意 在增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组。使用 Variant 数组时更要格外小心,因为他们需要更大的存储空间。 用循环操作数组可以用 For 循环嵌套有效的处理多维数组。例如,在 MatrixA 中基于每个元素在数组中的位置为其赋值:Dim I As Integer, J As IntegerStatic MatrixA(1 To 10, 1 To 10) As DoubleFor I = 1 To 10 For J = 1 To 10 MatrixA (I, J) = I * 10 + J Next JNext I详细信息 关于循环的详细信息,请参阅本章后面的“循环结构”部分动态数组数组到底应该有多大才合适,有时可能不得而知。所以希望能够在运行时具有改变数组大小的能力。动态数组就可以在任何时候改变大小。在 Visual Basic 中,动态数组最灵活、最方便,有助于有效管理内存。例如,可短时间使用一个大数组,然后,在不使用这个数组时,将内存空间释放给系统。如果不用动态数组,就要声明一个数组,它的大小尽可能达到最大,然后再抹去那些不必要的元素。但是,如果过度使用这种方法,会导致内存的操作环境变慢。要创建动态数组,请按照以下步骤执行: 1. (如果希望数组为公用数组,则)用 Public 语句声明数组,或者,(如果希望数组为模块级,则)在模块级用 Dim 语句声明数组,或者(如果希望数组为局部数组,则)在过程中用 Static 或 Dim 语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。 2. Dim DynArray ()2. 用 ReDim 语句分配实际的元素个数。 3. ReDim DynArray (X + 1)ReDim 语句只能出现在过程中。与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。ReDim 语句支持这样的语法,它与固定数组中使用的语法相同。对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变。ReDim DynArray (4 to 12)例如,用第一次声明在模块级所建立的动态数组 Matrix1:Dim Matrix1 () As Integer然后,在过程中给数组分配空间:Sub CalcValuesNow () . . . ReDim Matrix1 (19, 29)End Sub这里的 ReDim 语句给 Matrix 分配一个 20 30 的整数矩阵(元素总大小为 600)。还有一个办法,用变量设置动态数组的边界:ReDim Matrix1 (X, Y)注意 您可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非 Unicode 平台上的两倍。保留动态数组的内容每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basi 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve 关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:ReDim Preserve DynArray (UBound (DynArray) + 1)在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)而不可这样编程:ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)详细信息 关于动态数组的更详细信息,请参阅语言参考中的“ReDim 函数”。关于对象数组,请参阅“用对象编程”。判定结构Visual Basic 过程能够测试条件式,然后根据测试结果执行不同的操作。Visual Basic 支持的判定结构有: If.Then If.Then.Else Select Case If.Then用 If.Then 结构有条件地执行一个或多个语句。单行语法和多行块语法都可以使用:If condition Then statementIf condition ThenstatementsEnd IfCondition 通常是比较式,但它可以是任何计算数值的表达式。Visual Basic 将这个值解释为 True 或 False:一个为零的数值为 False,而任何非零数值都被看作 True。若 condition 为 True,则 Visual Basic 执行 Then 关键字后面的所有 statements。可以使用单行或多行语法有条件地执行一个语句(下面两个例子等价):If anyDate Now Then anyDate = NowIf anyDate Now Then anyDate = NowEnd If注意:If.Then 的单行格式不用 End If 语句。如果 condition 为 True 时要执行多行代码,则必须使用多行块 If.Then.End If 语法。If anyDate Now Then anyDate = Now Timer1.Enabled = False 定时器控制失效。End IfIf.Then.Else用 If.Then.Else 块定义几个语句块,执行其中一个语句:If condition1 Thenstatementblock-1ElseIf condition2 Thenstatementblock-2 .Elsestatementblock-nEnd IfVisual Basic 首先测试 condition1。如果它为 False,Visual Basic就测试 condition2,依次类推,直到找到一个为 True 的条件。当它找到一个为 True 的条件时,Visual Basic就会执行相应的语句块,然后执行 End If 后面的代码。作为一个选择,可以包含 Else 语句块,如果条件都不是 True,则 Visual Basic 执行 Else 语句块。If.ThenElseIf 只是 If.Then.Else 的一个特例。注意,可以使用任意数量的 ElseIf 子句,或者一个也不用。可以有一个 Else 子句,而不管有没有 ElseIf 子句。例如,应用程序可以根据菜单控件数组中哪个控件被单击而采取相应的动作:Private Sub mnuCut_Click (Index As Integer) If Index = 0 Then “剪切”命令。 CopyActiveControl 调用通用过程。 ClearActiveControl ElseIf Index = 1 Then “复制”命令。 CopyActiveControl ElseIf Index = 2 Then “清除”命令。 ClearActiveControl Else “粘贴”命令。 PasteActiveControl End IfEnd Sub注意,总是可以添加更多的 ElseIf 块到 If.Then 结构中去。但是,当每个 ElseIf 都将相同的表达式比作不同的数值时,这个结构编写起来很乏味。在这种情况下可以使用 Select Case 判定结构。详细信息 请参阅语言参考中的“If.Then.Else 语句”。Select CaseVisual Basic 提供 Select Case 结构替代 If.Then.Else,从而可在多个语句块中有选择地执行其中一个。Select Case 语句的能力与 If.Then.Else 语句类似,但对多重选择的情况,Select Case 语句使代码更加易读。Select Case 在结构的上方处理一个测试表达式并只计算一次。然后,Visual Basic 将表达式的值与结构中的每个 Case 的值进行比较。如果相等,就执行与该 Case 相关联的语句块。Select Case testexpressionCase expressionlist1statementblock-1Case expressionlist2statementblock-2.Case Elsestatementblock-nEnd Select每一个 expressionlist 是一个或几个值的列表。如果在一个列表中有多个值,就用逗号把值隔开。每一个 statementblock 中含有零个或多个语句。如果不止一个 Case与测试表达式相匹配,则只对第一个匹配的 Case 执行与之相关联的语句块。如果在表达式列表中没有一个值与测试表达式相匹配,则 Visual Basic 执行 Case Else 子句(此项是可选的)中的语句。例如,假定在 If.Then.Else 的例子中要向“编辑”菜单添加命令。为此可以另加一个 ElseIf 子句,或用 Select Case 来写函数:Private Sub mnuCut_Click (Index As Integer) Select Case Index Case 0 “剪切”命令。 CopyActiveControl 调用通用过程。 ClearActiveControl Case 1 “复制”命令。 CopyActiveControl Case 2 “清除”命令。 ClearActiveControl Case 3 “粘贴”命令。 PasteActiveControl Case Else frmFind.Show 显示找到的对话框。 End SelectEnd Sub注意 Select Case 结构每次都要在开始处计算表达式的值。而 If.Then.Else 结构为每个 ElseIf 语句计算不同的表达式。只有在 If 语句和每一个 ElseIf 语句计算相同表达式时,才能用 Select Case 结构替换 If.Then.Else 结构。循环结构循环结构允许重复执行一行或数行代码。Visual Basic 支持的循环结构有: Do.Loop For.Next For Each.Next Do.Loop用 Do 循环重复执行一语句块,且重复次数不定。Do.Loop 语句有几种演变形式,但每种都计算数值条件以决定是否继续执行。如同 If.Then condition 必须是一个数值或者值为 True(非零)或 False(零)的表达式。在下面的 Do.Loop 循环中,只要 condition 为 True 就执行 statements。Do While conditionstatementsLoop当 Visual Basic 执行这个 Do 循环时会首先测试 condition。如果 condition 为 False(零),则跳过所有语句。如果 condition 为 True(非零),则 Visual Basic 执行语句,然后退回到 Do Wh
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 各类标准


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!