培训目标:
掌握各种基本数据类型以及流程控制语句的语法,感受VB编程。
培训内容:
1. VB中的数据类型;
2. VB中的常量与变量;
3. VB中的运算符;
4. VB中的流程控制语句。
课后练习:
改进第一次培训布置的“计算器”,要求实现四则运算,并充分利用流程控制语句来实现语句的改进及对数据长度、数据类型以及除零等异常的防范。
1、VB中的数据类型
- 基本数据类型
- 比较特别的有对象类型和变体类型。Object 对象类型可以简单的理解成为对控件对象的引用;Variant 变体类型可以算是VB中的特殊类型,由于它的存在常常让人对VB的数据类型检查产生误解。VB在变量声明时,如果不指定变量类型则VB就将为该变量指定为 Variant 类型。
- 在最常用的数据类型中,特别要注意的就是 Integer 整型,之所以要特点注意就是因为它的值域很小,在使用中可能会产生数值溢出,通常的做法是在VB中直接使用 Long 来替换全部的 Integer 。
- 表中可以看到有个“类型符”列,它是声明变量类型的简化形式。
自定义数据类型 / 枚举类型
PPT中只简述了类型的声明语法,实际上这两种类型的用处极大,通过对它们的使用可以让你的程序更加具有有读性和面向对象的特点,呵呵。来看看俺的示例代码,从中应该可以有点感觉(在VB6中书写枚举类型的变量时可是会有弹出提示的哟)。
自定义类型和枚举类型的使用
Option Explicit
' 这里使用了一个自定义类型来表现登录中的关键信息
' 通过这里的使用将登录中相互关联的3个属性绑在一起
Private Type typLogInfo
UserName As String ' 登录用户名
Pwd As String ' 登录密码
LogState As enuLogState ' 登录结果
End Type
' 这里的枚举类型表现了登录的结果,从下面可以看到对于代码的可读性可以有很大的改善
Public Enum enuLogState
Success = 0 ' 登录成功
Faile ' 登录失败
End Enum
' 这是登录窗体上的"登录"按钮的Click事件
Private Sub cmdOK_Click()
Dim LoginInfo As typLogInfo ' 声明变量
' 存入登录的用户名以及密码以便下面的检查时使用
LoginInfo.UserName = Trim(txtUserName.Text)
LoginInfo.Pwd = Trim(txtPassword.Text)
' 检查登录的名称及密码是否正确
Call loginCheck(LoginInfo)
' 根据检查的结果来分支逻辑
If LoginInfo.LogState = Success Then ' 这里可以看到枚举对于改善代码的可读性提供了极大帮助
MsgBox " 欢迎您: " & LoginInfo.UserName
Else
MsgBox " 登录失败 "
End If
End Sub
' 这是一个自定义的过程,利用它来做登录检查
' 过程具有一个typLogInfo类型的参数,外部将登录的信息传进来
Private Sub loginCheck(logInfo As typLogInfo)
' 检查登录的名称及密码是否正确
If txtUserName = " ddm " And txtPassword = " 123 " Then
' 通过了登录检查
logInfo.LogState = Success
Else
' 登录失败
logInfo.LogState = Faile
End If
End Sub
- 如果你是一位VB的新手(写过几段小程序),看过上面的代码后就应该能够体会到这两种类型的优势所在。不过就培训后的效果来看,这段代码对于真正的初学者是一点效果也没有,哎...。
2、VB中的常量与变量
- 常量,在VB中最为常见的就是VB常量;常量的最大用处就是助记(VB支持中文,但是中文编程也不能滥用,因此在常量中使用是比较好的选择)
Public Const 单位资料表 As String = " DAD6CPP "
- 变量,变量的声明需要注意。因为VB支持隐式声明(就是不声明)和声明时省略数据类型,这两种情况下变量并不是没有类型,而是 Variant 类型。
Public Sub doSomthing()
x = 1
Dim y
Dim i1, i2, i3 As Long
End Sub
-
这是三个例子,其中的变量 X 和 Y 都是 Variant 类型,这个比较看出,注意的是第3行声明,这是极易出错的地方,只有 i3 是Long,i1、i2 都是 Variant。
3、VB中的运算符
- 连接运算符多用 & 就好,+ 对两边操作数会有类型要求
- 全部的运算符没什么可好说的,按规矩来即可,只是要注意一点在使用运算符时多用括号比依赖记忆的效果要好。
4、VB中的流程控制语句
- 条件语句 IF ... Then ... Else ... EndIF,如果是单条语句用 IIF函数 来替换也是不错的,在使用IF语句时必须注意将 Else 写全,这对于日后的调试有很大的益处(当你找半天都没能发现错误所在时就知道了)。
- 分支语句 Select Case ... Case ... Case Else ... End Select,Case表达式所支持的语法非常的灵活性,这样使得分支语句可使用的范围非常的广,它在特定情况下可有效改善 多IF条件 代码可读性下降的问题。下面来看看对上面示例的改善过程:使用多条IF
Option Explicit
' 这里使用了一个自定义类型来表现登录中的关键信息
'通过这里的使用将登录中相互关联的3个属性绑在一起
Private Type typLogInfo
UserName As String ' 登录用户名
Pwd As String ' 登录密码
LogState As enuLogState ' 登录结果
End Type
' 这里的枚举类型表现了登录的结果,从下面可以看到对于代码的可读性可以有很大的改善
Public Enum enuLogState
Success = 0 ' 登录成功
PwdFaile ' 密码错误
Faile ' 登录失败
End Enum
' 这是登录窗体上的"登录"按钮的Click事件
Private Sub cmdOK_Click()
Dim LoginInfo As typLogInfo ' 声明变量
' 存入登录的用户名以及密码以便下面的检查时使用
LoginInfo.UserName = Trim(txtUserName.Text)
LoginInfo.Pwd = Trim(txtPassword.Text)
' 检查登录的名称及密码是否正确
Call loginCheck(LoginInfo)
' 根据检查的结果来分支逻辑,这里示例的是IF嵌套
If LoginInfo.LogState = Success Then ' 这里可以看到枚举对于改善代码的可读性提供了极大帮助
MsgBox " 欢迎您: " & LoginInfo.UserName
Else
If LoginInfo.LogState = PwdFaile Then
MsgBox " 密码错误 "
Else
MsgBox " 用户不存在 "
End If
End If
End Sub
' 这是一个自定义的过程,利用它来做登录检查
'过程具有一个typLogInfo类型的参数,外部将登录的信息传进来
Private Sub loginCheck(logInfo As typLogInfo)
' 检查登录的名称及密码是否正确,这里示例了使用ElseIf语句
If txtUserName = " ddm " And txtPassword = " 123 " Then
' 通过了登录检查
logInfo.LogState = Success
ElseIf txtUserName = " ddm " Then
' 用户名正确,密码错误
logInfo.LogState = PwdFaile
Else
' 用户名错误
logInfo.LogState = Faile
End If
End Sub
这里的登录状态只使用了3种状态,可以看到 cmdOK_Click 事件中对状态的检查使用的是多条IF,如果状态更多的话那么这里的代码会显得更加的繁琐,看看CASE能够给我们带来什么。
使用CASE分支来替换IF
' 这是登录窗体上的"登录"按钮的Click事件
Private Sub cmdOK_Click()
Dim LoginInfo As typLogInfo ' 声明变量
' 存入登录的用户名以及密码以便下面的检查时使用
LoginInfo.UserName = Trim(txtUserName.Text)
LoginInfo.Pwd = Trim(txtPassword.Text)
' 检查登录的名称及密码是否正确
Call loginCheck(LoginInfo)
' 根据检查的结果来分支逻辑
Select Case LoginInfo.LogState
Case enuLogState.Success
MsgBox " 欢迎您: " & LoginInfo.UserName
Case enuLogState.PwdFaile
MsgBox " 密码错误 "
Case enuLogState.Faile
MsgBox " 用户不存在 "
Case Else
MsgBox " 未知结果 "
End Select
End Sub
- 这里的分支比较少,如果多的话优势则更明显。
- 循环语句 For ... Next / For Each ... Next,这里举一个使用 For Each 语句的示例,这种形式的运用比较多:使用For Each遍历
• ' 清空文本框的内容
Private Sub clearText()
Dim objTextBox As Control
For Each objTextBox In Me .Controls ' 使用FOR EACH在窗体的控件集合中遍历
If TypeName (objTextBox) = " TextBox " Then
objTextBox.Text = ""
End If
Next
End Sub
Private Sub Form_Load()
Call clearText ' 清空窗体上文本框的内容
End Sub
- 循环语句 Do ... Loop,这个需要注意的一点就是要在适当的时候记住要能够终止。
- 循环语句中选用 For ... Next 还是 Do ... Loop 没有特定的要求。For 更适于循环次数明确的情况,而 Do 适于循环次数不明,但终止条件了解的情况。