Upload
scarlet-jarvis
View
120
Download
30
Embed Size (px)
DESCRIPTION
VB 程序设计. 任课教师:余凌 邮箱: [email protected] 电话: 13886090451. 学时: 48 ( 32+16 ) 教材: 《VB 程序设计教程 》 周霭如, 清华大学出版社 参考资料: 《VB6.0 入门与提高 》 张树兵, 清华大学出版社 《VB 程序设计教程 》 刘瑞新, 电子工业出版社 《VB 实用教程 》 郑阿奇, 电子工业出版社. 第一章 概述 2 学时 第二章 数据与表达式 4 学时 第三章 顺序结构 2 学时 第四章 分支结构 2 学时 - PowerPoint PPT Presentation
Citation preview
1
2
学时: 48 ( 32+16 )
教材: 《 VB 程序设计教程》 周霭如, 清华大学出版社
参考资料: 《 VB6.0 入门与提高》 张树兵, 清华大学出版社 《 VB 程序设计教程 》 刘瑞新, 电子工业出版社 《 VB 实用教程》 郑阿奇, 电子工业出版社
3
教学内容 第一章 概述 2 学时 第二章 数据与表达式 4 学时 第三章 顺序结构 2 学时 第四章 分支结构 2 学时 第五章 循环结构 2 学时 第六章 VB 常用控件 第七章 数组与记录 2 学时 第八章 过程 4 学时
4
第九章 文件 2 学时 第十章 菜单、多重窗体与多重文档 2 学时 第十一章 绘图 2 学时 第十二章 程序调试与错误处理 2 学时 附: ACCESS 数据库应用 4 学时 总结 2 学时
5
教学目的要求:• 了解 VB 的发展过程和特点• 掌握 VB 集成开发环境 • 理解面向对象程序设计方法• 掌握 VB 工程开发设计步骤
教学重点• VB 集成开发环境• VB 工程开发设计步骤• 面向对象程序设计方法
第 1 章 概述
6
时间安排:2 学时
教学难点:面向对象程序设计中对象、属性、方法、事件等概念
7
1.1 VB 的发展过程和特点1.1 VB 的发展过程和特点
一、发展过程:
1991年: VB1 . 01991年秋:VB2 . 01993年: VB3 . 01995年: VB4 . 01997年: VB5 . 01998年: VB6 . 0
Windows 操作系统产生初期,人们只能利用 Windows API( 应用程序接口)的一千多个函数编写程序。微软公司就开发了当今流行的 Microsoft Visual Studio 工具套件,VB就是其中一种。
8
VB6.0 版本学习版:Learning
学习版:Learning
VB 的基础版本,可开发 WINDOWS 或 WINDOWS NT 程序。内容包括所有内部控制以及网络、数据绑定控件。
专业版: Professional
专业版: Professional
为专业编程人员开发功能强大的分布式应用程序。包括专业版的全部功能,同时具有自动化管理器、部件管理器及数据库管理工具。
企业版: Enterprise
企业版: Enterprise
为专业编程人员提供的一套功能完备工具。包括学习版的全部功能和 ActiveX 控件、 Internet控件开发工具、动态 HTML 页面设计。
9
二、 VB 主要功能特点
VB 是面向对象的可 视化程序设计工具
友好的VB集成开发 环境
支持多种数据库系统的访问
支持动态数据交换、 动态链接库、对象的 链接与嵌入技术及 A ctiveX 技术
10
1.2 VB6.0 集成开发环境1.2 VB6.0 集成开发环境
VB6.0 启动:
11
工具箱
窗体设计器窗口
代码编辑器窗口
标题栏
工具栏菜单栏
工程资源编辑器窗口
窗体布局窗口
属性窗口
12
标题栏可显示当前 VB 的工作模式:• 设计模式:可进行界面设计和代码编写• 运行模式:运行程序• 中断模式:程序运行暂时中断,可编辑代码,但不可设计界面
13
工程资源管理窗口
一个工程由多种类型的文件组成,如工程文件、窗体文件、标准模块文件等,在工程资源管理窗口中以树形目录结构的形式列出了当前工程中包括的所有文件。
• 工程文件 (.vbp)• 窗体文件 (.frm)• 标准模块文件 (.bas)• 类模块文件 (.cls)• 工程组文件 (.vbg)• 资源文件 (.res)
查看对象
切换文件夹
查看代码
14
属性窗口
属性窗口主要对窗体和控件设置对象下拉列表框
可列出当前所有对象
选项卡
属性说明
属性列表框
属性值
15
代码编辑器窗口:
对象下拉列表框
事件过程下拉列表框
过程查看
全部过程查看
自动列出成员特性
代码窗口
窗口拆分栏
用于显示和编辑代码
16
传统过程化应用程序 从第一行开始执行 , 并按照预定的路径执行 , 用户无法改变程序的流程
事件驱动的应用程序 代码不是按预定的路径执行 , 而是在响应不同事件时执行不同的代码段 .
事件触发•由用户触发•由操作系统触发•由其它应用程序的消息触发
采用面向对象、事件驱动方式的编程 , 程序员不需要考虑精确次序执行的每一步骤,而只需编写响应用户动作的程序即可,工作量相对较少。用 VB 编程,实际上是与一组标准对象进行交互的过程。
1.3 面向对象程序设计1.3 面向对象程序设计
17
对象对象 是系统中的基本运行实体 , 是代码和数据的集合 .
用户定义
对象是具有特殊属性(数据)和行为方式(方法)的实体。建立对象后,其操作与该对象有关的属性、事件和方法来描述。
类类 是封装数据和隐藏数据的工具 , 是一组用来定义对象的相关过程和数据的集合 .
一个对象就是类的一个实例
类具有封装性、继承性和多态性特征
VB 中,对象分系统定义,如窗体、菜单等
18
属性属性 是一个对象的特性,不同的对象有不同的属性。
对象常见的属性:• 标题 (Caption)• 名称 (Name)• 颜色 (Color)• 字体 (Font)• 是否可见 (Visible)
19
通过修改对象的属性,可以改变对象的外观与功能。• 在属性窗口上设置• 在程序代码中用赋值语句设置
属性设置
格式:< 对象名 >.< 属性名 >=< 属性值 >
例:•Command1.Caption=“ 确定”•Command1.Font=19
20
事件事件
在 VB 中,系统为每一对象预先定义好一系列的事件,如:• 单击 (Click)• 双击 (DblClick)• 装入事件 (Load)• 改变事件 (Change)• 鼠标移动事件 (MouseMove)• 获取焦点事件 (GotFocus)
是指发生在对象上的事情。
事件过程的一般格式 :Private Sub < 对象名 >_< 事件名 >([< 参数表>])
< 程序代码 >
End Sub
例 :Private Sub Command1_Click()
Form1.BackColor = vbRed
End Sub
21
方法方法方法是面向对象程序设计中所特有的 , 是一种特殊的过程和函数 , 可供用户直接调用。如 : 打印 (Print) 方法、显示窗体 (Show) 方法、清除 (Cls) 方法、移动 (Move) 方法
对象调用格式 :
[< 对象名 >.]< 方法名 > [< 参数名 >]
是指对象要执行的动作。
22
1.4 VB 程序设计的基本步骤 1.4 VB 程序设计的基本步骤 程序设计的一般过程
分析问题
设计算法
绘制流程图
编制程序
调试程序
23
新建一个工程
设计用户界面
编写事件过程及通用过程代码
保存、调试、运行,形成可执行文件
以求两数和的程序为例,说明 VB 工程的建立全过程
VB 程序设计的基本步骤
24
1 、新建工程
途径有两种:• 启动 VB 后,在系统显示的“新建工程”对话框的“新建”选项卡中选择“标准 EXE” ,然后单击“打开”按钮。• 在“文件”菜单中选择“新建工程”命令,然后在“新建工程”对话框中选择“标准 EXE” ,然后单击“打开”按钮。
25
2 、设计界面•设计对象控件的布局•改变 Caption 属性的值为“求和”•改变对象标签、命令按钮 Caption 属性的值•改变文本框的属性 Text 为 0
窗体
标签
命令按钮
文本框
26
3 、编写代码
三种方式:•在窗体上双击命令按钮•在工程管理器窗口单击“查看代码”按钮•在视图菜单中选择“代码窗口”命令,或单击“工具栏”上的“代码窗口”按钮
27
4 、运行与调试工程选择“运行”菜单中的“启动”命令,或单击工具栏中的“启动”按钮,或按 F5 键,即可运行。
在文本框中输入数据,然后点击“求和”按钮,即可得到两数的和,显示在文本框中。
计算结果
28
5 、保存工程
程序代码检查没有错误后,可保存工程。•选择“文件”菜单中的“保存工程”或“工程另存为”命令,或单击工具栏中的“保存工程”按钮。若是第一次保存,则系统弹出“文件另存为”对话框。•在“文件对话框”中选择合适的文件夹后,点击“保存”即可。
文件名
文件夹
文件名后缀
•保存窗体文件后,系统会弹出“工程另存为”对话框,同样选择文件夹,点击“保存”
29
6 、编译工程形成可执行文件
编译成 .exe 文件 , 可脱离 VB环境运行•选择“文件”菜单中的“生成可执行文件” ,则系统弹出“生成工程”对话框。•在“生成文件对话框”中选择合适的文件夹,输入文件名点后,击“确定”即可。
30
输入代码规则 :•每行不超过 1023 个字符•一行写多个语句用“ :”隔开•可用续行符“ _”在下一行接着写•不分大小写 ,关键字及标准函数自动处理成第一母大写•注释行用“‘”开头
VB 程序结构 :
•窗体模块•标准模块•类模块
31
课后分析: 面向对象程序设计中对象、属性、方法、事件、类等概念的理解随后续课程的学习而逐渐加深
32
教学目的要求:•掌握 VB 基本数据类型•掌握 VB 中的常量与变量 •掌握运算符与表达式•了解常用标准函数
教学重点•常量与变量•运算符与表达式•常用标准函数
第2章 VB 程序设计基础第2章 VB 程序设计基础
33
时间安排: 4 学时
教学难点: 变量的类型定义 运算符的优先级
34
数据类型是程序设计的必要组成部分,也是程序处理的对象。在不同语言中,数据类型的规定和处理方法不同。• VB 提供系统定义
的数据类型• 还允许用户自己
定义
VB 提供的基本数据类型主要有:• 数值型• 字符串型( String )• 布尔型( Boolean )/逻辑型• 日期型( Date )• 变体型( Variant )• 对象型 (Object)
2.1 数据类型2.1 数据类型
35
类型:整型( Integer )长整型( Long )单精度浮点型( Single )双精度浮点型( Double )货币型( Currency )字节型( Byte )
2.1.1 数值型数据
36
整型 (Integer) :以 2 个字节的二进制码存储。
十进制:由 0-9 数字组成和正负号,取值范围 -32768-32767八进制:由 0-7 数字组成,前面冠以 & 或 &O ,取值范围 &0-&177777例: &123 ,或 &O123 十六进制:由 0-9 数字及 A-F 组成,前面冠以 &H (或 &h ),取值范围 &H0-&HFFFF例: &H56 , &H7F
1 .整数类型定义:是不带小数点和指数符号的数
根据表示数的范围的不同,可分为整型、长整型,且都有三种表示形式,即十进制、八进制、十六进制。
37
长整型( Long ):以 4 个字节的二进制码存储。
十进制:由 0-9 数字组成和正负号,取值范围 -2147483648~2147483647
八进制:由 0-7 数字组成,前面冠以 & 或 &O ,以 & 结束,取值范围 &0&-&37777777777&
例: &123& ,或 &O123&
十六进制:由 0-9 数字及 A-F 组成,前面冠以 &H (或 &h ),以 & 结尾,取值范围 &H0&-&HFFFFFFFF&
例: &H56& , &H7F&
38
是带小数部分的数。按存储格式,又分为浮点型和定点型 浮点型实数采用 IEEE 格式,由符号、尾数及指数三部分组成。
2 .实数类型
单精度浮点数的指数用 E(e) 表示;双精度浮点的指数用 D( 或 d) 表示。
[+|-]X···X.X···X[E|D][+|-]XXX
指数部分尾数部分
39
单精度浮点型 (Single)
占 4 个字节存储空间,可以精确到 7 位十进制,取值范围 ±1.40×10-45~±3.40×1038
货币型 (Currency)
占 8 个字节的存储空间,用于表达定点数,小数左边有 15位,右边有 4 位,小数点固定 , 因此称为定点数据类型 .
取值分围: -922337203685477.5808~922337203685477.5807
主要用于要求精度特别重要的场合 , 如货币计算和定点计算 .
双精度浮点型 (Double)
占 8 个字节的存储空间,可以精确到 15 位或 16 位十进制数,
取值范围 ±4.94×10-324~±1.79×10308
40
是一种无符号整型数,占 1 个字节
用于存储二进制数据,取值范围: 0~255
3. 字节型 (Byte)
41
字符串是一个用双引号括起来的字符序列 , 由一切可打印的西文字符和汉字组成
2.1.2 字符串型数据 (String)
例 :
“Hello”
“123456”
“ 程序设计”
“”( 空字符串 )
42
注意 :
(1)VB 字符串有两种:可变长度字符串和固定长度字符串。前者指程序执行过程中字符串长度不固定,最多可包含 2^31 个字符;后者指在程序执行过程中字符串长度保持不变的字符串,最大长度为 2^16 。(2) 双引号在程序代码中起字符串的定界作用。(3) 在字符串中 , 字母的大小写是有区别的。例如“ AB123” 与“ ab123” 代表两个不同的字符串。(4) 若字符串本身包含双引号 , 可用连续的两个双引号表示 .例 :“You must study hard”, he said.写成 :“ ““You must study hard””,he said.”
43
注意:•当将数值型数据转换为布尔型时, 0转换为 False ,非0 值转换为 True 。•当将布尔型数据转换为其他数据类型时, False转换为0 , True转换为 -1 。
2.1.3 布尔型数据 (Boolean)
占 2 个字节的存储空间,用于逻辑判断,只有True 和 False 两个值。
44
按 8 个字节的浮点形式存储,可以表示的日期范围从 100 年 1月 1 日 ~9999 年 12月 31 日,而时间可以从 0:00:00~23:59:59
2.1.4 日期型数据 (Date)
日期型数据有两种表示方法:
•用数字符号( # )表示,例 #January 1 , 2001# ;
•另一种以数字序列表示,小数点左边的值表示日期,而小数点右边的值则表示时间。
45
是一种没有用 Dim 等语句显示说明其类型的数据类型•可以包含数值等任何类型的数据•还可以包含 Empty 、 Error 、 Null 等特殊值
•Empty 用来标记未初始化的变体型变量:数值计算时为 0 ,字符运算时为空串•Null 一般用于数据库应用程序:如表达式中包含 Null 值则其值总为空•Error 用来表示在过程中出错时的特殊值
2.1.5 变体型数据 (Variant)
46
例如 1 : dim svSv=“17”Sv=sv-15Sv=“u”&sv 例如 2 :Sub form_click()Dim x,yX=“6”Y=“7”Print x+y,x&yX=6Print x+y,x&y
47
存储 32 位( 4 字节)的地址信息,可以用来
表示图形、 OLE 对象或其他对象,利用VB
中的 Set 语句为其指定值
Dim x as object
Set object =opendatabase(“c:\vb6\bibio.mdb”)
2.1.6 对象型数据 (Object)
48
常量是指在程序运行期间其值不发生变化的量。
在 Visual Basic 中,有两种形式的常量•直接常量•符号常量。
符号常量又分为 :•用户自定义符号常量•系统定义符号常量
2.2 常量与变量2.2 常量与变量2.2.1 常量
49
根据数据类型常量分为•字符串常量•数值常量•布尔常量•日期常量
1 直接常量直接常量就是在程序代码中,以直接明显的形式给出的数。
•例如:
”欢迎使用 visual Basic” 字符串常量,长度为 20
12345 数值型常量
True 布尔型常量
#11 / 10 / 2001# 日期型常量
50
在程序设计中,常用常量命名的方法来取代程序代码中出现的数,这种常量称为符号常量。 符号常量在使用前需要使用 Const 语句进行声明。声明的格式如下:
[Public|Private] Const < 常量名 >[As < 类型 >]=< 表达式 >
2 用户自定义符号常量
说明 :
• < 常量名 > :按变量名的命名规则命名。• As< 类型 > :可选项,用以说明符号常量的数据类型。
< 类型 > 可以是 Byte 、 Boolean 、 Integer 、 Long 、 Currency 、 Single 、 Double 、 Date 、 String 或 Variant 。• 一个 As< 类型 > 子句只能说明一个符号常量。若省略该项,则系统根据表达式的求值结果,确定最合适的数据类型。• < 表达式 > :由数值常量或字符串常量以及运算符组成。•在 < 表达式 > 中不能使用函数调用。
51
用先前定义过的符号常量定义新符号常量
自定义符号常量举例Const Pi=3.14159 声明符号常量 Pi 代表 3.14159 ,单精度类型
Const Max As Integer=9 声明符号常量 Max 代表 9 ,整型
Const BirthDate=#1/1/01#
声明符号常量 BirthDate 代表 2001 年 1月 1 日,日期型Const Pi=3.14, Max=9, MyStr=“Hello”
用逗号分隔多个符号常量声明
Const Pi2=Pi*2
52
1) 如果要使创建的符号常量只作用于某个过程中 , 则应在该过程内部声明该符号常量。
注意:
2) 如果要使创建的符号常量对模块中所 有过程都有效,但对模块之外任何代 码都无效,则应在模块的声明段中声 明符号常量。
3) 如果要使创建的符号常量在整个应 用程序中有效,则应在标准模块的 声明段中进行声明,并在 Const 前面 放置 Public 关键字。在窗体模块或类 模块中不能声明 Public 符号常量。
53
例如:Const pi=3.14159Private Sub Commandl_Click() Const r=100 s= pi * r^2 Print “圆面积 =”; sEnd Sub
Private Sub Command2_C1ick() angle=Sin(20*pi / 180) Print angleEnd Sub
符号常量 pi 在整个窗体模块中有效 , 符号常量 r只在本事件过程中有效
54
4) 由于符号常量可以用其他符号常量定义,因此在两个以上符号常量之间不要出现循环或循环引用。
例如:在标准模块 Modulel 中定义:
Public Const conA= conB*2 在整个应用程序中有效
在标准模块 Module2 中定义:
Public Const conB=conA/2 在整个应用程序中有效
当程序中有两个以上的公共符号常量,而且每个公共符号常量都用另一个去定义时就会出现循环。
出现循环引用,在运行此应用程序时, VB 就会产生错误信息。为了避免出现循环引用,可以将公共符号常量限制在单一模块内,或最多只存在于少数几个模块内。
55
5) 符号常量是有意义的名字,它用于取代永远不变的数值或字符串。
尽管符号常量有点像变量,但不能像对变量那样修改符号常量,也不能对符号常量赋以新值。
56
3 系统定义符号常量 符号常量的定义可以从“对象浏览器”中获得。使用对象浏览器可以显示包括当前工程及对象库在内的过程、模块、类、属性和方法等的描述信息。
选择对象库
在“类”列表中选择所需要的符号常量组
用鼠标单击某一个符号常量
描述框中显示有关该符号常量的定义及描述信息。例: vbBlue 所表示的颜色值为 &HFF0000
从菜单栏视图中选择“对象浏览器”或( F2 )
57
每个变量都有名字和数据类型,通过名字来引用一个变量,而通过数据类型来确定该变量的存储方式。
变量是指一个有名称的内存单元。
2.2.2 变量
分为属性变量和用户自定义变量
58
VB 变量的命名规则: .第一个字符必须是字母。 .长度不超过 255 个字符。 .不可以包含小数点或者内嵌的类型声明字符。 .不能使用关键字。 .不能与过程名或符号常量同名。
1. 变量的命名规则
例如 :
合法变量名 : strMyString 、 intCount 、 MyForm 、姓名、性别等
非法变量名 : 1x 、 a+b 、 δ 、 π 等 关键字 : 又称保留字,在语法上有固定含义,是语言的自称
组成部分,用于表示系统提供的标准过程、函数、运算符、常量等; VB 中约定关键字的首写字母为大写。
59
2. 变量的声明
变量使用之前,一般必须先声明变量名和类型,以便系统为其分配存储单元。
固定格式声明
隐式声明
强制显式声明
VB 变量及其类型声明方式
60
格式 :
说明 :
• < 类型 > :可以是 VB 提供的各种数据类型或用户自定义类型。• [As < 类型 >] :方括号部分表示该部分可以缺省。缺省时 , 变量默认
为变体类型 .
• Dim :在窗体模块、标准模块或过程中声明变量。
Private :变量仅在该模块或过程中有效。
Static :在过程中定义静态变量,即使该过程结束,也仍然保留变量的值。
Public :标准模块中声明全局变量,使变量在整个应用程序中有效。
Global: 在标准模块中声明全局变量 .
Dim|Private|Static|Public|Global < 变量名 > [As < 类型 >]
格式声明
61
Defbool|DefByte|DefInt|Deflng|Defcur|Defsng|DefDbl|DefDate|DefStr|DefObj|DefVar 字母范围 [, 字母范围 ]...
变量名后加一特定符号来表明数据类型 :
% 整型& 长整型 ! 单精度型# 双精度型@ 货币型$ 字符串型
62
若变量未经定义而直接使用, VB 会自动建立一个变量。可存放任何类型的数据,如数值、字符串、日期和时间。
隐式声明
可见 , 随着所赋值的不同,变量的类型在不断变化 .
这种方法很方便,但是常常会因为转换过程难以预料,而导致一个难以查找的错误。因此,应该在应用程序中声明所使用的变量的类型。
例如:
SomeValue = “100”
SomeValue = SomeValue –10;
SomeValue = “ABC”+SomeValue
63
可在窗体模块或标准模块的声明段中加入语句: Option Explicit
强制显式声明
VB 可采用强制声明功能 ,使所有变量都必须先声明后使用 .这样,若运行时遇到一个未经明确声明的变量名, VB 就会发出错误警告。
声明方式 :
在“工具”菜单中打开“选项”对话框 , 单击“编辑器”选择“要求变量声明”选项 , 即可自动插入 Option Explicit 语句 .注: Option Explicit 语句的作用范围仅限于语句所在模块 . 对于需要强制式变量声明的窗体模块、标准模块及类模块,必须将 Option Explicit 语句放在这些模块的声明段中。
64
VB 中有以下 6 类运算符和表达式: · 算术运算符与算术表达式 .字符串运算符与字符串表达式 .关系运算符与关系表达式 .逻辑运算符与逻辑表达式 .日期运算符与日期表达式 .对象运算符与对象表达式
用运算符将运算对象 ( 或操作数 ) 连接起来即构成表达式。表达式表示了某种求值规则。 操作数可以是常量、变量、函数、对象等,而运算符也有各种类型。
2.3 运算符与表达式2.3 运算符与表达式
65
2.3.1 算术运算符与算术表达式
算术运算符用于对数值型数据执行各种算术运算。 VB 提供了 7 个算术运算符,优先级次序如表所列 :
优先级 运算符 运算
1 ^ 乘方
2 - 取负
3* 乘法
/ 浮点除法
4 \ 整数除法
5 Mod 取模
6+ 加法
- 减法
其中,取负 (—) 运算符是单目运算符,其余运算符均为双目运算符 (需要两个操作数 ) 。
66
乘方运算用来计算乘方和方根。例: 10^2 10 的平方,结果为 100 10^(-2) 10 的平方的倒数,即 1 / 100 ,结果为 0.01 25^0.5 25 的平方根,结果为 5 8^(1/3) 8 的立方根,结果为 2 2^2^3 运算顺序从左到右,结果为以 64 (-8)^(-1/3) 错误,当底数为负数时,指数必须是整数
1 .乘方运算
2 .整数除法
例:
10\4 结果为 2
25.68\6.99 先四舍五人再整除,结果为 3
执行整除运算,结果为整型值。参加运算的操作数一般为整型数。当操作数带有小数点时,先被四舍五入为整型数,后整除。
67
例 : 10 Mod 4 结果为 2 25.68 Mod 6.99 先四舍五人再求余数,结果为 5 11 Mod -4 结果为 3 -11 Mod 5 结果为 -1 -11 Mod –3 结果为 -2
3. 取模运算取模运算符 Mod 用于求余数 , 为第一操作数整除第二操作数所得的余数 .
操作数带小数 , 先四舍五入取整型数,后求余 ;
运算结果符号取决于第一个操作数。
68
注意 :“&” 和“ +”这两个运算符的区别:“ +” 运算符两边的操作数应均为字符串。如果都为数值型,则进行算术运算;如果有一个为字符串,另一个为数值型,则出错。“ &’’ 运算符两边的操作数不论是数值型的还是字符串型的,都进行字符串的连接运算,系统先将数值型操作数转换为字符串,然后再进行连接运算。
2.3.2 字符串运算符与字符串表达式
字符串运算符有两个:“ &” 、“ +” ,是将两个字符串连接起来,合并成一个新的字符串。
例如:
“Hello” & “ World” 结果为“ Hello World”
“Check” & 123 结果为“ Checkl23”
“Check” + 123 错误
69
VB 提供的关系运算符 := 等于 2=3 False<> 不等于 2<>3 True< 2<3 True> 2>3 False>= 2>=3 False<= 2<=3 TrueLike 字符串匹配 “ aBBa” Like “a*a” Tr
ueIs 对象引用比较
2.3.3 关系运算符与关系表达式关系运算符又称为比较运算符,用于对两个表达式的值进行比较,比较的结果为布尔值 True(真 ) 或 False(假 ) 。
70
有关说明:• 若两个操作数是数值型,按其大小比较。• 若两个操作数是字符串,则按字符的 ASCII 码值从左到右逐一比较。• 对单精度或双精度进行比较时,应避免直接判断两个浮点数是否相等,而改成对其误差的判断。
例如: Abs(A-B)<1E-5• 关系运算符的优先级相同。• “Like” 运算符与通配符“?”、“ *” 、“ #”等结合使用,常用于数据库模糊查询。• “Is” 运算符用于两个对象变量的引用比较。 ** is Null
71
例 : 数学上判断 x 是否在区间 [a,b] 内
如写成 : a <= x<=b 则不能完成指定功能
假设 a=1,b=3,x=4
VB 在计算 :1 <= x<=3 时由左向右计算
先计算 1 <= 4 成立 , 值为 -1 接着计算 -1<=3
成立 , 最终结果为 True, 而我们想要的结果为 False
故引入逻辑表达式
72
2.3.4 逻辑运算符与逻辑表达式
逻辑运算也称布尔运算或逻辑乘 . 运算符两边的操作数要求为逻辑值 .
用逻辑运算符连接两个或多个逻辑量组成的表达式称为逻辑表达式或布尔表达式 . 逻辑表达式的结果仍为逻辑值 True 或 False.
当两个操作数均为假时 , 结果才为假
当两个操作数均为真时 , 结果才为真
当操作数为假时 , 结果为真
说明
False(3>8) And (5<6)与And2
True
True
结果
(3>8) Or (5<6)
Not(3>8)
例子
或
非
运算
Or
Not
运算符
Not 运算符为单目运算符 , 其它为双目运算符 .
3
1
优先级
4
5
Xor
Eqv
6 Imp
异或
同或
蕴含
当两个操作数不等价时 , 结果为真
当两个操作数值等价时 , 结果为真
如果 A 则 B
(3>8) Xor (5<6)
(3>8) Eqr (5<6)
(3>8) Imp (5<6)
True
False
True
73
真值表
TrueFalse
A Xor B
False
B
False
A
False
True
True False True
True True False
TrueFalse
A EqvB
False
B
False
A
True
Falsee
True False False
True True True
TrueFalse
A Imp B
False
B
False
A
True
True
True False
TrueTrue True
False
74
2.3.5 表达式的运算顺序
表达式的运算的先后顺序为 :
函数运算 算术运算 关系运算 逻辑运算
例 : a=3, b=5, c=-1, d=7
a + b > c + d And a >= 5 Or Not c > 0 Or d < 0
⑩True
①8 ②6 ④False
③True
⑤False ⑥False
⑦True
⑧False
⑨True
75
VB 提供系统内部函数 , 允许用户自定义函数过程内部函数分 5 类 :• 数学函数•字符串函数•随机函数、格式输出函数•转换函数•日期和时间函数
这些函数都带有一个或几个自变量,在程序设计中称为参数。函数运算后返回一个值。
函数一般调用格式:
< 函数名 > ([< 参数表>])函数的参数可以是常量、变量或表达式 , 若有多个参数时 , 参
数之间以逗号分隔
2.4 常用内部函数2.4 常用内部函数
76
2.4.1 数学函数
数学函数用于各种数学运算 , 主要包括• 三角函数• 平方根函数• 绝对值函数• 对数函数• 指数函数
绝对值函数
Abs(x) 返回 x 的绝对值
例 : Abs(3.4) 结果为 3.4
Abs(-3.4) 结果为 3.4
平方根函数
Sqr(x) 返回 x 的平方根 , x>=0
例 : Sqr(9) 结果为 3
三角函数
Sin(x) 正玄函数
Cos(x) 余玄函数
Tan(x) 正切函数
Atn(x) 反正切函数
参数单位为弧度
77
指数和对数函数
Exp(x) 返回以 e 为底的指数函数,即数学中的 ex
Log(x) 返回以 e 为底的自然对数,即数学中的 lnx 。VB 没有提供常用对数函数,要想计算常用对数可以换算 :
例如: Exp(1) 、 Exp(2*X) 、 Log(10) 。
10ln
ln10
xxLog
取整函数
Int(x) 返回不大于 x 的最大值
Fix(x) 返回 x 的整数部分
例 :
Int(3.6) =3
Int(-2.3) =-3
Fix(6.5) =6
Fix(-5.6) =-5
四舍五入函数
CInt(x)
CLng(x)
例 :
CInt(3.6) =4
78
随机函数Rnd[(x)] 产生 0~1之间的单精度随机数。
说明 : 若 x<0, 则每次都使用 x 作为随机数种子得到相同的结果 ;
若 x>0, 则以上一个随机数作为种子 , 产生序列中的下一个随机数 ;
若 x=0, 则产生与最近生成的随机数相同的数 ;
若省略参数 x, 则以上一个随机数作为种子 , 产生序列中的下一个随机数
产生 [N1,N2]问随机数,可使用公式:
Int(N2-N1+1)*Rnd +N2
随机种子生成器: Randomize time
79
2.4.2 字符串函数
VisualBasic 提供了大量的字符串函数,具有很强的字符串处理能力。
1 .删除空白字符函数
LTrim(s) 去掉字符串 s 左边的空白字符 ( 即前导空格 ) 。
RTrim(s) 去掉字符串 s 右边的空白字符 ( 即后置空格 ) 。
Trim(s) 去掉字符串 s 左右两边的空白字符。
例如:
LTrim(”UUUABC”) 结果为“ ABC”
RTrim(”ABCUUU”) 结果为“ ABC”
Trim(”UUUABCUUU”) 结果为“ ABC”
80
2 .取子串函数
Left(s,n) 取字符串 s 左边的 n 个字符
Right(s,n) 取字符串 s 右边的 n 个字符
Mid(s,p,n) 从字字符串 s 的第 p 个字符开始取 n 个字符
例:
Left(“ABCDE”,2) 结果为“ AB”
Right(“ABCDE”,2) 结果为“ DE”
Mid(“ABCDE”,2,3) 结果为“ BCD”
Mid(“ABCDE”,2,6) 结果为“ BCDE”
3. 字符串长度函数
Len(s) 返回字符串 s 的长度例: Len(“ABCDE”) 结果为 5
81
5 .生成空格函数
Space(n) 返回 n 个空格
例: Space(3) 的结果为“ UUU”
4 .生成字符串函数 String(n,s) 取字符串 s 的第一个字符构成长度为 n 的新字符串。
例:
String(3,”ABC”) 结果 “ AAA”
String(3 , 65) 结果 “ AAA” ( 字符” A” 的 ASCII 码为 65)
82
7 .字母大小写转换函数
UCase(s) 把小写字母转换为大写字母。 LCase(s) 把大写字母转换为小写字母。例: UCase(”Abc”) 结果为 "ABC” LCase(”ABc”) 结果为 "abc”
6 .搜索予字符串函数 InStr([S,]s1,s2[,C]) 在字符串 s1 中第 S 个位置开始查找
字符串 s2 出现的起始位置例 : InStr(”ABCDE” ,” BC”) 结果为 2 1nStr(”ABCDECDE” ,” DE” , ) 结果为 4
83
转换函数用于数据类型或形式的转换,包括整型、实型、字符串型之间以及与 ASCII 码字符之间的转换。
下面介绍常用的转换函数。
1 .将字符转换成 ASCII 码 Asc(s) 返回字符串 s 中第一个字符的 ASCII 码。
例: Asc(“A”) 结果为 65 Asc(“ABC”) 结果为 65
2.4.4 转换函数
2 .将 ASCII 码转换成字符
Chr(x) 把 x 的值转换为对应的 ASCII 字符
例: Chr(65) 的结果为” A” 。
84
3 .将数值转换成字符串
Str(x) 把 x 的值转换为一个字符串。
如果 x 为正,则返回的字符串前有一前导空格。
例: Str(123) 的结果为“ 123” 。 ‘
4 .将字符串转换成数值
Val(s) 把数字字符串 s转换为数值。
例:
Val(“123”) 结果为 123
Val(“123AB”) 结果为 123
Val(“.123AB”) 结果为 .123
Val(”a123AB") 结果为 0
85
5 .转换成逻辑型数据
Cbool(x) 非 0 为 True 0 为 False 。
例: Cbool(123) 的结果为 True 。 ‘
6 .转换成日期型数据
Cdate(x) 把数字、字符串转换为日期数据。
例:
Cdate(“February 20,1999”) 结果为 99-2-20
Cdate(“4:30:40 PM”) 结果为 16:30:40
86
日期和时间函数可以显示系统的日期和时间,提供某个事件何时发生及持续时间长短等信息。
常用的日期时间函数有: Now 返回系统日期和时间Date 返回系统日期Time 返回系统时间Day(d) 返回参数 d 中指定月份的第几天WeekDay(d) 返回参数 d 中指定的星期几Month(d) 返回参数 d 中指定的月份Year(d) 返回年份Hour(d) 返回小时 (0~23)Minute(d) 返回分钟 (0~59)Second(d) 返回秒 (0~59)Timer 返回从午夜开始到现在经过的秒数
2.4.3 日期和时间函数
87
格式输出函数可以使数值、日期或字符串按指定的格式输出。其格式为 Format(< 表达式 >[ , < 格式字符串 >])
2.4.5 格式输出函数
< 表达式 > :要格式化的数值、日期或字
符串表达式。
< 格式字符串 > :指定表达式的值的输出
格式。
格式字符有三类:数值格式、日期格式和字符串格式。
格式字符要加引号。
88
89
2.4.6 其他函数
1 .条件函数 Iif(<x1>,<x2>,<x3>) 如 x1 值为真,则返回 x2 的值,否则返回 x3
例: Iif(x>y,x,y) 返回 x,y 中较大值 Iif(x>=60,“Pass”,”Failure”)
2 .选择函数 Choose(n,<x1>[,<x2>]...)
例: Choose(3,”星期一”,”星期二” ”星期三” ”星期四” ”星期五”) ) 的结果为”星期三”。
90
课后分析: 本节需掌握知识点较多,不需要一下子都记住,以后用到时逐渐记忆。
91
教学目的要求:• 掌握顺序结构程序设计方法• 掌握选择结构程序设计方法• 掌握循环结构程序设计方法
教学重点• 顺序、选择、循环结构程序设计
第 3 章 流程控制
92
时间安排: 6 学时
教学难点: 循环结构程序设计
93
VB 采用事件驱动方法,但仍需要结构化程序设计方法,用控制结构控制程序执行的流程。程序流程有三种最基本的结构:顺序、选择、循环。
一个计算机程序通常可分为三部分,即输入、处理和输出。 VB 的输入输出有着十分丰富的内容和形式,它提供了多种手段,并可通过各种控件实现输入输出操作,使输入输出更加灵活、多样、方便、直观。
3.1.1 顺序结构
94
功能 : 先计算“ =” 号 ( 称为赋值号 ) 右边的表达式的值 , 然后将此值赋给赋值号左边的变量或对象属性 .
说明 : • < 变量名 > 应符合 VB 的变量命名约定。
• < 表达式 > 可以是常量、变量、表达式及带有属性的对象。
格式 :
[Let] < 变量名 |属性名 >=< 表达式 >
3.1.1 几个基本语句
1. 赋值语句
95
1) “=” 赋值号与数学中的等号意义不同。例如:语句 X=X+1 表示将变量 X 的值加1 后的结果值再赋给变量 X, 而不是表示两边的值相等 .
2) 赋值号左边必须是变量或对象属性 .例 : X=1MyStr = “Good Morning”Command1.Caption=“ 确定”X+1=X ( 错误 )
注意事项
96
3) 变量名或对象属性名的类型应与表达式的类型相容 .
即变量名或对象属性名能够正确存取赋值号右边的表达式的值 .
例如Dim A As Integer, B As Single, C As Double, S As String
A = 100
S = "123.45“
A = S ‘A=123
S = A ‘S=“123”
S = "abc”
A = S 错误,类型不匹配
97
4) 变量未赋值时,数值型变量的值为 0 ,字符串变量的值为空串“”。
[ 例 4-1]交换两个变量的值。
设变量 A 中存放 5 ,变量 B 中存放 8 ,交换两个变量的值,使变量 A 中存放 8 ,变量 B 中存放 5 。
分析:交换变量需要借助第三个变量 C ,才能实现交换。
代码如下: A = 5
B = 8
C = A
A = B
B = C
98
2. 注释语句格式 :
Rem|’[ 注释内容 ]
1) 如使用 Rem 则在 Rem 与注释内容之间要加空格;以‘开头,可不加
2) 允许使用 GoTo 或 GoSub 语句转到一个有行号或标号的注释语句,程序从该注释行下面的第一条可执行语句继续执行
3) 在其他语句行后使用 Rem, 用冒号
注意事项:
99
3 . 停止程序执行语句
格式 : End
功能:结束程序的执行。 一个程序没有 End 语句,对运行没有什么影响。但如果没有 End 语句,或者虽然有,却没执行,程序都不能正常结束,此时要结束程序必须执行“运行”菜单中的“结束”命令或单击工具栏中的“结束”按钮。为了保持程序的完整性,应当在程序中含有 End 语句,并且通过 End 语句来结束程序的运行。
100
InputBox 函数产生一个对话框,作为输入数据的界面,等待用户输入正文或按下按钮,并返回所输入的内容。
格式 :InputBox(< 提示信息 >[,< 对话框标题 >][,<默认值 >])
3.1.2 输入数据
1 输入框函数 (InputBox)
101
例如,假设某程序中有如下代码: · MyStr=InputBox(“ 提示” & vbCrLf & “信息”,“对话框标题”, “ aaaaaa”)
执行该行代码时,弹出的输入对话框
可以在文本框中将默认值修改成其他内容,单击“确定”按钮,文本框中的文本返回到变量 MyStr 中;单击“取消”按钮,返回一个 0 长度的字符串。
102
在 windows 中,如果操作有误,通常会在屏幕上显示一个对话框,提示用户进行选择,然后系统根据选择确定其后的操作。
VB 提供的 MsgBox 函数可以实现此功能,它可以向用户传送信息,并可以接收用户在对话框上的选择,以此作为程序继续执行的依据。
2 消息框函数 (MsgBox)
格式:
MsgBox(< 提示信息 >[,< 按钮类型 >][,< 对话框标题 >])
功能:在对话框中显示消息,等待用户单击按钮,并返回一个整数告诉用户单击了哪个按钮。
103
分类 按钮值 系统定义符号常量 含义
按钮类型
0 vbOKOnly 只显示“确定”按钮1 vbOKCancel 显示“确定”、“取消”按钮 2 vbAbortRetryIgnore 显示“终止”、“重试”、“忽
略”按钮 3 vbYesNoCancel 显示“是”、“否”、“取消”按
钮 4 vbYesNo 显示“是”、“否”按钮 5 vbRetryCancel 显示“重试”、“取消”按钮
图标类型
16 vbCritical 显示停止图标 x
32 vbQuestion 显示询问图标 ?
48 vbExclamation 显示警告图标 !64 vbInformation 显示信息图标 i
默认按钮0 vbDefaultButton1 第一个按钮是默认按钮 256 vbDefaultButton2 第二个按钮是默认按钮 512 vbDefaultButton3 第三个按钮是默认按钮
“ 按钮类型”的设置值及含义
104
MsgBox 函数的返回值
系统符号常量 返回值 按键vbOK 1 确定
vbCancel 2 取消
vbAbort 3 终止
vbRetry 4 重试
vbIgnore 5 忽略
vbYes 6 是
vbNo 7 否
•若不需要返回值 , 则可以使用 MsgBox 语句 , 其格式为 :
MsgBox < 提示信息 > [,< 按钮类型 >][,< 对话框标题 >]
105
例 :
Private Sub Command1_Click( )
a= MsgBox(“ 提示信息” )
End Sub
Private Sub Command1_Click( )
a= MsgBox(“ 提示信息” & Chr(13) & “换行显示” )
End Sub
只显示“提示信息”
提示信息换行
106
Private Sub Command1_Click( )
a= MsgBox(“ 提示信息” , ,“ 标题” )
End Sub
省略第二个参数“按钮类型” , 但逗号不能省略
Private Sub Command1_Click( )
a= MsgBox(“ 提示信息” ,1,“ 标题” )
End Sub
显示“确定”、“取消”按钮
107
Private Sub Command1_Click( )
a= MsgBox(“ 提示信息” ,1+16,“ 标题” )
End Sub
Private Sub Command1_Click( )
a= MsgBox(“ 提示信息” ,2+32+0,“ 标题” )
End Sub
显示停止图标
设第一按钮是默认按钮
108
(1) Text 属性: 字符串类型。返回或设置文本框中显示的内容。 例如: Text1.Text = “欢迎使用 Visual Basic”
(2) MultiLine 属性: 布尔型。当 MultiLine 属性为 True 时,文本框可以输入或显示多行文本,且会在输入的内容超出文本框时自动换行。默认值为 False 。
3 用文本框 (TextBox) 输入数据
文本框控件在工具箱中的名称为 TextBox ,在 VB 中,可以使用文本框控件作为输入控件,在运行时接收用户输入的数据。
1) 属性
109
3) PasswordChar 属性:
字符串类型。当 MuitiLine 属性值为 False 时,该属性可以用于口令输入。在缺省状态下,该属性被设置为空串,用户从键盘输入时,每个字符都可以在文本框中显示出来。如果把 PasswordChar 属性设置为一个字符,如星号 (*) ,则在文本框中键人字符时,只显示星号,不显示键人的字符。 Text 属性接收的仍是用户输入的文本。
4) ScrollBars 属性:
数值型。该属性用于确定文本框是否带滚动条。有以下 4 种选择:
0-None 没有滚动条
1-Horizontal 只有水平滚动条
2-Vertical 只有垂直滚动条
3—Both 同时具有水平和垂直滚动条
只有当 MultiLine 属性值为 True 时,文本框才显示滚动条。
110
5) SelLength 属性: 数值型。在程序运行期间返回或设置选择的字符数。 例如: Text1.Sellength = Len(Text1.Text) 表示选中文本框 Text1 中所有字符。
6) SelStart 属性: 数值型。在程序运行期间返回或设置当前选择文本的起始位置。 例如: Textl.SelStart = 0 表示选择文本的起始位置从第一个字符开始。
7) Locked 属性: 布尔型。指定运行时文本框内容是否可以编辑。默认值为 False ,表示可以编辑。
111
1)Change 事件: 当用户向文本框输人新的内容,或在程序代码中对文本框的 Text 属性进行赋值从而改变了文本框的 Text 属性时,将触发 Change 事件。
2 .事件和方法
文本框除了支持鼠标的 Click 、 DblClick 事件外,还支持 Change 、 GotFocus 、 LostFocus 、 KeyPress 等事件和SetFocus 方法。
例:建立三个文本框和两个命令按钮。运行时,用户在文本框 Text1 中输入内容的同时,文本框 Text2 和 Text3 显示相同的内容,但显示的字体不同。单击“清除”,按钮清空三个文本框中的内容,单击“退出”按钮结束程序的运行 .
112
设计界面
程序代码
运行界面
113
2) GotFOCUS 事件: 当运行时用 Tab 键或用鼠标选择对象,或用 SetFOCUS 方法使光标落在对象上时,触发该事件,称之为“获得焦点”。该事件适用于窗体和大部分可接受键盘输入的控件。
Text1 获得焦点
Text2失去焦点
114
3) LostFOCUS 事件: 当按下 Tab 键使光标离开当前文本框,或者用鼠标选择窗体的其他对象时触发该事件,称之为“失去焦点”。
4) KeyPress 事件: 当在键盘上按下某个键时触发该事件。 KeyPress 事件返回一个参数KeyAscii ,该参数值为整数,表示所按下键的 ASCⅡ码。
5) SetFocus 方法: SetFocus 方法是文本框常用的方法,该方法是把光标移到指定的文本
框中,使该文本框获得焦点。 当在窗体上建立了多个文本框后,可以使用该方法把光标置于所需要
的文本框上。使用格式如下: [< 对象名 > . ]SetFocus
例如,将焦点定位在文本框 Textl 中,使用语句: Textl.SetFocus
115
在程序设计中对输入的数据进行加工后,往往需要将数据输出。在 VB 中,可以使用
•消息框 (MsgBox) 函数或语句•文本框 (Text) 控件•标签 (Label) 控件•Print 方法
实现输出。
3.1.3 输出数据
116
在 windows 中,如果操作有误,通常会在屏幕上显示一个对话框,提示用户进行选择,然后系统根据选择确定其后的操作。
VB 提供的 MsgBox 函数可以实现此功能,它可以向用户传送信息,并可以接收用户在对话框上的选择,以此作为程序继续执行的依据。
1. 用消息框 (MsgBox) 输出数据
117
2 用文本框 (TextBox) 输出数据
用文本框可以输人数据,也可以使用文本框输出数据。
例 :
已知长方体的长、宽、高为 a 、 b 、 c ,求其表面积
118
119
1 .属性 Caption 属性:字符型。标签的标题。 Alignment 属性:数值型。确定标签中标题的对齐方式,有以下设置值: 0-LeftJustify 缺省值,标题从标签的左边开始显示。 1-RightJustif 标题靠右显示。 2-Center 标题居中显示。 AutoSize 属性:布尔型。设置为 True 时,可根据标题自动调整标签的大小;
设置为 False(缺省值 ) 时,标签保持设计时定义的大小,太长的标题内容将不能显示出来。
BackStyle 属性:数值型。缺省值为 1 ,标签不透明;设置为 0 时,标签透明。 WordWrap 属性:布尔型。设置为 True 时,标签将在垂直方向变化大小以与
标题相适应,此时, Autosize 属性应设置为 True ;设置为 False 时 (缺省值 ) ,标签不能在垂直方向上扩展。
3. 用标签 (Label) 输出数据
VB 提供的标签控件只能显示文本,而不能对文本进行编辑。标签通常用于标注本身具有 Caption 属性的控件。例如,可以使用标签为文本框附加描述信息。标签也常用于输出。
120
设计界面
代码
运行界面
例
121
标签控件可以支持 Click 、 DblClick 等事件。
例:设窗体上有一个标签控件 Labell ,其 AutoSize 属性值为 True ,双击该标签控件,则标签的标题字体增加 10磅,可以通过如下代码实现:
Private Sub Label1_DblClick( )
Labell . FontSize = Labell . FontSize + 10
End Sub
2 .事件
122
Print 方法可以在窗体、图片框、打印机和立即窗口等对象上输出数据。
[< 对象名 > . ] Print [< 表达式表 >][{; | ,}]
•< 对象名 > 可以是窗体、图片框、打印机或立即窗口。如果省略“对象名”,则在当前窗体上输出。
•< 表达式表 > 中的表达式可以是算术表达式、字符串表达式、关系表达式或者布尔表达式,多个表达式之间的分隔符为逗号 ( , ) 或分号 ( ; ) 。
3. 用 Print 方法输出数据1. Print 方法
123
例:
Form1 . Print “欢迎使用 Visual Basic”
在窗体 Forml 上显示字符串“欢迎使用 Visual Basic”
Picture1 . Print “欢迎使用 Visual Basic”
在图片框 Picturel 上显示字符串“欢迎使用 Visual Basic”
Printer . Print “欢迎使用 Visual Basic”
在打印机上打印字符串“欢迎使用 Visual Basic”
124
Print 方法具有计算和输出双重功能。
对于表达式,先计算表达式的值,然后输出。输出时,数值型数据前面有一符号位(正号不显示),后面留一个空格位;字符串原样输出,前后无空格。
符号位
125
Print 方法有两种显示格式:区分格式和紧凑格式。
当各表达式之间用逗号作为分隔符时,则按区分,显示数据个字为单位把一个输出行分成 若干区个表达式的值。
当各表达式之间用分号作为分隔符时,则按紧凑格式输出数据,后一项紧跟前一项输出。
126
一般情况下,每执行一次 Print 方法都要自动换行,即每一次执行 Print 时,都会在新的一行上输出数据。若要在同一行上输出数据,则可以在末尾加上分号或逗号。
若省略 < 表达式表 > ,则输出一个空行或取消前面 Print末尾的逗号或分号的作用。
127
2. 与 Print 方法有关的函数
格式 : Tab[(n)] 功能 : 在指定的第 n 个位置 上输出数据 .
1) Tab 函数
说明 :
•若 n 小于当前显示位置 , 则自动移到下一个输出行的第 n列上 ;
•若 n 小于 1, 则打印位置在第 1 列 ;
•若 n 大于输出行的宽度 , 则利用公式 n Mod width 计算下一个打印位置 ;
•若省略此参数 , 则将插入点移到下一个打印区的起点 .
128
2) Spc 函数 格式 : Spc(n)
功能 : 跳过 n 个空格 .
说明 : n 是一个数值表达式 , 表示空格 .
例如 : Print “Hello”; Spc(3); “World”
输出结果 :
HelloUUUWorld
Spc 函数与输出项之间用分号分隔 .
Spc 函数表示两个输出项之间的间隔 , Tab 函数总是从对象的左端开始计数 .
129
3.1.4 举例[ 例 3-3] 使用文本框输入圆的半径,计算圆的面积并用标签输出。运行界面如下图所示。
Private Sub Command1_Click()
Dim r As Double,s As Double
Const pi = 3.1415926
r = Val(Text1.Text)
s=pi * r * r
Label2.Caption = “圆的面积:” & s
End Sub
130
有些实际问题中,往往需要根据条件成立与否,决定程序的执行方向,在不同的条件下,进行不同的处理。使用顺序结构是无法解决这一问题的,需要用选择结构。本章将介绍 Visual Basic 中用于解决此类问题的三种语句结构,
即: 单行结构条件语句 If…Then…Else… 块结构条件语句 If…Then…EndIf 多分支选择语句 Select Case…End Select 以上语句又统称为条件语句,其功能都是根据条件或表达式的值有选择地执行一组语句。
3.2 3.2 选择结构程序设计选择结构程序设计
131
格式: If <条件 > Then [< 语句组 1>][Else < 语句组 2>]功能:如果 <条件 > 成立,则执行 < 语句组 1> ,否则执行< 语句组 2> 。
3.2.1 实现选择结构的语句
1. 单行结构条件语句
•<条件 > 可以是关系表达式、逻辑表达式、数值表达式或字符串表达式。 对于数值表达式, VB将 0 作为 False 、非 0 作为 True 处理;
对于字符串表达式, VB 只允许包含数字的字符串,当字符串中的数字值为 0 时,则认为是 False ,否则认为是 True 。
VisualBasic将 Null 作为 False 处理。
• < 语句组 1> 和 < 语句组 2> 可以有多条语句,各语句之间用冒号隔开。
132
例如: If N>0 Then A=A+B : B=B+A Else A=A-B : B=B-A 可以没有 Else 部分,这时必须有 < 语句组 1> 。 例如: If X<>"aaa " Then PrintX
注意: 1) 单行结构条件语句应作为一条语句书写。如果语句太长需要换行,必须在折行处使用续行符号,即一个空格跟一个下划线。 2) 无论条件是否成立,单行结构条件语句的出口都是本条件语句之后的语句。 If X >=0 Then X =1+ X Else X =5- X Y =1- X Print “Y =“; Y 当 X=4 时,条件 X>0 成立,执行 Then之后的语句 X=1+X ,使 X 的值成为 5 ,然后执行条件语句之后的语句 Y=1+X ,使 Y 的值成为 -4 ,所以输出 Y=-4 。 当 X 的值为 -4 时,条件 X>=0 不成立,执行 Else之后的语句 X=5-X ,使 X 的值成为 9 ,然后同样执行条件语句之后的语句 Y=1-X ,使 Y 的值成为 -8 ,所以输出 Y=-8 。 即无论条件 X>=0 是否成立,都要执行 If 语句后面的语句 Y=1-X 。 3) 单行结构条件语句可以嵌套,也就是说,在 < 语句组 1> 或 < 语句组2> 中可以包含另外一个单行结构条件语句。
133
2 块结构条件语句格式:If <条件 1> Then [< 语句组 1>][ElseIf <条件 2> Then [< 语句组 2>]]…[Elself <条件 N> Then [< 语句组 n>]][Else [< 其他语句组 >]]EndIf
功能:执行该块结构条件语句时,首先判断 <条件 1> 是否成立,若成立,则执行< 语句组 1> ,若不成立,则继续判断 ElseIf 子句后的 <条件 2> 是否成立,若成立,则执行 < 语句组 2> ,否则,继续判断以下的各个条件,依此类推。如果 <条件 1> 到 <条件 N> 都不成立,则执行 Else 子句后面的 < 其他语句组 > 。
当某个条件成立而执行了相应的语句组后,将不再继续往下判断其他条件,而直接退出块结构,执行 EndIf之后的语句。
条件 1 语句组 1
条件 2 语句组 2
条件 n 语句组 n
其他语句组
…
134
注意:整个块结构必须以 If 语句开头, EndIf 语句结束。除了第一行的 If 语句和最后一行的 EndIf 语句是必须的以外, ElseIf 子句和 Else 子句都是可选的。
块结构条件语句的两种常见的简化形式 :
形式一:
If <条件 1> Then
< 语句组 1>
Else
< 语句组 2>
End If
形式二:
If <条件 > Then
< 语句组 >
End lf
形式一的功能与单行结构条件语句功能相同,用于处理两个条件分支的情况;而形式二仅在条件成立时执行一定的操作,当条件不成立时则不做任何处理。
135
注意:
1)使用块结构条件语句时,关键字 Elself 不能写成
Else If ,即中间不能有空格。
2) 在书写时,可以将 If 语句、 ElseIf 语句、 Else 子
句和 EndIf 语句左对齐,而各语句组向右缩进若干空格,
以使程序结构更加清楚,便于阅读和查错。
3) 要注意严格按格式要求进行书写,不可以随意换行
或将两行合并成一行。
4) 块结构条件语句可以嵌套。
136
格式如下:Select Case <测试表达式 > Case < 表达式表 1> [< 语句组 1>] [Case < 表达式表 2> [< 语句组 2>]] … [Case Else [< 语句组 n>]]End Select
3 多分支选择语句
功能:
根据 <测试表达式 > 的值,按顺序匹配 Case 后的表达式表,如果匹配成功,则执行该 Case 下的语句组,然后转到 EndSelect 语句之后继续执行;如果 <测试表达式 > 的值与各表达式表都不匹配,则执行 CaseElse之后的 < 语句组 n> ,再转到 EndSelect 语句之后继续执行。
137
< 测试表达式 > 可以是任何数值表达式或字符表达式。 Case后的表达式表可以有如下形式之一: 1)< 表达式 1> [, < 表达式 2>]…如: Case l, 3 , 5 表示 < 测试表达式 > 的值为 1 或 3 或 5 时将执行该 Case语句之后的语句组。 2)< 表达式 1> TO < 表达式 2> : Case l0 TO 30 表示 < 测试表达式 > 的值在 10 到 30 之间 (包括 10和 30) 时将执行该Case语句之后的语句组。 3)Is < 关系运算符 > < 表达式 > : Case Is>=10 表示 < 测试表达式 > 的值大于或等于 10时将执行该 Case语句之后的语句组。 以上三种方式可以同时出现在同一个 Case语句之后,各项之间用逗号隔开。 如: Case l, 3 , 10 T0 20, Is<0
138
0lg
025.1
0
xx
x
xee
y
xx
设从文本框 Textl 输人 X 的值,单击命令按钮 Commandl 计算 Y 的值,结果显示于文本 Text2 中:Private Sub Command1_Click() X=Val(Text1.Text) Select Case X Case Is < 0 Y = Exp(X)+Exp(-X) Case 0 ‘Case Is=0 Y = 1.25 Case Is > 0 Y = Log(X)/Log(10) End Select Text2 . Text=Format(Y, ”0.000000”) ‘ 保留 6 位小数End Sub
按以下公式求分段函数 y 的值
139
注意:1)<测试表达式 > 的类型应与 Case 后的表达式类型一致。
2) 不可以在 Case 后的表达式中使用 <测试表达式 > 中的变量。
3)<测试表达式 > 只能是一个变量或表达式 , 而不能是变量表或表达式表。
4) 语句也可以嵌套,但每个嵌套的 Select Case 语句必须要有相应的语句。 ·5) 不要在 Case 后直接使用布尔运算符来表示条件,例如,要表示条件 0<X<100 ,不能写成:Select Case X Case X>0 And X<100…End Select对于较复杂的条件,可以用块 If 语句来实现,而有些条件完全可以转换成 Case 语句允许的几种形式之一 .
140
•以上三种条件结构都能解决需要多分支处理的问题,但根据不同的要求选择适当的结构进行编程,可以简化编程,使程序结构更加清楚,便于阅读和查错。 对于简单的两个分支的情况,使用单行结构条件语句就比较方便; 使用块结构条件语句可以处理分支较多,条件较复杂的情况;而多分支选择结构更适合于对单一表达式进行多种条件判断的情况。
•编程时,使用条件结构语句尤其要注意两个问题,一是条件的书写,二是不同语句结构之间的格式区别。
141
3.2.2举例 Private Sub Command1_Click() If Text1.Text = "王刚 " Then If UCase(Text2.Text) = "ABCDE" Then MsgBox " 口令正确 !" Else MsgBox " 口令错误 !" End End If Else MsgBox " 用户名错误 !" End End If Print Print Spc(20); "欢迎使用 !"End Sub
142
例 : 运费计算 . 规则如下 :50km 以内 : 运费 = 运量 (t)*距离 (km)*1(元 )50~100km: 运费 = 运量 (t)*距离 (km)*0.8(元 )101~300km: 运费 = 运量 (t)*距离 (km)*0.6(元 )300km 以上 : 运费 = 运量 (t)*距离 (km)*0.5(元 )
Private Sub Command2_Click() Dim y1, j1, yf As Single y1 = Text1.Text j1 = Text2.Text Select Case j1 Case Is < 50 yf = y1 * j1 * 1 Case 50 To 100 yf = y1 * j1 * 0.8 Case 101 To 300 yf = y1 * j1 * 0.6 Case Is > 300 yf = y1 * j1 * 0.5 End Select Text3.Text = CStr(yf)End Sub
Private Sub Command1_Click() Text1.Text = "" Text2.Text = "" Text3.Text = ""End Sub
Private Sub Command3_Click() Unload MeEnd Sub
143
3.3 循环结构程序设计
和顺序结构、选择结构一样,循环结构是结构化程序中的三种基本程序结构之一。在程序中,凡是需要重复相同或相似的操作步骤,都可以用循环结构来实现。循环结构由两部分组成:• 循环体,即要重复执行的语句序列;• 循环控制部分,即用于规定循环的重复条件或重复次数,同时确定循环范围的语句。 要使计算机能够正常执行某循环,由循环控制部分所规定的循环次数必须是有限的,即循环体可以重复 0 次到若干次。
3.3.1 实现循环结构的语句
144
VB 支持的循环结构有:
. For…Next 循环
. Do…Loop 循环
. For Each…Next 循环
. While …Wend 循环
本章将介绍 For…Next 循环结构和 Do…Loop 循环结构。其中 For…Next 循环结构常用于设计已知循环次数的程序,而 Do…Loop While…Wend 循环结构更适合于设计循环次数未知,而只知道循环结束条件的程序。 For Each…Next 循环将在数组中介绍。
145
1. For…Next 循环语句
在已知循环要执行多少次时,最好使用 For…Next 循环。在 For…Next 循环中使用一个起计数器作用的循环变量,每重复一次循环之后,循环变量的值就会按一定的步长增加或者减少,直到超过某规定的终值时退出循环。 格式如下: For < 循环变量 >=< 初值 > To <终值 > [Step < 步长 >] < 语句组 1> [Exit For] < 语句组 2> Next [< 循环变量 >]
146
VisualBasic 按以下步骤执行 For…Next 循环:
1)首先将 < 循环变量 > 设置为 < 初值 > 。 2) 若 < 步长 > 为正数,则测试 < 循环变量 > 是否大于 <终值> ,若是,则退出循环,执行 Next 语句之后的语句,否则继续下一步。 若 < 步长 > 为负数,则测试 < 循环变量 > 是否小于 <终值> ,若是,则退出循环 Next 语句后的语句,否则继续下一步。 3) 执行循环体部分,即执行 For 语句和 Next 语句之间的语句组。 4)< 循环变量 > 的值增加 < 步长 > 值。 5)返回步骤 2) 。
147
以下面循环为例,以框图形式说明 For循环执行过程:For I=<e1> to <e2> step <e3> 循环体Next I
I=e1
I超过终值 e2?
循环体
I=I+e3
N
Y
148
说明 :• < 循环变量 > 、 < 初值 > 、 <终值 > 和 < 步长 > 都是数值型的,其中, < 循环变量 > 、 < 初值 > 和 <终值 > 是必需的。
• < 步长 > 可正可负,也可以省略。若 < 步长 > 为正,则 < 初值 > 必须小于或等于 <终值 > ,否则不能执行循环体内的语句;若 < 步长 > 为负,则 < 初值 > 必须大于或等于 <终值 > ,否则不能执行循环体内的语句;若 < 步长 >省略,则默认为1 。
• Exit For 可选 , 语句用于退出循环体,执行 Next 语句之后的语句。必要时,循环体中可以放置多条 Exit For 语句。该语句一般放在某条件结构中,用于表示当某种条件成立时,强行退出循环。
• Next 语句中的 < 循环变量 > 必须与 For 语句中的 < 循环变量 > 一致,也可以省略。
149
例 : 求 1+2+3+…+n 的值。
分析: 在程序设计中,求取一批数据的“和”是一种典型的操作,通常称为“累加”。 “累加”问题可以很方便地用循环来实现。设计时,一般引入一个存放‘‘和”值的单元,如变量 Sum 。首先设置该“和”值为 0 ,然后通过循环重复执行:
和值 = 和值 +累加项即 Sum=Sum+I
程序代码如下:For I =1 to n Sum=Sum+INext
150
Do…Loop 循环结构有几种演变形式,但每一种都是通过判断某条件以决定循环是否继续执行。所不同的是,是先判断条件后执行循环体,还是先执行循环体后判断条件;是条件成立时执行循环 ( 当型循环 ) ,还是条件不成立时执行循环( 直到型循环 ) 。
2. Do…Loop 循环语句
Do 循环
当型
直到型
前测式
后测式
前测式
后测式
151
格式一 : 前测式当型循环
Do While <条件 >
[< 语句组 1>]
[Exit Do]
[< 语句组 2>]
Loop
格式二 : 前测式直到型循环
Do Until <条件 >
[< 语句组 1>]
[Exit Do]
[< 语句组 2>]
Loop
格式三 : 后测式当型循环
Do
[< 语句组 1>]
[Exit Do]
[< 语句组 2>]
Loop While<条件 >
格式四:后测式直到型循环
Do
[< 语句组 1>]
[Exit Do]
[< 语句组 2>]
Loop Until<条件 >
Do…Loop 循环结构的四种格式
152
四种格式的区别在于 <条件 > 的书写位置不同,可以写在 Do 语句之后,也可以写在 Loop 语句之后,另外, <条件>之前的关键字可以是 While ,也可以是 Until 。
•使用 While<条件 > 时,当指定的条件为 True 时,执行循环体中的语句组,而当条件为 False 时则退出循环,执行循环终止语句 Loop之后的语句。
•使用 Until<条件 > 时,当指定的条件为 False 时,执行循环体中的语句组,而当条件为 True 时则退出循环,执行循环终止语句 Loop之后的语句。
使用 While 和使用 Until 的区别是:•While<条件 > 表示当条件成立时执行循环体,•Until<条件 > 则是在条件不成立时执行循环体。
153
四种格式中,格式一和格式二在循环的起始语句 Do之后判断条件,属于当型循环;
格式三和格式四在循环的终止语句 Loop 处判断条件,属于直到型循环。• Exit Do 语句用于退出循环体,执行 Loop 语句之后的语句。必要时,循环体中可以放置多条 ExitDo 语句。该语句一般放在某条件结构中,用于表示当某种条件成立时,强行退出循环• 也可以在 Do 语句和 Loop 语句之后都没有条件判断,这时循环将无条件地重复,因此在这种情况下,在循环体内必须有强行退出循环的语句,如 Exit Do 语句,以保证循环在执行有限次数后退出。
154
例:从键盘输入一正整数,判断是否是素数。
输入N值K=int(sqr(n))
I=2
Flag=0
I<=k 且 Flag=0?
N 能被I整除吗?
Flag=1
I=I+1
Flag=0?
打印不是素数
打印是素数
结束
开始程序代码如下: Input “n=”;n k=int(sqr(n)) I=2 flag=0 do while I<=k and flag=0 if n mod I=0 then flag=1 else I=I+1 end if loop if flag=0 then print n;”is a prime number.” else print n;”is not a prime number.” end if
155
3. While…Wend 循环语句
格式如下: While <条件 > < 语句组 > Wend功能:当条件为 True 时,反复执行循环,为 False时退出循环。
156
通常,把循环体内不再包含其他循环的循环结构叫做单层循环。在处理某些问题时,常常要在循环体内再进行循环操作,而在内嵌的循环中还可以再包含循环,这种情况叫多重循环,又称为循环的嵌套。
VB 对循环的嵌套层数没有限制,当循环的层数太多时,程
序的可读性会下降。
习惯上,为了使循环结构更具可读性,总是用缩排的方式书写循环体部分。
4. 循环的嵌套
157
多层循环的执行过程是,外层循环每执行一次,内层循环就要从头开始执行一轮。
如:
For I=1 To 9 For J=1 To 9 Print I; ”*” ; J ;“ =”;I*J Next J Next I
在以上的双重循环中,外层循环变量 I 取 1 时,内层循环就要执行 9 次 (J依次取 1 、 2 、 3 、…、 9) ,接着,外层循环变量 I=2 ,内层循环同样要重新执行 9 次 (J再依次取 1 、2 、 3 、…、 9)…… ,所以循环共执行 81 次。
158
同类循环可以嵌套, For…Next 循环和 Do…Loop 循环也可以互相嵌套。嵌套时,内层循环必须完全嵌套在外层循环之内。例如,以下的嵌套都是允许的
For I=1 To 10
…
For J=1 To 20
…
Next J
Next I
Do
…
For J=1 To 20
…
Next J
Loop While I<=10
For I=1 To 10
…
Do While J<=20
…
Loop
Next I
Do
…
Do While J<=20
…
Loop
Loop Until I>10
159
交叉是不允许的
For I=1 To 10
…
For J=1 To 20
…
Next I
Next J
Do
…
For J=1 To 20
…
Loop While I<=10 Next J
For I=1 To 10
…
Do While J<=20
…
Next I
Loop
160
当多重 For…Next 循环的 Next 语句连续出现时, Next 语句可以合并成一条,而在其后跟着各循环控制变量,内层循环变量写在前面,外层循环变量写在后面,例如,以下两个三重循环的写法是完全等价的。
注意, Next 语句之后的循环变量的次序,只能按先内层循环变量,后外层循环变量的次序。如果将以上的 Next 语句写成 Next I, J, K 则是错误的。
写法一For I=1 To 10
…
For J=1 To 20
…
For K=1 To 30
…
Next K
Next J
Next I
写法二For I=1 To 10
…
For J=1 To 20
…
For K=1 To 30
…
Next K, J, I
161
在多重循环的任何一层循环中都可以使用 Exit Do 或 Exit For退出循环,注意只能退出 Exit Do 或 Exit For 语句所对应的最内层循环,而不是一次退出多层循环。
例如,下例的循环退出位置如箭头所示:
F=1
For I=1 To 10
For J=1 To 10
F=F*I*J
If F>1000 Then Exit For
Next J
Print I; J; F
F=1
Next I
F=1
Do While I<=10
For J=1 To 10
F=F*I*J
If F>1000 Then Exit Do
Next J
Print F
F=1
I=I+1
Loop
Print F
162
3.3.2 举例例 1 :打印九九乘法口诀表
程序如下:Private Sub Form_Click()Dim i As Integer, j As IntegerFor i = 1 To 9 For j = 1 To 9 Print i; "*"; j; "="; Format(i * j, "@@"); Next j PrintNext iEnd Sub
163
若打印格式改进如下:
程序修改如下:Private Sub Form_Click()Dim i As Integer, j As IntegerFor i = 1 To 9
For j = 1 To i Print i; "*"; j; "="; Format(i * j, "@@"); Next j PrintNext iEnd Sub
164
若打印格式修改如下:
程序修改如下:Private Sub Form_Click()Dim i As Integer, j As IntegerFor i = 1 To 9 For j = 1 To i
Print j; "*"; i; "="; Format(i * j, "@@"); Next j PrintNext iEnd Sub
165
课后分析: 因例题、课后习题和上机实验都用到常用控件标签和文本框。
166
上机实验内容1 .用 InputBox 函数显示一输入对话框,要求用户输入要查询的编号,该对话框的标题为“编号查询”,用户输入后,用 MsgBox 语句将用户输入的值显示出来。如图所示。
167
2 .求解任意一元二次方程根的通用程序。如下图所示。要求:包括复根,保留两位小数。
168
3 .计算正整数的阶乘。如输入 5 时运行界面如图所示。
169
第 4章 数组、枚举和自定义数据类型
教学目的要求:• 掌握数组和控件数组的概念及应用 • 了解枚举和自定义数据类型
教学重点:• 数组和控件数组的应用
170
时间安排: 2 学时
教学难点: 控件数组
171
少量的数据可以使用简单变量方便地存取或处理。若数据量很大,采用这种处理方法几乎是难以做到的。而数组可以很方便地处理这种大量的数据 。
4.1 数组
4.1.1 数组的基本概念
数组是一组按一定规律进行排列的数据
172
• 数组用于表示一组性质相同的有序的数,这一组数用一个统一的名称来代替,称为数组名。数组名的命名规则与简单变量的命名规则相同。
• 数组中的每一个元素称为数组元素。为了在处理时能够区分数组中的每一个元素,需要用一个索引号加以区别,该索引号称为下标。数组中的每一个元素可以用数组名和下标唯一地表示,写成:数组名 ( 下标 ) 。
173
• 数组元素在程序中的使用与简单变量类似,在简单变量允许出现的多数地方也允许出现数组元素。数组元素也称为下标变量。
在表示数组元素时,应注意以下几点:
1) 要用圆括号把下标括起来,不能用中括号或大括号代替,也不能省略圆括号。
2) 下标可以是常量、变量或表达式,其值必须是整数,否则将被自动四舍五人为整数。
3) 下标的最小取值称为下界,下标的最大取值称为上界。在不加任何说明的情况下,数组的下界默认值为 0。
174
例如, 1000 个学生的数学成绩,可以统一取名为MScore 。
用 MScore(1) 表示第一个同学的数学成绩 ( 下标为1) ,
MScore(345) 表示第 345 个同学的数学成绩 ( 下标为 345) 。
175
数组的维数
• 一个数组的元素只有一个下标,则称为一维数组。例如,一班 40 名同学的英语成绩可以表示成 G(1) 、G(2) 、 G(3)……G(40) 。
• 用两个下标来表示元素的数组称为二维数组。对于可以表示成表格形式的数据,如矩阵、行列式等,用二维数组来表示是比较方便的。若要表示一到六班 ( 设各班有 40 人 )共 240个学生的英语成绩,可以用二维数组表示G(6,40) ,第一个下标表示班级号,第二个下标表示学号,则一班 30号学生的成绩可以表示成 G(1,30) 。
• 根据需要,还可以使用三维数组、四维数组等, VB最多允许有 60 维。
176
数组在使用之前必须先声明,声明数组的目的是为数组分配存储空间,数组名即为这个存储空间的名称,而数组元素即为存储空间的每一个单元。每个单元的大小与数组的类型有关。例如,定义某数组 X为整型数组,共有 10个元素,则每个元素占 2个字节,整个数组占 20个字节的存储空间。 按数组占用存储空间的方式不同, VB 有两种数组:固定大小的数组和动态数组。两种数组的定义方法不同,使用方法也略有不同。 固定大小的数组是指数组元素的个数在程序的执行期间不能改变的数组。这种数组在编译阶段就已经确定了存储空间,直到程序执行完毕。
4.1.2 数组的定义
177
一、 固定大小的数组的定义 1 .格式 Dim|static < 数组名 >(<维数定义 >)[As < 类型 >]
2 .功能 声明数组,包括确定数组的名称、维数、每一维的大小和数组元素的类型,并为数组分配存储空间。 3 .说明 1) Dim语句用于建立一个模块级数组。 Static 声明一静态数组。 2)< 数组名 >必须是一个合法的变量名。
178
3)<维数定义 > 形式为:[< 下界 1> To] < 上界 1> , [< 下界 2> To] < 上界 2
> ,… 下界和上界规定了数组元素每一维下标的取值范围。省略时, VB默认下界值为 0,可以使用 Option Base语句将默认下界修改为 1 。 Option Base语句的格式为:
Option Base(0 | 1) Option Base语句只能在模块级中使用,用来声明数组下标的缺省下界,它只影响位于包含该语句的模块中的数组的下界。 4)< 数据类型 > 可以是 Integer 、 Long、 Single 、 Double 、 Boolean 、 String( 可变长度字符串 ) 、 String *n( 固定长度字符串 ) 、 Currency 、Byte 、 Date 、 Object 、 Variant 、用户定义类型或对象类型。与声明变量类似,一个 As < 数据类型 > 只能定义一个数组的类型。
179
5) 声明数组后, VB自动对数组元素进行初始化,将可变类型数组元数值置为 Empty,数值类型数组元数值置为 0,字符串类型数组元数值置零长度字符串。
6) 在编译时计算机为固定大小的数组分配固定的存储空间,在运行期不能改变。 7) 可以使用 Erase语句清除固定大小数组中的元素值。Erase语句格式为:
Erase < 数组 > 该语句用于对固定大小数组中的所有元素进行初始化,即将可变类型数组元素值置为 Empty,将数值型数组元素值置为 o,将字符串类型数组元素值置为零长度字符串。
180
动态数组是指在程序执行过程中数组元素的个数可以改变的数组。动态数组也叫可变大小的数组。 使用动态数组就可以在任何时候改变其大小,并且可以在不需要时清除动态数组所占的存储空间。因此,使用动态数组更加灵活、方便,并有助于高效管理内存。
二、 动态数组的定义
181
1 .格式
定义动态数组需要分以下两步进行:
1) 按以下格式定义一个没有下标的数组。 Dim|static< 数组名 >( ) [As < 数据类型 ],…
2) 在过程级使用下面的 ReDim语句分配数组的实际元素个数。 ReDim < 数组名 >(<维数定义 >) [As < 类型 >],… 这里的 <维数定义 > 通常包含变量或表达式,但其中的变量或表达式应有明确的值。
182
2. 说明
1)ReDim语句只能出现在过程中。与 Dim语句不同, ReDim语句是一个可执行语句。 2) 可以用 ReDim语句反复改变数组元素及维数的数目。 3) 在定义动态数组的两个步骤中,如果用步骤(1) 定义了数组的类型,则不允许用步骤 (2)改变类型。 4) 每次执行 ReDim语句时,当前存储在数组中的值会全部丢失。 VB 重新对数组元素进行初始化,即将可变类型数组元素值置为 Empty,将数值型数组元素值置为 0,将字符串类型数组元素值置为零长度字符串。 5)使用 Erase语句将释放动态数组所占的存储空间, Erase语句格式为:
Erase < 数组名 >
183
数组声明后,方可使用。可以对数组元素进行各种操作:• 对数组元素赋值• 进行各种表达式运算、排序、统计、输出 使用数组可以缩短和简化程序。
三、 数组的基本操作
184
1. 数组元素的输入与输出 数组在声明之后, VB 对其进行了初始化,但在实际应用中,往往要给数组元素赋一定的初始值。 对数组元素的输入可以有多种方法:• 可以使用文本框• InputBox函数• 赋值语句• Array函数
变量名 =Array( 数组元素值表) 例: A=Array(1,2,3,4,5,6,7,8,9,10) 数组元素经过处理后,常需要将结果显示给用户,即数组元素的输出。可以使用 Print 方法输出数组元素,也可以使用控件输出数组元素,如标签、文本框、列表框、组合框等。
185
2. 数组元素的复制
数组元素的复制指将一个数组中的元素复制到另一个数组的元素中。单个数组元素的复制可以像简单变量一样用赋值语句实现,而不用考虑数组的维数是否相同。例如: A(1) = B(1 , 1) A(2) = B(2 , 2) 整个数组的复制,需要用循环来实现,例如,可以将一个具有 10个元素的一维数组 A的所有元素赋给另一个一维数组 B : For I=1 To 10 B(I)=A(I) Next I
186
3 保留动态数组的内容
对于动态数组,每当使用 ReDim语句进行定义时,数组将被重新初始化,当前存储在数组中的值就会全部丢失。 有时希望改变数组的大小而又不丢失数组中原有的数据,使用带 Preserve 关键字的 ReDim语句就可以做到这一点。使用格式为: ReDim Preserve < 数组名 >(<维数定义 >) 用 Preserve 关键字只能改变多维数组中最后一维的上界,如果改变了其他维或最后一维的下界,那么运行时就会出错。
187
ReDim定义动态数组 A有 5 个元素,并给动态数组 A的 5个元素全部赋值为 1 ,第二次使用 ReDim Preserve A(N)将A定义成 9个元素,并将A的全部元素值输出到窗体上。
可见,输出结果保留了A数组原有的 5 个元素值。若不使用 Preserve 关键字,则输出 I结果全部为零。
例:
188
5. 数组应用举例
Command1 Command2
分别生成两个( 0, 10 )之间的随机整数构成的5 行 5 列的矩阵,存于 A数组和 B 数组中,单击“求和”按钮求两个矩阵的和,存于 C数组中。分别将 A、 B 、 C 三个数组的值显示在三个图片框中。运行界面如图所示。
189
Private Sub Command1_Click()
Dim i, j
Picture3.Cls
For i = 1 To 5
For j = 1 To 5
c(i, j) = a(i, j) + b(i, j)
Picture3.Print Format(c(i, j), "@@@");
Next j
Picture3.Print
Next i
End Sub
Private Sub Form_activate()
Dim i, j
For i = 1 To 5
For j = 1 To 5
a(i, j) = Int(Rnd * 10)
b(i, j) = Int(Rnd * 10)
Picture1.Print a(i, j);
Picture2.Print b(i, j);
Next j
Picture1.Print
Picture2.Print
Next i
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
程序代码如下:
190
应用程序中对于一些类型相同、功能相似的控件,可将其定义成一个控件数组来实现。和数组变量一样,控件数组中的每一个控件是该控件数组的一个元素,表示为:
<控件数组名 > (<索引 >) 同一控件数组名称相同,各控件 ( 数组元素 ) 的索引 ( 下标 ) 不同,该索引由控件的 Index属性决定。控件数组中可用的最大索引值为 32767。同一控件数组中的不同控件可以有自己的属性设置值。
在设计时,使用控件数组添加控件所消耗的资源比直接向窗体添加多个相同类型的控件消耗的资源要少。
当希望若干控件共享代码时,控件数组也很有用,因为同一个控件数组中的不同控件共享相同的事件过程。
4.2 控件数组
191
4.2.1 控件数组的建立
在设计时,可以用以下三种方法建立控件数组。 1 .将多个控件取相同的名称
操作步骤: 1) 绘制或选择要作为一个控件数组的所有控件,必须保证它们为同一类型的控件。
2)决定哪一个控件作为数组中的第一个元素,选定该控件并将其 Name 属性值设置成数组名 ( 或使用其原有的 Name 属性值 ) 。
3)将其它控件的 Name 属性值改成同一名称。这时 VB会显示一个对话框,要求确认是否创建控件数组,选择“是”则控件添加到控件数组中。
192
例:作同类控件
确定第一元素和 Name
改 Name为同一名称
193
2 .复制现有的控件,并将其粘贴到窗体上
操作步骤: 1) 绘制或选择要作为控件数组的第一控件。 2)选择“复制”,再选择“粘贴”。 VB 同样会显示一个对话框,要求确认是否创建控件数组,选择“是”确定要创建一个控件数组。
3 .给控件设置一个 Index 属性
操作步骤: 1) 绘制或选择要作为控件数组的第一控件。 2) 在属性窗口中直接指定一个 Index 属性值(如设置为 0) 3)使用以上两种方法之一添加数组中的其它控件。这时 VB 不会显示对话框。
194
4.2.2 控件数组的使用
同一个控件数组中的所有控件共享相同的事件过程。 控件数组的事件过程会返回一个参数 Index,以表示当前是在控件数组的哪一个控件上发生了该事件。
SubPrivate Sub Command1_Click(Index As Integer)
End Sub
根据 Index 的值决定当前按下了哪一键
195
4.2.3 控件数组和一般数组的比较
控件数组 一般数组
元素为一个控件,是一对象 元素可以是各种类型的数据
下标可以不连续 下标必须连续
只有一维 可以有多维
可在空闲索引号位置上增加元素 只能在最未位置上加元
素
196
4.2.4 举例[例 4-9] 编制一测试程序,可对两位正整数进行加、减、乘、除运算进行测试。操作数由随机函数给出,用户选择运算功能并输入计算结果,如结果不正确要求重新计算。运行界面如下图所示。
197
4.3 自定义数据类型
定义: [Public|Private] Type < 自定义类型名 > <元素名 1> As < 类型名 1> [<元素名 2> As < 类型名 2>] ... End Type
说明: 1) 必须为定长字符串 2) 定义自定义数据类型变量用: Dim < 变量名 > As < 自定义类型名 > 3 )元素名引用:
< 变量名 >.<元素名 >
198
教学目的要求:• 掌握过程的概念和调用• 掌握子过程和函数的应用 • 掌握虚实结合和变量的作用域
教学重点:• 子过程和函数
第 5 章 过 程
199
时间安排: 2 学时
200
VB 应用程序是由过程组成的,除了定义一些公共的常量、变量或数组外,编写代码都是在事件过程中进行的。 事件过程由 VB 预先定义,编程人员所要做的工作就是在已经存在的过程中编写代码。 实际应用中,为了使程序结构清楚,或减少代码的重复性,可将重复性较大的代码段独立出来形成一个过程,在需要使用该过程的位置可根据不同的参数调用该过程,实现该过程所规定的功能。这种独立定义的过程叫做“通用过程”。 通用过程由编程人员建立,供事件过程或其他通用过程使用 ( 调用 ) ,通用过程也称为“子过程”或“子程序”,可以被多次调用。而调用该子过程的过程称为“调用过程”。
201
调用过程
调用 Sprg1
调用 Sprg1
调用 Sprg2
子过程: Sprg1
子过程: Sprg2
过程调用
202
VB 中,通用过程分为两类: Function 过程和 Sub过程
本章主要介绍•Function 过程•Sub过程•过程的嵌套•参数的传递•代码模块•变量的作用域与生存期
203
VB 提供了丰富的内部函数供用户使用,如 Sin函数、 Sqr 函数,使用这些函数时只需写出函数名称,并指定相应的参数就能得到函数值。
当在程序中要重复使用某一公式或处理某一函数关系,而又没有现成的内部函数可以使用时,可以自己定义函数,并采用与调用内部函数相同的方法来调用自定义函数。
自定义函数通过 Function 过程实现。 Function 过程也称为函数过程。
5.1 Function 过程5.1 Function 过程
204
5.1.1 Function 过程的定义 1 . Function 过程的格式
[Public | Private | Static] Function < 函数过程名 >([< 形参表>]) [As < 类型 >]
[<语句组 >]
[< 函数过程名 > = < 表达式 >]
[Exit Function]
[<语句组 >]
[< 函数过程名 >=< 表达式 >]
End Function
205
2 .说明• Public :可选项,缺省值。使用 Public 时表示所有模块的所有其他过程都可以调用该 Function 过程。• Private :可选项。使用 Private 时表示只有本模块中的其他过程才可以调用该 Function 过程。• Static :可选项。如果使用该选项,则 VB 只给过程中的所有局部变量分配一次存储空间,即在应用程序执行期间,每次调用该 Function 过程时将保留该过程中的局部变量值。若没有使用该选项,则每次调用该 Function 过程时,其中的局部变量都要被重新初始化。• < 函数过程名 > : Function 过程的名称,遵循变量的命名规则。
206
• < 形参表 > :可选项。表示在调用时要传递给 Function 过程的参数变量列表。多个变量之间用逗号隔开。 < 形参表 > 的格式为: [ByVal | ByRef] < 变量名 >[( )] [As < 类型 >] 其中: ByVal 为可选项,表示该参数按值传递 ; ByRef为可选项,缺省值,表示该参数按地址传递。 < 变量名 > 遵循变量命名规则的任何变量名或数组名。 ( )当参数为数组时使用。 As< 类型 >为可选项,用于声明参数的数据类型。
207
• As < 类型 > :可选项。 Function 过程的返回值的数据类型 , 可以是 Byte 、 Boolean 、 Integer 、 Long、 Currency 、 Single 、 Double 、 Date 、String( 固定长度除外 ) 、 Object 、 Variant 或用户自定义类型。
• <语句组 > :可选项。语句组中可以有一条或多条Exit Function语句。
• Exit Function语句:从 Function 过程中退出。
• < 表达式 > :可选项。 Function 过程通过赋值语句 “< 函数过程名 > = < 表达式 >”将函数的返回值赋给 < 函数过程名 > 。如果省略该语句,则数值函数过程返回 0,字符串函数过程返回空串。
208
Function 过程的建立可以在窗体模块中进行,也可以在标准模块中进行。建立的方法有以下两种:
Function 过程的定义不能嵌套,即不能在 Function 过程中再定义 Function 过程或 Sub过程。
例如, Function Fact(N As Integer) ,回车后,此时代码窗口中即可在 Function 语句和 End Function 语句之间输入程序代码。
1)直接在代码窗口中输入在代码窗口中的所有过程之外,输入过程的第一条语句。
209
2)使用“添加过程’’命令。
打开代码窗口,执行“工具”菜单中的“添加过程”命令,弹出‘‘添加过程’’对话框,输入过程名
选择类型
选择范围
210
5.1.2 Function 过程的调用
定义函数过程的目的是为了在其他过程中调用,通过调用将一些参数值传递给函数过程,在函数过程中利用参数值计算并返回函数值。 Function 过程的调用与内部函数的调用类似,即可以直接在表达式中调用。 格式: < 函数过程名 > ([< 实参表 >]) 其中, < 函数过程名 >为要调用的 Function 过程的名称; < 实参表 >为要传送给 Function 过程的常量、变量或表达式,各参数之间用逗号分隔,如果是数组,在数组名之后必须跟一对空括号。
211
Function 过程定义及调用举例
过程定义
Label2
Label3
Text1
212
当需要定义的过程返回一个值时,使用前面介绍的 Function 过程很容易实现,但在实际应用中,可能希望过程不需要返回值,例如,使用过程打印一个图形,或需要返回多个值;利用过程对一批数据进行排序,或者要进行较复杂的操作,等等。在这些情况下就要利用 Sub过程来实现。
5.2 Sub 过程
213
5.2.1 Sub 过程的定义
1 . Sub 过程的格式
[Private | Public][Static] Sub < 过程名 > [(< 形参表 >)]
[< 语句组 >]
[Exit Sub]
[< 语句组 >]
End Sub
214
2 .说明
• 格式中各项含义同 Function 过程。 Exit Sub用于退出Sub过程。• Sub过程的 < 过程名 > 与 Function 过程的 < 函数过程名 > 的含义与作用不同, < 过程名 > 只在调用 Sub过程时使用,不具有值的意义,在 Sub过程中不能给 < 过程名 >赋值,也不能给 < 过程名 > 定义类型。• 过程可以返回 0到多个值,且由 < 形参表 > 中的参数返回这些值。因此,使用函数过程可以实现的功能,也可以用 Sub过程实现。• Sub过程的建立方法与 Function 过程的建立方法相同,可以在代码窗口中直接输入,也可通过执行“工具”菜单中的“添加过程”命令生成过程模板。
215
5.2.2 Sub 过程的调用
定义一个 Sub 过程之后,必须使用 Call 语句调用该过程。 调用格式一: Call < 过程名 > [(< 实参表 >)] 调用格式二: < 过程名 > [< 实参表 >]
·< 过程名 > :要调用的 Sub 过程名。 ·< 实参表 > :要传送给 Sub 过程的常量、变量或表达式,各参数之间用逗号分隔。如果是数组参数,则要在数组名之后跟一对空括号。 · 用 Call 语句调用一个 Sub 过程时,如果过程本身没有参数,则省略 < 实参表 > 和括号。 .格式二省略了 Call 关键字,同时 < 实参表 > 两边也不能带括号。
216
在一个过程执行期间又调用另一个过程 ,称为过程的嵌套 .
调用 S1 调用 S2 S2
5.3 过程的嵌套
217
5.4.1 形参和实参
形参是在 Sub过程、 Function 过程的定义中出现的变量名,实参则是在调用 Sub过程或 Function 过程时传送给 Sub过程或 Function 过程的常量、变量、表达式或数组。
在调用一个过程时,必须把实参传送给过程,完成形参与实参的结合,然后用实参执行调用的过程。这种参数的传递也称为参数的结合。
5.4 参数的传递
218
例如,定义如下一个过程:Sub SubTest(n As Integer, Sum As Single) …End Sub 如果有以下调用语句:Call SubTest(a, s) 则其形参与实参的结合关系如下: 过程调用 : Call SubTest(a, s)
过程定义 : Sub SubTest(n As Integer, Sum As Single) 在传递参数时,形参表与实参表中对应参数的名字不必相同,但要求形参表与实参表中参数的个数、类型、位置顺序必须一一对应。 形参表中的参数可以是:除固定长度字符串之外的合法变量名,后面带一对圆括号的数组名。 实参表中的参数可以是:常量、变量、表达式、后面带一对圆括号的数组名。 VB 中 , 形参与实参的结合有两种方式:按值传递和按地址传递。
219
5.4.2 按值传递和按地址传递
1 .按值传递 按值传递是指实参把其值传递给形参而不传递实参的地址。在这种情况下,系统把需要传递的参数复制到一个临时存储单元中,然后把临时存储单元与形参结合,在子程序执行过程中,形参值的改变不会影响主程序中实参的值,因此,数据的传递是单向的。
220
2 .按地址传递
按地址传递即指将实参的地址传给形参,使形参和实参具有相同的地址,即形参与实参共享同一存储单元。当实参为变量或数组时,形参使用关键字 ByRef 定义 ( 或省略 ) ,表示要按地址传递。当参数是数组时,数组名之后必须使用一对空的圆括号。按地址传递可以实现调用过程与子过程之间数据的双向传递。
221
VB 应用程序由三种模块组成,即窗体模块(Form) 、标准模块 (Module) 和类模块 (Class) 。这些模块通常保存在具有特定类型名的文件中,窗体模块保存在以 .frm为类型名的文件中;标准模块保存在以 .bas 为类型名的文件中;类模块保存在以 .cls 为类型名的文件中。
5.5 代码模块
222
VB 应用程序的组成
类模块
(.cls) 文件
标准模块
(.bas) 文件
事件过程
窗口模块
(.frm) 文件
应用程序
工程文件
Function 过程
Sub 过程 Function 过程 Sub 过程
223
5.5.1 窗体模块
窗体模块是大多数 VB 应用程序的基础。 窗体模块可以包含处理事件的过程、通用过程以及变量、常量、类型和外部过程的窗体级声明。若要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性设置值。窗体模块还可以引用该应用程序内的其他窗体或对象。
224
5.5.2 标准模块
当一个应用程序含有多个窗体,且这些窗体都需要调用某一个通用过程时,就需要建立一个标准模块,在该标准模块中建立通用过程。标准模块可以包含变量、常量、外部过程和全局过程的全局 ( 在整个应用程序范围内有效的 )声明或模块级声明。缺省情况下,标准模块中的代码是公有的,任何窗体或模块中的事件过程或通用过程都可以访问它。标准模块不与任何窗体相关联。在标准模块中可以包含通用过程,但不能包含事件过程。 添加标准模块的步骤: 1) 从“工程”菜单中执行“添加模块”命令,打开“添加模块”对话框。 2) 在“新建”选项卡中,双击“模块”图标即可建立一个标准模块Modulel,打开标准模块代码窗口。
225
5.5.3 类模块
在 VB 中类模块是面向对象编程的基础。 可在类模块中编写代码建立新对象,这些新对象可以包含自定义的属性和方法。实际上,窗体正是这样一种类模块,在其上可安放控件,可显示窗体窗口。
226
5.5.4 过程的作用域 在窗体模块中可以建立事件过程、通用过程,在标准模块中只能建立通用过程。过程的建立位置不同,允许被访问的范围也不同。 VB 中,可以将过程的作用域分为模块级和全局级。 在 Sub过程或 Function 过程前如果加 Private 关键字,则这种过程只能被其所在的窗体模块或标准模块中的其他过程所调用,称为模块级过程。 在 Sub过程或 Function 过程前如果加 Public 关键字,或者省略Public 与 Private 关键字,这种过程可以被该应用程序的所有窗体模块或所有标准模块中的过程所调用,称为全局过程。 全局过程所处的位置不同,其调用方式也有所区别。在窗体模块内定义的全局过程,其他模块中的过程要调用时,必须在被调用过程名前加上其所在的窗体名;在标准模块内定义的全局过程,其他模块中的过程可直接调用,但被调用过程名必须惟一,否则要加上其所在的标准模块名。
227
作用域 模块级 全局级
窗体模块 标准模块 窗体模块 标准模块
定义方式
过程名前加 Private ,例如: Private Sub Subl
(< 形参表 >)
过程名前加 Public ,例如: [Public] Sub Sub2 ( 形参表 )
能否被本模块中其他过程调用
能 能 能 能
能否被本应用程序中其他模块调用 否 否
能,但必须在过程名前加窗体名,例如: Call Forml.Sub2 (< 形参表 >)
能,但过程名必须唯一,否则必须在过程名前加标准模块名,例如: Call Modulel.Sub2(<形参表 >)
过程的作用域及过程定义、调用规则
228
VB 的程序模块由一些过程组成,在过程中会使用到变量,包括在形参表中出现的变量以及不在形参数表中出现的变量。本节要讨论的是不在形参表中出现的变量。
变量的定义位置不同,定义方式不同,允许被访问的范围和作用时间也不相同。变量的作用域即指变量的有效范围。变量的生存期即指变量的作用时间。
5.6 变量的作用域与生存期
229
5.6.1 变量的作用域
变量的作用域决定了应用程序中哪些过程可以访问该变量。按变量的作用域不同,可以将变量分为:局部变量、窗体 / 模块级变量和全局变量。
1 .局部变量
局部变量指在过程内用 Dim 语句声明的变量、未声明而直接使用的变量、用 Static声明的变量。这种变量只能在本过程中使用,不能被其他过程访问。在其他过程中如果有同名的变量,也与本过程的变量无关,即不同的过程中可以使用同名的变量。除了用 Static声明的变量外,局部变量在其所在的过程每次运行时都被初始化。
230
2 .模块级变量
模块级变量指在窗体模块或标准模块的通用声明段中用 Dim 语句或 Private 语句声明的变量。模块级变量的作用范围为其定义位置所在的模块,可以被本模块中的所有过程访问。模块级变量在其所在的模块运行时被初始化。
3 .全局变量
全局变量指在模块的通用声明段中用 Public 语句声明的变量,其作用范围为应用程序的所有过程。全局变量在应用程序运行时被初始化。
231
作用域 局部变量 模块级变量 全局变量
窗体模块 标准模块
声明方式 Dim 、 Static
Dim 、 Private
Public
声明位置 在过程中窗体模块、标准模块的通用声明段
窗体模块、标准模块的通用声明段
能否被本模块中其他过程调用
否 能 能
能否被本应用程序中其他模块调用
否 否能,但要在变量名前加窗体名
能
变量的作用域及声明、使用规则
232
5.6.2 变量的生存期
当一个过程被调用时,系统将给该过程中的变量分配存储单元,当该过程执行结束时,是释放还是保留变量的存储单元,这就是变量的生存期问题。
根据变量的生存期,可以将变量分为动态变量和静态变量。
233
1 .动态变量
在应用程序中的变量如果不使用 Static语句进行声明,则属于动态变量。
• 对于过程级的动态变量,在程序运行到变量所在的过程时,系统为变量分配存储空间,并进行变量的初始化工作;当该过程结束时,释放变量所占用的存储空间,其值不再存在。• 模块级动态变量在运行模块时被初始化,在退出模块时释放其所占用的存储空间。• 全局级动态变量在应用程序执行时分配存储空间,在退出应用程序时释放存储空间。
234
2 .静态变量
如果一个变量用 Static语句声明,则该变量只被初始化一次,在应用程序运行期间保留其值,即在每次调用该变量所在的过程时,该变量不会被重新初始化,而在退出变量所在的过程时,不释放该变量所占的存储空间。
声明静态变量:
Static < 变量名 > [As < 类型 >]
Static Function < 函数过程名 >([< 形参表 >]) [As < 类型 >]
Static Sub < 过程名 > [< 形参表 >]
在 Function 过程、 Sub过程的定义语句中使用 Static修饰词,表明该过程内所有的局部变量均为静态变量。
235
例 5-22
Static Sub SS1( )
For I = 1 To 10
S = S + I
Next I
Print S
End Sub
Private Sub Command1_Click( )
Call SS1
End Sub
55
110
165
……
55
110
165
……
236
第六章 文 件
237
使用文件可以将应用程序所需要的原始数据、处理的中间结果以及执行的最后结果以文件的形式保存起来,以便继续使用或打印输出。 VB 访问文件的方法有两种,• 一种是使用传统的访问文件方法,如使用 Open 、 Write #语句等进行访问,而要查询关于磁盘的信息 ( 如磁盘的容量 ) ,查询文件和文件夹的信息 ( 如创建时间等 ) ,要进行文件、文件夹的复制、移动和删除等操作还要使用 Windows APl函数;• 另一种是使用 VB6 提供的新方法,即使用文件系统对象FSO(File System Object) 对文件进行访问。使用 FSO对象可以轻而易举地完成对驱动器、文件夹及文件的管理。另外,使用 VB 的内部文件系统控件 ( 如 DriveListBox、DirListBox、 FileListBox) 可以实现选择驱动器、遍历浏览文件夹或文件等操作。
238
文件是存储数据的基本单位,任何对数据的访问都是通过文件进行的。通常在计算机的外存储设备 ( 如磁盘、磁带 )上存储着大量的文件,比如文本文件;位图文件、程序文件等,常将具有相互关系的一组文件放在同一个文件夹中,系统通过对文件、文件夹的管理达到管理数据信息的目的。 可以从不同的角度对文件进行分类,例如,按文件的存储介质不同,可以分为磁盘文件、磁带文件、打印文件等;按文件的存储内容不同,可以分为程序文件和数据文件;按文件的访问方式不同,又可以将文件分为顺序文件、随机文件和二进制文件。 数据文件用于保存程序运行时所用到的输入、输出数据或中间结果,它一般由一些数据记录构成,每个记录又包括一些数据项。 VB 通常以记录为单位存取数据文件中的数据。
6.1 文件的基本概念
239
顺序文件即普通的纯文本文件,其数据是以字符(ASCII码 ) 的形式存储的,可以用任何字处理软件进行访问。 对顺序文件中的数据的操作只能按一定的顺序执行,建立时只能从第一个记录开始,一个记录接一个记录地写入文件。读写文件时只能快速定位到文件头或文件尾,但如果要查找位于中间的数据,就必须从头开始一个一个地查找,直到找到为止,就好像在录音带上查找某首歌一样。 顺序文件 : 优点是结构简单、访问方式简单; 缺点是查找数据必须按顺序进行,且不能同时对顺序文件进行读写操作。
240
随机文件是以固定长度的记录为单位进行存储的。随机文件由若干条记录组成,而每条记录又可以包含多个字段,每个记录包含的字段数和数据类型都是相同的。 随机文件按记录号引用各个记录,通过简单地指定记录号,就可以很快地访问到该记录。 随机文件 优点是可以按任意顺序访问其中的数据,可以方便地修改各个记录而无需重写全部记录,可以在打开文件后同时进行读写操作; 缺点是不能用字处理软件查看其中的内容,占用的磁盘存储空间比顺序文件大。其严格的文件结构也增加了编程的工作量。
241
二进制文件是以字节为单位进行访问的文件。由于二进制文件没有特别的结构,整个文件都可以当做一个长的字节序列来处理,所以可以用二进制文件来存放非记录形式的数据或变长记录形式的数据。
242
顺序文件要顺序进行读写,操作分为三步:• 打开文件• 读或写文件• 关闭文件
10.2.1 顺序文件的打开和关闭 1. 打开打开顺序文件使用 Open语句。•格式:Open < 文件名 > For [Input | Output | Append] As [#] < 文件号 > [Len =< 缓冲区大小 >]•功能:按指定方式打开一个文件,并为文件指定一个文件号。
6.2 顺序文件
243
说明 :• < 文件名 > :一个字符串表达式,可以包含驱动器符及文件夹。• Input :表示以只读方式打开文件。当要读的文件不存在时会出错。• Output :表示以写方式打开文件。如果文件不存在,就创建一个新的文件;如果文件已经存在,则删除文件中的原有数据,从头开始写入数据。• Append:表示以添加的方式打开文件。如果文件不存在,就创建一个新的文件。打开文件时,保留原有的数据,写数据时从文件尾开始进行添加。• < 文件号 > :表示打开文件的文件句柄,是一个介于 1-511之间的整数。 VB 提供了函数 FreeFile 来为打开的文件分配系统中未被使用的文件号。 < 文件号 >前的 #号可以省略。• < 缓冲区大小 > :表示可使用的缓冲区的字节数。
244
例:要在 C 盘 Data 文件夹下建立一个名为 Student.dat 的顺
序文件,使用 Open语句: Open ”C:\Data\Student.dat” For Output As #l
打开当前盘当前文件夹下名为 Salary.dat 的顺序文件,以便从中读取数据:
Open ”Salary.dat” For Input As #8
打开 C 盘 Data 文件夹下名为 Student.dat 的文件,以便在文件尾添加数据:
Open ”C:\Data\Student.dat” For Append As 2
245
2 .顺序文件的关闭
完成文件操作后,要使用 Close语句关闭打开的文件。
格式:
Close [< 文件号列表 >]
< 文件号列表 >包括一个到多个已经打开的文件的文件号,各项之间用逗号隔开,省略时则关闭所有已打开的文件。
例如: 关闭文件号为 1 的文件: Close #l 关闭文件号为 1 、 2 、 8 的文件: Close #1, 2, 8 ‘ 文件号前的“ #” 号可以省略 关闭所有文件: Close
246
10.2.2 顺序文件的读写 1. 顺序文件的写操作 VB 提供了两个向文件写入数据的语句,即 Write #语句和Print #语句。
(1)Write #语句 格式: Write # < 文件号 >[, < 输出列表 >] 功能:将 < 输出列表 > 的内容写入指定的文件中。 其中, < 输出列表 > 中各项之间要用逗号分开,每一项可以是常量、变量或表达式。 Write #语句将各输出项的值按列表顺序写入文件,并在各值之间自动插入逗号,并且将字符串加上双引号。所有变量写完后,将在最后加入一个回车换行符。 不含 < 输出列表 > 的 Write #语句,将在文件中写入一空行。
247
(2)Print #语句
格式: Print # < 文件号 > , < 输出列表 > 功能:将 < 输出列表 > 的内容写入指定的文件中。 < 输出列表 > 中各项要用逗号或分号隔开。当用逗号分隔时,采用分区格式输出;当用分号分隔时,采用紧凑格式输出,所有项将在一行内输出,所有项输出后将自动换行。每一项可以是常量、变量或表达式。 Print #语句与 Write #语句不同,用 Print #语句输出后,文件中的字符串没有被加上引号,各项之间没有逗号分隔。另外, < 输出列表 > 中可以使用 Spc( ) 函数和 Tab( )函数。
248
例如: Print #1 ,”函数”, Spc(8) ,”实验”在”函数”和”实验”间留有 8 个空格
Print #1 ,”定位”, Tab(8) ,”实验”“ 实验”将写在第 8 列开始的地方 用 Write # 语句和 Print # 语句产生的两种不同格式的数据文件: 用 Write # 语句生成的数据: ”001”,” 张三 ",87,92 ”002”,”李四” ,76,89 ”003“,”王五 ",93,86
用 Print # 产生的数据: 001 张三 87 92 002 李四 76 89 003 王五 93 86
249
2. 顺序文件的读操作
VB允许使用多种方式来读取顺序文件中的数据。 (1)Input #语句 格式: Input # < 文件号 >,< 变量列表 > 功能:从文件中读取一行数据,并将这些已格式化的数据,依次读人 < 变量列表 >所列的各变量中。
读出数据的类型要与变量列表中变量的类型相匹配,否则会读出错误的结果。 Input #语句常与 Write #语句配合使用。
250
(2) Line lnput #语句
格式: Line lnput #< 文件号 >, < 变量名 > 功能:从文件中读取一行数据,即读取从行首到回车换行符之间的所有字符 ( 不包括回车和换行符 ) 。读出的字符串放在 < 变量名 > 中。 该语句常与 Print #配合使用。
读顺序文件的过程中,可以使用 EOF函数判断是否已读到了文件尾, EOF函数使用格式为: EOF (< 文件号 >) 该函数返回一个布尔值,当返回值为True 时,表明已经到达文件的末尾。
251
(3)Input 函数
格式: < 变量名 > = Input( 整数 , [#]< 文件号 >) 功能:从指定文件的当前位置一次读取指定个数的字符,并赋值给变量。
例如,有如下程序段: Open ”a:\d1.dat” For Input As #1 MyStr = Input(6, #1) Textl.Text = MyStr
假设数据文件 d1.dat 的内容为 "VisualBasic" ,则执行上述程序段后,文本框中显示 "Visua ,只读取了 6 个字符。
252
(4)InputB 函数 格式: < 变量名 > = InputB( 字节数, [#]< 文件号 >) 功能 : 从指定文件的当前位置一次读取指定字节数的数据,并赋值给变量。
253
随机文件中的数据是以记录的形式存放的。通过指定记录号就可以快速地访问相应的记录。打开随机文件后,在读出数据的同时允许对数据进行修改、写入。
VB 对随机文件的访问具有严格的限制:随机文件中的每条记录的长度是相同的,每条记录相对应的字段的数据类型必须相同。所以在对随机文件操作前常常先定义一种数据结构来存放写入或读出的数据,然后再打开文件进行读写操作,操作完成后还要关闭文件。
6.3 随机文件
254
VB 中可以使用用户自定义类型来定义这种数据结构。自定义类型通过 Type语句来实现。格式如下: [Private|Public] Type <自定义类型名 > <元素名 >[( 下标 )] As <t 类型 > <元素名 >[( 下标 )] As < 类型 > End Type <自定义类型名 > 、 <元素名 > 遵循变量的命名规则。 < 类型 > 可以是 VB 系统提供的基本数据类型或已声明的自定义类型。 缺省 [Private|Public] 选项时,默认是 Public 。自定义类型必须在窗体模块或标准模块的“通用”位置的声明段进行声明。窗体模块中定义自定义类型时必须使用 Private 。 如果自定义类型的一个元素为数组,则其下标的下界不受 Option Base语句的限制。在使用自定义类型前,必须先声明自定义类型的变量。引用自定义类型元素,使用如下格式: <自定义类型变量名 >.<元素名 >
255
例如,声明一个 Students 类型的变量。 Load 事件过程为变量的每个元素赋值。单击窗体输出自定义类型变量各元素的值。代码如下:Private Type Students
Dept As String*20
ClassNo As String*10
Name As String
Age As Integer
End Type
Private Sub Form_C1ick()
Print Stud.Dept ,输出每个元素的值
Print Stud.ClassNo, Stud.Name, Stud.Age
End Sub
Dim Stud As Students
Private Sub Form_Load()
Stud.Dept = ” 计算机系”
Stud.ClassNo = ” 软件 200l—1”
Stud.Name = ” 张三“
Stud.Age = 18
End Sub
256
10.3.1 随机文件的打开和关闭
1 .随机文件的打开 对随机文件存取之前也必须先打开文件,打开随机文件也使用 Open语句。 格式:Open < 文件名 > [For Random] As< 文件号 > Len = < 记录长度 >
其中, For Random表示打开随机文件,可以省略。 < 记录长度 > 通常就是自定义类型的大小,可用 Len 函数获得。当使用带参数 Random的 Open语句打开随机文件时,如果文件已经存在则直接打开,否则建立一个新的文件。
2 .随机文件的关闭 随机文件的关闭同样使用 Close语句。 例如: Close #1语句表示关闭文件号为 1 的文件。
257
10.3.2 随机文件的读写
1 .写文件 VB使用 Put语句向随机文件中写数据。 格式: Put [#]< 文件号 >, [< 记录号 >], < 变量名 > 功能:将一个变量的数据写人随机文件中。 其中,< 记录号 > :若文件中已有此记录,则该记录将被新数据覆盖;若文件中无此记录,则在文件中添加一条新记录。如果省略 <记录号 > ,则写人数据的记录号为上次读或写的记录的记录号加 1 。< 变量名 > :通常是一个自定义类型的变量,也可以是其他类型的变量。
258
2 .读文件
VB使用 Get语句从随机文件中读取数据。
格式: Get [#]< 文件号 >, [< 记录号 >], < 变量名 >
功能:将一个已打开的随机文件的一条记录读人一个变量之中。
这里,
< 记录号 > 的含义与 Put 相同。
< 变量名 > 通常是用户自定义类型,用于接收从随 机文件中读取的记录。
259
VB 为用户提供了三个文件系统控件:驱动器列表框 (DriveListBox)目录列表框 (DirListBox)文件列表框 (FileListbox)
它们都能自动从操作系统获取信息,让用户了解有关驱动器、目录和文件的当前状态。这三个控件可以单独使用,也可以组合起来使用。
组合使用时,可在各控件的事件过程中编写代码,建立它们之间的联系,产生联动的关系。
6.4 文件系统控件
260
10.4.1 驱动器列表框 (DriveListBox) 驱动器列表框是一种能显示系统中所有有效磁盘驱动器的列表框。用户可以单击列表框右侧的箭头从列出的驱动器列表中选择驱动器。 1 .属性 Drive 属性:返回或设置磁盘驱动器的名称。可以是任何一个有效的字符串表达式,该字符串的第一个字母必须是二个有效的磁盘驱动器符号。如:“ C:\”或“D”等。 Drive 属性只能在运行时被设置,当被设置后,驱动器盘符出现在列表框的顶部。改变 Drive 属性的设置值将激活 Change事件。从列表框中选择驱动器并不能自动地变更系统当前的工作驱动器,要改变系统当前的工作驱动器需要使用 ChDrive语句。 例如: rDrive = Drivel.Drive ‘ 读取驱动器 Drivel.Drive = ”c:\’ ‘ 设置驱动器 ChDrive ”C:” ’ 表示将驱动器 c; 变成当前工作驱动器
261
2. 事件 驱动器列表框的常用事件为 Change 事件。当选择一个新的驱动器或通过代码改变 Drive 属性的设置时触发该事件。
例如,将在驱动器列表中选择的驱动器设置为当前驱动器,可以在该事件过程中编写代码: Private Sub Drivel_Change() ChDrive Drivel.Drive End Sub
262
10.4.2 目录列表框 (DirListBox)
目录列表框通过显示一个树型的目录结构来列出当前驱动器下的分层目录,其中每一行代表一级目录,当用鼠标双击某一目录时,将打开该目录并显示其子目录。 1 .属性 Path 属性:返回或设置当前工作目录的完整路径 (包括驱动器盘符 ) 。 当改变 Path 属性时,将激活一个 Change 事件。在设计阶段,该属性不可用。设置 Path 属性相当于改变了目录列表框的当前目录。在目录列表框中选择目录并不能改变系统的当前目录,要想真正改变系统当前目录必须使用ChDir语句。 2 .事件 目录列表框的常用事件为 Change 事件。 -当双击一个目录项或通过代码改变 Path 属性的设置时触发该事件。
263
10.4.3 文件列表框 (FileListBox)
文件列表框是一个带滚动条的列表框,用来显示特定目录下的文件。编写程序时,经常用到 Path 属性、 FileName 属性、Pattern 属性和 Click 事件、 DblClick 事件。 1 .属性 Path 属性:返回或设置当前目录的路径名。其值为一个表示路径名的字符串表达式。编写程序时,文件列表框的 Path 属性值一般由目录列表框的 Path 属性获得。当Path 属性被设置后,文件列表框将显示当前目录下的文件。 Path 属性只能在运行阶段设置。 FileName 属性:设置或返回所选文件的路径和文件名。当在程序中设置 FileName 属性时,可以使用完整的文件名,也可以使用不带路径的文件名;当读取该属性时,则返回当前从列表中选择的不含路径名的文件名或空值。改变该属性值可能会激活一个或多个事件 ( 如 PathChange 、 PatternChange或 DblClick 事件 ) 。 ’
264
Pattern 属性:返回或设置要显示的文件类型,即按该属性的设置对文件进行过滤以显示满足条件的文件。其值是一个带通配符的文件名字符串,代表要显示的文件名类型。如,“ *.TXT”等。缺省值为“ *.*”。如果过滤的类型不止一种,可以用分号分隔。例如:
Filelistboxl.Pattern = ”*.EXE; *.COM”表示只显示以 .EXE和 .COM为后缀的文件。
2 .事件
当用户单击或双击文件列表框中的文件时,激活Click 或 DblClick 事件。
另外,设置 FileListBox控件的 ReadOnly属性、Archive 属性、 System属性、 Normal属性、 Hidden 属性也可以对文件进行过滤。
265
266
文件系统对象 (FSO)模型是 VB6 的新增功能,用于对文件系统进行管理。它通过一种基于对象的方式,使用户在编写程序时可以通过这些对象提供的丰富的属性和方法来操纵和管理计算机的文件系统。
6.5 文件系统对象模型
267
10.5.1 文件系统对象模型概述
FSO 对象模型提供了一组对文件系统的驱动器、文件夹和文件进行管理的对象。 FSO 对象模型的主要对象有 : FileSystemObject 文件系统对象模型的核心对象。它提供了一整套用于收 集相关信息,以及操纵驱动器、文件夹和文件的方法 Drive 用来收集系统所用的驱动器的信息 Folder 提供对一个文件夹所有属性的访问 ( 查询文件夹的名称、 路径等 ) ,也允许使用适当的方法创建、删除或移动文件夹 File 提供对文件所有属性的访问 ( 查询文件的名称、路径等 ) ,也可以使 用适当的方法创建、删除或移动文件 TextStream 允许用户读和写文本文件
FSO 对象模型包含在一个称为 Scripting 的类型库中,此类型库位于 Scrrun.DLL 文件中。如果还没有引用此文件,则执行“工程”菜单的“引用”命令,打开“引用对话框”选择“Microsoft Scripting Runtime” 项。
268
1 .使用 FSO 对象模型编程的主要步骤
1)创建 FileSystemObiect 对象。 2) 据编程需要,有两种选择:一对 FileSystemObiect对象使用适当的方法生成用于管理驱动器、文件夹和文件的对象 ( 如 Drive 对象、 Folder 对象、 File 对象 ) ,用新创建的对象进行文件和文件夹的复制、移动、删除;二是使用 FileSystemObjiect 对象的方法,进行文件或文件夹的创建、复制、移动、删除。再生成用于管理驱动器、文件夹和文件的对象 ( 如 Drive 对象、 Folder 对象、File 对象 ) 来实现其他功能。 3)访问步骤 2 生成的新对象的属性,以获取文件系统的信息 ( 如文件名称、大小等 ) 。
269
2 . FileSystemObiect 对象的创建
创建 FileSystemObject 对象主要有二种方法: 1)使用 New 关键字,将一个变量声明为 FileSystemObiect对象类型。例如: Dim FSO As New FileSystemObject 2)使用 CreateObject 函数创建一个 FileSystemOBJect 对象。例如; Set FSO = CreateObject(”Scripting.FileSystemObject”) FSO 对象目前不支持对二进制文件和随机文件的访问,只能通过 Textstream 对象读写纯文本文件。 FileSystemObject 对象提供了许多与其他对象相同的功能,如 FileSystemObject 对象的 CopyFile 方法与 File 对象的 Copy方法功能一样,编程时可以任选一种方法使用。
270
10.5.2 管理驱动器
在 FSO 对象模型中, Drive 对象主要用于管理驱动器。通过调用 Drive 对象的属性不仅能读取系统本地驱动器的信息,还能获得网络驱动器的信息。在编程时,通过对 FileSystemObject 对象使用 GetDrive 方法,建立一个 Drive 对象的实例,再调用 Drive 对象的属性获取驱动器的信息。
271
10.5.3 管理文件夹
使用 FSO 对象模型对文件夹的管理包括文件夹的创建、复制、移动、删除及获取与文件夹有关的信息。 FileSystemObject 对象和 Foldef 对象都能完成对文件夹的管理工作,但使用 Folder 对象的属性还可以获取文件夹的信息。
272
创建一个文件夹 FileSystemObject.CreateFolder
删出一个文件夹 FileSystemObject.DeleteFolder 或 Folder.Delete
移动一个文件夹 FileSystemObject.MoveFolder 或 Folder. Move
复制一个文件夹 FileSystemObject.CopyFolder 或 Folder. Copy
检索文件夹的名称 Folder. Name
查找一个文件夹是否在驱动器上 FileSystemObject.FolderExists
获得已有 Folder 对象的一个实例 FileSystemObject.GetFolder
找出一个文件夹的父文件夹名称 FileSystemObject.GetParentFolderName
找出系统文件夹的路径 FileSystemObject.GetSpecialFolder
273
1 .文件夹的创建 使用 FileSystemObJect 对象的 Createfolder 方法可以创建文件夹。
例如:在 C盘上建立两个文件夹:“ apple” 和“ orange” ,可以通过下列程序段实现: Dim fso Set fso = CreateObject(”Scripting.FileSystemObiect”) fso.CreateFolder(”c:\apple”) fso.CreateFolder(”c:\orange”) 注意,如果要创建的文件夹已存在,则此语句会出错,所以编写程序时应先判断要创建的文件夹是否已存在,然后再操作。
274
2 .文件夹的复制、移动、删除
文件夹的复制、移动、删除分别可以用两种方法实现。 例如:将上例创建的文件夹 orange复制到 apple文件夹中,可以有两种实现方法。
• 方法一:使用 FileSystemObject 对象的方法 Dim fso Set fso = CreateObiect(”Scripting.FileSystemObject”) fso.CopyFolder(”C:\orange”, ”C:\apple\”)
• 方法二:使用 Folder 对象的方法 Dim fso,o_folder Set fso = CreateObiect("Scripting.FileSystemObject") Set o_folder = fso.GetFolder(”C:\orange”) o_folder.Copy "c:\apple\”
275
3 .获取与文件夹有关的信息
FilesystemObject 对象和 Folder 对象配合使用可以获取关于文件夹的全部信息。编写程序时,通过对 FilesystemObject 对象使用适当的方法 (GetFolder 方法、 CreateFolder 方法 ) ,建立一个 Folder 对象的实例,再调用 Folder 对象的属性获取文件夹的信息。
276
10.5.4 管理文件
与管理文件夹一样,使用 FSO 对象模型管理文件包括文件的创建 ( 打开 ) 、复制、移动、删除及获取与文件有关的信息。 FileSystemObject 对象和 File对象都能完成对文件的管理工作,但侧重点不同。 •对 FileSystemObject 对象使用适当的方法可以完成文件的创建、复制、移动、删除;
•对 File 对象使用适当的方法同样也可完成文件的复制、移动、删除,同时调用 File 对象的属性可获取文件的信息。
277
1 .文件的创建与打开 FSO 对象模型提供了三种创建和打开文件的方法。 (1)使用 PileSystemObJect 对象的 CreateTextfile 方
法创建文件格式: < 对象名 >.CreateTextFile(< 文件名 [,<覆盖否 >]) 功能:创建一个指定文件名的文件,并且返回一
个用于对该文件进行读写的 TextStream 对象。 其中,< 对象名 > :一个 FileSystemObject 对象的名字。< 文件名 > :字符串表达式,表示新创建文件的文
件名。<覆盖否 > :当设置为 False 时,表示如果文件已存
在,新创建的文件不覆盖原文件,否则覆盖原文件。缺省值为 Palse 。当 <覆盖否 > 参数为 False 时,如果创建的文件已经存在,则发生错误,所以使用前要用FileExists 方法判断文件是否存在。
278
(2)使用 FileSystemObject 对象的 OpenTextFile 方法 通常使用 OpenTextFile 方法来打开文件,但当其带参数“ <创建否 >” 时,可以创建一个新文件。 格式:
< 对象名 >.OpenTextFile(< 文件名 >[,< 方式 >[,<创建否 >[,< 文件格式>]]])
功能:打开一个指定的文件并返回一个 TextStream 对象,该对象可用于对文件进行读操作或追加操作。• < 对象名 > :一个 FileSystemObject 对象的名字。• < 文件名 > :字符串表达式,表示新创建或打开的文件名。• < 方式 > :可选项,表示输入 / 输出方式,可为常量 ForReading 或 ForAppending 。• <创建否 > :当设置为 False 时,表示如果指定的文件不存在将不创建文件,设置为 True 时创建一个新文件。缺省值为False 。• < 文件格式 > :可选项,用于指示打开文件的格式。如果省略,则文件以 ASCII 格式打开。
279
(3)使用 File 对象的 OpenAsTextStream 方法
使用 File 对象的 OpenAsTextStream 方法与使用 FileSystemObject 对象的 OpenTextFile 方法可实现相同的功能。 格式:< 对象名 >.OpenAsTextStream([< 方式 >,[< 文件格式 >]])
功能:打开一个指定的文件并返回一个 TextStream 对象,该对象可用来对文件进行读、写、追加操作。•< 对象名 > :一个 File 对象的名字。•< 方式 > :可选项,表示输入 / 输出方式,可为常量 For
Reading 、 ForWriting 或 ForAppending 。•< 文件格式 > :可选项,用于指示打开文件的格式。如果省略,则文件以 ASCII 格式打开。
280
2 .文件的复制、移动、删除 , 在编写程序时,可以使用两种方法完成文件的复制、移动、删除工作。 (1)使用 File FileSystemObject 对象的 CopyFile 、MoveFile 、 DeleteFile 方法 (2)使用 File 对象的 Copy 、 Move 、 Delete 方法
281
3 .获取与文件有关的信息 PileSystemObject 对象和 File 对象必须配合使用才能获取文件的有关信息。 4 .文件读 / 写 在文件被打开或新创建后,才能使用 TextStream 对象进行文件的读 / 写操作。 TextStream 对象与读 / 写文件方法 :Read(n) 从文件中读取 n 个字符并返回得到的字符串ReadLine 从文件中读一行 ( 不包括换行符 ) 并返回得到的字符串ReadAll 读取整个的 TextStream 文件并返回得到的字符中Write(string) 将字符串 string 写入文件中WriteLine(string) 将字符串 string 写入文件并在行尾加上换行符WriteBlankLines(n) 将 n 个换行符写入文件 5. 关闭文件 关闭由 TextStream 对象打开的文件用 Close 方法。
282
第七章 菜单 窗体教学目的要求:• 了解 VB 的菜单编辑器的使用• 掌握创建下拉式菜单和快捷式菜单的方法• 掌握 VB 窗体的创建、常用属性、方法和事件 • 掌握MDI 窗体的应用
教学重点• 创建下拉式菜单和快捷式菜单的方法• 窗体的常用属性、方法和事件
283
时间安排: 2 学时
教学难点: 在菜单中加单选和复选控制
284
下拉菜单:单击左键
快捷菜单:单击右键
菜 单
285
子菜单
主菜单菜单栏
分隔条快捷键
菜 单
286
快捷菜单
打开
下拉菜单:“工具” ---“ 菜单编辑器”
快捷菜单: “菜单编辑器”
快捷键: <Ctrl>+<E>
菜 单
287
菜 单
288
例 1 :在窗体 Form1 中设计如图所示的下拉式菜单,用以控制标签 Label1 的字体和字形;再设计一快捷式菜单,用以控制标签Label1 的字号。
菜 单
289
对上题改进:当选中某一字体或字号后,其菜单项的前面加“”;设置某一字形后,其菜单项的前面加“”,取消某一字形后,去掉其前面“”。即当 Label1为楷体、下划线、 16号时,菜单状态如图所示。
例 2 :菜 单
290
窗体 (Form) 就是窗口 , 是 VB 中最常见的对象 ,也是可视化程序设计的基础。
各种控件对象必须建立在窗体上 .
一个窗体对应一个窗体模块
窗体结构
边框
关闭
最大化 /还原
最小化标题栏控制菜单
• 具有控制菜单、标题栏、最大化 /还原按钮、最小化按钮、关闭按钮及边框。• 运行时通过移动窗体、改变窗体大小。
窗 体
291
窗体操作—添加、删除
建立新工程时,系统自动创建一窗体 Form1;
若要增加新窗口时,可在“工程”菜单中选择“添加窗体”项
选择“窗体”后,单击“打开”即可
窗 体
292
从“工程”菜单中选择“移除 Form3”命令窗 体
293
属性属性决定窗体的外观和操作。
对于窗体的属性,可以通过属性窗口设置,也可以在程序代码中设置。
常用的窗体属性有:
Name(名称 ): 窗体名称 , 文件名扩展名为 . frm
BackColor 窗体的背景颜色 :
BorderStyle 窗体边框样式
Caption 标题栏显示的内容
ControlBox 决定窗体是否具有控制菜单
Font 输出字符的字体、大小、颜色等
Icon 决定窗体运行时处于最小化时所显示的图标
MaxButton 决定窗体标题栏中是否具有最大化按钮
Moveable 决定窗体是否能移动
Picture 设置在窗体上显示的图片
WindowState 决定运行时窗体是正、最小化还是最大化
窗 体
294
Height 窗体高度 包括边框与标题 单位为 Twip
Width 窗体的宽度 包括边框与标题 单位为 Twip
Left 窗体的最左端与包含它的容器的最左端之间的躏离
Top 窗体的最上端与包含它的容器的最上端之间的躏离
scaleHeight 窗体数据区的高度,不包括边框、标题、菜单栏等
ScaleWidth 窗体数据区的宽度,不包括边框、标题、菜单栏等
ScaleLeft/ScaleTop 窗体数据区坐标原点( 0 , 0)的位置
ScaleMode 窗体度量单位
StartUpPosition 窗体首次出现在窗体上的位置
Visible 窗体是否可见
在程序中装入图片函数:对象名 .Picture=Loadpicture([文件名 ])
省略:清除图片
295
在程序中设计颜色的三种方法:
1. 直接使用颜色值或 VB 颜色常量2.RGB 函数 格式: RGB(red,green,blue)
0~2553.QBColor 函数格式: QBColor(colorvalue)
0~15
296
事件常用事件有:• Click( 单击 ) 事件 —单击窗体的空白区 , 响应该事件• DblClick( 双击 ) 事件 —双击窗体的空白区 , 响应该事件• Load( 装入 ) 事件 —当窗体被装入工作区时,响应该事件• Activate(活动 ) 事件 —当窗体变为活动窗口时,响应该事件•Unload( 卸载)事件 —当从内存中卸载窗体时,响应该事件•QueryUnload 事件 —当从内存中卸载窗体之前时,响应该事件•Resize 事件 —当窗体首次显示在屏幕上或窗体大小改变•KeyPress KeyDown KeyUp
事件和方法
窗 体
297
方法和语句
Load 装载窗体到内存,会引发窗体的 Load 事件,但不 显示窗体
语法格式为: [ 窗体名 ].Load
Show 显示窗体 语法格式为: [ 窗体名 ].Show
Hide 隐藏窗体 语法格式为: [ 窗体名 ].Hide
Cls 清除窗体上用 Print 方法显示的信息和用绘图方法生成的图形
语法格式为: [ 窗体名 ].Cls
Move 移动并改变窗体的位置和大小
语法格式为: [ 窗体名 ].Move
窗 体
298
例:设计一窗体,运行时呈最大化状态,窗体图标为 face.ico ,标题为“窗体实验”,并在窗体中装入图形。当用户单击窗体的关闭按钮时,弹出询问对话框,询问用户是否要退出,若用户回答“是”,则退出系统,否则不退出,运行界面如图所示。
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("真的要退出吗? ", vbYesNo + vbQuestion, " 确认 ") = vbYes Then
Unload Me Else Cancel = True End IfEnd Sub
窗 体
299
第 8章 Visual Basic 标准控件
教学目的要求:• 掌握 VB 标准控件的常用属性、方法和事件
教学重点:• 标准控件的常用属性、方法和事件
300
时间安排: 2 学时
教学难点: 事件的响应
301
控件有很多共同的属性。 1 . Name 属性
Name 属性在代码中用于标识窗体、控件或数据访问对象的名称,在运行时是只读的。 每当建立一个新控件时, VB 为其建立一个缺省名称,该名称由一个表示控件类型的标识符加上一个唯一的整数组成。例如,第一个新的命令按钮名称是 Commandl ,第二个新的命令按钮名称是 Command2 ,第一个新的标签名称是Label1 ,而在窗体上创建的第三个文本框的名称是 Text3 。 控件的 Name 属性必须以一个字母开始,并且最长可达 40 个字符。它可以包括字母、数字和下划线,但不能包括标点符号或空格。为同类型的控件取相同的 Name 属性,可以创建控件数组。
控件的公共属性
302
2 . Caption 属性
Caption 属性用于确定对象的标题。对于窗体,该属性表示要显示在标题栏中的文本。当窗体最小化时,该文本被显示在窗体图标中。当创建一个新的对象时,缺省标题与缺省的 Name 属性值相同,该缺省标题包括对象名和一个整数,如 Commandl 或 Forml 。一般要对缺省的 Caption 属性进行修改,以产生一个描述得更清楚的标题。 可以在 Caption 属性中为控件指定一个访问键。在设置 Caption 属性时,可在要指定为访问键的字符前加一个“ &”符号。运行时,同时按下 Alt 键和带下划线的字符相当于单击相应的控件。 Label 控件标题的大小没有限制。对于窗体和所有别的有标题的控件,标题大小的限制是 255 个字符。
303
3 . Enabled 属性
该属性用来确定一个窗体或控件是否能够对用户产生的事件作出响应。若将控件的 Enabled 属性设置为 True(缺省值 ) ,则控件有效,允许控件对事件作出响应;若控件的 Enabled 属性设置为 False ,则控件无效,阻止控件对事件作出响应。 运行时,可以根据应用程序的当前状态,决定使某些控件无效或有效。将可视控件 Enabled 属性设置为 False使控件呈暗灰色显示。
304
4 . Visible 属性
该属性用来确定一个窗体或控件是否可见。若将控件的 Visible 属性设置为 True(缺值 ) ,则控件在运行时可见;若将控件的 Visible 属性设置为 False ,则控件在运行时不可见。
对窗体用 Show 或 Hide 方法,分别和在代码中将窗体的 Visible 属性设置为 True 或 False 的果是一样的。
305
5 . Left 、 Top 、 Height 、 Width 属性
Left 、 Top 、 Height 和 Width 属性用于设置或返回控件的位置或尺寸。其中 Left 属性表示控件内部的左边与它的容器的左边之间的距离。 Top 属性表示控件的内顶部和它的容器的顶边之间的距离: 对于窗体, Left 、 Top , Height 和 Width 属性总以缇为单位来表示的;对于控件,它们的度量单位取决于它的容器的坐标系统。
306
BackColor 属性用来返回或设置控件的背景颜色。 ForeColor 属性用来返回或设置在控件里显示图片和文本时的前景颜色。 颜色的设置方法: 1) 直接输入一个颜色值。 2)使用标准 RGB 颜色:使用调色板或在代码中使用 RGB 或 QBColor 函数指定的颜色。 3)使用系统缺省颜色:使用对象浏览器中的对象库所列的系统颜色常量指定的颜色。 对于所有的窗体和控件, BackColor 属性的缺省设置值为由常量 vbWindowBackground 定义的系统缺省颜色,而 ForeColor 属性的缺省设置值为由常量 vbWindowText 定义的系统缺省颜色。 在 Label 和 Shape 控件中,如果 BackStyle 属性的设置值为 0(透明 ) ,则忽略 BackColor 属性。 若在 Form 对象或 PictureBox 控件中设置 BackColor 属性,则所有已经打印的文本或用绘图方法绘制的图形都将被擦除掉。设置 ForeColor 属性值不会影响已经打印的文本或绘制的图形。
6. BackColor 、 ForeColor 属性
307
FontName : 决定在控件中显示的文本所用的字体。FontSize : 决定在控件中显示的文本所用的字体大小。FontBold : 决定在控件中显示的文本是否为粗体样式。Fontltalic : 决定在控件中显示的文本是否为斜体样式。FontStrikethru :决定在控件中显示的文本是否带有删除线。FontUndedine :决定在控件中显示的文本是否带有下划线。 对于 PictureBox 控件及 Form 和 Printer 对象,设置这些属性不会影响在控件或对象上已经打印的文本。对于其他控件,这些属性的改变会在屏幕上立刻生效。
7. FontName 、 FontSize 、 FontBold 、 FontItalic 、 FontStrikethru 、 FontUnderline 属性
308
8 . Font 对象属性
Font 对象在设计时不能直接使用。取而代之的是,在“属性”窗 口 中通过选择控 件 的 Font 属 性并单击属 性按钮“…”,在打开的对话框中直接设置其属性。在代码中,可以使用以下格式引用该对象的属性: < 控件名 > . Font< 属性名 > 属性名,可以是: Name ,返回或设置 Font 对象的字体名称; Size ,返回或设置 Font 对象使用的字体大小; Bold ,返回或设置 Font 对象的字形是粗体或非粗体; Italic ,返回或设置 Font 对象的字形为斜体或非斜体; Underlinc ,返回或设置 Font 对象的字形为带下划线或不带下划线; Strikethrough ,返回或设置 Font 对象的字形为有删除线或无删除线。
309
8.1 命令按钮 CommadButton
VB 中最常用的控件之一 . 常用来接受用户的操作信息 , 激发相应的事件过程 , 是用户与程序交互的最简便的方法
命令按钮
310
主要属性Name
Caption
Font
Cancel 和 Default
Enabled
Style
Picture
DownPicture 和 DisabledPicture
Value Command1.Value=True 自动触发按钮的 Click 事件
Visible
Enabled=false
311
事件命令按钮可以接受许多事件 , 如:• 鼠标单击 (Click)
• 鼠标按下 (MouseDown)
• 鼠标抬起 (MouseUp)
• 键盘按下或松开事件 (Load)
其中鼠标单击事件最常用 .
方法可以用 SetFocus 方法将焦点定位在指定的命令按钮上 .
如 cmdOk.SetFocus
表示将焦点定位在名称为 cmdOk 的命令按钮上 .
312
1 .属性 Caption 属性:字符型。标签的标题。 Alignment 属性:数值型。确定标签中标题的对齐方式,有以下设置值: 0-LeftJustify 缺省值,标题从标签的左边开始显示。 1-RightJustif 标题靠右显示。 2-Center 标题居中显示。 AutoSize 属性:布尔型。设置为 True 时,可根据标题自动调整标签的大小;
设置为 False(缺省值 ) 时,标签保持设计时定义的大小,太长的标题内容将不能显示出来。
BackStyle 属性:数值型。缺省值为 1 ,标签不透明;设置为 0 时,标签透明。 WordWrap 属性:布尔型。设置为 True 时,标签将在垂直方向变化大小以与
标题相适应,此时, Autosize 属性应设置为 True ;设置为 False 时 (缺省值 ) ,标签不能在垂直方向上扩展。
一 . 标签 (Label)
VB 提供的标签控件只能显示文本,而不能对文本进行编辑。标签通常用于标注本身具有 Caption 属性的控件。例如,可以使用标签为文本框附加描述信息。标签也常用于输出。
8.2 标签( Label) 与文本框( Text)
313
设计界面
代码
运行界面
例
314
标签控件可以支持 Click 、 DblClick 等事件。
例
设窗体上有一个标签控件 Labell ,其 AutoSize 属性值为 True ,双击该标签控件,则标签的标题字体增加 10磅,可以通过如下代码实现:
Private Sub Label1_DblClick( )
Labell . FontSize = Labell . FontSize + 10
End Sub
2 .事件
315
标签控件支持 Move 方法,用于实现控件的移动。Move 方法的格式: [< 对象名 > . ]Move <left>[ , [<top>][ , [<width>][ , <height>]]]
<left> : 指示对象左边的水平坐标 (x-轴 ) 。<top> : 指示对象顶边的垂直坐标 (y-轴 ) 。<width> : 指示对象新的宽度。 、<height> :指示对象新的高度。
例如,设窗体上有一个标签控件 Labell ,单击该标签控件,使该标签控件向右移动 50缇,可以通过如下代码实现:
Private Sub Labeli_C1ick() Labell . Move Labell . Left + 50End Sub
3 .方法
316
1) Text 属性: 字符串类型。返回或设置文本框中显示的内容。 例如: Text1.Text = “欢迎使用 Visual Basic”2) MultiLine 属性: 布尔型。当 MultiLine 属性为 True 时,文本框可以输入或显示多行文本,且会在输入的内容超出文本框时自动换行。默认值为 False 。 在设计阶段,在属性窗口设置 Text 属性值时,通过按下 Ctrl+Enter组合键实现文本的换行。 在运行阶段,如果窗体上没有缺省按钮,则在多行文本框 (TextBox) 控件中按下回车键可以把光标移动到下一行;如果有缺省按钮存在,则必须按下 Ctrl+Enter 组合键才能移动到下一行。
二 . 文本框 (TextBox)
文本框控件在工具箱中的名称为 TextBox ,在 VB 中,可以使用文本框控件作为输入控件,在运行时接收用户输入的数据。
1 .属性
317
3) PasswordChar 属性:
字符串类型。当 MuitiLine 属性值为 False 时,该属性可以用于口令
输入。在缺省状态下,该属性被设置为空串,用户从键盘输入时,每个字符都可以在文本框中显示出来。如果把 PasswordChar 属性设置为一个字符,如星号 (*) ,则在文本框中键人字符时,只显示星号,不显示键人的字符。 Text 属性接收的仍是用户输入的文本。
4) ScrollBars 属性:
数值型。该属性用于确定文本框是否带滚动条。有以下 4 种选择:
0-None 没有滚动条
1-Horizontal 只有水平滚动条
2-Vertical 只有垂直滚动条
3—Both 同时具有水平和垂直滚动条
只有当 MultiLine 属性值为 True 时,文本框才显示滚动条。
318
5) SelLength 属性: 数值型。在程序运行期间返回或设置选择的字符数。
例如: Text1.Sellength = Len(Text1.Text) 表示选中文本框 Text1 中所有字符。
6) SelStart 属性: 数值型。在程序运行期间返回或设置当前选择文本的起始位置。
例如: Textl.SelStart = 0 表示选择文本的起始位置从第一个字符开始。
7) Locked 属性: 布尔型。指定运行时文本框内容是否可以编辑。默认值为 False ,表示可以编辑。
319
1)Change 事件: 当用户向文本框输人新的内容,或在程序代码中对文本框的 Text 属性进行赋值从而改变了文本框的 Text 属性时,将触发 Change 事件。
2 .事件和方法
文本框除了支持鼠标的 Click 、 DblClick 事件外,还支持 Change 、 GotFocus 、 LostFocus 、 KeyPress 等事件和SetFocus 方法。
例:建立三个文本框和两个命令按钮。运行时,用户在文本框Text1 中输入内容的同时,文本框 Text2 和 Text3 显示相同的内容,但显示的字体不同。单击“清除”,按钮清空三个文本框中的内容,单击“退出”按钮结束程序的运行
320
设计界面
运行界面
程序代码
321
2) GotFOCUS 事件: 当运行时用 Tab 键或用鼠标选择对象,或用 SetFOCUS 方法使光标落在对象上时,触发该事件,称之为“获得焦点”。该事件适用于窗体和大部分可接受键盘输入的控件。
Text1 获得焦点
Text2 获得焦点
322
3) LostFOCUS 事件: 当按下 Tab 键使光标离开当前文本框,或者用鼠标选择窗体的其他对象时触发该事件,称之为“失去焦点”。
4) KeyPtess 事件:
当在键盘上按下某个键时触发该事件。 KeyPress 事件返回一个参数KeyAscii ,该参数值为整数,表示所按下键的 ASCⅡ码。
5) SetFocus 方法:
SetFocus 方法是文本框常用的方法,该方法是把光标移到指定的文本框中,使该文本框获得焦点。
当在窗体上建立了多个文本框后,可以使用该方法把光标置于所需要的文本框上。使用格式如下:
[< 对象名 > . ]SetFocus 例如,将焦点定位在文本框 Textl 中,使用语句: Textl.SetFocus
323
8.3 定时器 Timer
主要属性Enabled 是否可用 为 False 不发生 Timer 事件
Interval 定时间隔 单位为 ms ,取值范围为 0~65535
事 件
Timer 到达 Interval 指定的时间时就触发一次该事件
Private Sub Timer1_Timer() If Image1.Visible Then Image1.Visible = False Image2.Visible = True Else Image1.Visible = True Image2.Visible = False End IfEnd Sub
324
VB 提供两种滚动条控件:• 水平滚动条 HScrollBar• 垂直滚动条 VScrollBar 。两种滚动条除方向不同外,结构和操作方法完全一样。
8.4 滚动条
HScrollBar
VScrollBar
325
1. 属性
. Max 属性:滚动条所能表示的最大值。当滚动块移动到滚动条的最右端或底部时,滚动条的 Value 属性值等于Max 值。
. Min 属性:滚动条所能表示的最小值。当滚动块移动到滚动条的最左端或顶部时,滚动条的 Value 属性值等于Min 值。
. LargeChange 属性:当用户单击滚动块和滚动箭头之间的区域时,滚动条 Value 属性值的改变量。
. SmallChange 属性:当用户单击滚动箭头时,滚动条的Value 属性值的改变量。
. Value 属性:滚动条的当前位置值,该值始终介于 Max 和 Min 属性值之间 ( 包括这两个值 ) 。
326
2 .事件
. Change 事件:当滚动块移动后或在代码中对 Value 属性进行赋值后产生该事件。
. Scroll 事件:当在滚动条内拖动滚动块时产生该事件。
3 .例 8-2Private Sub HScroll1_Change(Index As Integer) Labelrgb(Index).Caption = HScroll1(Index).Value Picture1.BackColor = RGB(HScroll1(0).Value, _HScroll1(1).Value, HScroll1(2).Value)End Sub
Private Sub HScroll1_Scroll(Index As Integer) HScroll1_Change (Index)End Sub
控件数组 HScroll1
控件数组L
abelrgb
327
8.5 选项按钮 (OptionButton) 、复选框 (CheckBox) 与框架 (Frame)
框架在工具箱中的名称为 Frame ,主要用做控件的容器,也用于修饰界面。 容器的作用是对控件进行分组,放在容器中的控件跟随其容器移动,删除容器将同时删除其中的所有控件。 要将控件放在容器中,可以先选中容器,然后在容器中直接画控件。也可以将事先画好的控件复制到剪贴板,再选中容器,然后粘贴控件。 框架具有以上介绍的控件的公共属性,其中要特别注意的是 Enabled 属性,当框架的 Enabled 属性设置为 False 时,框架的标题变成暗灰色,而框架中的所有对象将同时无效。 框架不响应鼠标事件,不能在其中显示文本和图形。
1. 框架 (Frame)
328
选项按钮在上具箱中的名称为 OptionButton ,用于提供一个可以打开或关闭的选项。在使用时,—般将几个选项按钮组成一组,在同一组中,用户只能选择其中的一项。
在 Frame 控件、 PictureBox 控件或者窗体这样的容器中绘制选项按钮控件,就可以把这些控件分组。同一容器中的选项按钮控件为一个组。运行时,在选择一个选项按钮时,同组中的其他选项按钮控件会自动取消选样。
2. 选项按钮 (OptionButton)
329
1. 属性 . Value 属性:表示选项按钮的状态。 Value 属性为 True 时,表示选择了该按钮; Value 属性为 False 时,表示没有选择该按钮。 Value 属性的缺省值为 False 。 . Alignment 属性:决定选项按钮中的文本的对齐方式。Alignment 属性为 0-Left Justify 时表示左对齐 ;1—Right Justify 的表示右对齐。 . Style 属性:用于控制选项按钮的外观。可以将 Style属性设置为 1—Graphical使其显示成与命令按钮相同的形状,运行时按钮可以在按下和抬起两种状态间切换,这时还可以为其设置颜色或添加图形。
330
2. 事件 选项按钮常用的事件为 Click 事件.当运行时单击选项按钮,使选项按钮从未选择状态变成选择状态时,或在代码中将一个选项按钮的 Value 属性从 False 改为 True 时,产生 Click 事件。可以在该事件过程中编写代码,表示选择该选项按钮时要执行的操作。也经常不直接在选项按钮的事件过程中编写代码,只是使用选项按钮进行选择,而在其他事件过程 ( 如命令按钮的单击事件 ) 中根据选项按钮的 Value 值进行判断,以执行相应的操作。
331
3. 例 8-3框架
框架
332
复选框在工具箱中的名称为 CheckBox 。与选项按钮类似,该控件一般用于提供一个可以打开或者关闭的选项。选择复选框控件后,该控件将显示符号∨,而取消选择后,符号∨ 消失。也可以设置复选框使其处于第三种状态,即灰度状态。同样可以按功能对复选框进行分组,但同—组中的复选框可以有多个同时被选中。 复选框和选项按钮功能相似,但二者之间也存在着重要差别:在一个窗体中可以同时选择任意数量的复选框控件;但是在一个组中,在任何时侯只能选择一个选项按钮。
3. 复选框 (CheckBox)
333
1 .属性
. Value 属性:复选框的 Value 属性用来确定其状态.即选择、取消选择或灰度状态。 Value 值为 0 表示取消选择状态; Value 值为 1 表示选择状态;而 Value 值为 2使复选框处于灰度状态,常利用这种状态来表示部分选中或不确定状态。
. Alignment 属性:设置或返回一个值,决定复选框中的文本的对齐方式。 Alignment 属性为 0-LeftJustify 时表示左对齐, Alignment 属性为 l-RightJustify 时表示右对齐。
. Style 属性:与选项按钮相同,可以将复选框的 Style属性设置为 1-Graphical使其显示成按钮的形状,同时还可以为其设置颜色或添加图形。
334
2. 事件 复选框常用的事件为 Click 事件,运行时单击复选框时,或在代码中改变复选框的 Value 属性值时,产生 Click 事件。可以在该事件过程中编写代码,表示选择或取消选择该复选框时要执行的操作。也经常不直接在复选框的事件过程中编写代码,只是使用复选框进行选择,而在其他事件过程 ( 如命令按钮的单击事件 ) 中根据复选框的 Value 值进行判断,以执行相应的 操作。
3. 例 8-3
335
列表框在工具箱中的名称为 ListBox 。该控件用于显示项目列表,从列表中可以选择一项或多项。如果项目总数超过了可显示的项目数, VB 会自动给列表框加上滚动条。
8.6 列表框 (1istBOX) 和 组合框 (ComboBox)一、列表框 (1istBOX)
336
1 .属性
. List 属性:返回或设置列表框的列衷部分的项目。在设计时可以在属性窗口中直接输入列表项目,输入每一列表项后使用 Ctrl+Enter 键换行。运行时,引用列表框中的第一项为 List(0) 、第二项为 List[(1)……
. Style 属性:返回或设置列表框的显示样式。如果该属性设置为 0(缺省值 ) ,则列表框按传统的列表样式显示列表项;如果该属性设置为 1 ,则在列表框中的每一个文本项的旁边都有一个复选框,这时在列表框中可以同时选择多项。
. Columns 属性:返回或设置列表框是按单列显示 (垂直滚动 ) 还是按多列显示 (水平滚动 ) 。当 Columns 值为0 时,列表框为垂直滚动的单列形式;当 Columns 值大于0 时,列表 框为水平滚动形式,显示的列数由 Columns值决定。
337
. Text 属性:返回列表框中被选择的项目。如果列表框的名称为 Listl ,则 Listl.Text 的值总是与 List1.List(Listl.ListIndex) 的值相同。 Text 属性为只读属性。
. ListIndex 属性:返回或设置列表框中当前选择项目的索引,在设计时不可用。列表框的索引从 0 开始,即第一项的索引为 0 ,第二项的索引为 1……, 若没有在列表框中选择项目,则 Listlndex 的值为 -1 。对于可以做多重选择的列表框,若同时选择了多个项目, ListIndex返回所选项目的最后一项的索引。
注: List,ListIndex,Text之间存在如下等价关系:
List1.Text=List1.List(List1.ListIndex)
. ListCount 属性:返回列表框中列表部分项目的总个数。ListCount 属性值总是比最大的 ListIndex 值大 1 。
. Sorted 属性:指定列表项目是否自动按字母表顺序排序。将 Sorted 设置为 True 表示列表 项目按字母表顺序排序,设置为 False(缺省值 ) 表示列表项目不按字母表顺序排序。
338
. Selected 属性:返回或设置在列表中的一个项的选择状态。该属性在设计时不可用。
. MultiSelecl 属性:返回或设置一个值,该值指示是否能够同时选择列表框中的多个项 (复选 ) ,以及如何进行复选,在运行时是只读的。有以下几种取值: 0-None 为缺省值,表示不允许复选。
1-Simple 表示单击鼠标或按空格键可在列表中选择或取消选择列表项。
2-Extended 表示按下 Shift 键井单击鼠标,或按下 Shift健以及一个箭头键将在以前选择项的基础上扩展选择到当前选择项。按下 Ctrl 键并单击鼠标可在列表中选择或取消选择列表项。
339
2 .事件
列表框接受 Click 、 DblClick 、 GotFocus 、 LostFocus等大多数控件的通用事件,但通常不编写 Click 事件过程,而是当单击某个命令按钮或双击列去框时读取列表框的 Text 属性值。
340
3 .方法
. AddItem 方法:向列表框中添加新的项目,使用格式为: < 对象名 >.AddItem < 项目 >[ , <索引 >] 格式中的 <索引 > 表示要添加的位置。当 <索引 >省略
时,若 Sorted 属性设置为 True , < 项目 >将添加到恰当的排序位置;若 Sorted 属性设置为 False , < 项目 >将添加到列表的末尾。
. RemoveItem 方法:从列表框中移除项目,使用格式为: < 对象名 >. RemoveItem <索引 > 格式中的 <索引 > 用于指定要删除的项目的索引。. Clear 方法:清除列表框中的所有项目,使用格式为: < 对象名 >.Clear
341
4.举例
342
组合框在工具箱中的名称为 ComboBox 。 组合框的作用与列表框类似,只是组合框控件将文本框和
列表框的特性结合在一起,既可以在控件的文本框 ( 编辑域 )部分输入信息,也可以在控件的列表框部分选择一项。
另外,组合框可以将列表项折叠起来,使用时再通过下拉列表进行选择,所以使用组合框比使用列表框更节省界面空间。
二、 组合框 (ComboBox)
343
1 .属性
. List 属性:返回或设置组合框的列表部分的项目。在设计时可以在属性窗口中直接输入列表项目,输入每一列表项后使用 Ctrl+Enter 键换行。 . Style 属性:用于指定组合框的显示形式,有以下几种取值: 0 为缺省值,组合框显示形式为下拉组合框,包括一个文本框和一个下拉式列表。可以从列表中选择项目或在文本框中输人文本。该样式将选项折叠起来,当需要选择时,单击组合框旁边的下拉箭头,弹出选项列表,再用鼠标单击进行选择,选择后列表会重新折叠起来,只显示被选择的项目。 1 表示组合框显示形式为简单组合框。该形式同样包括一个文本框和一个列表框,与下拉组合框不同的是,该形式不能将列表折叠起来。 2 表示组合框显示形式为下拉列表框。这种样式仅允许从下拉列表中选择,不能在文本框中输入文本,列表可以折叠起来。
344
. Text 属性:当 ComboBox 控件的 Style 属性设置为 0( 下拉组合框 ) 或为 1(简单组合框 ) 时 , 该属性用于返回或设置编辑域中的文本。而当 Style 属性设置为 2( 下拉列表框 ) 时,该属性为只读,运行时返回在列表中选择的项目。若列表框的名称为 Combo1 ,且运行时选择了某列表项,则 Combo1.Text的值总是与 Combo1.List(Combo1.ListIndex) 的值相同。
. ListIndex 属性:返回或设置在组合框下拉列表中当前选择项目的索引,在设计时不可用。若没有选择项目,或者向文本框部分输入了新的文本,则 ListIndex 值为 -1 。
. ListCount 属性:返回组合框的列表部分项目的总个数。ListCount 属性值总是比最大的 Listlndex 值大 1 。
. Sorted 属性:指定列表项目是否自动按字母表顺序排序。将 Sorted 设置为 True 表示列表项目按字母表顺序排序,设置为 False(缺省值 ) 表示列表项目不按字母表顺序排序。
345
2 .事件
组合框的事件与 Style 属性有关, 当 Style 为 0 时,响应 Click 、 Change 、 DropDown 事件。 当 Style 为 1 时,响应 Click 、 DblClick 、 Change 事件。 当 Style 为 2 时,响应 Click 、 DropDown 事件。
当用户单击组合框的下拉箭头时,触发 DropDown 事件;而组合框可以接受文本编辑时,则可以触发 Change 事件。通常是在其他事件过程 ( 如命令按钮的单击事件 ) 中读取组合框的 Text 属性。
346
3 .方法
. AddItem 方法:向组合框中添加新的项目,使用格式为:
< 对象名 >.AddItem < 项目 >[,<索引 >] 格式中的 <索引 > 表示要添加的位置。当 <索引 >省略时,若 <Sorted> 属性设置为 True , < 项目 >将添加到恰当的排序位置;若 <Sorted> 属性设置为 False , < 项目 >将添加到列表的末尾。 . RemoveItem 方法:从组合框的列表中移除项目,使用格式为:
< 对象名 >. RemoveItem <索引 > 格式中的 <索引 > 用于指定要删除的项目的索引。 . Clear 方法:清除列表框中的所有项目 , 使用格式为:
< 对象名 >.Clear
347
4 .举例在窗体 Form1 上建立一列表框、两个选项按钮、一个组合框和一个文本框,当在列表框、选项按钮和组合框选中某些内容时,用文本框将其显示出来。运行界面如图所示。
348
8.7 驱动器列表、目录列表和文件列表框
349
图片框在工具箱中的名称为 PictureBox ,该控件可以用来显示图像,包括位图文件 (.bmp) 、图标文件 (.ico) 、光标文件 (.cur) 、元文件 (wmf) 、增强的元文件 ( . emf) 、 JPEG 文件 (.jpg) 或 GIF 文件 (.gif) 。
8.8 图片框 (PictureBox) 和图像框 (Image)
一、图片框 (PictureBox)
PictureBox 控件也可以作为控件的容器,还可用于显示用Print 方法产生的文本和用图形方法绘制的图形。要清除用 Print 方法在图片框中产生的文本和用图形方法绘制的图形,使用 Cls 方法:
< 对象名 >. Cls 若使用 LoadPicture 函数清除图像,将同时清除文本和用图形方法绘制的图形。
350
1. 属性
. Picture 属性:设置图片框中显示的图片,可以在属性窗口中设置其 Picture 属性 , 也可以在代码中使用 LoadPicture函数进行设置,格式如下: < 对象名 >.Picture = LoadPicture(“< 图形文件名 >”) 要清除图片框中的图像,可以在属性窗口中直接删除其 Picture 属性的内容,也可以在代码中使用 LoadPicture 函数进行清除,格式如 下: < 对象名 >.Picture = LoadPicture () 或 < 对象名 >.Picture = LoadPicture(“ ”). Autosize 属性:若在图片框中加载 .wmf 文件,图像会自动调整大小,以适应控件的大小 ; 对于其他类型的文件,若控件大小不足以显示整幅图像,则 VB 会自动裁剪图像.以适应控件的大小;但不能调整图形以适应控件的大小。 将其设置为 True, 可以自动调整大小以显示整幅图像。
351
. AutoRedraw 属性:是否自动重新绘制图形
2. 事件
常用事件有 Resize 、 Paint 、 Click 等
3. 方法
常用方法有 Refresh 、 Move 、 Print 及一组绘图方法等
•对象名 .Pset [step](x,y)[,color] 画点•对象名 .Point(x,y) 返回指定点的颜色•对象名 .line [step](x1,y1)-[step](x2,y2)[,color],[b][f] 画线矩形填充矩形•对象名 .Circle [step](x,y),radius [,color] 画圆
•Step :可选项,带此参数时,点 (x,y) 是相对于当前位置 ( 由 CurrentX 和 CurrentY属性决定 ) 的坐标点,否则为绝对坐标。
352
4.举例 例 1:画圆
Private Sub Form_click() Dim i, x, y, x0, y0, r, pi, pace As Single r = ScaleHeight / 4 x0 = ScaleWidth / 2 y0 = ScaleHeight / 2 pi = 3.1415926 pace = pi / 15 For i = 0 To pi * 2 Step pace x = x0 + r * Cos(i) y = y0 - r * Sin(i) Circle (x, y), r * 0.8 Next iEnd Sub
353
Private Sub Form_Click() Dim i, j, x, y, r, c Form1.Cls For i = 1 To 10000 x = (Form9.ScaleWidth * Rnd) y = Form9.ScaleHeight * Rnd r = 1000 * Rnd c = RGB(256 * Rnd, 256 * Rnd, 256 * Rnd) Circle (x, y), r, c For j = 1 To 5000 Next j Next iEnd Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) Dim c c = Int(Rnd * 16) Circle (x, y), 100, QBColor(c)End Sub
354
图像框在工具箱中的名称为 Image, Image 控件也用于显示图像,包括位图文件 (.bmp) 、图标文件 (.ico) 、光标文件(.cur) 、元文件 (.wmf) 、增强的元文件 (.emf) 、 JPEG 文件 (.jpg) 或 GIF 文件 (gif) 。 和 PictareBox 控件一样 , 可以在属性窗口通过设置 Image控件的 Picture 属性来添加一幅图像,也可以在代码中使用LoadPicture 函数进行图像的添加或清除。 因为 Image 控件比 PictureBox 控件使用较少的系统资源,所以重画起来比 PictureBox 控件要快,但是它只支持 PictureBox 控件的一部分属性、事件和方法。 若将 Image 控件的 Stretch 属性设置为 True ,则可以缩放图像来适应控件大小;若将 Image 控件的 Stretch 属性设置为 False ,则可以自动调整控件大小以适应图像。
二、 图像框 (Image)
355
例 8-6
Private Sub Command1_Click() If Command1.Caption = " 开始 " Then Timer1.Enabled = True Command1.Caption = "停止 " Else Timer1.Enabled = False Command1.Caption = " 开始 " End IfEnd Sub
Private Sub Command2_Click() Timer1.Enabled = False EndEnd Sub
Private Sub Timer1_Timer() If Image3.Left > Form1.ScaleWidth Then Image3.Left = Form1.ScaleLeft - 200 End If Image3.Move Image3.Left + 200 If Image3.Picture = Image1.Picture Then Image3.Picture = Image2.Picture Else Image3.Picture = Image1.Picture End IfEnd Sub
356
第九章 ActiveX 控件
教学目的要求:• 孰练掌握 VB 常用 ActiveX 控件的主要属性、方法、事 件及在实际编程中的应用。• 掌握公用对话框( CommonDialog )、 Windows 公用控 件和多媒体控件等高级控件的用法。
教学重点• 公用对话框( CommonDialog )、 Windows 公用控件 和多媒体控件等高级控件的用法
357
时间安排: 2 学时
教学难点: ActiveX 控件的主要属性、方法、事 件
358
ActiveX 控件:采用 ActiveX技术创建
的一个或多个对象组成,是一段可重复
使用的程序代码和数据。以文件形式存
在,扩展名为 .ocx
359
ActiveX 控件添加:1. “ 工程” ---“ 部件”2. 工具箱 --- 右击(快捷菜单) ---“ 部件”
选项卡添加:1. 工具箱 --- 右击(快捷菜单) ---“添加选项卡”
360
9.1 公用对话框( Common dialog)
“ 打开”对话框 “ 另存为”对话框 “ 颜色”对话框 “ 字体”对话框 “ 打印”对话框 “帮助”对话框
“ 部件”对话框中选择“ Microsoft Common Dialog Control 6.0"
361
Action 属性:运行阶段有效
属性值 说明0 没有操作1 显示“打开”对话框2 显示“另存为”对话框3 显示“颜色”对话框4 显示“字体”对话框5 显示“打印”对话框6 显示“帮助”对话框
一、共有属性与方法
362
CancelError 属性:按“取消”按钮时是否产生出错信息,若设为 True ,会产生一个错误号为 32755 的错误信息
DialogTitle 属性:对话框标题
方法:ShowOpen 显示“打开”对话框ShowSave 显示“另存为”对话
框ShowColor 显示“颜色”对话框ShowFont 显示“字体”对话框ShowPrinter 显示“打印”对话框ShowHelp 显示“帮助”对话框
363
二、“打开”与“另存为”对话框
Filename 属性:设置或返回对话框中选定的包括目录的文件名
FileTitle 属性:设置或返回对话框中选定的不包括目录的文件名
Filter 属性:设置或返回对话框中显示文件的过滤器,格式为: 类型描述 | 类型通配符例:文本文件 (*.txt)|*.txt|Word 文档 (*.doc)|*.doc
364
FilterIndex 属性:当用 Filter 设置多组过滤器时,指定第几组为默认过滤器InitDir 属性:
设置对话框中初始文件目录,默认为当前目录
Flags 属性:
DefaultExt 属性: 适合“另存为”对话框,没有指定扩展名时的默认扩展名
365
例:Private Sub Command1_Click()
On Error Resume Next
CommonDialog1.ShowOpen 或 CommonDialog1.action=1
If Err.Number <> 32755 Then
Image1.Picture = LoadPicture(CommonDialog1.FileName)
End If
End Sub
Private Sub Command2_Click()
Image1.Picture = Nothing
End Sub
Private Sub Command3_Click()
Unload Me
End Sub
366
三、“颜色”对话框
Color 属性:返回用户选定的颜色
Flags 属性:
CdlCCFullOpen-&H2 全部对话框,包括自定义颜色CdlCCShowHelpButton-&H8 显示帮助CdlCCPreventFullOpen-&H4 自定义颜色无效
CdlCCRGBInit-&H1 设置初始颜色
367
例:
368
四、“字体”对话框
Color 属性:返回用户选定的字体的颜色
Flags 属性:常用如下表
CdlCFEffects-&H100 全部对话框,包括自定义颜色CdlCFPrinterFonts-&H2 只列出打印机支持的字体CdlCFScreenFonts-&H1 只列出系统支持的屏幕字体
CdlCFBoth-&H3 列出可用的打印机和屏幕字体
369
Fontname 属性:返回用户选定的字体名称
Fontsize 属性:返回用户选定的字体大小
FontBold 、 FontItalic 、 FontStrikethru 、 FontUnderline 属性:返回用户选定的字体样式
例:
370
五、“打印”对话框
Copies 属性:指定要打印的份数FromPage 、 ToPage 属性:设置或返回要打印的起始页号和终止页号
六、“帮助”对话框
HelpFile 属性:指定要显示的帮助文件
HelpCommand 属性:常用值如下CdlHelpContextPopup-&H9: 确保显示正确的帮助文件
371
例:
Private Sub Command1_Click()
CommonDialog1.HelpCommand = &H9
CommonDialog1.HelpFile = "d:\ls\help.hlp"
CommonDialog1.ShowHelp
End Sub
372
9.2 Windows公用控件
“ 部件”对话框中选择“ Microsoft Windows Common Controls6.0"
ToolBar
StatusBar
ListView
ImageList
373
一、工具栏 (ToolBar)控件
Align 属性:显示的位置 1~4 :顶、底、左、右ImageList 属性:相关联图像的 ImageList 控件名称
Buttons 属性:工具栏控件的 Button 对象集合
常用事件:
ButtonClick :返回一个参数 Button ,表示用户单击哪个按钮。
374
二、状态栏 (StatusBar)控件
状态栏控件由一组窗格构成,每一个窗格作为一 Panel 对象,所有 Panel 对象组成 Panels集合
Panel对象的常用属性: Text :显示的文本 Picture :显示的图片文件名
375
三、滑块 (Slider)控件常用属性: Max 、 Min :设置或返回标尺刻度的最大、小值 Orientation :放置方向 0—水平 1—垂直 TickFrequency :标尺上每个刻度表示的数值 SmallChange : 按光标左右键时滑动刻度 LargeChange :按光标 PgUp 、 PgDn 键时滑动刻度 Value :滑块当前值
常用事件: Click 、 Change 、 Scroll
376
例:
377
四、进程条 (ProgressBar)控件
常用属性:
Orientation :放置方向 0—水平 1—垂直 Scrolling : 0— 分段式 1—平滑式 Max 、 Min : 进程条的终点值和起始值 Value :当前进度数值
378
Private Sub Timer1_Timer()
n = n + 5
If n <= ProgressBar1.Max Then
ProgressBar1.Value = n
ProgressBar2.Value = n
Else
MsgBox " 文件下载已完成! "
Timer1.Enabled = False
End If
End Sub
Dim n As Integer
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
379
9.3 多媒体控件
Filename 属性:播放文件名Command 属性: Open 、 Play 、 Stop 等
“ 部件”对话框中选择“ Microsoft MultiMedia Controls6.0"
一、 MMcontrol控件
380
Open 方法:打开Play 方法:播放动画Stop 方法:停止播放
“ 部件”对话框中选择“ Microsoft Windows Common Controls-2 6.0"
二、 Animation控件
如下例:
381
Private Sub Timer1_Timer()
i = i + 1
ProgressBar1.Value = i
Label1.Caption = “已完成 " & i & "%"
If i = 100 Then
MsgBox “复制完毕! "
Timer1.Enabled = False
Animation1.Stop
End If
End Sub
Dim i As Integer
Private Sub Command1_Click()
Timer1.Enabled = True
Animation1.Open "C:\filecopy.avi"
Animation1.Play
End Sub
382
< 颜色 > :可选项,圆、椭圆、弧或扇形的边框颜色值。如果省略,则图形边框使用容器对象的 ForeColor 属性值。
<起始角 > :可选项,指定弧的起点位置 ( 以弧度为单位 ) 。取值范围从 -2π—2π;
< 终止角 > :可选项,指定弧的终点位置 ( 以弧度为单位 ) 。取值范围从 -2π—2π ,缺省为 2π 。弧的画法是从起点逆时针画到终点。
< 纵横比 > :可选项,圆的纵轴和横轴的尺寸比。缺省值为 1 ,表示画一个标准圆。当纵横比大于 1 时,椭圆的纵轴比横轴长;当纵横比小于 1 时,椭圆的纵轴比横轴短。
除圆心坐标和半径外,其他参数均可省略,但若省略的是中间参数,则逗号必须保留。
执行 Circle 方法后,当前位置 (CurrentX 和 CurrentY 属性 ) 的值被设置成圆心的坐标值。
383
VB 中有许多与绘图有关的属性、事件和方法,设置属性可以改变图形的颜色、线形和填充样式;合理使用这些事件和方法,可以得到事半功倍的效果。
11.4 与绘图有关的常用属性、事件和方法
384
11.4.1 清除图形方法 (Cls)
Cls方法用于清除对象中生成的图形和文本,将光标复位,即移到原点。使用格式为: [< 对象名 >.]Cls
例如, Forml.Cls 可清除窗体中的图形和文本。
385
11.4.2 线宽 (DrawWidth) 属性和线型 (DrawStyle) 属性 1. DrawWidth 属性 用于设置图形方法输出的线宽。线宽的取值范围从 1到 32767,以像素为单位。缺省值为 1 ,即一个像素宽。 如果 DrawWidth 属性值大于 1 ,画出的图形是实线;如果DrawWidth 属性值等于 1 ,可以画各种线型。 2. DrawStyle 属性 用于设置图形方法输出的线型,其取值与相应的线型。 0 vbSolid (缺省 ) 实线 1 vbDash 虚线 2 vbDot 点线 3 vbDashDot 点划线 4 vbDashDotDot 双点划线 5 vbInvisible 无线 6 vbInsideSolid 内收实线
386
11.4.3 填充颜色 (FillColor) 属性和填充样式 (FillStyle) 属性 1 . FillColor 属性 设置 FillColor 属性可以改变填充图形的颜色。编程时可为 FillColor 属性赋值。 2 . FillStyle 属性 FillStyle 属性设置 Shape控件所画图形的填充样式,也可以设置由 Circle 和 Line 图形方法生成的封闭图形的填充样式。 0 vbFSSo1id 实心 1 vbFSTransparent (缺省值 ) 透明 2 vbHorizontalLine 水平直线 3 vbVerticalLine 垂直直线 4 vbUpwardDiagonal 上斜对角线 5 vbDownwardDiagonal 下斜对角线 · 6 vbCross 十字线 7 vbDiagonalCross 交叉对角线 如果 FillStyle 设置为 1( 透明 ) ,则忽略 FillColor 属性,Form 对象除外。
387
11.4.4 自动重画 (AutoRedraw) 属性
应用程序在运行时其窗体经常被移动或被其他窗体覆盖,要想保持窗体中的内容 ( 图形等 ) 不丢失,就要在窗体移动、改变大小或覆盖它的窗体移开后,重新显示 ( 绘制 ) 窗体中的内容。 一般来说, Windows 管理和控制窗口和控件的重新显示,而窗体和图片框内图形的重新显示必须由用户的应用程序来控制。 AutoRedraw 属性就提供了重新显示窗体和图片框内图形的功能。当 AutoRedraw 属性设置为 False(缺省值 ) 时,对象中的图形不具有持久性,即当覆盖对象的窗体或控件被移动或大小改变后,对象上的图形将丢失;当 AutoRedraw 属性设置为 True 时,表示对象的自动重画功能有效,图形具有持久性,即当覆盖在容器对象上的窗体或控件被移动或大小改变了,对象内的图形将被重画,保持原有的样子。
388
11.4.5 Paint 事件
在应用程序运行时,当一个对象 ( 如窗体或图片框 )被移动或改变大小之后,或当一个覆盖该对象的窗体被移开之后,如果要保持该对象上所画图形的完整性 ( 重现原来的图形 ) , 可以选择触发 Paint 事件来完成图形的重画工作。
• 使用 Refresh 方法时,触发 Paint 事件。• 改变一个子控件或改变某一种属性 ( 如改变 Picture 属性 ) 时触发 Paint 事件。 在改变窗体大小后,应在 Resize 事件过程中调用 Refresh 方法,强制对象通过 Paint 事件重画图形。
如果 AutoRedraw 属性被设置为 True ,重新绘图将会自动进行,此时 Paint 事件无效。
389
第 12章 设计数据库应用程序
本章要求 :
1. 掌握数据库及数据库管理系统的概念
2. 掌握关系型数据库模型的关系(表),记录、字段、关键字、索引概念等。
3. 学会使用可视化数据管理器建立的数据库是 Access数据库(类型名为 .mdb)
4. 了解数据库控件的常用属性及与相关控件的绑定
390
1 VB 与数据库
1-1 数据库基本概念
根据数据模型,即实现数据结构化所采用的联系方式,数据库可以分为层次数据库、网状数据库和关系数据库。
关系数据库的有关概念
391
392
1 . 关系(表)
在关系数据库中,数据以关系的形式出现,可以把关系理解成一张二维表( Table)。
2 . 记录(行)
每张二维表均由若干行和列构成,其中每一行称为一条记录( Record),
3 . 字段(列)
二维表中的每一列称为一个字段( Field),每一列均有一个名字,称为字段名,各字段名互不相同。
4 . 主键
关系数据库中的某个字段或某些字段的组合定义为主键( Primary Key)。每条记录的主键值都是唯一的,这就保证了可以通过主键唯一标识一条记录。
393
5 .索引
为了提高数据库的访问效率,表中的记录应该按照一定顺序排列,通常建立一个较小的表——索引表,该表中只含有索引字段和记录号。通过索引表可以快速确定要访问记录的位置。
394
2 数据库的设计与管理2-1 建立数据库
VB 提供了两种方法建立数据库,分别是:
1. 可视化数据管理器
2. 数据访问对象( DAO)
1 、可视化数据管理器
使用可视化数据管理器建立的数据库是 Access 数据库(类型名为 .mdb),可以被 Access直接打开和操作。在VB 环境下,执行“外接程序”菜单中的“可视化数据管理器”命令,即可打开如图所示的“可视化数据管理器”窗口。
395
2 、 建立数据表以建立一个如下结构的学生表为例:
396
图 13-4 输入数据库文件名
( 2)在对话框中选择数据库文件保存的位置,并输入文件名后(保存类型只能是 MDB)单击保存按钮,将打开如图 13-5所示的建立数据表窗口。
( 1)在“可视化数据管理器”窗口中执行“文件”菜单中的“新建”命令(假设选择Microsoft Access ,版本7.0 MDB)后,弹出如图 13-4所示的对话框。
397
图 13-5 建立数据表窗口
( 3)右击数据库窗口,在弹出的菜单中选择“新建表”命令,打开如图 13-6所示的“表结构”对话框。
398
( 4)在“表结构”对话框中输入表名后,单击“添加字段”按钮,在弹出的如图 13-7所示的“添加字段”对话框中输入字段名,选择字段类型( Text 类型字段还需输入字段大小)。重复此过程直至添加完所有字段后,单击“关闭”按钮。
“表结构”对话框
399
“添加字段”对话框
3 . 建立索引
单击“表结构”对话框的“添加索引”按钮,在弹出的对话框中(如图 13-8所示)输入索引名称,选择索引字段后,单击“确定”按钮即完成了索引的建立过程。
400
“添加索引”对话框 “数据库”窗口
401
2-2 数据库的基本操作
输入数据
编辑数据
删除数据
排序数据
过滤数据
移动数据
查找数据
打开如图 13-10所示的输入数据窗口
402
3 使用控件访问数据库
3-1 ADO 数据控件
ADO数据控件是 ActiveX 外部控件,它的用途以及外形都和 Data控件相似,但它是通过 Microsoft ActiveX 数据对象(ADO)来建立对数据源的连接的,凡是符合 OLEDB规范的数据源都能连接。 ADO数据控件通过属性实现了对数据源的连接。创建连接时,可以采用下列源之一:一个连接字符串,一个 OLE DB 文件 (MDL) ,一个 ODBC数据源名称(DSN)。当使用 DSN时,无须更改控件的任何其他属性。
403
使用 ADO数据控件:1 . ConnectionStrng属性ConnectionString属性包含了用于与数据源建立连接的相关信息。 ConnectionString属性带有 4 个参数如表所示。
ConnectionString属性参数
参数 描述Provide 指定数据源的名称FileName 指定数据源所对应的文件名RemoteProvide
在远程数据服务器打开一个客户端时所用的数据源名称
Remote Server
在远程数据服务器打开一个主机端时所用的数据源名称
404
2 . RecordSource 属性RecordSource 确定具体可访问的数据,这些数据构成记录集对象 Recordset 。该属性值可以是数据库中的单个表名,一个存储查询,也可以是使用 SQL查询语言的一个查询字符串。
405
3-2 数据绑定控件
随着 ADO对象模型的引入, Visual Basic 6 . 0除了保留以往的一些数据连接控件外,又提供了一些新的成员来连接不同数据类型的数据。这些新成员主要有 DataGride 、 DataCombo、 DataLiSt 、 DataReport 和 MonthView等控件。 在绑定控件上不仅对 DataSource 和 DataField属性在连接功能上作了改进,又增加了 DataMember与 DataFormat 属性使数据访问的队形更加完整。 DataMember 属性允许处理多个数据集, DataFormat 属性用于指定数据内容的显示格式。
406
3-3 对数据控件编程1 、 Refresh 方法
2 、常用事件
4 数据库记录对象( RecordSet)使用 Recordset 对象的属性与方法的一般格式为:
数据控件名 . Recordset . 属性 / 方法
407
一、记录集 Recordset 的属性:BOF:用来测试记录指针是否超过文件头。EOF:用来测试记录指针是否超过文件头。Absoluteposition: 测试记录指针当前位置。
RecordCount 属性:指出Recordset 对象中当前记录总数。
Fields属性:每个 Field对象对应于Recordset 中有一列,即一个字段。要访问 Fidlds集合中的某个Field对象,可利用字段在集合中的索引位置(编号从 0开始),或直接用字段名。
如: Fields(1),Fields(2) 或 Fields(“姓名” )等
408
二、使用 Recordset 对象连接与访问数据库的记录 ( 1) Move 方法 使用 Move 方法遍历整个记录集中的记录。 Move 方法是: MoveFirst 或 MoveLast 方法移至第一个或最后一个记录。 MoveNext 或 MovePrevious 方法移至下一个或上一个记录。 Move [n] 方法向前或向后移 n 个记录, n为指定的数值。( 2) Find 方法 可在指定的 Dynaset 或 Snapshot 类型的 Recordset 对象中查找与指定条件相符的一个记录,并使之成为当前记录。 4种 Find 方法是: FindFirst 或 FindLast 方法 . 找到满足条件的第一个或最后一个记录。 FindNext 或 FindPrevious 方法找到满足条件的下一个或上一个记录。 4 种 Find 方法的语法格式相同:
数据集合 .Find 方法 条件
409
( 3) Seek 方法使用 Seek 方法可在 Table 表中查找与指定索引规则相符
的第一个记录,并使之成为当前记录。其语法格式为:数据表对象 .Seek comparison , key1,key2…
( 4) Refresh 方法如果在设计状态没有为打开数据库控件的有关属性全部赋值,或当 RecordSource 在运行时被改变后,必须使用激活数据控件的 Refresh 方法激活这些变化。例如:Data1.DatabaseName = "C:\VB\Biblio.mdb"Data1.RecordSource = "Titles"Data1.Refresh
( 5) Close 方法关闭指定的数据库、记录集并释放分配给它的资源其语法格式为:
对象 .Close
410
( 6) AddNew 方法向数据库中添加记录的步骤如下:首先,调用 AddNew 方法,打开一个空白记录;然后,通过相关约束控件给各字段赋值;最后,单击数据控件上的箭头按钮,移动记录指针,或调用UpdateRecord 方法确定所做添加。( 7) Delete 方法删除数据库中记录的步骤如下:首先,将要删除的记录定位为当前记录;然后,调用 Delete 方法;最后,移动记录指针,确定所做删除操作。( 8)数据更新的 Update 方法:
形式: Adodc1.recordset.Update
411
5 提高部分
一、使用表格控件
添加 DataGrid控件:鼠标右击控件箱 -- 选“部件”命令—选“ Microsoft Data Control 6.0” 复选框。
DataGrid控件常用属性: DataSource
412
二、数据环境设计器(Data Environment)
数据环境设计器(Data Environment) 用于设计数据库的工具保存在 .dsr 文件中。1 、给工程添加数据环境设计器:“工程“—选择” Data Environment“命令。2 、建立一种连接:右击Connection 对象,选择“属性”命令—出现“数据链接属性”选项卡,在“提供者”选项卡中选“Microsoft jet 4.0 OLE DB Provider”— 单击“下一步”—在“连接”选项卡中选择数据库名称 ---“测试连接”3 、定义命令:( 1)选择Connection 对象,单击“数据环境设计器”工具栏上“添加命令”按钮。( 2)在属性窗口输入 Command对象名。( 3)右击Command对象,选择“属性”命令,输入数据源
4 、创建用户界面:
打开一个窗体,将 Command对象从 Data Environment 设计器窗口拖到窗体中去。
413
三、报表设计(一)报表设计器:由DataReport 对象、Section 对象和Data Report控件组成。1 、 DataReport 对象:“工程”菜单—单击“Data Report”命令。DataReport 对象由“报表标头”、“页标头”、“细节”、“页注脚”、“报表注脚”组成。2 、 Section 对象:报表设计器的每一个部分由Section 对象表示Section1– Section5 。3 、 Data Report控件:有TextBox控件、Label控件、 Image控件、Line控件、Shape控件、Function控件。
414
(二)设计报表:
1 、指定数据源:
利用数据环境( Data Environment) 作数据源。
2 、将数据报表设计器添加到工程中:
“ 工程”—“添加 Data Report” 命令
3 、设置 Data Report 对象属性:
DataSource 和 DataMember
4 、检索结构:
右击报表—选择“检索结构”命令。
5 、添加控件:
6 、设置布局:
7 、运行显示数据报表:
415