第3章 Visual Basic.NET编程基础 Visual Basic.NET编程基础主要是指数据类型、运算符及表达式、基本语句、过程和函数等,这些内容也是其他编程语言的编程基础,只是具体实现方法有差异而已。要掌握Visual Basic.NET的编程方法,必须熟练地掌握这些基本内容。 主要知识点 Visual Basic.NET的基本数据类型 自定义数据类型 Visual Basic.NET变量与常量 Visual Basic.NET运算符与表达式 Visual Basic.NET的基本语句 Visual Basic.NET的数组 过程和函数 程序调试技术
3.1 基本数据类型 数值型 数 据 关键字 占字节 范 围 字节型 Byte 1 0~255 短整型 Short 2 -32768~32767 长整型 Long 8 -232~232 整型 Integer 4 -2147483648~ 2147483647 单精度浮点 Single ±3.4.E-45~ ±3.40E38 双精度浮点 Double ±4.94D-324~ ±1.79D308 大浮点数型 Decimal 16 ±79, 228 ,162 ,514, 264, 337, 593, 543, 950 ,335
3.1 基本数据类型 字符数据类型 Char类型的数据以2个字节的数字形式存储,取值范围从0~65535。每两个字节数值存储一个Unicode字符。 String类型数据是一个字符串,在Visual Basic.NET中,String类型数据是用双引号(” ”)括起来的一串字符,它可存储近20亿个Unicode字符。
3.1 基本数据类型 布尔数据类型 Boolean数据类型的数据只有True 和False两个值,常用于表示逻辑判断的结果。
3.1 基本数据类型 日期数据类型 Date类型的数据以IEEE 8个字节的长整型数值形式存储。 其表示日期的范围从公元1年1月1日到9999年12月31日,时间从00:00:00到23:59:59。 Date型数据依赖于区域设置,任何可识别的日期格式所表示的日期值,都可以存储为Date类型数据。 日期型数据使用时,要注意必须使用#括起来,否则,Visual Basic.NET不能正确识别。例如, #10/22/2002#、 #2002.10.22#、 #10/22/2002 12:30:02PM#。
3.1 基本数据类型 类型转换函数 Asc 函数 CBool 函数 CByte 函数 CCur 函数 CDate 函数 CDbl 函数 Chr 函数 CInt 函数 CLng 函数 CSng 函数 CStr 函数 Hex 函数 Oct 函数
3.1 基本数据类型 类型转换函数 函数名 返回数据类型 expression 参数范围 CBool Boolean 任何有效的 Char、String 或数值表达式。 CByte Byte 0 到 255(无符号);舍入小数部分。1 CChar Char 任何有效的 Char 或 String 表达式;只转换 String 的第一个字符;值可以为 0 到 65535(无符号)。 CDate Date 任何有效的日期和时间表示法。
3.1 基本数据类型 类型转换函数 函数名 返回数据类型 expression 参数范围 CDbl Double 绝对值范围为 1.79769313486231570E+308 到 4.94065645841246544E-324; CDec Decimal 对于零变比数值,即无小数位数值,为 +/-79,228,162,514,264,337,593,543,950,335。对于具有 28 位小数位的数字,范围是 +/-7.9228162514264337593543950335。最小的可用非零数是 0.0000000000000000000000000001 (+/-1E-28)。 CInt Integer -2,147,483,648 到 2,147,483,647;舍入小数部分。 CLng Long -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807;舍入小数部分。
3.1 基本数据类型 类型转换函数 函数名 返回数据类型 expression 参数范围 CObj Object 任何有效的表达式。 CSByte SByte -128 到 127;舍入小数部分。 CShort Short -32,768 到 32,767;舍入小数部分。 CSng Single 负值的取值范围为 -3.402823E+38 到 -1.401298E-45;正值的取值范围为 1.401298E-45 到 3.402823E+38。
3.1 基本数据类型 类型转换函数 函数名 返回数据类型 expression 参数范围 CStr String 数据类型 CStr 的返回值取决于 expression 参数。 CUInt UInteger 数据类型 0 到 4,294,967,295(无符号);舍入小数部分。 CULng ULong 数据类型 0 到 18,446,744,073,709,551,615(无符号);舍入小数部分。 CUShort UShort 数据类型 0 到 65,535(无符号);舍入小数部分。
Object类型的数据以4个字节的地址形式存储,即Object数据类型只记录某一个数据的地址,并不是真正记录那个数据。 3.1 基本数据类型 对象数据类型 Object类型的数据以4个字节的地址形式存储,即Object数据类型只记录某一个数据的地址,并不是真正记录那个数据。
在 Visual Basic.NET中,除了上述的基本数据类型外,还提供了自定义数据类型。 自定义数据类型一般由若干个基本数据类型组成。 3.2自定义数据类型 在 Visual Basic.NET中,除了上述的基本数据类型外,还提供了自定义数据类型。 自定义数据类型一般由若干个基本数据类型组成。 它必须在模块的声明部分使用Structure语句定义,其类型分为Private和Public两种。 它的一般形式是: [Private│Public] Structure 自定义类型名 元素名 AS类型 … 元素名 AS 类型 End Structure
3.2自定义数据类型 例如,定义一个有关学生信息的自定义数据类型: Public Structure Student Stuno As Integer '学号 Stuname As String(10) '姓名 Stuage As Integer '年龄 End Structure 定义好自定义数据类型后,就可以在变量声明中使用该类型。例如: Dim a As Student 要引用自定义数据类型变量中的某个元素,可使用以下形式: 变量名.元素名 例如:要引用学生的姓名可写成: a.Stuname
变量就是指在程序运行期间,它的值随着需要而发生变化的量。 3.3变量与常量 变量就是指在程序运行期间,它的值随着需要而发生变化的量。 通常,变量在程序中用于临时存储数据,因数据类型不同,变量所占用的存储空间也有所不同。 变量的命名规则 变量名须以英文字母或下划线开头。 变量名所用的字符只能由字母、数字和下划线组成,不能含有标点、空格等其他字符。 如果是下划线开头必须至少包括一个字母或数字。 变量名不能使用Visual Basic.NET的关键字。 长度不能超过16,383个字符。
3.3变量与常量 使用Dim 语句声明变量 Dim语句声明变量格式如下: Dim 变量名 As 数据类型[=初始值] 在使用变量之前,应先声明变量,这是一种良好的程序设计风格。 在应用程序中,使用Dim 语句可以声明变量,并且可以给变量赋初始值。 Dim语句声明变量格式如下: Dim 变量名 As 数据类型[=初始值] 用方括号括起来的“=初始值”子句表示是可选项,使用这个子句,可以给声明的变量赋初始值。 例如: Dim x As Integer Dim Sum As Single = 5.1
Public语句在模块级使用,用于声明全局变量。全局变量可以在所有模块的所有过程中使用。 3.3变量与常量 Public语句在模块级使用,用于声明全局变量。全局变量可以在所有模块的所有过程中使用。 Private语句在模块级使用,用于声明模块级变量。模块级变量可以在本模块的所有过程中使用。 Static语句,使用Static声明的变量称为静态变量,它与Dim语句声明的变量不同之处在于 执行一个过程结束时,过程中用Static声明的变量值会保留, 下次再调用此过程时,变量的初值是上次调用该过程结束时被保留的值, 而使用Dim语句声明的变量在过程结束时,变量值不保留,每次调用时都重新初始化。
3.3变量与常量 隐式声明 在使用变量时,Visual Basic.NET不要求对变量都事先声明,不加声明的变量系统默认为是Object类型。 在应用程序中,也可以使用类型符隐含声明变量的数据类型。例如 X%是一个Integer变量 Y&是一个Long型变量 Z!是一个Single型变量 W#是一个Double型变量等
3.3变量与常量 在应用程序中,不经声明而使用的变量,称为变量的隐式说明。 为了使程序具有较好的可读性,并利于对程序的调试和维护,建议应尽量避免使用事先未声明的变量。
Const常量名 [As 数据类型]=表达式 3.3变量与常量 常量是指在程序运行期间,其值始终保持不变的量。定义常量使用Const语句,其格式如下: Const常量名 [As 数据类型]=表达式 例如: Const Pi = 3.14159 ‘定义常量Pi,单精度浮点型 Const Max As Integer = 266 '定义常量Max为整型
3.3变量与常量 范围级别 编程元素(包括变量等)在声明它的整个区域内都可用。 同一区域内的所有代码不用限定元素的名称即可引用元素。 级别 说明 块范围 只适用于在其中声明元素的代码块 过程范围 适用于在其中声明元素的过程中的所有代码 模块范围 适用于在其中声明元素的模块、类或结构中的所有代码 命名空间范围 适用于在其中声明元素的命名空间中的所有代码
3.3变量与常量 块范围 块是初始声明语句与终止声明语句之间的一组语句,如下所示: Do 和 Loop For [Each] 和 Next If 和 End If Select 和 End Select SyncLock 和 End SyncLock Try 和 End Try While 和 End While With 和 End With 在某个块声明的变量只能在该块中使用。 下例中,整数变量 cube 的范围是 If 和 End If 之间的块,并且,在执行超出该块后便不能再引用 cube。 If n < 1291 Then Dim cube As Integer cube = n ^ 3 End If
只有包含元素声明的过程才能使用该元素。该级别的变量也称为“局部变量”。 使用 Dim 语句 声明这些变量 过程范围和块范围密切相关。 3.3变量与常量 过程范围 在某过程内声明的元素在该过程外不可用。 只有包含元素声明的过程才能使用该元素。该级别的变量也称为“局部变量”。 使用 Dim 语句 声明这些变量 过程范围和块范围密切相关。 如果在过程内但在该过程内的任何块外声明变量,则可将该变量看作具有块范围,其中块就是整个过程。
3.3变量与常量 模块范围 术语“模块级别”同等地应用于模块、类和结构。 可以通过将声明语句放在模块、类或结构中的任一过程或块的外部来声明该级别的元素。 当在模块级声明时,由所选的访问级别确定范围。包含模块、类或结构的命名空间也影响范围。 为其声明 Private 访问级别的元素可用于该模块内的每个过程,但不能用于其他模块中的任何代码。 如果不使用任何访问级别关键字,则模块级 Dim 语句默认为 Private。
3.3变量与常量 示例 所有在模块中定义的过程均可以引用字符串变量 strMsg。当调用第二个过程时,它在对话框中显示字符串变量 strMsg 的内容。 ' Put the following declaration at module level (not in any procedure). Private strMsg As String ' Put the following Sub procedure in the same module. Sub initializePrivateVariable() strMsg = "This variable cannot be used outside this module." End Sub Sub usePrivateVariable() MsgBox(strMsg)
3.3变量与常量 命名空间范围 如果使用 Friend 或 Public 关键字声明模块级元素,则该元素变为可用于在其中声明该元素的整个命名空间内的所有过程。 对上述示例进行如下更改后,字符串变量 strMsg 可由它的声明命名空间内任意位置的代码引用。 ' Include this declaration at module level (not inside any procedure). Public strMsg As String
3.3变量与常量 局部变量的优点 对于任何类型的临时计算,局部变量都是很好的选择: 可避免名称冲突。局部变量名称不易发生冲突。 例如,可以创建若干个不同的过程,每个过程都包含称为 intTemp 的变量。只要每个 intTemp 都被声明为局部变量,各过程就只识别自己版本的 intTemp 变量。 任何一个过程都可以修改其局部变量 intTemp 的值,而不会影响到其他过程中的 intTemp 变量。
3.3变量与常量 声明变量时选择其范围时的注意 内存消耗。 将范围最小化 局部变量只在其过程运行时占用内存。当过程返回到调用代码时,会释放其内存。 Shared 和 Static 变量在应用程序停止运行前将一直占用内存资源,因此,仅在必要时使用这些变量。 实例变量在其实例继续存在的同时占用内存,因此不如局部变量有效,但可能会比 Shared 或 Static 变量更为有效。 将范围最小化 一般情况下,在声明任何变量或常数时,使其范围尽可能窄(块范围最窄)是好的编程习惯。 这有助于保留内存,并可最大限度地减少代码错误地引用错误变量的机会。 同样,仅当有必要在过程调用之间保留值时,才应将变量声明为 Static 。
3.3变量与常量 VB中控制变量的范围的方法 块级别或过程级别的范围 模块级别或命名空间级别上的范围
3.3变量与常量 块级别或过程级别的范围 使变量仅在块内可见 使变量仅在过程内可见 将变量的 Dim 语句 放置在块的起始和终止声明语句之间 如在 For 循环的 For 和 Next 语句之间。 该变量只能在块内引用。 使变量仅在过程内可见 将变量的 Dim 语句放置在过程内部,所有块的外部 如 With...End With 块外。 该变量只能在该过程(包括过程内包含的所有块)内引用。
3.3变量与常量 模块级别或命名空间级别上的范围 使变量在整个模块、类或结构内可见 使变量在整个命名空间内可见 将变量的 Dim 语句放置在模块、类或结构的内部,所有过程的外部。 将 Private 关键字包含在 Dim 语句中。 从模块、类或结构内部的任何位置都可以引用该变量,但是不能从外部引用。 使变量在整个命名空间内可见 将 Friend 或 Public 关键字包含在 Dim 语句中。 从包含该模块、类或结构的命名空间中的任何位置都可以引用该变量。
3.3变量与常量 示例 下面的示例在模块级别声明一个变量,并限制其可见性,只有模块中的代码才能访问。 Module demonstrateScope Private strMsg As String Sub initializePrivateVariable() strMsg = "This variable cannot be used outside this module." End Sub Sub usePrivateVariable() MsgBox(strMsg) End Sub End Module 在模块 demonstrateScope 中定义的所有过程都可以引用 String 变量 strMsg。调用 usePrivateVariable 过程时,在对话框中显示字符串变量 strMsg 的内容。 对示例进行如下更改后,字符串变量 strMsg 可由它的声明命名空间内任意位置的代码引用。 Public strMsg As String
Visual Basic 中的访问级别 已声明元素的“访问级别”是指能够对其进行访问的程度,即什么代码对其具有读取或写入权限。 这不仅取决于元素本身的声明方式,还取决于元素容器的访问级别。 不能访问包含元素的代码也不能访问该元素中包含的任何元素,甚至那些声明为 Public 的元素也不例外。 例如,Private 结构中的 Public 变量可从包含该结构的类内部访问,但不能从该类的外部访问。
Visual Basic 中的访问级别 Public 声明语句中的 Public 关键字表明可从以下位置访问元素: 同一项目中任意位置的代码, 引用该项目的其他项目, 以及由该项目生成的任何程序集。 Public Class classForEverybody 可以在源文件级别或命名空间级别,或者在接口、模块、类或结构内部声明 public 元素, 不能在过程内声明public 元素。
Visual Basic 中的访问级别 Protected Protected Class classForMyHeirs 仅可以在声明类的成员时和仅在类级别使用 Protected。 不能在源文件级或命名空间级,或者在接口、模块、结构或过程内部声明。
Visual Basic 中的访问级别 Friend Friend stringForThisProject As String 可以在源文件级别或命名空间级别,或者在接口、模块、类或结构内部声明 friend 元素, 不能在过程内声明。
Visual Basic 中的访问级别 Protected Friend 派生类或同一程序集内 或两者皆可。 Protected Friend stringForProjectAndHeirs As String 可以在类中声明 protected friend 元素 不能在源文件级别或命名空间级别,或者在接口、模块、结构或过程内声明它。
Visual Basic 中的访问级别 Private 声明语句中的 Private 关键字表明仅可以从同一模块、类或结构内访问元素。 Private numberForMeOnly As Integer 仅可以在模块、类或结构内部声明 private 元素 不能在源文件级别或命名空间级别、接口内部或者过程内声明它。 在模块级别,不带任何访问级别关键字的 Dim 语句与 Private 声明等效。 但使用 Private 关键字使代码更容易阅读和解释。
Visual Basic 中的访问级别 访问修饰符 授予的访问级别 Public Protected Friend 无限制: 可看到 public 元素的任何代码均可以访问它 Protected 派生的: 声明 protected 元素的类(或该类的派生类)中的代码可访问该元素 Friend 程序集: 声明 friend 元素的程序集中的代码可以访问该元素 Protected Friend Protected 和 Friend 的联合: 与 protected friend 元素位于同一个类或同一个程序集中的代码,或者从该元素的类派生的任何类中的代码均可访问该元素 Private 声明上下文: 声明 private 元素的类型(包括该类型的子类型)中的代码可访问该元素
Visual Basic 中的访问级别 VB控制变量的可用性的方法 可通过指定变量的“访问级别”来控制变量的可用性。访问级别决定什么样的代码有权读或写变量。 “成员变量”(在模块级别上并且在任何过程外部定义)默认为公共访问, 任何可以看见变量的代码都可以访问变量。 可通过指定访问修饰符来改变此设置。 “局部变量”(在过程内部定义)名义上具有公共可访问性,但只有局部变量所在的过程内的代码可以访问局部变量。 不能更改局部变量的访问级别 但可以更改包含局部变量的过程的访问级别。
Visual Basic 中的访问级别 专用访问和公共访问 使变量只能从它的模块、类或结构内被访问 使变量可由任何可以看见它的代码访问 在模块、类或结构内,但在任何过程外部放置变量的 Dim 语句。 将 Private 关键字包含在 Dim 语句中。 然后就可以从模块、类或结构内的任何位置(而不能从外部)读或写该变量。 使变量可由任何可以看见它的代码访问 对于成员变量,在模块、类或结构内,但在任何过程外部放置变量的 Dim 语句。 将 Public关键字包含在 Dim 语句中。 然后就可以从任何与您的程序集交互的代码读或写该变量。 - 或 - 对于局部变量,在过程内放置变量的 Dim 语句。 不要将 Public 关键字包含在 Dim 语句中。 然后就可以从该过程内的任何位置(而不能从该过程外)读或写该变量。
Visual Basic 中的访问级别 受保护访问与友元访问 使变量只能从它的类或任何派生类内被访问 在类的内部,但在任何过程外部放置变量的 Dim 语句。 将 Protected 关键字包含在 Dim 语句中。 然后就可以从类内的任何位置以及从任何派生类的内部(而不能从派生链中的任何类的外部)读或写该变量。 使变量只能从同一程序集内被访问 在模块、类或结构的内部,但在任何过程外部放置变量的 Dim 语句。 将 Friend 关键字包含在 Dim 语句中。 然后就可以从模块、类或结构内的任何位置,以及从同一程序集中的任何代码(而不能从程序集外部)读或写该变量 可以将变量的访问级别限定为该变量的类或任何派生类的级别,或者限定为该变量的程序集的级别。也可以指定这些限制的并集,以允许从任何派生类中的代码或同一程序集中的任何其他位置的代码访问该变量。可以通过在同一声明中组合 Protected 和 Friend 关键字来指定此并集。 41
Visual Basic 中的访问级别 示例显示了具有 Public、Protected、Friend、Protected Friend 和 Private 访问级别的变量的声明。 注意,当 Dim 语句指定访问级别时,不需要包括 Dim 关键字。 Public Class classForEverybody Protected Class classForMyHeirs Friend stringForThisProject As String Protected Friend stringForProjectAndHeirs As String Private numberForMeOnly As Integer
Visual Basic 中的访问级别 安全可靠编程 变量的范围越小 变量的访问级别越严格 引用另一个同名变量时不小心引用到该变量的机会就越少。也可以将引用匹配的问题减至最少。 变量的范围越窄,恶意代码非正当使用该变量的机会就越少。 变量的访问级别越严格 恶意代码可以不正当使用该变量的机会就越小。
Visual Basic 中的访问级别 变量作用范围的使用 变量应该总是被定义在尽可能小的范围内。 慎用全局变量(Public) 全局变量可以导致极其复杂的程序结构 使一个应用程序的逻辑非常难于理解。 全局变量使代码的重用和维护更加困难 只有当没有其它方便途径在窗体、模块之间共享数据时才使用全局变量。必须用时,在一个模块中声明并按功能分组。给这个模块取一个有意义的名称,以指明它的作用
Visual Basic.NET中运算符按功能可分为4类 3.4 运算符和表达式 Visual Basic.NET中运算符按功能可分为4类 算术(Arithmetic)运算符 连接(Concatenation)运算符 比较运算符(Comparision)运算符 逻辑(Logical)运算符 若一个表达式同时拥有这4类运算符,则 算术运算符优先级最高, 连接运算符次之, 逻辑运算符优先级最低.
3.4 运算符和表达式 算术运算符 算术运算符 名称 优先级 ^ 乘方 1 - 负号 2 *、/ 乘除 3 \ 整除 4 Mod 取模 5 +、- 加减 6
连接运算符有两个:“&”和“+”,它们的作用都是将两个字符串连接起来。例如: 3.4 运算符和表达式 连接运算符有两个:“&”和“+”,它们的作用都是将两个字符串连接起来。例如: “软件”+“与硬件” 结果为“软件与硬件” “VB”&“.NET” 结果为“VB.NET” 连接运算符“& ”与“+”的区别是: “+”连接符不仅能对字符串作连接操作,而且也能对数值型数据作加减运算。 但“+”连接符两边的操作数应为相同数据类型,若一个为字符型,另一个为数值型则出错。 “&”连接符两边的操作数,不管是字符型还是数值型,进行连接操作前,系统先将操作数转换成字符型,然后再连接。
3.4 运算符和表达式 比较运算符 = 等于 > 大于 >= 大于等于 < 小于 <= 小于等于 <> 功能 = 等于 > 大于 >= 大于等于 < 小于 <= 小于等于 <> 不等于 Like 字符串匹配,匹配为真 Is 对象引用比较,一致为真 IsNot 对象引用比较,不一致为真
3.4 运算符和表达式 运算符 功 能 优先级 Not 取数 1 And 与 2 AndAlso 3 Or 或 4 OrElse 5 Xor 功 能 优先级 Not 取数 1 And 与 2 AndAlso 3 Or 或 4 OrElse 5 Xor 异或 6 逻辑运算符
Short-Circuiting(短路法) by Using AndAlso and OrElse an example of the short-circuit situation in Visual Basic, a simple routine that uses an If statement and an AndAlso operator to test two conditions and display the message “Inside If” if both conditions are True: Dim Number As Integer = 0 If Number = 1 AndAlso MsgBox("Second condition test") Then MsgBox("Inside If") Else MsgBox("Inside Else") End If
表达式是由变量、常量、运算符、对象和圆括号按一定的规则组成,每一个表达式都产生唯一的运算结果, 运算结果的类型由数据和运算符共同决定。 3.4 运算符和表达式 表达式是由变量、常量、运算符、对象和圆括号按一定的规则组成,每一个表达式都产生唯一的运算结果, 运算结果的类型由数据和运算符共同决定。 在Visual Basic.NET中有4类运算符,对应也有4类表达式: 算术表达式, 字符串表达式, 关系表达式和 布尔表达式。
3.4 运算符和表达式 算术表达式也称为数值型表达式,由算术运算符,数值型常量、变量、函数和圆括号组成,其运算结果为一数值。 在算术表达式中,如果操作数具有不同的数据精度,则Visual Basic.NET 规定运算结果的数据类型采用精度高的数据类型。即: Short<Integer<Long<Single<Double<Decimal
字符串表达式由字符串常量、字符串变量、字符串函数和连接运算符组成。 3.4 运算符和表达式 字符串表达式由字符串常量、字符串变量、字符串函数和连接运算符组成。
3.4 运算符和表达式 关系表达式是用比较运算符将两个表达式连接起来的式子(如a+b>c+d),用来对两个表达式的值进行比较,比较结果为一个布尔值(True或False).
布尔表达式是用逻辑运算符连接若干关系表达式,或布尔值而构成的式子,如 3.4 运算符和表达式 布尔表达式是用逻辑运算符连接若干关系表达式,或布尔值而构成的式子,如 (a<=X)and(x<=B) 布尔表达式的值也是一个布尔值。
3.5 基本语句 赋值语句是程序设计中最基本、最常用的语句,它的格式为: 变量名=表达式 在赋值语句中,赋值符号“=”的作用是把右边表达式的值赋给左边的变量。 在Visual Basic.NET中,可在“=”赋值符号前加上其他操作符,构成复合操作符。 如“+=”、“-=”、“*=”、“/=”、“ \=”“ &=”、“ ^=”等都是复合操作符。 例如: A+= 10 就相当于 A=A+10 X*= Y+10 就相当于 X = X*(Y+10)。
3.5 基本语句 控制程序执行 使用条件语句和循环语句可以控制程序的流程。 使用条件语句可以编写进行判断和重复操作的 VB 代码。 If...Then...Else 语句 Select Case 语句
条件语句就是对条件进行判断,根据判断结果选择执行不同的分支。 1. IF … Then语句(单分支结构) 语句格式如下: 3.5 基本语句 条件语句就是对条件进行判断,根据判断结果选择执行不同的分支。 1. IF … Then语句(单分支结构) 语句格式如下: IF<条件>Then <语句块> End If 条件 语句块 F T
3.5 基本语句 myDate = #2/13/95# If myDate < Now Then myDate = Now If中要运行多行代码,必须使用多行(或块)语法。多行(或块)语法包含 End If 语句 If value = 0 Then AlertLabel.ForeColor=vbRed AlertLabel.Font.Bold=True AlertLabel.Font.Italic=True End If
2 .If … Then … Else(双分支结构) 语句格式如下: If〈条件〉Then 〈语句块1〉 Else 〈语句块2〉 3.5 基本语句 2 .If … Then … Else(双分支结构) 语句格式如下: If〈条件〉Then 〈语句块1〉 Else 〈语句块2〉 End If 条件 语句块1 语句块2 T F
3.5 基本语句 3. If...Then...Else If语句(多分支结构) 语句格式如下: If<条件>Then <语句块1> Else If<条件2>Then <语句块2> …… Else If<条件n>Then <语句块n> Else <语句块n+1> End If
3.5 基本语句 条件1 条件2 条件n 语句块n+1 语句块n 语句块2 语句块1 T F
3.5 基本语句 If value = 0 Then MsgBox value ElseIf value = 1 Then MsgBox value ElseIf value = 2 then Msgbox value Else Msgbox “数值超出范围!” End If 可以添加任意多个 ElseIf 子句以提供多种选择。使用多个 ElseIf 子句经常会变得很累赘。在多个条件中进行选择的更好方法是使用 Select Case 语句。
3.5 基本语句 4. If 语句的嵌套 If语句的嵌套是指If或Else后面的语句块中又包含If语句。语句形式如下: If〈条件1〉Then If〈条件2〉Then … End If Else If<条件3>Then
3.5 基本语句 5. Select Case语句(分情况语句) 语句格式如下: Select Case 变量或表达式 语句块1 Case 表达式列表2 语句块2 … Case 表达式列表n 语句块n [Case Else 语句块n+1] End Select Select Case 结构在其开始处使用一个只计算一次的简单测试表达式。 表达式的结果将与结构中每个 Case 的值比较。 如果匹配,则执行与该 Case 关联的语句块: 表达式1 表达式2 表达式n 语句块1 语句块2 语句块n 语句块n+1 T F
3.5 基本语句 Select Case语句例子代码 Select Case text Case "a" sub_a Case "b" sub_b Case "c" sub_c Case Else sub_d End Select
循环是指在指定的条件下,多次重复执行一组语句的结构。 被重复执行的一组语句被称为循环体。 3.5 基本语句 循环是指在指定的条件下,多次重复执行一组语句的结构。 被重复执行的一组语句被称为循环体。 循环语句功能强大,在程序设计中,当需要处理不断重复执行的一组计算和操作时,通常都使用循环语句来实现。 Visual Basic.NET中提供了多种形式的循环语句: While循环语句、 For…Next循环语句、 Do…Loop循环语句和 For Each...Next 循环语句等。
3.5 基本语句 1. While循环语句 While循环语句用于根据指定条件来执行循环的情况,语句格式如下: While〈条件〉 循环体 End While “条件”是一个逻辑值,即True或False,当“条件为True时,就执行一次循环体;如果条件为False,那么退出循环体,开始执行End While后面的其他语句。
3.5 基本语句 2. For … next 循环语句 For … next 循环语句常被用于已知循环次数来执行循环的情况,语句格式如下: For〈循环变量〉=〈初值〉To〈终值〉[Step步长] 循环体 Next循环变量 语句中的循环变量一般为整型,步长默认值时,其值为1。可以在循环体中的任何位置放置Exit For语句,随时提前退出循环。
要使计数器变量递减,可将 Step 设为负值。此时计数器变量的终止值必须小于起始值 3.5 基本语句 要使计数器变量递减,可将 Step 设为负值。此时计数器变量的终止值必须小于起始值 Dim myNum, total For myNum = 16 To 2 Step -2 total = total + myNum Next
3.5 基本语句 3. DO…Loop循环语句 DO…Loop循环语句类似While循环语句,都是用于循环次数未知的循环结构。该语句有4种格式: (1) Do While…Loop循环语句 语句格式如下: Do While <条件> <循环体> Loop 这是先判断条件的当循环语句,只要条件为True就执行循环体,条件为False时,则终止循环。
MsgBox "循环重复了 " & counter & " 次。" 当条件为 True 时重复执行语句 Dim counter, myNum counter = 0 myNum = 20 Do While myNum > 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "循环重复了 " & counter & " 次。"
3.5 基本语句 (2) Do…Loop While循环语句 语句格式如下: Do <循环体> Loop While<条件> 这是后判断条件的当循环语句,与格式(1)不同之处在于,先执行循环体,然后判断条件,决定是否继续执行循环。 也就是说,第一次进入循环体是无条件的,无论如何都至少要执行一次循环体。
这是直到型循环语句,是在条件为真时,终止循环,条件为假时,则执行循环体。 3.5 基本语句 (3) Do Until…Loop循环语句 语句格式如下: Do Until<条件> <循环体> Loop 这是直到型循环语句,是在条件为真时,终止循环,条件为假时,则执行循环体。
3.5 基本语句 (4)Do…Loop Until循环语句 语句格式如下: Do <循环体> Loop Until<条件> 这种格式的直到型循环语句与格式(3)不同之处在于,先进入循环体,后进行判断.因此循环体至少被无条件执行一次。 可以在上述格式的Do…Loop循环语句的循环中,放置Exit Do语句,随时退出循环。
3.5 基本语句 4. For Each...Next 循环语句 For Each...Next 循环语句是新增加的一种循环语句类型,用于当需要为集合或数组的每个元素重复执行一组语句时,来执行循环的情况,语句格式如下: For Each 集合或数组中元素 In 集合或数组 [ 语句 ] [ Exit For ] Next [ 元素 ] Exit For 可选项,用于将控制转移到 For Each 循环外。
For Each...Next 循环与 For...Next 循环类似。 3.5 基本语句 For Each...Next 循环与 For...Next 循环类似。 For Each...Next 不是将语句运行指定的次数,而是对于数组中的每个元素或对象集合中的每一项重复一组语句。 这在不知道集合中元素的数目时非常有用。 For Each element In group statements Next element
3.5 基本语句 5. 循环的嵌套 在有些情况下,可能需要在一个循环的循环体中,又包含一个完整循环语句,这种结构称作循环嵌套。循环嵌套可以是同一种类循环语句的嵌套,也可以是不同种类的循环语句嵌套在一起。对于一个嵌套结构的循环,有几层嵌套就称为有几重循环。 例如,要打印一个小学生常常背的九九乘法表,就可以使用二重循环,其程序段如下: Dim I, j As Integer '定义两个工作变量 For I = 1 To 9 j = 1 While j <= I Debug.Write(j & "X" & I & "=" & I * j & " ") '在输出窗口输出 j += 1 End While Debug.WriteLine(" ") '换行 Next I
3.5 基本语句 这个程序段的输出结果如下: 1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 1×4=4 2×4=8 3×4=12 4×4=16 1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
数组是一组按一定顺序排列,且具有相同类型的数据的集合。 使用数组可用一个数组名代表逻辑上相关的一批数据,用下标表示该数组中的各个元素, 3.6 数组 数组是一组按一定顺序排列,且具有相同类型的数据的集合。 使用数组可用一个数组名代表逻辑上相关的一批数据,用下标表示该数组中的各个元素, 在程序设计中数组与循环语句配合使用,可使程序结构简洁、清晰。
3.6 数组 一维数组是指使用一个下标来区分数组中各元素的数组。数组的声明与其他变量的声明一样,使用Dim语句。 声明一维数组格式如下: Dim 数组名(下标) As 类型 数组名的命名规则与变量名相同, 数组下标必须为常量,不可为表达式或变量, 数据类型是数组的数椐类型,即数组中各个元素的数据类型。
3.6 数组 在数组中使用索引为数组的每个元素赋值。 A(0) = 256 A(1) = 324 . . . A(10) = 55 与此类似,使用索引可以检索到所需的数组元素的数据。 SomeVariable = A(8)
Dim 数组名(下标1[,下标2…])As 类型 3.6 数组 数组可以是一维,也可以是多维。 数组下标的个数称为维数。 声明多维数组与声明一维数组类似, 也是使用Dim语句, 只不过在括号中有多个数值, 几维数组就有几个数值。 声明多维数组格式如下: Dim 数组名(下标1[,下标2…])As 类型
3.6 数组 例如,一个2×3矩阵 声明一个二维数组,并对数组初始化的程序段如下: Dim A(1,2) As Integer Dim i, j As Integer For i = 0 To 1 For j = 0 To 2 A(i, j) = 0 Next j Next i
3.6 数组 数组并不仅限于一维。 数组的维数最大可以为 32(尽管大多数人不能理解超过 3 或 4 的维数)。 Dim MyTable(5, 10) as <数据类型> 注意 在增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组。 使用 object 数组时更要格外小心,因为他们需要更大的存储空间
3.6 数组 动态数组 在程序设计中,有时很难估计数组到底需要多大,这时可使用动态数组。动态数组是在任何时候可以改变数组大小的数组。 建立动态数组一般分两个步骤: (1)在声明一个数组时,可以不指定它的长度,声明一个维数为空的数组,如 DIM A() AS Single (2)在程序中需要使用该数组时,可以使用ReDim语句来定义它的大小。,ReDim语句的格式如下: ReDim 数组名(下标1[,下标2…]) 例如, Dim A() As String … ReDim A(20)
3.6 数组 注意: 使用ReDim语句重新定义一个数组时,也不能改变数组的类型,除非数组类型定义为Object类型。 如下面的定义是非法的: Dim A() As String … ReDim A(10) As Char 使用ReDim语句重新定义一个数组时,数组原有的值通常会丢失,但可在ReDim语句中,使用Preserve关键字来保持这些值。 如果在ReDim语句中使用Preserve关键字,那么只能改变数组最后一维的大小。
过程和函数 在Visual Basic.NET中, 是程序中能完成某种特定功能的一组独立的程序代码, 它们可以被多次调动和执行。 3.7 过程与函数 过程和函数 是程序中能完成某种特定功能的一组独立的程序代码, 它们可以被多次调动和执行。 在Visual Basic.NET中, 过程一般用Sub声明, 函数一般用Function声明, 它们之间的主要区别是函数一定要有返回值。
过程: Visual Basic.NET的过程分为事件过程和通用过程两大类。 3.7 过程与函数 过程: Visual Basic.NET的过程分为事件过程和通用过程两大类。 事件过程是当某个事件发生时,对该事件作出响应的独立程序段。 通用过程是可供应用程序调用,完成一定功能的独立程序段。 在很多情况下,有一些相同或相似的代码段,在编程时会经常用到, 为了精简程序代码并便于程序的调试,可将这段代码独立出来,编写一个可供应用程序调用的公共过程, 这种过程通常称为通用过程。
3.7 过程与函数 事件过程 当某个对象对一个事件的发生作出响应时,Visual Basic.NET会自动地执行与该事件相关的事件过程。 所有的事件过程都使用相同的语法。 其语法格式如下: Private Sub 对象名_事件名([形参表]) 语句组 End Sub
3.7 过程与函数 通用过程 定义通用过程的一般格式如下: 通用过程与事件过程不同,它不是由对象的某个事件激活,也不依附于某一对象,只能由别的过程来调用, 它可以放在窗体文件或模块文件中。 定义通用过程的一般格式如下: [Public|Private|Static] Sub 过程名([形参表]) 语句组 End Sub
在Visual Basic.NET中,包含了许多内部函数 在编写程序时,只需写出函数名和相应的参数,就可得到函数值。 3.7 过程与函数 函数是过程的另一种形式。 它与过程不同的是 函数可以返回一个值给调用它的程序。 在Visual Basic.NET中,包含了许多内部函数 如len( )、Sqrt() 等。 在编写程序时,只需写出函数名和相应的参数,就可得到函数值。 此外,在应用程序设计中,也可以使用Function语句,根据需要自定义函数
由于函数带有返回值,所以在定义函数时,要用“As类型”来说明返回值的类型 在函数定义中两种返回值的方法 3.7 过程与函数 定义函数的一般格式如下: [Public| Private | Static] Function函数名(形参表)As 类型 语句 函数名=表达式|Reture 表达式 End Function 由于函数带有返回值,所以在定义函数时,要用“As类型”来说明返回值的类型 在函数定义中两种返回值的方法 可通过赋值语句将表达式的值赋值给函数名,该值就是函数的返回值。 也可直接用Return语句来返回函数值
3.7 过程与函数 过程和函数的建立 在Visual Basic.NET中,被窗体,或模块内的其他过程调用的局部过程或函数,可以直接在窗体文件中建立,即打开代码编辑窗口,与编写事件过程一样,编写局部过程或函数。
将通用过程或函数建立在模块文件中的步骤如下: 3.7 过程与函数 将通用过程或函数建立在模块文件中的步骤如下: 选择“项目”菜单中的“添加模块”命令打开如图所示的“添加新项”窗口;
3.7 过程与函数 在“添加新项”窗口的右边的“模板”框内选择“模块”,在下面名称文本框中输入模块文件名。(如Module1.Vb”),然后单击“打开”命令按钮,则在代码窗口中显示出建立该模块的模板如图 在Module和End Module之间输入通用过程或函数的代码; 选择“文件”菜单的“保存Module1.Vb”命令,则所建立的通用过程或函数,就保存在该模块文件之中了。
在Visual Basic.NET中,有两种方法调用通用过程: 3.7 过程与函数 通用过程的调用 在Visual Basic.NET中,有两种方法调用通用过程: 直接使用通用过程名调用该过程,其格式如下: 通用过程名([实参表]) 使用Call关键字调用通用过程,其格式如下: Call 通用过程名([实参表]) 在过程前面使用了Call关键字的调用发方式,由于,可以使程序的可读性增强,检测程序时,可以很明显地知道哪个地方调用了一个过程。
因为由函数返回一个值,所以函数不能作为单独的语句加以调用,被调用的函数必须作为表达式中的一部分,再配以其他语法成份构成语句。 3.7 过程与函数 函数的调用 函数调用与调用过程不同, 因为由函数返回一个值,所以函数不能作为单独的语句加以调用,被调用的函数必须作为表达式中的一部分,再配以其他语法成份构成语句。 最简单情况是使用赋值语句调用函数: 变量名=函数过程名(实参表)
调用 Function 过程时,函数名必须用在变量赋值语句的右端或表达式中。 先定义函数 Function Celsius(byval fDegrees as double) as double Celsius = (fDegrees - 32) * 5 / 9 End Function 调用 Temp = Celsius(fDegrees)或 MsgBox "温度为 " & Celsius(fDegrees) & " 摄氏度。" 又如 Sub ConvertTemp() temp = InputBox(“请输入华氏温度。”, 1) MsgBox “温度为 ” & Celsius(temp) & “摄氏度。” End Sub
3.7 过程与函数 参数传递 在调用过程时,一般主过程与被调用过程之间有数据传递,即将主过程的实参,传递给被调用的过程,完成实参与形参的结合,然后执行被调用的过程体。 在Visual Basic.NET中,实参与形参的结合有两种方式,即按值传递和按地址传递。 其中按地址传递也称为引用。区分两种方式的方法是, 在定义过程时,若形参前使用ByVal关键字,则为按值传递参数; 若在形参前使用ByRef关键字,则为按地址传递参数。 在Visual Basic.NET中,为了避免过程使用的参数与程序其他部分的数据混淆,一般只使用按值传递参数,所以ByVal是系统默认的参数类型,即默认是按值传递参数。
当调用一个过程时,按值传递参数的过程是,系统将实参值复制给形参, 3.7 过程与函数 按值传递参数(ByVal) 当调用一个过程时,按值传递参数的过程是,系统将实参值复制给形参, 然后实参与形参就断开了联系,被调用过程的运算和操作,都是在形参自己的存储单元中进行, 当调用结束时,这些形参所占用的存储单元也同时被释放。 因此,在被调用过程中对形参的任何运算和操作不会影响到实参
如果在程序中按引用传递变量,实际上传递的就是指向该变量的指针,也就是说,它是将实参变量的地址传递给形参。 3.7 过程与函数 引用传递参数(ByRef) 引用传递参数也称为按地址传递参数。 如果在程序中按引用传递变量,实际上传递的就是指向该变量的指针,也就是说,它是将实参变量的地址传递给形参。 这样,在被调用的过程中,对形参的任何操作,实际上都变成了对相应实参的操作。 因此,实参变量的值就会随形参的改变而改变。
错误(Bug)和程序调试(Debug)是在程序设计中经常遇到术语, 3.8程序调试 错误(Bug)和程序调试(Debug)是在程序设计中经常遇到术语, Bug就是指程序中隐含的错误和问题,它们的存在会导致程序不正确的运行。 发现和纠正错误的过程就称为程序调试(Debug)。 实际上,在程序设计中错误总是难免的,程序调试(Debug)是一个程序开发中不可缺少的过程。 Visual Basic.NET提供了一组方便的调试工具,利用这些调试工具,程序设计人员可以方便、快捷地找到应用程序中存在的问题。
3.8程序调试 程序中的错误类型 通常,将程序错误划分为三种类型: 语法错误 运行错误 逻辑错误。
语法错误是指在程序代码中,存在不符合Visual Basic.NET语法规则的地方而产生的错误。 3.8程序调试 1. 语法错误 语法错误是指在程序代码中,存在不符合Visual Basic.NET语法规则的地方而产生的错误。 如果出现此类错误,Visual Basic.NET开发环境在代码输入过程中,就会自动检测出来,并在错误代码下面标上波浪线(~~~)。 当把鼠标移到波浪线上方时,系统会显示出错的原因。 例如,在输入MsgBox函数的时候,输入MgBox( )就会给出错误提示。demo
3.8程序调试 2. 运行错误 运行错误是指程序中的语句本身是正确的,但是这些语句在运行时无法正确执行,从而导致程序发生错误。 运行错误比语法错误更加隐蔽,这是因为运行错误是在程序执行时,遇到了一些非法操作引起的。 这类错误常见的有: 打开一个不存在的文件、 磁盘空间不足、 网络连接断开、 除运算中除数为0、 从服务器读取数据时,发生服务器断开连接、 输入的数据类型不匹配等等。
3.8程序调试 3. 逻辑错误 在程序设计中,有时会出现这样一种情况:程序在编辑和编译时,没有发现任何语法错误,程序也能运行和正常退出,可是程序就是不能完成我们预想的工作。 在这种情况下,通常就是程序中出现了逻辑错误。 如运算符使用不正确、语句的次序不对、循环语句的起始值、终值不正确等。 通常,逻辑错误不会产生错误提示信息,故错误的排除需要认真阅读分析程序,并借助调试工具才能够找到错误的原因并改正。
为了更正程序中发生的不同错误,Visual Basic.NET提供了多种调试工具,如 3.8程序调试 程序的调试 是在应用程序中查找,并修改错误的过程。 通过程序的调试,可以纠正程序中的错误。 为了更正程序中发生的不同错误,Visual Basic.NET提供了多种调试工具,如 设置断点、 插入观察变量、 逐行执行和过程跟踪, 以及各种调试窗口等。
3.8程序调试 1. Visual Basic.NET的三种工作模式 作为一个集编辑、编译和运行为一体的集成开发环境,Visual Basic.NET提供了三种模式。 • 设计模式 • 运行模式 • 中断模式 为了测试和调试应用程序,编程时应知道应用程序正处在何种模式之下。
3.8程序调试 2. 使用调试工具调试程序 调试程序时,可使用Visual Basic.NET提供的一组调试工具。“调试”菜单和调试工具栏提供了几种常用的调试工具,如图所示。
断点是应用程序暂时停止执行的位置,也是让应用程序进入中断模式的地方。 在程序设计中,可以在中断模式下,或设计模式下设置和删除断点。 3.8程序调试 设置和删除断点 断点是应用程序暂时停止执行的位置,也是让应用程序进入中断模式的地方。 在程序设计中,可以在中断模式下,或设计模式下设置和删除断点。 在调试程序时, 按照程序的功能,可在怀疑有错误的代码块处设置断点, 这样可有利于测试程序的功能和发现程序的逻辑错误。
Visual Basic.NET提供了“逐语句”、“逐过程等跟踪方式。 3.8程序调试 跟踪程序的执行 Visual Basic.NET提供了“逐语句”、“逐过程等跟踪方式。 逐语句执行 逐过程执行 跳出
3.8程序调试 使用调试窗口 在调试应用程序时,经常要分析应用程序的运行结果,分析数据到底发生了什么变化,分析变量,或属性产生不正确值的原因等。 Visual Basic.NET提供了很多调试窗口,调试程序时应善于利用这些窗口,以方便应用程序的调试。 错误列表窗口
3.8程序调试 输出窗口
3.8程序调试 即时窗口
3.8程序调试 监视窗口
3.8程序调试 局部变量窗口
3.9 设计示例 【设计示例3-1】求任意半径长度圆的面积。 在界面上输入任意半径的长度,要求编写函数过程,计算其面积大小,并在按钮的点击事件中验证,将结果输出到屏幕上。
3.9 设计示例 控件属性设置 控件事件响应 控件 属性 属性值 Form1 Text "实例3-1" Label1 "请输入圆的半径:" "计 算 结 果:" Label3 "" TextBox1 Button1 "计算" Button2 "退出" 控件 事件 Button1 click Button2 Click
3.9 设计示例 程序代码如下: Public Class Form1 Dim CulArea As Single '定义变量存储计算结果 Private Function CircleArea(ByVal r As Single) As Single CircleArea = 3.14159 * r * r '圆面积计算公式 End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim rad As Single If TextBox1.Text = "" Then '不能不输入数字来计算 Label3.Text = "半径长度不能为空,请输入半径长度!" Exit Sub End If
3.9 设计示例 rad = Val(TextBox1.Text) '读取输入半径 If rad <= 0 Then '半径必须大于 Label3.Text = "半径不能为或负数,请输入半径长度!" Exit Sub End If CulArea = CircleArea(rad) '计算面积 Label3.Text = "所得结果为:" + CStr(CulArea) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Close() End Class
3.9 设计示例 程序运行界面如图所示。
3.10 VB编码实践
对代码进行注释 在Visual Basic加入注释必须用下面的方法: REM I am a VB comment. ’I am also a VB comment. intVB = intVB + 1 此符号通知 Visual Basic 编译器忽略在它后面的文本(即注释)。 注释是为了方便阅读而为代码添加的简短的解释性说明。
注释举例 FOR i=1 TO 100 ‘The start of a loop myvar=myvar+1 ‘Increments myvar NEXT ‘The end of a loop
对代码进行注释 在所有过程的开头加入一段说明过程功能特征(过程的作用)的简短注释是一个很好的编程做法。这对您自己和检查代码的任何其他人都有好处。 应该把实现的详细信息(过程实现的方式)与描述功能特征的注释分开。若给说明加入了实现的详细信息,切记在更新函数时对这些详细信息进行更新。 注释可以和语句同行并跟随其后,也可以另占一整行。 每个重要的变量声明前都应有注释,用以描述被声明变量的用途。 变量、控件和过程的命名应当足够清楚,使得只在遇到复杂的实现详细情况时才使用注释。 注释不能与行继续符同行。
对代码进行注释 注释类型 注释说明 用途 描述过程的用途(而不是其实现方式) 假设 列举每个外部变量、控件、打开的文件或过程访 问的其他元素 效果 列举每个受影响的外部变量、控件、文件以及它 的作用(仅在作用不明显时列举) 输入 指定参数的用途 返回 说明过程返回的值
代码约定-变量命名
代码约定-变量使用范围前缀
代码约定-对象命名 用一致的前缀来命名对象,使人们容易识别对象的类型
代码约定-常数 内部常数名是大小写混合,前缀两个字符表示定义该常数的对象库 用户自定义的常数的前缀通常为 “con”,大小写混合的。例如: VB和VBA 对象库中的常数的前缀为 “vb”:vbTileHorizontal 数据访问对象 (DAO) 库中前缀为 “db”:dbAppendOnly Microsoft Excel 对象库中的前缀为 “xl”: xlDialogBorder 用户自定义的常数的前缀通常为 “con”,大小写混合的。例如: conYourOwnConstant
代码约定-代码缩进 在子过程、函数过程和属性过程中的控制流块和语句需要缩进 Private Sub cmdRemove_Click () Dim Ind As Integer Ind = lstClient.ListIndex ‘获取索引。 ‘确定有选定的项。 If Ind >= 0 Then lstClient.RemoveItem Ind ‘将其从列表框中删除。 ’显示编号。 lblDisplay.Caption = lstClient.ListCount Else Beep ‘如果没有项被选中,就发出鸣叫。 End If End Sub
代码约定-其它 关键字(保留字)用大写字母开头 Sub, If, ChDir, Print 和 True 都是关键字。 Print "Title Page”
代码约定-其它 续行( _) 如果一句代码太长,无法在一行内写下(不包括注释),则可以在下一行继续,在行的末尾用续行字符表示一行尚未结束,续行字符是一个空格加一个下划字符, Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single)
Visual Basic 2005命名建议 不要使用下划线,不要过多使用缩写,因为缩写会引起混淆。 名称中各单词首字母均为大写, 如 FindLastRecord 和 RedrawMyForm。 函数名和方法名以动词开始, 如 InitNameArray 和 CloseDialog。 类名、结构名、模块名和属性名以名词开始, 如 EmployeeName 或 CarAccessory 中。 接口名称以前缀“I”开始,后面接一个名词或名词词组或者接一个描述接口行为的形容词 如 IComponent, IPersistable。 事件处理程序的名称以一个描述事件类型的名词开始,后面接后缀“EventHandler”, 如“MouseEventHandler”。 事件参数类的名称里要加“EventArgs”后缀。
Visual Basic 2005命名建议 如果某事件含有“之前”或“之后”的概念,请以现在时或过去时形式使用前缀, 如“ControlAdd”或“ControlAdded”。 对于长项或常用项,可使用缩写使名称长度适中, 如,可用“HTML”代替“HyperText Markup Language”。 通常,多于 32 个字符的变量名在低分辨率的监视器上难以阅读。同时,请确保缩写在整个应用程序中保持一致。在项目中随意在“HTML”和“HyperText Markup Language”之间切换可能会导致混淆。 在内部范围中避免使用与外部范围中的名称相同的名称。如果访问了错误的变量,则可能会产生错误结果。若变量与同一名称的关键字冲突,则必须在关键字前加适当的类型库以作标识。例如,如果有一个名为 Date 的变量,通过调用 System.DateTime.Date 只可以使用内部 Date 函数。
VB应用程序的工作方式-事件驱动 事件是窗体或控件识别的动作。 事件驱动应用程序执行 Basic 代码 判定是否响应事件以及如何响应事件 是编程者的责任 代码部分(即事件过程)与每个事件对应 让控件响应事件时,就把代码写入事件过程之中
VB应用程序中的典型事件序列 启动应用程序,装载和显示窗体。 窗体(或控件)接收事件。 如果在相应的事件过程中存在代码,就执行代码。 事件可由用户引发(例如键盘操作), 由系统引发(例如定时器事件,监听端口事件), 由代码间接引发(例如,当代码装载窗体时的 Load 事件)。 如果在相应的事件过程中存在代码,就执行代码。 应用程序等待下一次事件。
VB应用程序中的典型事件 注意 许多事件伴随其它事件发生。例如,在 DblClick 事件发生时,MouseDown、MouseUp 和 Click 事件也会发生。
创建 VB应用程序三个主要步骤 创建应用程序界面。 设置属性。 编写代码 创建窗体 用工具箱绘制控件 调整大小、移动和锁定控件 在“属性窗口”中设置属性 编写代码 打开代码窗口 创建事件过程
3.11常用字符串处理函数字符串操作摘要 操作 语言元素 比较两个字符串 StrComp 转换字符串 StrConv 翻转字符串 InStrRev、StrReverse 转换为小写或大写 Format、LCase、UCase 创建包含重复字符的字符串 Space、StrDup 查找字符串的长度 Len 格式化字符串 Format、FormatCurrency、FormatDateTime、FormatNumber、FormatPercent 操作字符串 InStr、Left、LTrim、Mid、Right、RTrim、Trim 设置字符串比较规则 Option Compare 使用 ASCII 值和 ANSI 值 Asc、AscW、Chr、ChrW 替换指定子字符串 Replace 返回基于筛选的字符串数组 Filter 返回指定数量的子字符串 Split、Join
StrComp() - 比较两个字符串,根据字符串的比较结果返回 -1、0 或 1。 ' Defines variables. Dim TestStr1 As String = "ABCD" Dim TestStr2 As String = "abcd" Dim TestComp As Integer ‘ The two strings sort equally. Returns 0. TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Text) ' TestStr1 sorts before TestStr2. Returns -1. TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Binary) ' TestStr2 sorts after TestStr1. Returns 1.如果省略 Compare,则由 Option Compare 设置确定比较类型 TestComp = StrComp(TestStr2, TestStr1)
Option Compare { Binary | Text } 声明比较字符串时使用的默认比较方法 Binary 可选。导致基于从字符的内部二进制表示形式导出的排序顺序进行字符串比较。 Text 可选。导致基于由系统的区域设置确定的不区分大小写的文本排序顺序进行字符串比较。 如果使用,Option Compare 语句必须出现在文件中的任何其他源代码语句之前。 ' Set the string comparison method to Binary ("AAA" < "aaa"). Option Compare Binary ' Set the string comparison method to Text ("AAA" = "aaa"). Option Compare Text
StrConv() 返回按照指定方式转换的字符串 Dim sText As String = "Hello World" ' Returns "hello world". Dim sNewText As String = StrConv(sText, VbStrConv.LowerCase)
StrReverse() 返回指定字符串的字符顺序相反的字符串。 Dim TestString As String = "ABCDEFG" ' Returns "GFEDCBA". Dim revString As String = StrReverse(TestString)
LCase(),UCase() 转换为小写或大写。 ' String to convert. Dim UpperCase As String = "Hello World 1234" ' Returns "hello world 1234". Dim LowerCase As String = LCase(UpperCase)
Space(),StrDup() 创建包含重复字符的字符串。 Dim TestString As String ' Returns a string with 10 spaces. TestString = Space(10) ' Inserts 10 spaces between two strings. TestString = "Hello" & Space(10) & "World“ Dim aString As String = "Wow! What a string!" Dim aObject As New Object aObject = "This is a String contained within an Object" ' Returns "PPPPP" TestString = StrDup(5, "P") ' Returns "WWWWWWWWWW" TestString = StrDup(10, aString) ' Returns "TTTTTT" TestString = CStr(StrDup(6, aObject))
Len() 查找字符串的长度 ' Initializes variable. Dim TestString As String = "Hello World" ' Returns 11. Dim TestLen As Integer = Len(TestString)
格式化字符串 Format() FormatCurrency() FormatDateTime() FormatNumber() FormatPercent()
Format() 返回根据格式 String 表达式中包含的指令设置格式的字符串。 要格式化的内容 执行此操作 数字 使用预定义的数字格式或创建用户定义的数字格式。 日期和时间 使用预定义的日期/时间格式或创建用户定义的日期/时间格式。 日期和时间序列数 使用日期和时间格式或数字格式。
日期和时间格式示例 Dim TestDateTime As Date = #1/27/2001 5:04:23 PM# Dim TestStr As String ' Returns current system time in the system-defined long time format. TestStr = Format(Now(), "Long Time") ' Returns current system date in the system-defined long date format. TestStr = Format(Now(), "Long Date") ' Also returns current system date in the system-defined long date ' format, using the single letter code for the format. TestStr = Format(Now(), "D")
日期和时间格式示例 ' Returns the value of TestDateTime in user-defined date/time formats. ' Returns "5:4:23". TestStr = Format(TestDateTime, "h:m:s") ' Returns "05:04:23 PM". TestStr = Format(TestDateTime, "hh:mm:ss tt") ' Returns "Saturday, Jan 27 2001". TestStr = Format(TestDateTime, "dddd, MMM d yyyy") ' Returns "17:04:23". TestStr = Format(TestDateTime, "HH:mm:ss")
数字格式示例 ' Returns "23". TestStr = Format(23) ' User-defined numeric formats. ' Returns "5,459.40". TestStr = Format(5459.4, "##,##0.00") ' Returns "334.90". TestStr = Format(334.9, "###0.00") ' Returns "500.00%". TestStr = Format(5, "0.00%")
FormatCurrency() -返回一个格式为货币值的表达式 Dim TestDebt As Double = -4456.43 Dim TestString As String ' Returns "($4,456.43)". TestString = FormatCurrency(TestDebt, , , TriState.True, TriState.True)
FormatDateTime() -返回一个表示日期/时间值的字符串表达式 ' English (US) format. Dim TestDate As DateTime = #3/12/1999# ' FormatDateTime returns "Friday, March 12, 1999". ' The time information is neutral (00:00:00) and therefore suppressed. Dim TestString As String = FormatDateTime(TestDate, DateFormat.LongDate)
FormatNumber() 返回格式化为数字的表达式 Dim TestNumber As Integer = 45600 ' Returns "45,600.00". Dim TestString As String = FormatNumber(TestNumber, 2, , , TriState.True)
FormatPercent() 返回格式化为带后缀 % 字符的百分数(即乘以 100)的表达式 Dim TestNumber As Single = 0.76 ' Returns "76.00%". Dim TestString As String = FormatPercent(TestNumber)
操作字符串 InStr() InStrRev() Left() LTrim() Mid() Right() RTrim() Trim()
InStr() - 返回一个指定一字符串在另一字符串中的第一个匹配项的起始位置的整数 ' String to search in. Dim SearchString As String = "XXpXXpXXPXXP" ' Search for "P". Dim SearchChar As String = "P" Dim TestPos As Integer ' A textual comparison starting at position 4. Returns 6. TestPos = InStr(4, SearchString, SearchChar, CompareMethod.Text) ' A binary comparison starting at position 1. Returns 9. TestPos = InStr(1, SearchString, SearchChar, CompareMethod.Binary) ' If Option Compare is not set, or set to Binary, return 9. ' If Option Compare is set to Text, returns 3. TestPos = InStr(SearchString, SearchChar) ' Returns 0. TestPos = InStr(1, SearchString, "W")
InStrRev() 返回某字符串从另一字符串的右侧开始算起第一次出现的位置 Dim TestString As String = "the quick brown fox jumps over the lazy dog" Dim TestNumber As Integer ' Returns 32. TestNumber = InStrRev(TestString, "the") ' Returns 1. TestNumber = InStrRev(TestString, "the", 16)
Left() 返回一个字符串,其中包含从某个字符串左端开始的指定数量的字符 Dim TestString As String = "Hello World!" ' Returns "Hello". Dim subString As String = Left(TestString, 5)
Right() 返回一个字符串,其中包含从某个字符串右端开始的指定数量的字符 Dim TestString As String = "Hello World!" ' Returns "World!". Dim subString As String = Right(TestString, 6)
LTrim()/RTrim()/Trim() 指定字符串不带前导空格、不带尾随空格或同时不带前导和尾随空格的副本。 ' Initializes string. Dim TestString As String = " <-Trim-> " Dim TrimString As String ' Returns "<-Trim-> ". TrimString = LTrim(TestString) ' Returns " <-Trim->". TrimString = RTrim(TestString) ' Returns "<-Trim->". TrimString = LTrim(RTrim(TestString)) ' Using the Trim function alone achieves the same result. TrimString = Trim(TestString)
Mid() 从一个字符串返回包含指定数量字符的字符串。 ' Creates text string. Dim TestString As String = "Mid Function Demo" ' Returns "Mid". Dim FirstWord As String = Mid(TestString, 1, 3) ' Returns "Demo". Dim LastWord As String = Mid(TestString, 14, 4) ' Returns "Function Demo". Dim MidWords As String = Mid(TestString, 5)
Asc()/AscW() 返回一个表示与某个字符相对应的字符代码的Integer值 Dim codeInt As Integer ' The following line of code sets myInt to 65. codeInt = Asc("A") ' The following line of code sets myInt to 97. codeInt = Asc("a") codeInt = Asc("Apple") AscW() 返回输入字符的 Unicode 码位。返回值范围为 0 到 65535。
Chr()/ChrW() 返回与指定字符代码相关联的字符。 ChrW 以 CharCode 作为 Unicode 码位。 -32768 到 -1 范围内的值的处理方式与 +32768 到 +65535 范围内的值相同。 Dim associatedChar As Char ' Returns "A". associatedChar = Chr(65) ' Returns "a". associatedChar = Chr(97) ' Returns ">". associatedChar = Chr(62) ‘ Returns “熊". associatedChar = ChrW(29066)
Replace() 替换指定子字符串 Dim TestString As String = "Shopping List" ' Returns "Shipping List". Dim aString As String = Replace(TestString, "o", "i")
Filter() 返回基于筛选的字符串数组。 Dim TestStrings(2) As String TestStrings(0) = "This" TestStrings(1) = "Is" TestStrings(2) = "It" Dim subStrings() As String ' Returns ["This", "Is"]. subStrings = Filter(TestStrings, "is", True, CompareMethod.Text) ' Returns ["This"]. subStrings = Filter(TestStrings, "is", True, CompareMethod.Binary) ' Returns ["Is", "It"]. subStrings = Filter(TestStrings, "is", False, CompareMethod.Binary)
Split () 函数返回一个从零开始的一维数组,其中包含指定数量的子字符串 例一:在字符串的空格处拆分该字符串 Dim TestString As String = "Look at these!" ' Returns an array containing "Look", "at", and "these!". Dim TestArray() As String = Split(TestString) 例二:拆分一行中有多个分隔符的字符串,以及如何筛选掉空字符串 Dim TestString As String = "apple pear banana " ' TestArray holds {"apple", "", "", "", "pear", "banana", "", ""} Dim LastNonEmpty As Integer = -1 For i As Integer = 0 To TestArray.Length - 1 If TestArray(i) <> "" Then LastNonEmpty += 1 TestArray(LastNonEmpty) = TestArray(i) End If Next ReDim Preserve TestArray(LastNonEmpty) ' Preserve防止在重新设置数组维数时清除数组内容。 ' TestArray now holds {"apple", "pear", "banana"}
Join() 返回:通过连接一个数组中包含的若干子字符串创建的字符串 Dim TestItem() As String = {"Pickle", "Pineapple", "Papaya"} ' Returns "Pickle, Pineapple, Papaya" Dim TestShoppingList As String = Join(TestItem, ", ")