内 容 提 要

Size: px
Start display at page:

Download "内 容 提 要"

Transcription

1 Visual Basic 6.0 程序设计基础教程 罗朝盛主编 余文芳 副主编 人民邮电出版社

2 前 言 Visual Basic 6.0 程序设计教程 于 2002 年 9 月由人民邮电出版社出版以来, 受到广大读者的欢迎, 被全国几十所各类高等学校选做教材 在两年多的时间里, 先后 8 次重印, 与教材配套的实验 CAI 系统也被很多高校采用, 得到了不少专家 老师和学生的好评 Visual Basic 程序设计课程在 2003 年 11 月被评为浙江省首批 高等学校精品课程, 我们使用该教材和实验 CAI 系统的 任务驱动的 Visual Basic 程序设计实验 CAI 系统及系列教材 被评为 2005 年度浙江省高等学校 教学成果二等奖 根据部分专家 教师的建议, 同时参照全国计算机等级考试 ( 二级 VB) 大纲及多所高校的非计算机专业 Visual Basic 程序设计课程的教学大纲, 结合这两年多使用 Visual Basic 6.0 程序设计教程 教材教学的实践, 考虑到目前各高校非计算机专业程序设计课程学时数普遍偏少, 难以在有限的学时内完成教学任务的实际情况, 在该教材的基础上, 我们编写了这本 Visual Basic 6.0 程序设计基础教程, 相比 Visual Basic 6.0 程序设计教程, 我们压缩了篇幅, 以适合不同院校非计算机专业学生选用 本教材共分 10 章, 包括 Visual Basic 程序设计概述 Visual Basic 语言基础 程序设计的 3 种基本结构 数组及应用 过程 常用控件 文件 图形操作 对话框与菜单程序设计 数据库编程基础等, 内容丰富 概念清楚 层次分明 通俗易懂, 并配有大量的例题, 适合教师课堂教学和学生自学 与现有的 VB 教材相比, 本教材具有以下特点 1. 突出程序设计方法训练 本教材没有面面俱到地介绍 VB 所有控件和高级技术, 而是深入浅出 循序渐进地介绍面向对象的程序设计方法 其中, 着重介绍 VB 编程的基础知识和方法, 加强了结构化程序设计和常用算法的训练, 并与 VB 中的对象属性和方法加以联系 这是因为面向对象的程序设计方法还是要以结构化程序设计为基础 这样可使读者既掌握了程序设计的基本方法, 又加深了面向对象概念的理解 2. 注重应用与适用 本教材以简短的篇幅介绍 VB 中最基本 最常用的内容, 同时精心设计了一些 VB 的编程实例, 对所讲述的原理 概念加以辅助说明 例如在介绍 VB 的控件 菜单 文件 图形设计等功能时, 设计了 IP 电话拨号 霓虹灯 倒计时 记事本 绘画板, 模拟行星绕太阳运动等小实例程序 通过这些实例分析, 并加以编程实现, 学生可以加深对 VB 编程的基本原理 方法的理解与掌握, 培养学生实际编程能力, 激发学生探索 VB 奥妙的兴趣, 达到事半功倍的效果 3. 将教程 实验 习题有机结合在一起 本书每一章后附有多种类型的练习题和实验题, 使用本教材不需要再配实验教程 VB 程序设计是一门实践性很强的课程, 上机实验是该课程的重要教学内容 学习程序设计是听不会, 看不会的, 只有通过大量的编程练习, 在实践中掌握语言知识, 培养实践能力 针对这一特点, 我们为本教材开发了一套采用 任务驱动 的 VB 程序设计实验 CAI 系统, 该系统的每个实验任务都是精心设计的, 针对性强, 学生可在实验任务的驱动下进行操作, 并能将完成的结果与系统要求达到的结果进行比较, 从而提高实际编程能力 关于本系统的详细介绍请见附录 3 本系统可直接到作者个人教学网站 ( 或 浙江省高校精品课

3 程 Visual Basic 程序设计 网站 ( 下载 对于选用本书作教材的学校, 我们可提供该系统的网络版, 网络版支持在线提交 / 批改作业等功能 4. 多元化 立体化 教材建设 为了方便老师的教学与学生的学习, 我们为广大读者提供了一个全面的学习平台, 读者可以通过访问作者的个人教学网站, 下载教师使用的课堂教学课件 例题源程序 练习题及相关辅导资料等 各位读者在使用中有任何意见和建议, 欢迎通过 与本书作者 (csluo168@163.com) 和责任编辑 (wangwenjuan@ptpress.com.cn) 联系 本教材由在教学第一线并具有丰富计算机基础教学经验的多位教师共同编写 其中第 1~4 章 第 9 章及附录由罗朝盛编写, 第 5 章由罗朝盛 郭招娣编写, 第 6 10 章由魏英编写, 第 7 8 章由余文芳编写 余匡辉 孙燕参与了实验 CAI 系统的开发 习题及例题的调试工作 本教材由浙江科技学院罗朝盛教授任主编, 浙江工商大学余文芳副教授任副主编 在教材的编写过程中得到了浙江大学余瑞钊教授 杭州电子科技大学胡维华教授 浙江工业大学陈庆章教授和胡同森副教授 浙江师范大学赵建民教授 杭州师范学院詹国华教授 河南电大现教中心裘佩珍副教授等专家及浙江科技学院计算机基础教研室全体教师的帮助和支持, 他们对本教材提出了不少有益的建议, 在此一并表示衷心的感谢 本教材可作为各类高等院校非计算机专业学习 VB 程序设计的教材, 也可作为有关工程技术人员和计算机爱好者的参考书 本教材虽经多次讨论并反复修改, 但限于作者水平, 不当之处仍在所难免, 谨请广大读者指正 编 者 2005 年 3 月 2

4 目 录 第 1 章 Visual Basic 程序设计概述 计算机程序设计概述 程序设计语言的发展 程序设计方法概述 中文 Visual Basic 6.0 简介 Visual Basic 的发展 Visual Basic 的特点 Visual Basic 6.0 可视化编程环境 Visual Basic 的集成开发环境主窗口 窗体设计窗口 工具箱 工程资源管理器 属性窗口 窗体布局窗口 代码编辑窗口 立即窗口 Visual Basic 中的基本概念 可视化编程 对象与类 属性 方法 事件与事件过程 窗体 窗体的结构 窗体的属性 窗体的事件 窗体的方法 Visual Basic 程序的组成及工作方式 Visual Basic 应用程序的组成 Visual Basic 应用程序的工作方式 创建应用程序的步骤 一个简单的 Visual Basic 程序的创建实例 新建工程 程序界面设计...27

5 Visual Basic 6.0 程序设计基础教程 编写相关事件代码 保存工程 运行 调试程序 生成可执行程序 本章小结...31 习题...31 实验...33 第 2 章 Visual Basic 语言基础 Visual Basic 语言字符集及编码规则 Visual Basic 的字符集 编码规则与约定 数据类型 Visual Basic 的标准数据类型 用户自定义类型 常量和变量 常量 变量 运算符和表达式 算术运算符与算术表达式 字符串运算符与字符串表达式 关系运算符与关系表达式 逻辑运算符与逻辑表达式 日期型表达式 运算符的执行顺序 常用内部函数...49 本章小结...52 习题...53 实验...54 第 3 章程序设计的 3 种基本结构 算法及算法的表示 算法概述 算法的特性 算法的表示 用 N-S 流程图表示算法 顺序结构 赋值语句 数据的输出 Print 方法...64

6 目录 用户交互函数和过程 注释语句 应用举例 选择结构 If 条件语句 Select Case 语句 ( 情况语句 ) 选择结构的嵌套 循环结构 For Next 循环语句 Do Loop 循环语句 While Wend 语句 循环的嵌套 多重循环结构 几种循环语句比较 循环结构与选择结构的嵌套 其他控制语句 Goto 语句 Exit 语句 End 语句 暂停语句 With...End With 语句 On Error 语句与 Resume 语句 应用程序举例 素数与哥德巴赫猜想 字符串处理 迭代法...94 本章小结...95 习题...95 实验 第 4 章数组及其应用 概述 一维数组 一维数组的声明 一维数组元素的引用 一维数组的基本操作 一维数组的应用 二维数组及多维数组 二维数组的声明 二维数组的引用

7 Visual Basic 6.0 程序设计基础教程 二维数组的基本操作 二维数组应用举例 多维数组的声明和引用 动态数组 动态数组的建立及使用 与数组操作有关的几个函数 应用举例 本章小结 习题 实验 第 5 章过程 过程概述 Sub 过程 事件过程 自定义过程 (Sub 过程 ) 子过程的建立 过程的调用 Function 过程 函数过程 (Function 过程 ) 的定义 函数的调用 过程之间参数的传递 形式参数与实际参数 参数传递 ( 虚实结合 ) 有关过程之间数据传递的几点说明 数组作过程的参数 过程的嵌套和递归调用 过程的嵌套 过程的递归调用 过程与变量的作用域 过程的作用域 变量的作用域 多重窗体与多模块程序设计 设置启动对象 窗体的加载与卸载过程 与窗体加载与卸载过程的相关的事件 应用举例 本章小结 习题...156

8 目录 实验 第 6 章常用控件 命令按钮 标签与文本框 命令按钮 标签控件 文本框控件 单选钮 检查框及框架 单选钮 检查框 框架 滚动条 列表框与组合框 时钟控件 控件数组 控件数组的概念 控件数组的建立 鼠标事件与键盘事件 鼠标事件 键盘事件 ActiveX 控件 概述 ProcessBar 控件 ImageList 控件与 ImageCombo 控件 SSTab 控件 本章小结 习题 实验 第 7 章文件 文件的概念 文件系统控件 驱动器列表框 (DriveListBox) 目录列表框 (DirListBox) 文件列表框 (FileListBox) 文件系统控件的联动 顺序文件 顺序文件的打开与关闭 顺序文件的读写操作

9 Visual Basic 6.0 程序设计基础教程 随机文件 随机文件的打开与关闭 写随机文件 读随机文件 二进制文件 打开与关闭二进制文件 二进制文件的读写操作 常用的文件操作语句和函数 文件操作语句 文件操作函数 本章小结 习题 实验 第 8 章图形操作 图形控件 图片框控件 图像框控件 形状控件 Shape 直线控件 Line 坐标系统 默认坐标系统 用户自定义坐标系统 绘图属性 CurrentX CurrentY 属性 线宽与线型 图形的填充 AutoRedraw 属性 图形颜色 绘图方法 Point 方法 Pset 方法 Line 方法 Circle 方法 应用举例 绘制函数曲线 简单动画设计 本章小结 习题...254

10 目录 实验 第 9 章对话框与菜单程序设计 自定义对话框 由普通窗体创建自定义对话框 使用对话框模板创建对话框 显示与关闭自定义对话框 通用对话框 打开通用对话框 通用对话框的属性页 打开 / 另存为 对话框 颜色 对话框 字体 对话框 其他对话框 菜单设计 菜单的类型 菜单编辑器 下拉式菜单 弹出式菜单 应用举例 本章小结 习题 实验 第 10 章数据库编程基础 数据库基础 数据库的基本概念 关系数据库 数据库应用程序的体系结构 数据库的建立与管理 建立数据库 管理数据库 数据访问控件 Data 控件 ADO 控件 DataGrid 控件 结构化查询语言 SQL 简介 SQL 概述 SQL 的查询语句

11 Visual Basic 6.0 程序设计基础教程 10.5 一个简易的学生成绩管理系统 系统分析 设计实现 本章小结 习题 实验 附录 1 ASCII 字符集 附录 2 常用内部函数 附录 3 Visual Basic 程序设计实验 CAI 系统简介

12 第 1 章 Visual Basic 程序设计概述 本章介绍计算机程序设计的概念 计算机语言的发展 VB 语言的特点 VB 语言程序设计的基本知识 通过一个简单 Visual Basic 应用程序的创建实例, 向读者介绍使用 VB 开发工具开发和调试程序的基本步骤 读者学习本章后, 应该做到 : (1) 了解计算机程序设计语言及程序设计方法的发展, 用高级语言编写的程序的执行过程 ; (2) 了解 VB 语言的特点, 正确理解 VB 语言的一些基本概念 ; (3) 掌握 VB 应用程序的基本组成结构 ; (4) 掌握开发和运行一个简单 VB 应用程序的过程 1.1 计算机程序设计概述 程序设计语言的发展计算机系统是由硬件系统和软件系统两大部分构成的, 硬件是物质基础, 而软件则是计算机的灵魂 没有软件, 计算机是一台 裸机, 是什么也不能干的 ; 有了软件, 才能成为一台真正的 电脑 而所有的软件, 都是用计算机语言编写的 人和计算机交流信息使用的语言称为计算机语言或称程序设计语言 计算机程序设计语言的发展, 经历了从机器语言 汇编语言到高级语言的历程 1. 机器语言 (Machine Language) 机器语言是一种用二进制代码 0 和 1 形式表示的, 1

13 Visual Basic 6.0 程序设计基础教程能被计算机直接识别和执行的语言 用机器语言编写的程序, 称为计算机机器语言程序 它是一种低级语言, 用机器语言编写的程序不便于记忆 阅读和书写 但由于使用的是针对特定型号计算机的语言, 故而运算效率是所有语言中最高的 机器语言是第一代计算机语言 2. 汇编语言 (Assemble Language) 为了克服使用机器语言编程的难记 难读等缺点, 人们进行了有益的改进, 用一些简洁的英文字母 符号串 ( 称为注记符 ) 来替代一个特定的指令的二进制串, 比如, 用 ADD 代表加法, MOV 代表数据传递等, 这样就很容易理解程序在干什么, 程序维护也就变得方便了, 这种程序设计语言就称为汇编语言 用汇编语言编制的程序称为汇编语言程序, 机器不能对其直接识别和执行, 必须先由 汇编程序 ( 或汇编系统 ) 将这些符号翻译成二进制的机器语言 这种 汇编程序 就是汇编语言的翻译程序 汇编语言程序的执行过程如图 1-1 所示 图 1-1 汇编语言程序的执行过程 汇编语言属于第二代计算机程序语言 汇编语言适用于编写直接控制机器操作的低层程序, 它与机器密切相关, 移植性不好, 但效率仍十分高 针对计算机特定硬件而编制的汇编语言程序, 能准确发挥计算机硬件的功能和特长, 程序精炼而质量高, 所以至今仍是一种常用的 强有力的软件开发工具 汇编语言和机器语言都是面向机器的程序设计语言, 一般称为低级语言 3. 高级语言 (High Level Language) 高级语言是一种与硬件结构及指令系统无关, 表达方式比较接近自然语言和数学表达式的计算机程序设计语言 优点是描述问题能力强, 通用性 可读性 可维护性都较好 ; 缺点是执行速度较慢, 编制访问硬件资源的系统软件较难 高级语言的发明是计算机发展史上最惊人的成就之一 1954 年, 第一个完全脱离机器硬件的高级语言 FORTRAN 问世了, 五十多年来, 共有几百种高级语言出现, 目前在计算机中广泛使用的高级语言有几十种, 影响较大 使用较普遍的有 FORTRAN ALGOL COBOL BASIC LISP SNOBOL PL/1 Pascal C PROLOG Ada C++ Visual C++ Visual Basic Delphi JAVA 等 BASIC 语言是一种简单易学的计算机高级语言 尤其是 Visual Basic 语言, 具有很强的可视化设计功能, 给用户在 Windows 环境下开发软件带来了方便, 是重要的多媒体编程工具语言 FORTRAN 是一种适合科学和工程设计计算的语言, 它具有大量的工程设计计算程序库 PASCAL 语言是结构化程序设计语言, 适用于教学 科学计算 数据处理和系统软件的开发 C 语言是一种具有很高灵活性的高级语言, 适用于系统软件 数值计算 数据处理 2 2

14 第 1 章 Visual Basic 程序设计概述 等, 使用非常广泛 面向对象的 C++ 语言及 Visual C++ BC++ 等集成开发工具很受程序开发者的青睐 JAVA 语言是近几年发展起来的一种新型的高级语言 它简单, 安全, 可移植性强 JAVA 适用于网络环境编程, 多用于交互式多媒体应用 用高级语言编写的程序称为 源程序, 计算机不能识别和执行, 要把源程序翻译成机器指令, 通常有编译和解释两种方式 编译方式是将源程序整个编译成等价的 独立的目标程序, 然后通过链接程序将目标程序链接成可执行程序 执行过程如图 1-2 所示 图 1-2 高级语言编译执行方式 解释方式是将源程序逐句翻译, 翻译一句执行一句, 不产生目标程序 整个执行过程, 解释程序都一直在内存中 解释方式执行过程如图 1-3 所示 图 1-3 高级语言解释执行方式 目前一般的高级语言 ( 如 Turbo C Visual Basic Visual C++ Delphi 等 ) 都提供了集成 开发环境, 它集源程序编辑 编译 ( 解释 ) 执行为一体, 非常方便用户使用 Visual Basic 应用程序可采用编译和解释两种执行方式 程序设计方法概述 程序设计方法的发展可以划分以下 3 个阶段 1. 早期的程序设计计算机发展的初期, 由于 CPU 运行速度慢 内存容量小, 因此衡量程序质量优劣的标淮是占用内存的大小和运行时间的长短, 这就导致了程序设计人员不得不把大量的精力耗费在程序设计技巧上 反映在程序结构上, 对程序的流程没有严格的限制, 程序员可以随心所欲地使流程转来转去, 程序流程变得毫无规律, 读者要花费很大的精力去追踪流程, 使得程序很难修改和维护 随着计算机技术的发展, 特别是到了 20 世纪 50 年代中期到 60 年代, 晶体管和集成电路相继问世, 使得计算机的性能价格比不断提高, 各种程序设计语言不断推出 另一方面由于计算机应用领域的不断扩大, 软件的规模也愈来愈大, 软件产品供不应求 传统方法研制软件时间长 成本高 可靠性低 难以修改和维护等问题日益突出, 导致出现了 软件危机 软件危机引起了人们的高度注意, 不少计算机专家着手研究探讨产生软件危机的原因以及解决软件危机的途径 于是也就出现了对软件工程 软件管理 软件可靠性及程序设计方法 ( 设 3 3

15 Visual Basic 6.0 程序设计基础教程计 编制 调试及维护程序的方法 ) 等问题的研究 2. 结构化程序设计 20 世纪 60 年代末, 著名学者 E.W.Dijkstra 首先提出了 结构化程序设计 的思想 这种方法要求程序设计者按照一定的结构形式来设计和编写程序, 使程序易阅读 易理解 易修改和易维护 这个结构形式主要包括两方面的内容 (1) 在程序设计中, 采用自顶向下 逐步细化的原则按照这个原则, 整个程序设计过程应分成若干层次, 逐步加以解决, 每一步是在前一步的基础上, 对前一步设计的细化 这样, 一个较复杂的大问题, 就被层层分解成为多个相对独立的 易于解决的小模块, 有利于程序设计工作的分工和组织, 也使调试工作比较容易进行 (2) 在程序设计中, 程序的控制结构仅由 3 种基本的控制结构 ( 顺序结构 选择结构和循环结构, 它们的算法表示将在第 3 章中介绍 ) 组成, 避免使用可能造成程序结构混乱的 GoTo 转向语句 所谓程序的控制结构是指用于规定程序流程的方法和手段 它是一种逻辑结构, 描述程序执行的顺序 ; 也是一种形式结构, 描述程序的编写规则 按照结构化程序设计方法, 使设计编写的程序的控制结构由上述 3 种结构组成, 这样的程序就是结构化程序 结构化程序设计技术虽已使用了几十年, 但软件质量的问题仍未得到很好的解决 这是因为面向过程的程序设计方法仍然存在与人的思维方式不协调的地方, 很难自然 准确地反映真实世界, 因而用此方法开发出来的软件, 还是很难保证质量, 甚至需要重新开发 另外, 该方法在实现中只突出了实现功能的操作方法 ( 模块 ), 而被操作的数据 ( 变量 ) 处于实现功能的从属地位, 即程序模块和数据结构是松散的结合在一起 因此, 当应用程序比较复杂时, 容易出错, 难以维护 为适应现代化软件开发的需要, 一种全新的软件开发技术应运而生, 这就是面向对象的程序设计 (Object Oriented Programming, 简称 OOP) 3. 面向对象的程序设计面向对象的程序设计在 20 世纪 80 年代初就提出了, 它起源于 Smalltalk 语言 用面向对象的方法解决问题, 不再将问题分解为过程, 而是将问题分解为对象 对象可以是现实世界中独立存在 能被区分的实体, 也可以是一些概念上的实体, 世界是由众多对象组成的 对象有自己的数据 ( 属性 ), 也包括作用于数据的操作 ( 方法 ), 对象将自己的属性和方法封装成一个整体, 供程序设计者使用 对象之间的相互作用通过消息传送来实现 这种 对象 + 消息 的面向对象的程序设计模式, 将取代 数据结构 + 算法 的面向过程的程序设计模式 但要注意到, 面向对象的程序设计并不是要抛弃结构化程序设计方法, 而是站在比结构化程序设计更高 更抽象的层次上去解决问题 当它被分解为低级代码模块时, 仍需要结构化编程的方法和技巧, 只是它分解一个大问题为小问题时采取的思路与结构化方法是不同的 结构化的分解突出过程, 强调的是如何做 (How to do?), 代码的功能如何完成 ; 面向对象的分解突出现实世界和抽象的对象, 强调的是做什么 (What to do?), 它将大量的工作由相应的对象来完成, 程序员在应用程序中只需说明要求对象完成的任务 目前常用的面向对象的程序设计语言有 Borland C++ Visual C++ Visual FoxPro 4 4

16 第 1 章 Visual Basic 程序设计概述 Visual Basic Java Delphi Visual Fortran 等, 它们虽然风格各异, 但都有共同的概念和编程 模式 Visual Basic 提供了开发 Windows 应用程序最迅速 最简洁的方法, 它提供了一整套 工具, 供用户开发应用程序 1.2 中文 Visual Basic 6.0 简介 什么是 Visual Basic? Visual 的英文意思是 可视的, 在这里是指开发图形用户界面 (GUI) 的方法, 即 可视化程序设计 在图形用户界面下, 不需要编写大量代码去描述界面元素的外观和位置, 而只要把预先建立的对象加到屏幕上的适当位置, 再进行简单的设置即可 Basic 指的是 BASIC(Beginners All-Purpose Symbol Instruction Code) 语言, 是一种应用十分广泛的计算机语言 Visual Basic 在原有 BASIC 语言的基础上进一步发展, 至今包含了数百条语句 函数及关键词, 其中很多和 Windows GUI 有直接关系 专业人员可以用 Visual Basic 实现其他任何 Windows 编程语言的功能, 而初学者只要掌握几个关键词就可以建立简单的应用程序 Visual Basic 的发展 1991 年,Microsoft 公司推出 Visual Basic 1.0 版, 它虽然存在一些缺陷, 但仍受到了广大程序员的青睐 随后 Microsoft 公司又分别在 1992 年 1993 年 1995 年和 1997 年相继推出了 和 5.0 多个版本 目前使用的最新版本 Visual Basic 6.0 是 1998 年下半年推出的 Visual Basic 6.0 版与以前版本相比, 其功能和性能都大大增强了, 还提供了新的 灵巧的数据库和 Web 开发工具 Visual Basic 5.0/6.0 有 3 种版本, 分别为学习版 专业版和企业版 Visual Basic 学习版使编程人员能轻松开发 Windows 和 Windows NT(R) 的应用程序 该版本包括所有的内部控件以及网格 选项卡和数据绑定控件 该学习版提供的文档有 Learn VB Now CD 和包含全部联机文档的 Microsoft Developer Network CD 专业版为专业编程人员提供了一整套功能完备的开发工具 该版本包括学习版的全部功能, 以及 ActiveX 控件 Internet Information Server Application Designer 集成的 Visual Database Tools 和 Data Environment Active Data Objects Dynamic HTML Page Designer 专业版提供的文档有 Visual Studio Professional Features 手册和包含全部联机文档的 Microsoft Developer Network CD 企业版使得专业编程人员能够开发功能强大的组内分布式应用程序 该版本包括专业版的全部功能, 以及 Back Office 工具 ( 如 SQL Server Microsoft Transaction Server Internet Information Server Visual SourceSafe SNA Server 以及其他 ) 企业版提供的文档有 Visual Studio Enterprise Features 手册以及包含全部联机文档的 Microsoft Developer Network CD 这 3 个版本是在相同的基础上建立起来的, 以满足不同层次用户的需要 对大多数用户来说, 专业版就可以满足要求 本书使用的是 Visual Basic 6.0 的企业版 ( 中文 ), 但书中程序尽量做到与版本无关 5 5

17 Visual Basic 6.0 程序设计基础教程 Visual Basic 的特点 Visual Basic 有以下几个主要的功能特点 1. 提供了面向对象的可视化编程工具 Visual Basic 采用的是面向对象的程序设计方法 (OOP), 它把程序和数据封装在一起视为一个对象 设计程序时只需从现有的工具箱中 拖 出所需的对象, 如按钮 滚动条等, 并为每一个对象设置属性, 这样就可以在屏幕上 画 出所需的用户界面来, 因而程序设计的效率可大大提高 2. 事件驱动的编程方式传统的程序设计是一种面向过程的方式, 程序总是按事先设计好的流程运行, 而不能将后面的程序放在前面运行, 即用户不能随意改变 控制程序的流向, 这不符合人类的思维习惯 在 Visual Basic 中, 用户的动作 事件控制着程序的流向, 每个事件都能驱动一段程序的运行 程序员只需编写响应用户动作的代码, 而各个动作之间不一定有联系 这样的应用程序代码一般比较短, 程序易于编写与维护 3. 结构化的程序设计语言 Visual Basic 具有丰富的数据类型和结构化程序结构, 其特点是 : (1) 增强了数值和字符串处理功能, 比传统的 BASIC 语言有许多的改进 ; (2) 提供了丰富的图形及动画指令, 可方便地绘制各种图形 ; (3) 提供了定长和动态 ( 变长 ) 数组, 有利于简化内存管理 ; (4) 增加了递归过程调用, 使程序更为简练 ; (5) 提供了一个可供应用程序调用的包含多种类型的图标库 ; (6) 具有完善的调试 运行出错处理 4. 提供了易学易用的应用程序集成开发环境在 Visual Basic 的集成开发环境中, 用户可设计界面 编写代码 调试程序, 直至将应用程序编译成可执行文件在 Windows 上运行, 使用户在友好的开发环境中工作 5. 支持多种数据库系统的访问数据访问特性允许对包括 Microsoft SQL Server 和其他企业数据库在内的大部分数据库格式建立数据库和前端应用程序, 以及可调整的服务器端部件 利用数据控件可访问 Microsoft Access Dbase Microsoft FoxPro Paradox 等数据库, 也可以访问 Microsoft Excel Lotusl1-2-3 等多种电子表格 6. 支持动态数据交换 (DDE) 动态链接库(DLL) 和对象的链接与嵌入 (OLE) 动态数据交换是 Microsoft Windows 除了剪贴板和动态链接函数库以外, 在 Windows 内 6 6

18 第 1 章 Visual Basic 程序设计概述 部交换数据的第三种方式 利用这项技术可使 Visual Basic 开发的应用程序与其他 Windows 应用程序之间建立数据通信 动态链接库中存放了所有 Windows 应用程序可以共享的代码和资源, 这些代码或函数可以用多种语言写成 Visual Basic 利用这项技术可以调用任何语言产生的 DLL, 也可以调用 Windows 应用程序接口 (API) 函数, 以实现 SDK 所能实现的功能 对象的链接与嵌入是 Visual Basic 访问所有对象的一种方法 利用 OLE 技术,Visual Basic 将其他应用软件作为一个对象嵌入到应用程序中进行各种操作, 也可以将各种基于 Windows 的应用程序嵌入到 Visual Basic 应用程序中, 实现声音 图像 动画等多媒体的功能 7. 完备的 Help 联机帮助功能与 Windows 环境下的其他软件一样, 在 Visual Basic 中, 利用帮助菜单和 F1 功能键, 用户可随时方便地得到所需的帮助信息 Visual Basic 帮助窗口中显示了有关的示例代码, 通过复制 粘贴操作可获得大量的示例代码, 为用户的学习和使用提供了极大的方便 另外 Visual Basic 6.0 还增加许多新特性, 读者可以通过查询系统的帮助了解 1.3 Visual Basic 6.0 可视化编程环境 Visual Basic 的集成开发环境主窗口 Visual Basic 集成开发环境或 IDE, 提供了一整套工具方便用户开发应用程序 它在一个公共环境里集成了许多不同的功能, 例如设计 编辑 编译和调试 下面介绍 Visual Basic 6.0 的集成开发环境 当启动 Visaul Basic 6.0 时, 可以见到如图 1-4 所示的窗口, 提示选择要建立的工程类型 图 1-4 Visual Basic 6.0 新建工程对话框 使用 Visual Basic 6.0 可以生成如图 1-4 中所示的 13 种类型的应用程序 ( 图中仅看到 10 种, 通过滚动条可看到另外 3 种 ) 7 7

19 Visual Basic 6.0 程序设计基础教程在图 1-4 中的窗口中有如下 3 个选项卡 (1) 新建 : 这个选项卡中列出了上述 13 种可生成的工程类型, 选择其中一种时开始创建工程 (2) 现存 : 这个选项卡中列出了可以选择和打开的现有工程 (3) 最新 : 这个选项卡中列出了最近使用过的工程, 用户可以选择和打开一个需要的工程 当选择 新建 选项卡中的 标准 EXE 图标并单击 打开 按钮时, 可以打开如图 1-5 所示的 Visual Basic 集成开发环境窗口 菜单栏 工具栏 工具箱 标题栏 工程资源管理器窗口 属性窗口 窗体设计窗口 布局窗口 立即窗口 图 1-5 Visual Basic 6.0 集成开发环境 需要说明的是一般启动时, 可能见不到图 1-5 中的 立即窗口 Visual Basic 集成开发环境中的各窗口都可以通过 视图 菜单中的相应命令来打开和关闭, 用户可根据需要自行设置 1. 标题栏标题栏位于主窗口最上面的一行, 如图 1-5 所示 标题栏显示窗口标题及工作模式, 启动时它显示 工程 1-Microsoft Visual Basic[ 设计 ], 表示它处于程序设计模式 Visual Basic 有 3 种工作模式 : 设计 (Design) 模式 运行 (Run) 模式和中断 (Break) 模式 (1) 设计模式 : 可进行用户界面的设计和代码的编制, 以完成应用程序的开发, 如图 1-5 所示 (2) 运行模式 : 运行应用程序, 这时不可编辑代码, 也不可编辑界面 此时, 标题栏中的标题为 : 工程 1-Microsoft Visual Basic [ 运行 ] (3) 中断模式 : 应用程序运行暂时中断, 这时可以编辑代码, 但不可编辑界面 此时, 标题栏中的标题为 : 工程 1-Microsoft Visual Basic [ 中断 ] 按 F5 键或单击工具栏的 继续按钮, 程序继续运行 ; 单击 结束按钮, 程序停止运行 在此模式会弹出 立即 窗口, 在立即窗口内可输入简短的命令, 并立即执行 8 8

20 第 1 章 Visual Basic 程序设计概述 2. 菜单栏 Visual Basic 集成开发环境的菜单栏中包含使用 Visual Basic 所需要的命令 它除了提供标准 文件 编辑 视图 窗口 和 帮助 菜单之外, 还提供了编程专用的功能菜单, 包括 工程 格式 调试 外接程序 等 8 个菜单, 如图 1-6 所示 标题栏 菜单栏 工具栏 图 1-6 Visual Basic 6.0 集成开发环境的主窗口 Visual Basic 6.0 集成开发环境中的基本菜单如下 (1) 文件 : 包含打开和保存工程以及生成可执行文件的命令 (2) 编辑 : 包含编辑命令 格式化命令 编辑代码的命令, 以及其他编辑功能命令 (3) 视图 : 包含显示和隐藏 IDE 元素的命令 (4) 工程 : 包含在工程中添加构件 引用 Windows 对象和工具箱新工具的命令 (5) 格式 : 包含对齐窗体控件的命令 (6) 调试 : 包含一些通用的调试命令 (7) 运行 : 包含启动 设置断点和终止当前应用程序运行的命令 (8) 查询 : 包含操作数据库表时的查询命令以及其他数据访问命令 (9) 图表 : 包含操作 Visual Basic 工程时的图表处理命令 (10) 工具 : 包含建立 ActiveX 控件时需要的工具命令, 并可以启动菜单编辑器以及配置环境选项 (11) 外接程序 : 包含可以随意增删的外接程序 缺省时这个菜单中只有 可视化数据管理器 选项 通过 外接程序管理器 命令可以增删外接程序 (12) 窗口 : 包含屏幕窗口布局命令 (13) 帮助 : 提供相关帮助信息 3. 工具栏工具栏在编程环境下提供对于常用命令的快速访问 单击工具栏上的按钮, 即可执行该按钮所代表的操作 按照缺省规定, 启动 Visual Basic 之后将显示 标准 工具栏 其他工具栏, 如 编辑 窗体设计 和 调试 工具栏可以从 视图 菜单中的 工具栏 命令中移进或移出 一般工具栏在菜单栏的正下方, 或以垂直条状紧贴在左边框上, 如果用鼠标将它从某栏下面移开, 则它能 悬 在窗口中 窗体设计窗口 窗体设计窗口 也称为对象窗口 Windows 的应用程序运行后都会打开一个窗体设计 9 9

21 Visual Basic 6.0 程序设计基础教程窗口, 它是应用程序最终面向用户的窗口, 是屏幕中央的主窗口 通过在窗体中添加控件并设置相应的属性来完成应用程序界面的设计 每个窗口必须有一个窗体名字 系统启动后会自动创建一个窗体 ( 缺省名为 Form1), 用户可通过 工程 / 添加窗体 来创建新窗体或将已有的窗体添加到工程中 程序每个窗体保存后都有一个窗体文件名 ( 扩展名为.frm) 应注意窗体名 ( 即窗体的 Name 属性 ) 和窗体文件名的区别 工具箱 系统启动后, 缺省的 General 工具箱就会出现在屏幕左边, 其中每个图标表示一种控件, 共有 20 个常用 部件, 如图 1-7 所示 指针 ( 选择对象 ) 标签 (Label) 框架 (Frame) 复选框 (CheckBox) 组合框 (ComboBox) 水平滚动条 (HscrollBar) 定时器 (Timer) 目录列表框 (DirListBox) 形状 (Shape) 图像框 (Image) 图 1-7 图片框 (PictureBox) 文本框 (TextBox) 命令按钮 (CommandButton) 单选按钮 (OptionButton) 列表框 (ListBox) 垂直滚动条 (VscrollBar) 驱动器列表框 (DriveListBox) 文件列表框 (FileListBox) 画线 (Line) 数据库 (Data) 工具箱中的常用控件 图 1-8 部件 对话框 用户可以将不在工具箱中的其他 ActiveX 控件放到工具箱中 通过 工程 菜单中的 部 件 命令或从 工具箱 快捷菜单中选定 部件 选项卡, 就会显示系统已安装的所有 ActiveX 10 10

22 第 1 章 Visual Basic 程序设计概述 控件清单 要将某控件加入到当前选项卡中, 只需单击要添加的控件前面的方框, 如图 1-8 所示, 然后单击 确定 按钮, 选定的 ActiveX 控件便添加到工具栏中 工程资源管理器 工程是指用于创建一个应用程序的文件的集合 工程资源管理器列出了当前工程中的窗体和模块, 如图 1-9 所示 在工程资源管理器窗口中有 3 个按钮, 分别表示 查看代码 查看对象 和 切换文件夹 单击 查看代码 按钮, 可打开 代码编辑器 查看代码 单击 查看对象 按钮, 可打开 窗体设计器 查看正在设计的窗体 单击 切换文件夹 按钮, 则可以隐藏或显示包含在对象文件夹中的个别项目列表 图 1-9 工程资源管理器窗口 属性窗口 属性是指对象的特征, 如大小 标题或颜色等 在 Visual Basic 6.0 设计模式中, 属性窗口列出了当前选定窗体或控件的属性及其值, 用户可以对这些属性值进行设置 例如, 要设置 Command1 命令按钮上显示的字符串, 可以找到属性窗口的 Caption 属性, 输入 开始 之类的字符串, 如图 1-10 所示 图 1-10 属性设置窗口 11 11

23 Visual Basic 6.0 程序设计基础教程 窗体布局窗口 窗体布局窗口显示在屏幕右下角 用户可使用表示屏幕的小图像来布置应用程序中各窗体的位置 这个窗口在多窗体应用程序中很有用, 因为通过它可以指定每个窗体相对于主窗体的位置 图 1-11 表示桌面上两个窗体的放置及其相对位置 右键单击某个窗口, 弹出 快捷菜单, 可通过该 快捷菜单 对窗体启动位置进行设计, 如要设计窗体 Form1 启动位置居 所有者中心, 其操作如图 1-12 所示 图 1-11 窗体布局窗口图 1-12 设置窗体启动位置 代码编辑窗口 在设计模式中, 通过双击窗体或窗体上的任何对象或单击 工程资源管理器 窗口中的 查看代码 按钮, 都可打开代码编辑器窗口 代码编辑器是输入应用程序代码的编辑器, 如图 1-13 所示 应用程序的每个窗体或标准模块都有一个单独的代码编辑器窗口 图 1-13 代码编辑器窗口 立即窗口 在 Visual Basic 集成开发环境 IDE 中, 运行 视图 / 立即窗口 命令或按下 Ctrl+G 组合键, 即可打开如图 1-14 所示的立即窗口 立即窗口是 Visual Basic 所提供的一个系统对象, 称为 Debug 对象, 为调试程序使用 它只有方法, 不具备任何事件和属性 通常使用的是 Print 方法 12 12

24 第 1 章 Visual Basic 程序设计概述 图 1-14 立即窗口 在设计状态可以在立即窗口中进行一些简单的命令操作, 如变量赋值或用? 或 Print ( 两者等价 ) 输出一些表达式的值 例如 : 1. 在立即窗口中使用等号给变量赋值 如 : X= 3.14:Y=2:Z=30:P=True: K=False 2. 使用? 表达式 或 Print 表达式 输出某表达式的值 如 :? X+Y 5.14 ' 输出结果 Print Int(X)+Y/2 4 ' 输出结果? Not P Or K And P Or Y>Z False 操作结果如图 1-15 所示 ' 输出结果 图 1-15 在立即窗口中操作实例 此外,Visual Basic 6.0 中还有几个非常有用的附加窗口, 如本地和监视窗口, 它们都是 为调试应用程序提供的, 本地窗口和监视窗口只在运行工作模式下才有效 1.4 Visual Basic 中的基本概念 可视化编程 传统的编程方法采用的是面向过程 按顺序进行的机制, 其缺点是程序员始终要关心什 13 13

25 Visual Basic 6.0 程序设计基础教程么时候发生什么事情, 处理 Windows 环境下事件驱动方式的工作量太大 VB 采用的是面向对象 事件驱动的编程机制 程序员只需编写响应用户动作的程序, 如移动鼠标 单击鼠标等, 而不必考虑每个步骤执行的精确次序, 编写代码相对较少 VB 使用的 可视化编程 方法, 是 面向对象编程 技术的简化版 VB 提供多种 控件 支持可视化编程, 利用它们可以快速创建强大的应用程序而不需涉及不必要的细节 这一点, 通过前面实例的介绍, 相信读者已经有了初步的认识 在 VB 环境中, 程序员不仅可以利用控件来创建对象, 而且还可以建立自己的 控件, 这是 Windows 环境下编程的新概念 对象与类 1. 对象对象 (Object) 是代码和数据的集合 可以把对象想像成日常生活中的各种物体, 如一支钢笔 一辆汽车 一台电脑都是一个对象 一台电脑又可以拆分为主板 CPU 内存 外设等部件, 这些部件又都分别是一个对象, 因此电脑这个对象可以说是由多个 子 对象组成的, 它可以称为是一个对象容器 (Container) 在 Visual Basic 6.0 中, 对象可以由系统设置好, 直接供用户使用, 也可以由程序员自己设计 Visual Basic 设计好的对象有窗体 各种控件 菜单 显示器 剪贴板等 用户使用最多的是窗体和控件 2. 类类是同一种对象的统称, 是一个抽象的整体概念, 也是创建对象实例的模板, 而对象则是类的实例化 属于同一类的所有对象具有同一组属性 方法与事件, 只是其中不同对象的属性值不同, 对事件的响应不同 ( 取决于程序员的编程 ) 类与对象是面向对象程序设计语言的基础 下面以 汽车 为例, 说明类与对象的关系 汽车是一个笼统的名称, 是整体概念, 可以把汽车看成一个 类 ; 一辆辆具体的汽车 ( 比如你的汽车 我的汽车 ) 就是这个类的实例, 也就是属于这个类的对象 属性 属性是用来描述和反映对象特征的参数 对象中的数据就保存在属性中, 每一个对象都有其属性, 属性值决定了对象的外观和行为 例如, 控件名称 (Name) 颜色 (Color) 及 是否可见 (Visible) 等属性决定了对象展现给用户的界面具有什么样的外观及功能 不同的对象具有不同的属性, 如命令按钮有 Caption 属性而无 Text 属性, 文本框无 Caption 属性而有 Text 属性 控件属性的设置一般有两条途径 (1) 如果在界面设计时设置对象的属性, 需要使用属性窗口 这时只要在属性窗口中选中要修改的属性, 然后在右列中键入新的值即可设置对象的属性 14 14

26 第 1 章 Visual Basic 程序设计概述 注意 : 控件的某些公共属性如果不设定, 则取控件所在窗体的属性值为其缺省值 如标签 文本框 列表框 图片框控件的字体 颜色等属性 因此, 本书只说明窗体属性的缺省值, 而不说明其他控件公共属性的缺省值 (2) 如果要在程序运行中动态地更改对象的属性, 可以使用 VB 的赋值语句, 在代码窗口中通过编程设置, 其格式为 : 对象名. 属性名 = 属性值其中 对象名. 属性名 是 VB 中引用对象属性的方法, 如下述代码可以设置标签控件 Label1 的标题为 第一个应用程序 : Label1.Caption = " 第一个应用程序 " 方法 方法是面向对象程序设计语言为编程者提供的用来完成特定操作的过程和函数 在 Visual Basic 中已将一些通用的过程和函数编写好并封装起来, 作为方法供用户直接调用, 这给用户的编程带来了极大的方便 因为方法是面向对象的, 所以在调用时一定要指明对象 对象方法的调用格式为 : [ 对象.] 方法 [ 参数名表 ] 其中, 若省略了对象, 则表示是当前对象, 一般指窗体 例如 : 在窗体 Form1 上打印输出 Visual Basic 程序设计, 可使用窗体的 Print 方法 : Form1.Print "Visual Basic 程序设计 " 若当前窗体是 Form1, 则可写为 :Print "Visual Basic 程序设计 " 事件与事件过程 1. 事件事件是 VB 预先定义的 对象能够识别的动作 每个控件都可以对一个或多个事件进行识别和响应, 如窗体加载事件 (Load) 鼠标单击事件 (Click) 鼠标双击事件 (DblClick) 等 事件是一种预先定义好的特定动作, 由用户或系统激活, 在多数情况下, 事件是通过用户的交互操作产生的 例如, 窗体上有一个名为 CmdOK 的命令按钮对象 当鼠标指针移动时, 系统将跟踪鼠标指针的位置, 当鼠标在该对象上单击时, 系统就给对象发送一个 Click 事件 如果该事件已编写了程序代码, 系统则执行此程序代码, 执行结束后, 控制权交还给系统, 并等待下一个事件 2. 事件过程事件过程用来完成事件发生后所要执行的动作 当一个对象察觉到某一事件 ( 如 Click 等 ) 发生时, 就会对事件产生响应, 即执行一段程序代码, 所执行的这段程序代码就称为事件过程 15 15

27 Visual Basic 6.0 程序设计基础教程对于窗体对象, 其事件过程的形式如下 : Sub Form_ 事件过程名 [( 参数列表 )] ( 事件过程代码 ) 对于除窗体以外的对象, 其事件过程的形式如下 : Sub 对象名 _ 事件过程名 [( 参数列表 )] ( 事件过程代码 ) 例如, 单击名为 cmdok 命令按钮, 使命令按钮变为不可见, 则对应的事件过程如下 : Sub CmdOK_Click() CmdOk.Visible=False 通常,VB 的控件都可以识别一个或一个以上的事件, 所以对一个对象至少能够建立和使用一个事件过程, 用来对用户或系统的事件做出相应的反应 但是不一定每个事件过程对应用程序都是必需的, 只要根据应用程序的需要来建立相应的事件过程就可以了 1.5 窗体 窗体 (Form) 也就是平时所说的窗口, 是 VB 编程中最常见的对象, 各种控件对象必须建 立在窗体上, 一个窗体对应一个窗体模块, 在保存应用程序时, 一个窗体对应一个窗体文件 窗体的结构 同 Windows 环境下的应用程序窗口一样,VB 中的窗体也具有控制菜单 标题栏 最大 化 / 还原按钮 最小化按钮 关闭按钮以及边框等, 如图 1-16 所示 最小化按钮 图 1-16 窗体的结构 窗体的操作与 Windows 下的窗口操作一样 通过鼠标左键拖动标题栏可以移动窗体 ; 鼠标对准窗体边框, 当出现双向箭头时拖动鼠标可以改变窗体的大小 建立新窗体后, 它的大小 背景颜色 标题及窗体名称等特征需要根据应用程序的要求 16 16

28 第 1 章 Visual Basic 程序设计概述 进行设置 窗体的属性 窗体的基本属性有 Name Left Top Height Width Visible Enabled Font ForeColor BackColor 等 Visual Basic 中的大多数控件都有这些属性, 在以后介绍其他对象时, 这些属性不再详细介绍 1.Name 属性 Visual Basic 中任何对象都有 Name 属性, 在程序代码中就是通过该属性来引用 操作具体的对象 首次在工程中添加窗体时, 该窗体的名称缺省为 Form1; 添加第二个窗体, 其名称缺省为 Form2, 以此类推 最好给 Name 属性设置一个有实际意义的名称, 如给一个程序的主控窗体命名为 MainFrm 这样它在程序代码中的意义就很清楚, 程序的可读性就好 2.Left Top 属性窗体运行在屏幕中, 屏幕是窗体的容器, 因此窗体的 Left Top 属性值是相对屏幕左上角的坐标值 对于控件,Left Top 属性值则是相对 容器 左上角的坐标值, 其缺省单位是 twip 1 twip=1/20 点 =1/1440 英寸 =1/567 厘米 3.Height Width 属性返回或设置对象的高度和宽度 对于窗体, 指的是窗口的高度和宽度, 包括边框和标题栏 ; 对于控件, 这些属性使用控件所在 容器 的度量单位 图 1-17 所示是屏幕 (Screen) 窗体 ( Form1) 和命令按钮 (Ok) 的 Left Top Height Width 属性表示, 读者要注意 Left Top 属性值是相对 容器 左上角的坐标值 在 Visual Basic 中除了屏幕 窗体作 容器 外, 还有框架和图片框对象可作 容器. 图 1-17 对象的 Left Top Height Width 属性 例 1.1 在窗体 Form1 被加载时, 将其大小设置为屏幕大小的 1/2, 并居中显示 通过窗 体的 Load 事件来实现的程序代码如下 : 17 17

29 Visual Basic 6.0 程序设计基础教程 Private Sub Form_Load () Form1.Width = Screen.Width/2 ' 设置窗体的宽度,Screen 为屏幕对象 Form1.Height = Screen.Height/2 ' 设置窗体的高度 ' 在水平方向上居中显示 Form1.Left = (Screen.Width - Form1.Width)/2 ' 在垂直方向上居中显示 Form1.Top = (Screen.Height - Form1.Height)/2 4.Caption 标题属性决定出现在窗体的标题栏上的文本内容, 也是当窗体被最小化后出现在窗体图标下的文本 如图 1-16 中窗体的 Caption 属性值是 VB 窗体 5. 字体 Font 属性组 FontName 属性是字符型, 决定对象上正文的字体 ( 缺省为宋体 ) FontSize 属性是整型, 决定对象上正文的字体大小 ( 缺省为 9 磅 ) FontBold 属性是逻辑型, 决定对象上正文是否是粗体 ( 缺省为 False) FontItalic 属性是逻辑型, 决定对象上正文是否是斜体 ( 缺省为 False) FontStrikeThru 属性是逻辑型, 决定对象上正文是否加一删除线 ( 缺省为 False) FontUnderLine 属性是逻辑型, 决定对象上正文是否带下划线 ( 缺省为 False) 6.Enabled 属性用于确定一个窗体或控件是否能够对用户产生的事件做出反应 通过在运行时把 Enabled 属性设置为 True 或 False 来使窗体和控件成为有效或无效 注意 : 如果使窗体或其他 容器 对象无效, 则在其中的所有控件也将无效 例 1.2 当单击窗体时, 使命令按钮 CmdOk 无效 代码如下 Private Sub Fomr1_Click() CmdOK.Enabled = False ' 使按钮无效, 不接授用户操作 7.Visible 属性用于确定一个窗体或控件为可见或隐藏 要在启动时隐藏一个对象, 可在设计时将其 Visible 属性设置为 False 还可在代码中设置该属性使控件在运行时隐藏, 然后又重新显示以响应某一特别事件 8.BackColor 属性和 ForeColor 属性 BackColor 属性用于返回或设置对象的背景颜色,ForeColor 属性用于返回或设置在对象里显示的图片和文本的前景颜色 它们是十六进制长整型数据, 在 Visual Basic 中通常用 18 18

30 第 1 章 Visual Basic 程序设计概述 Windows 运行环境的红 - 绿 - 蓝 ( RGB) 颜色方案, 使用调色板或在代码中使用 RGB 或 QBColor 函数指定标准 RGB 颜色 例如, 将窗体 Form1 的背景色设置为红色, 可使用 : Form1.BackColor = RGB(255, 0, 0) 也可用十六进制长整型数据或 Visual Basic 系统内部常量给 BackColor 属性赋值 例如 : Form1.BackColor = &HFF& 它等价于 :Form1.BackColor = vbred 9.MaxButton 最大化按钮和 MinButton 最小化按钮值为 Ture, 有最大或最小化按钮 ;False 则无 10.Icon 控制图标属性返回或设置窗体左上角和最小化时显示的图标 它必须在 ControlBox 属性设置为 Ture 时才有效 缺省设置的图标是, 单击属性窗口中 Icon 属性值后面的按钮, 打开 加载图标 对话框, 允许打开一个图标文件 (*.ico 和 *.cur) 作为这个属性的值 11.ControlBox 控制菜单框属性设置 Ture 为有, 如设置为 False 则无控件菜单, 同时窗体也无最大化按钮和最小化按钮, 即使 MaxButton 属性和 MinButton 属性设置为 False 12.Picture 图片属性设置窗体中要显示的图片 一般可显示所有类型的图片文件 13.BorderStyle 边框风格属性通过改变 BorderStyle 属性, 可以控制窗体如何调整大小, 它可取以下 6 种值, 如表 1-1 所示 表 1-1 窗体对象 BorderStyle 属性的取值及意义 数值 属性值 系统常量 意 义 0 VbBSNone 无 ( 没有边框或与边框相关的元素 ) 1 VbFixedSingle 固定单边框 可以包含控制菜单框 标题栏 最大化按钮和最小化 按钮 只有使用最大化和最小化按钮才能改变窗体大小 2 VbSizable ( 缺省值 ) 可调整大小的边框 3 VbFixedDoubledialog 4 vbfixedtoolwindow 5 vbsizabletoolwindow 固定对话框 可以包含控制菜单框和标题栏, 不包含最大化和最小化按钮, 不能改变窗体尺寸固定工具窗口 不能改变窗体尺寸, 显示关闭按钮并用缩小的字体显示标题栏, 窗体不在任务栏中显示可变尺寸工具窗口 可以改变窗体大小, 显示关闭按钮并用缩小的字体显示标题栏, 窗体不在任务栏中显示 19 19

31 Visual Basic 6.0 程序设计基础教程 14.WindowsState 属性 设置窗体运行的状态, 它可取 3 个值, 对应于 3 个状态, 如表 1-2 所示 表 1-2 WindowsState 属性的取值 属性值说明数值系统常量 0 VbNormal 正常窗口状态, 有窗口边界 1 vbminimized 最小化状态, 以图标方式运行 2 vbmaximized 最大化状态, 无边框, 充满整个屏幕 15.AutoRedraw 属性该属性决定窗体被隐藏或被另一窗口覆盖之后重新显示时, 是否重新还原该窗体被隐藏或覆盖以前的画面, 即是否重画如 Circle Line Pset 和 Print 等方法的输出 当为 True 时, 重新还原该窗体以前的画面 ; 当为 False 时, 不重画 AutoRedraw 属性 注意 : 在窗体 Load 事件中如果要使用 Print 方法在窗体上打印输出, 就必须先将窗体的 AutoRedraw 属性设置为 True, 否则窗体启动后将没有输出结果 这是因为窗体是在 Load 事件执行完后才显示的 读者一下子要记住这些属性有一定困难 要熟悉并应用这些窗体属性, 最好的办法是上机实践 在 属性 窗口中更改窗体的一些属性, 然后运行该应用程序并观察修改的效果 窗体的事件 与窗体有关的事件较多,Visual Basic 6.0 中有 30 多个, 但平时在编程时并不需要对所有事件编程, 读者只需掌握一些常用事件, 了解这些事件的触发机制 下面对几个常用窗体事件做一下介绍 1.Click 事件在程序运行时单击窗体内的某个位置,Visual Basic 将调用窗体的 Form_Click 事件 如果单击的是窗体内的控件, 则只能调用相应控件的 Click 事件 2.DblClick 事件程序运行时双击窗体内的某个位置, 就触发了两个事件, 第一次按动鼠标时, 触发 Click 事件 ; 第二次按动鼠标时, 触发 DblClick 事件 3.Load 事件在程序运行时, 当窗体被装入工作区时, 将触发它的 Load 事件, 所以该事件通常用来在启动应用程序时对属性和变量初始化 20 20

32 第 1 章 Visual Basic 程序设计概述 4.Unload 事件卸载窗体时触发该事件 5.Resize 事件当窗体大小发生改变时, 将触发一个 Resize 事件 窗体的方法 窗体常用的方法有打印输出 Print 清除 Cls 移动 Move 显示 Show 隐藏 Hide 等 1.Print 方法 Print 方法以当前所设置的前景色和字体在窗体上输出文本字符串 Print 方法的调用格式为 : 窗体名.Print [{Spc(n) Tab(n)} 表达式列表 ] 窗体名 : 由窗体的 Name 属性所定义的窗体名称标识 Spc(n): 内部函数, 用于在输出表达式前插入 n 个空格, 允许重复使用 Tab(n): 内部函数, 用于将指定表达式的值从窗体第 n 列开始输出, 允许重复使用 表达式列表由一个或多个数值或字符类型的表达式组成 如果在 Print 方法后面不出现表达式列表, 则只在当前位置输出一个空行 当表达式列表由多个表达式组成时, 表达式之间必须用空格 分号或逗号隔开 空格和分号等价, 分号和逗号用来决定下一个表达式在窗体上显示的光标位置 分号表示光标定位在上一个显示字符之后, 逗号表示光标定位在下一个打印区的开始位置, 每隔 14 列为一个打印区的开始位置 例 1.3 在窗体 Form1 的单击事件中写入如下代码 : Private Sub Form_Click() a = 10: b = 3.14 Print "a="; a, "b="; b Print "a="; a, "b="; b Print "a="; a, "b="; b Print Print "a="; a, "b="; b ' 空一行 Print "a="; a, Tab(18); "b="; b ' 从第 18 列开始打印输出 b= Print "a="; a, Spc(18); "b="; b ' 输出 a 值后, 插入 18 个空后, 输出 b= Print Print "a="; a, "b="; b ' 空一行 Print Tab(18); "a="; a, "b="; b Print Spc(18); "a="; a, "b="; b 程序的运行结果如图 1-18 所示 ' 从第 18 列开始打印输出 ' 空 18 列, 即从第 19 列开始打印输出 21 21

33 Visual Basic 6.0 程序设计基础教程 图 1-18 Print 方法的使用 2.Cls( 清除 ) 方法 Cls 方法用来清除运行时在窗体上显示的文本或图形, 它的调用格式为 : 窗体名.Cls Cls 只清除运行时在窗体上显示的文本或图形, 而不能清除窗体设计时的文本或图形, 当使用 C1s 方法后, 窗体的当前坐标属性 CurrentX 和 CurrentY 被设置为 0 3.Move( 移动 ) 方法 Move 方法用来在屏幕上移动窗体, 它的调用格式如下 : 窗体名.Move Left[,Top[,Width[,Height]]] 其中,Left Top Width Height 均为单精度数值型数据, 分别用来表示窗体相对于屏幕左边缘的水平坐标 相对于屏幕顶部的垂直坐标 窗体的新宽度和新高度 Move 方法至少需要一个 Left 参数值, 其余均可省略 如果要指定其余参数值, 则必须按顺序依次给定前面的参数值, 不能只指定 Width 值, 而不指定 Left 和 Top 值, 但允许只指定前面部分的参数, 而省略后面部分 例如, 允许只指定 Left 和 Top 值, 而省略 Width 和 Height 值, 此时窗体的宽度和高度在移动后保持不变 例 1.4 使用 Move 方法移动一个窗体 双击窗体, 窗体移动并定位在屏幕的左上角, 同时窗体的长宽也缩小一半 为了实现这一功能, 可以在窗体 Forml 的 代码 窗口中输入下列代码 : Private Sub Form_DblClick() Form1.Move 0, 0, Form1.Width / 2, Form1.Height / 2 4.Show( 显示 ) 方法 Show 方法用于在屏幕上显示一个窗体, 使指定的窗体在屏幕上可见, 调用 Show 方法与设置窗体 Visible 属性为 True 具有相同的效果 其调用格式如下 : 窗体名.Show [vbmodal vbmodeless] 说明 : (1) 该方法有一个可选参数, 它有 0( 系统常量 vbmodeless) 或 1( 系统常量 vbmodal) 两种可能的值 若不指定参数, 则默认为 vbmodeless 当参数为 vbmodal 时, 显示的窗口或对话框要求用户必须先将其关闭后, 才能在本应用程序中做其他操作 当参数为 vbmodeless 时, 22 22

34 第 1 章 Visual Basic 程序设计概述 显示的窗口或对话框, 用户可以不对它进行操作, 就可以在本应用程序中做其他操作 (2) 如果要显示的窗体事先未装入, 该方法会自动装入该窗体再显示 5.Hide( 隐藏 ) 方法 Hide 方法用于隐藏指定的窗体, 但不从内存中删除窗体 其调用格式为 : 窗体名.Hide 当一个窗体从屏幕上隐去时, 其 Visible 属性被设置成 False, 并且该窗体上的控件也变得不可访问, 但对运行程序间的数据引用无影响 若要隐去的窗体没有装入, 则 Hide 方法会装入该窗体但不显示 下面是一个使用 Hide 和 Show 方法的例子 例 1.5 实现将指定的窗体在屏幕上进行显示或隐藏的切换 为了实现这一功能, 可以在窗体 Forml 的 代码 窗口中输入下列代码 : Private Sub Form_Click() Form1.Hide ' 隐藏窗体 MsgBox " 单击确定按钮, 使窗体重现屏幕 " ' 显示信息 Forml.Show ' 重现窗体 窗体还有 Line Pset Circle 和 Refresh 等方法, 这些方法将在第 8 章图形操作中详细讨论 1.6 Visual Basic 程序的组成及工作方式 Visual Basic 应用程序的组成 一个 Visual Basic 的应用程序也称为一个工程, 用来管理构成应用程序的所有文件 工程 文件一般主要由窗体文件 (.frm) 标准模块文件 (.bas) 类模块文件 (.cls) 组成, 它们的 关系如图 1-19 所示 一个或若干个窗体模块 (*.frm) 文件 1. 各种控件 2. 窗体及控件的事件过程 3. 自定义子过程 (Sub) 4. 自定义函数过程 ( Function) VB 工程 (*.vbp) 一个或若干个标准模块 (.bas) 文件 1. 自定义子过程 (Sub) 2. 自定义函数过程 ( Function) 类模块 (.cls) 文件 图 1-19 Visual Basic 应用程序中各模块之间的关系 23 23

35 Visual Basic 6.0 程序设计基础教程说明 : (1) 每个窗体文件 ( 也称窗体模块 ) 包含窗体本身的数据 ( 属性 ) 方法和事件过程( 即代码部分, 其中有为响应特定事件而执行的指令 ) 窗体还包含控件, 每个控件都有自己的属性 方法和事件过程集 除了窗体和各控件的事件过程, 窗体模块还可包含通用过程, 它是用户自定义的子过程和函数过程, 对来自任何事件过程的调用都做出响应 (2) 标准模块是由那些与特定窗体或控件无关的代码组成的另一类型的模块 如果一个过程可能用来响应几个不同对象中的事件, 应该将这个过程放在标准模块中, 而不必在每一个对象的事件过程中重复相同的代码 (3) 类模块与窗体模块类似, 只是没有可见的用户界面 可以使用类模块创建含有方法和属性代码的自己的对象, 这些对象可被应用程序内的过程调用 标准模块只包含代码, 而类模块既包含代码又包含数据, 可视为没有物理表示的控件 除了上面的文件外, 一个工程还包括以下几个附属文件, 它们没法在工程资源管理窗口中查看或管理 窗体的二进制数据文件 (.frx): 如果窗体上控件的数据属性含有二进制属性 ( 例如图片或图标 ), 当保存窗体文件时, 就会自动产生同名的.frx 文件 资源文件 (.res): 包含着不必重新编辑代码就可以改变的位图 字符串和其他数据 该文件是可选项 ActiveX 控件的文件 (.ocx): ActiveX 控件的文件是一段设计好的可以重复使用的程序代码和数据, 可以添加到工具箱, 并可像其他控件一样在窗体中使用 该文件是可选项 Visual Basic 应用程序的工作方式 Visual Basic 应用程序采用的是以事件驱动应用程序的工作方式 事件是窗体或控件识别的动作 在响应事件时, 事件驱动应用程序执行相应事件的 Basic 代码 Visual Basic 的每一个窗体和控件都有一个预定义的事件集 如果其中有一个事件发生, 并且在关联的事件过程中存在代码,Visual Basic 则调用执行该代码 尽管 Visual Basic 中的对象自动识别预定义的事件集, 但要判定它们是否响应具体事件以及如何响应具体事件则是用户编程的责任 代码部分 ( 即事件过程 ) 与每个事件对应 想让控件响应事件时, 就把代码写入这个事件的事件过程之中 对象所识别的事件类型多种多样, 但多数类型为大多数控件所共有 例如, 大多数对象都能识别 Click 事件, 如果单击窗体, 则执行窗体的单击事件过程中的代码 ; 如果单击命令按钮, 则执行命令按钮的 Click 事件过程中的代码 每个情况中的实际代码几乎完全不一样 下面是事件驱动应用程序中的典型工作方式 (1) 启动应用程序, 装载和显示窗体 (2) 窗体 ( 或窗体上的控件 ) 接收事件 事件可由用户引发 ( 例如通过键盘或鼠标操作 ), 可由系统引发 ( 例如定时器事件 ), 也可由代码间接引发 ( 例如当代码装载窗体时的 Load 事件 ) (3) 如果在相应的事件过程中已编写了相应的程序代码, 就执行该代码 (4) 应用程序等待下一次事件 24 24

36 第 1 章 Visual Basic 程序设计概述 注意 : 有些事件伴随其他事件发生 例如, 在 DblClick 事件发生时,Click MouseDown 和 MouseUp 事件也会发生 创建应用程序的步骤 创建 Visual Basic 应用程序一般有以下几个步骤 (1) 新建工程 创建一个应用程序首先要打开一个新的工程 (2) 创建应用程序界面 使用工具箱在窗体上放置所需控件 其中, 窗体是用户进行界面设计时在其上放置控件的窗口, 它是创建应用程序界面的基础 (3) 设置属性值 通过这一步骤来改变对象的外观和行为 可通过属性窗口设置, 也可通过程序代码设置 (4) 对象事件过程的编程 通过代码窗口为一些对象相关事件编写代码 (5) 保存文件 运行调试程序之前, 一般要先保存文件 (6) 程序运行与调试 测试所编程序, 若运行结果有错或对用户界面不满意, 则可通过前面的步骤修改, 继续测试直到运行结果正确, 用户满意为止, 再次保存修改后的程序 1.7 一个简单的 Visual Basic 程序的创建实例 本节通过一个简单的 VB 程序建立与调试实例, 向读者介绍 VB 应用程序的开发过程和 VB 集成开发环境的使用, 使读者初步掌握 VB 程序的开发过程, 理解 VB 程序的运行机制 读者可以通过上机, 自己动手建立一个简单 VB 程序 例 1.6 设计一个 加法器 程序 程序运行效果如图 1-20 所示, 具体要求如下 (1) 窗体的标题为 加法器 (2) 在窗体上从到下依次引入 Text1 Text2 两个文本框, 两个文本框的对齐方式均为右对齐 (3) 在窗体上引入两个标签 Label1 Label2 将 Label1 用于显示 + 号,Label2 用于显示两数的和, 将其边界风格 (BorderStyle) 设置为 1(Fixed Single 固定单线边框 ) (4) 单击 = 按钮 (Command1), 将两个加数的和显示在下面一个标签 (Label2) 中 图 1-20 加法器 程序运行效果 (5) 单击 清空 按钮 (Command2), 两个文本框及标签 Label2 的内容都被清空, 同 25 25

37 Visual Basic 6.0 程序设计基础教程 时第一个文本框获得焦点 分析 : 本应用程序的界面设计用到了 3 个 VB 基本控件, 即命令按钮 标签和文本框, 这 3 个基本控件是 VB 程序设计中使用最多的控件, 下面首先对这 3 个控件作些介绍, 更详 细的介绍读者可阅读 6.1 节 1. 命令按钮 命令按钮 (CommandButton) 用来接受用户的操作信息, 当用户单击命令按钮后完成特 定的操作, 如实现一个命令的启动 中断和结束等操作 命令按钮在工具箱中的图标为, 在程序设计中该类对象名的前缀为 cmd 显示在命令按钮上的信息是标题属性 (Caption 属性 ) 命令按钮的基本属性有 Name Height Width Top Left Enabled Visible Font 等, 与窗体的使用相同 经常使用的是单击事件 (Click 事件 ) 2. 标签 标签 (Label) 控件可以显示用户不能直接改变的文本, 但用户可以编写代码来改变 Label 控件显示的文本, 以响应运行时的事件 标签还可用来标识控件, 例如没有 Caption 属性 的文本框控件就可以使用标签控件来标识 标签在工具箱中的图标为对象名的前缀为 lbl 3. 文本框, 在程序设计中该类 文本框 (TextBox) 通常用于显示用户输入的信息, 作为接受用户输入数据的接口, 或者 在设计或运行时, 通过对控件的 Text 属性赋值, 作为信息输出的对象 文本框在工具箱中的 图标为, 在程序设计中该类对象名的前缀为 txt 文本框没有 Caption 属性, 最重要的属性是 Text 属性 用户在文本框输入的信息就是 存放在 Text 属性中, 程序中可通过对文本框 Text 属性赋值, 修改显示在文本框中的内容 Text 属性值为字符型 (String) 事件 文本框常用的有 Change 事件 LostFocus 事件和 KeyPress 事件 用户改变文本框的内容或通过代码改变 Text 属性的设置时触发 Change 事件 当用户用 Tab 键或鼠标选择窗体上的其他对象而离开文本框时, 触发 LostFocus 当进行文本输入时, 每一次键盘输入, 都将使文本框接受一个 ASCII 码字符, 而发生 KeyPress 事件 新建工程 启动 Visual Basic 6.0, 将出现 新建工程 对话框 ( 如图 1-4 所示 ), 从中选择 标准 EXE, 单击 确定 按钮, 即进入 Visual Basic 的 设计工作模式, 这时 Visual Basic 创建了一个带有单个窗体的新工程 系统默认工程为 工程 1, 如图 1-5 所示的系统开发集成环境 26 26

38 第 1 章 Visual Basic 程序设计概述 程序界面设计 Line 根据题中要求, 在界面上拖放两个文本框 两个标签 两个命令按钮和一直线控件, 并调整好位置, 其设计界面如图 1-21 所示 图 1-21 加法器 的设计界面 在窗体设计窗口中, 单击选中相应控件, 再通过 属性 窗口, 按表 1-3 设置各对象的 主要属性 直线控件不需设置其属性值 表 1-3 各对象的主要属性设置 控 件 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 加法器 ") BorderStyle(1) 文本框 1 Name(Text1) Text(" ") Alignment(1) 文本框 2 Name(Text2) Text(" ") Alignment(1) 标签 1 Name(Label1) Caption("+") 标签 2 Name(Label2) Caption(" ") Alignment(1) BorderStyle(1) 命令按钮 1 Name(CmdCount) Caption("=") 命令按钮 2 Name(CmdClear) Caption(" 清除 ") 当所有控件的属性设置好后,Visual Basic 应用程序的界面也就设置好了, 可通过按 F5 键或选择 运行 菜单的 启动 命令, 或单击工具栏中的按钮, 查看运行界面, 如图 1-22 所示 此时程序还不能进行计算, 因为还没编写相关事件的代码 图 1-22 程序运行最初界面 27 27

39 Visual Basic 6.0 程序设计基础教程 注意 : 有些对象系统本身已封装了某些操作 ( 如窗体的 最大化 关闭 等操 作 ), 无需用户编写相应的代码 编写相关事件代码 在设计窗口, 双击命令按钮进入代码编辑窗口编写程序代码 单击 选择对象 下拉列表框的下拉键, 从中选择 CmdCount 对象, 再从 选择事件 下拉列表框中选择 Click 事件, 则在代码窗口中会出现事件过程的框架, 如图 1-23 所示 选择对象 选择事件 图 1-23 代码窗口 在命令按钮的单击事件中写入如下代码 : Private Sub Form_Load() Text1.TabIndex = 0 ' 窗体启动后, 让文本框 Text1 得到焦点 Private Sub CmdCount_Click() Dim x!, y!, z! x = Val(Text1.Text) y = Val(Text2.Text) z = x + y Label2.Caption = Str(z) ' = 命令按钮单击事件 ' 定义变量 ' 将文本框 Text1 中输入的数据转换成数值后赋值给变量 x ' 求两数之和, 并存于变量 z 中 ' 在标签 Label2 中显示输出计算结果 Private Sub CmdClear_Click() Text1.Text = "" Text2.Text = "" Label2.Caption = "" Text1.SetFocus ' 清除 命令按钮单击事件 ' 清除 Text1 中的文本 ' 清除 Label2 中显示的内容 ' 将焦点定位于 Text1 中 28 28

40 第 1 章 Visual Basic 程序设计概述 保存工程 使用 文件 菜单中的 工程保存 命令, 或者单击工具栏上的 保存 按钮, Visual Basic 系统就会提示将所有内容 ( 如类模块文件 标准模块文件 窗体文件和工程文件等 ) 保存 对本例而言, 是保存包括窗体文件 *.frm 的工程文件 *.vbp 如果是第一次保存文件,Visual Basic 系统会出现 文件另存为 对话框, 如图 1-24 所示, 要求用户选择保存文件位置和输入文件名 如果不是第一次保存文件, 则系统将直接以原文件名保存工程中的所有文件 ; 若要将更新后的工程以新的文件名保存, 则可从文件菜单中选择 工程另存为, 同样将出现 文件另存为 对话框, 如图 1-24 所示, 用新的文件名保存此工程文件 Visual Basic 还将提示用户保存所有修改过的窗体或模块 输入窗体文件名 选择保存的位置 图 1-24 保存窗体文件 注意 : 在运行程序之前, 应先保存程序, 以避免由于程序不正确造成死机时界面 设计和程序代码的丢失 当程序运行正确后还要将修改的有关文件保存到磁盘上 Visual Basic 系统首先保存窗体文件和其他文件, 最后才是工程文件 运行 调试程序 选择 运行 菜单的 启动 或按 F5 键, 或单击工具栏的按钮, 则进入运行状态, 单击 显示 按钮, 如果程序代码没有错, 就得到图 1-20 所示的界面 ; 若程序代码有错, 如 将 Text1 错写成 Txet1, 则出现如图 1-25 所示的信息对话框 代码 这里可有 3 种选择 : (1) 单击 结束 按钮, 结束程序运行, 回到设计工作模式, 从代码窗口去修改错误的 (2) 单击 调试 按钮, 进入中断工作模式, 此时出现代码窗口, 光标停在有错误的行 上, 并用黄色显示错误行, 如图 1-26 所示, 修改其错误后, 可按 F5 键或单击工具栏的 按

41 Visual Basic 6.0 程序设计基础教程 钮继续运行 (3) 单击 帮助 按钮可获得系统的详细帮助 错误说明 错误代码 命令按钮 图 1-25 程序运行出错时的对话框 按此继续执行 有错误的行 图 1-26 中断工作模式 运行调试程序, 直到满意为止, 再次保存修改后的程序 生成可执行程序 VB 提供了两种运行程序的方式 : 解释执行方式和编译执行方式 一般调试程序就是解释执行方式, 因为解释执行方式是边解释边执行, 在运行中如果遇到错误, 则自动返回代码窗口并提示错误语句, 使用比较方便 当程序调试运行正确后, 以后要多次运行或要提供给其他用户使用, 就要将程序编译成可执行程序 在 Visual Basic 集成开发环境下生成可执行文件的步骤如下 : (1) 执行 文件 菜单中的 生成 XXX.exe 命令 ( 此处 XXX 为当前要生成可执行文件的工程文件名 ), 系统弹出 生成工程 对话框 ; (2) 在 生成工程 对话框中选择生成可执行文件的文件夹并指定文件名 ; (3) 单击 生成工程 对话框中的 确定 按钮, 编译和连接生成可执行文件 注意 : 按照上述步骤生成的可执行文件只能在安装了 Visual Basic 6.0 的机器上使用 30 30

42 第 1 章 Visual Basic 程序设计概述 本章小结 本章向读者介绍 Visual Basic 开发集成环境, 使读者通过学习初步建立起面向对象程序设计的概念 然后讲述 Visual Basic 的基本概念及窗体对象的常用属性 方法 事件 最后通过一个简单的程序实例, 介绍一个简单的 Visual Basic 应用程序的建立过程 学完本章后, 读者应掌握面向对象程序设计的概念 ; 对象 对象的属性 方法 事件和事件过程的概念 ;Visual Basic 程序的工作机制等 用 Visual Basic 创建简单的 Visual Basic 应用程序比较容易 首先, 在窗体上 绘制 诸如文本框和命令按钮等控件来创建用户界面 然后, 为窗体和控件设置属性, 以规定诸如标题 颜色和大小等的值 最后, 给需用到的一些事件编写代码, 将要完成的操作真正赋予应用程序 使用 Visual Basic 编程时, 必须首先确定应用程序如何与用户交互, 如鼠标单击 键盘输入等, 用户必须编写代码控制这些事件的响应方法, 这就是所谓的事件驱动式编程 这些将在以后各章节的学习加以解决 习题 一 判断题 1. 为了使一个控件在运行时不可见, 应将该控件的 Enable 属性值设置为 False 2. 当用 Load 命令将窗体装入内存时, 一定触发窗体的 Load 事件和 Activate 事件 3. 面向对象程序设计是一种以对象为基础, 由事件驱动对象执行的设计方法 4. 将焦点主动设置到指定的控件或窗体上, 应采用 Setfocus 方法 5. 方法是 Visual Basic 对象可以响应的用户操作 6. 对象是基本的运行时实体, 它既包括了数据 ( 属性 ), 也包括作用于对象的操作 ( 方法 ) 和对象的响应动作 ( 事件 ) 7. 属性是用来描述和反映对象特征的参数, 不同的对象具有各自不同的属性, 对象的所有属性都可以在属性窗口中设置 8.Visual Basic 中将一些通用的过程和函数编写好并封装作为方法供用户直接调用 9. 每个对象都有一系列预先定义好的事件, 但要使对象能响应具体的事件, 则应编写该对象相应的事件过程 10. 属性是 Visual Basic 对象性质的描述, 对象的数据就保存在属性中 11. 在打开一个 Visual Basic 工程进行修改后, 当要另存为一个文件时, 可单击 工程另存为 命令, 因为其同时会保存窗体文件 12. 控件的属性值不可以在程序运行时动态地修改 13. 许多属性可以直接在属性表上设置 修改, 并立即在屏幕上看到效果 31 31

43 Visual Basic 6.0 程序设计基础教程 14. 保存 VB 文件时, 若一个工程包含多个窗体或模块, 则系统先保存工程文件, 再分 别保存各窗体或模块文件 15.xxx.vbp 文件是用来管理构成应用程序 xxx 的所有文件和对象的清单 16. 由 Visual Basic 语言编写的应用程序有解释和编译两种执行方式 二 选择题 1. 工程文件的扩展名为 (A).frx (B).bas (C).vbp (D).frm 2. 以下 4 个选项中, 属性窗口未包含的是 (A) 对象列表 (B) 工具箱 (C) 属性列表 (D) 信息栏 3. 相对于传统编程语言,Visual Basic 最突出的特点是 (A) 可视化编程 (B) 面向对象的程序设计 (C) 结构化程序设计 (D) 事件驱动编程机制 4. 下列不属于对象的基本特征的是 (A) 属性 (B) 方法 (C) 事件 (D) 函数 5. 双击窗体中的对象后,Visual Basic 将显示的窗口是 (A) 项目 ( 工程 ) 窗口 (B) 工具箱 (C) 代码窗口 (D) 属性窗口 6. 窗体的用户设计区是由许多点组成的网格, 可通过 菜单中的 对齐到网 格 命令调整间距 (A) 编辑 (B) 格式 (C) 窗口 (D) 工具 7.VB 中 程序运行 允许使用的快捷键是 (A)F2 (B)F5 (C)Alt+F3 (D)F8 8. 改变控件在窗体中的上下位置应修改该控件的 属性 (A)Top (B)Left (C)Width (D)Right 9. 窗体模块的扩展名为 (A).exe (B).bas (C).frx (D).frm 10. 双击窗体中的对象后,Visual Basic 将显示的窗口是 (A) 项目 ( 工程 ) 窗口 (B) 工具箱 (C) 代码窗口 (D) 属性窗口 11. 窗体的 FontName 属性的缺省值是 (A) 宋体 (B) 仿宋体 (C) 楷体 (D) 黑体 12.FontSize 属性用以设置字体大小, 窗体的 FontSize 属性缺省值为 (A)5 (B)9 (C)12 (D) 在 Visual Basic 中, 称对象的数据为 (A) 属性 (B) 方法 (C) 事件 (D) 封装 14. 下列选项中不属于事件的是 (A)Dblclick (B)Load (C)Show (D)KeyUp 32 32

44 第 1 章 Visual Basic 程序设计概述 15. 将 VB 编制的程序保存在磁盘上, 至少会产生何种文件 (A).doc 与.txt (B).com 与.exe (C).bat 与.frm (D).vbp 与.frm 三 填空题 1. 面向对象的程序设计是一种以 为基础, 由 驱动对象的编程技术 2. 对象的 3 要素是 3.VB 提供的用来完成特定操作的特殊子程序称为 4. 窗体是用来存放 的容器, 窗体的 left 和 top 属性是相对 对象的 5. 属性窗口是由 组成的 6. 事件是由 VB 预先定义的 能够识别的动作 7. 改变控件在窗体中的左右位置, 应修改该控件的 属性 ; 改变上下位置, 应修 改该控件的 属性 8. 设置对象的属性有两种办法, 一种是在设计期在 窗口中设置 ; 另一种是在运 行期设置, 设置格式为 大部分属性可以用以上两种方法进行设置, 而有 些属性只能用其中一种方法设置 9. 对窗体 Form 内各控件不能用鼠标任意精确定位是由于窗体中的 起作用 10. 新建工程时系统会自动将窗体标题设置为 11. 在打开某窗体时, 初始化该窗体中的各控件, 应选用 事件 12. 每当一个窗体成为活动窗口时触发 事件, 当另一个窗体或应用程序被激 活时在原活动窗体上产生 事件 实验 1. 编一个程序, 程序运行的初始界面如图 1-27 所示 当用户在文本框输入姓名, 例如 输入 张三, 单击 确定 按钮, 则程序的运行情况如图 1-28 所示 单击 结束 按钮, 则结束程序运行 图 1-27 程序运行后初始界面图 1-28 单击 确定 按钮后的程序界面 2. 编一个程序, 在屏幕上显示 你好,Visual Basic 系统, 字体大小设为 12 磅 颜色为红色,( 见图 1-29) 单击窗体后, 在窗体上显示 初次见面, 请多关照!, 同时窗体上出现两个命令按钮 继续 和 结束, 如图 1-30 所示 如果单击 继续 按钮, 则又回到初 33 33

45 Visual Basic 6.0 程序设计基础教程 始运行状态 ; 单击 结束 按钮, 即结束程序运行 图 1-29 程序运行后初始界面图 1-30 单击窗体后的程序界面 34 34

46 第 2 章 Visual Basic 语言基础 通过上一章的学习, 读者可以看到, 要建立一个简单的 Visual Basic 应用程序是非常容易的 但要编写稍微复杂的程 序, 就会用到各类不同类型的数据 常量 变量, 以及由这些 元素组成的各种表达式 数据类型 常量 变量及表达式是程 序设计的基础 读者学习本章后, 应该做到 : (1) 理解变量与常量的概念 掌握其定义和使用 ; (2) 掌握各种常用数据类型的数据在内存中的存放形式, 了解自定义数据类型 ; (3) 掌握各种运算符 表达式的使用方法 ; (4) 掌握常用内部函数的使用 2.1 Visual Basic 语言字符集及编码规则 Visual Basic 的字符集 Visual Basic 字符集就是指用 Visual Basic 语言编写程序时所能使用的符号的集合 若在编程时使用了超出字符集的符号, 系统就会提示错误信息, 因此首先一定要弄清楚 Visual Basic 字符集包括的内容 Visual Basic 的字符集与其他高级程序设计语言的字符集相似, 包含字母 数字和专用字符 3 类, 共 89 个字符 字母 : 大写英文字母 A~Z; 小写英文字母 a~z 数字 :0~9 35

47 Visual Basic 6.0 程序设计基础教程 专用字符 : 共 27 个, 见表 2-1 表 2-1 Visual Basic 中的专用字符 符号 说 明 符号 说 明 % 百分号 ( 整型数据类型说明符 ) = 等于号 ( 关系运算符 赋值号 ) & 和号 ( 长整型数据类型说明符 ) ( 左圆括号! 感叹号 ( 单精度数据类型说明符 ) ) 右圆括号 # 磅号 ( 双精度数据类型说明符 ) ' 单引号 $ 美元号 ( 字符串数据类型说明符 ) " 花 a 号 ( 货币数据类型说明符 ), 逗号 + 加号 ; 分号 - 减号 : 冒号 * 星号 ( 乘号 ). 实心句号 ( 小数点 ) / 斜杠 ( 除号 )? 问号 \ 反斜杠 ( 整除号 ) - 下划线 ( 续行号 ) ^ 上箭头 ( 乘方号 ) 空格符 > 大于号 <CR> 回车键 < 小于号 编码规则与约定 为了编写高质量的程序, 从一开始就必须养成一个良好的习惯, 注意培养和形成良好的程序设计风格 首先必须了解 Visual Basic 的代码编写规则并严格遵守, 否则编写出来的代码就不能被计算机正确识别, 产生编译或者运算错误 其次, 遵守一些约定, 有利于对代码的理解和维护 1. 编码规则 (1)Visual Basic 代码中不区分字母的大小写 (2) 在同一行上可以书写多条语句, 但语句间要用冒号 (:) 分隔 (3) 若一个语句行不能写下全部语句, 或在特别需要时, 可以换行 换行时需在本行后加入续行符, 即 1 个空格加下划线 ( _) (4) 一行最多允许 255 个字符 (5) 注释以 Rem 开头, 也可以使用半个单引号 ('), 注释内容可直接出现在语句的后面 (6) 在程序转向时需用到标号, 标号是以字母开始而以冒号结束的字符串 2. 约定 36 36

48 第 2 章 Visual Basic 语言基础 (1) 为了提高程序的可读性, 对于 Visual Basic 中的关键字其首字母大写, 其余字母小写 若关键字由多个英文单词组成, 则每个单词的首字母都大写, 如 StudType 等 事实上, 在 Visual Basic 的集成环境中无论写成大写或小写, 系统都会按上述约定自动地进行书写的转换 但要注意, 对于用户自定义的变量 过程名,Visual Basic 以第一次定义的为准, 以后输入的自动向首次定义的转换 (2) 注释有利于程序的维护和调试, 因此要养成写注释的习惯 在 Visual Basic 6.0 中, 有专门的设置 / 取消块注释的功能, 使得将若干行语句或文字设置为注释或取消注释十分方便 设置注释块操作 : 选中要加注释块的语句行, 单击编辑工具栏的 设置注释块 按钮 若编辑工具栏没有在窗口上显示, 则可选择 视图 菜单的 工具栏 子菜单, 单击 编辑 命令将编辑工具栏打开 取消注释块操作与上类似, 就不再赘述 (3) 通常不使用行号 Visual Basic 源程序也可以像高级 BASIC 那样使用行号, 但这不是必须的, 通常不使用 (4) 对象名命名约定 : 每个对象的名字由 3 个小写字母组成的前缀 ( 指明对象的类型 ) 和表示该对象作用的缩写字母组成 前缀一般由对象类名的前 3 个字母组成, 但也有例外, 如命令按钮 ComandButton 的前缀为 cmd 标签 Lable 的前缀为 lbl 窗体 Form 的前缀为 frm 缩写字母部分一般由用户自己定义, 如 cmdexit 表示一个退出命令按钮,cmdEnter 表示一个确认按钮等 2.2 数据类型 数据可分为常量和变量, 数据还有类型之分, 比如整型数 实型数 字符串 日期型数据等 不同类型的数据取值的范围 所适应的运算不同, 在内存中所分配的存储单元数目也不同, 因此正确地区分和使用不同的数据类型, 可使程序运行时占用较少的内存, 确保程序运行的正确性和可靠性 Visual Basic 的标准数据类型 标准数据类型是 Visual Basic 系统定义的数据类型, 用户可以直接使用它们来定义常量和 变量,Visual Basic 中的标准数据类型见表 2-2 表 2-2 Visual Basic 的标准数据类型 数据类型 关键字 类型符 占字节数 前缀 大小范围 字节 Byte 无 1 bty 0~255 逻辑类型 Boolean 无 2 bln True 或 False(-1 或 0) 整型 Integer % 2 int ~ 长整型 Long & 4 lng ~ 单精度实数 Single! 4 sng E38~ E

49 Visual Basic 6.0 程序设计基础教程 双精度实数 Double # 8 dbl E308 ~ E308 续表 数据类型关键字类型符占字节数前缀大小范围 字符型 String $ 与串长有关 str 0~65535 个字符 货币 8 cur ~ 日期类型 Date 无 8 dtm 1/1/100~12/31/9999 对象类型 Object 无 4 obj 任何对象 通用类型 ( 变体类型 ) Variant 无 根据实际 情况分配 vnt 上述有效范围之一 对于 Visual Basic 中的数据 ( 变量或常量 ), 首先应明确以下几点 (1) 数据为何种类型 (2) 此类数据在内存中的存储形式 占用的字节数 (3) 数据的取值范围 (4) 数据能参与的运算 (5) 数据的有效范围 ( 是全局 局部, 还是模块级数据 ) 生成周期( 是动态还是静态变量 ) 等 例如, 对于一个整型 (Integer 类型 )x, 它在内存中占用两个字节 以定点数据形式来储存, 数据的取值范围是 ~ 若在程序中, 某个计算值可能大于 , 就不能用整型变量来存储, 应考虑使用长整型或实型数据来表示 如果数据是有小数点的实数, 就应使用实型数据来表示 用户自定义类型 如用户还需增加新的数据类型, 可用 Visual Basic 的标准类型的数据组合成一个新的数据类型, 例如一个学生的 学号 姓名 性别 年龄 入学成绩 等数据, 为了处理数据的方便, 常常需要把这些数据定义成一个新的数据类型 ( 如 Student 类型 ), 这种结构称为 记录 Visual Basic 提供了 Type 语句让用户自己定义数据类型, 形式如下 : Type 数据类型名元素名 1 As 类型元素名 2 As 类型. 元素名 n-1 As 类型元素名 n As 类型 End Type 例 :Type Student Xh As String Xm As String Xb As String Nl As Integer Score As Single End Type 38 38

50 第 2 章 Visual Basic 语言基础 有关用户自定义数据类型的使用, 可参阅第 7 章的例 常量和变量 常量 在程序运行过程中, 其值不能被改变的量称为常量 在 Visual Basic 中有 3 类常量 : 普通常量 符号常量和系统常量 普通常量一般可从 字面上区分其数据类型 ; 符号常量就是用一个字符串 ( 称之为符号或常量名 ) 代替程序中 的某一个常数 ; 系统常量是 Visual Basic 系统定义的常量, 它存于 Visual Basic 系统的对 象库中 1. 普通常量 普通常量也称直接常量, 可从字面形式上判断其类型, 如 等为整型常量, 等为实型常量, a abc OK 等为字符串常量,#1/10/2002# 为日期常量 (1) 整型常量 通常所说的整型常量指的是十进制整数, 但 Visual Basic 中还可以使用八进制和十六进制 形式的整型常量, 因此整型常量有如下 3 种形式 1 十进制整数 如 八进制整数 以 & 或 &O( 字母 O) 开头的整数是八进制整数, 如 &O25 表示八进制整 数 25, 即 (25) 8, 等于十进制数 21 3 十六进制 以 &H 开头的整数是十六进制整数, 如 &H25 表示十六进制整数 25, 即 (25) 16, 等于十进制数 37 Visual Basic 中的颜色数据常用十六进制整数表示 说明 : 上面整数表示的是整型 (Integer), 若要表示长整型 (Long) 整数, 则在数的最后 加表示长整型的类型符号 & 例如 :125& &O125& &H125& 分别是十进制 八进制和 十六进制长整型常数 125 (125) 8 (125) 16 请注意 25 和 25& 的区别 (2) 实型常量 Visual Basic 实数有 Single( 单精度 ) Double( 双精度 ) 两种, 它们在计算机内存中是以 浮点数形式存放的, 故又称浮点实数 实型常量有两种表示形式 : 1 十进制小数形式 它是由正负号 (+ ) 数字 ( 0~9) 和小数点 (.) 或类型符号 (! #) 组成的, 如 ±n.n,±n! 或 ±n#, 其中 n 是 0~9 的数字 例如 ! 123# 等都是十进制小数形式 2 指数形式 ±ne±m 或 ±n.ne±m,±nd±m 或 ±n.nd±m 例如 :1.25E+3 和 1.25D+3 相当于 或者 说明 : 当幂为正数时, 正号可以省略 即 1.25E+3 等价于 1.25E3,1.25D+3 等价于 1.25D

51 Visual Basic 6.0 程序设计基础教程 同一个实数可以有多种表示形式, 例如 : 可以表示为 1.25E E E+2 125E+1 或 E+5 一般将 称为 规范化的指数形式 Visual Basic 系统默认情况的直接实型常数都是双精度类型, 即 与 123# 是等价的常数 除非在其尾部加类型符号! 才表示单精度常量 (3) 字符串常量在 Visual Basic 中字符串常量是用双引号 " 括起的一串字符, 例如 "ABC" "abcdefg" "123" "0" "VB 程序设计 " 等 说明 : 字符串中的字符可以是西文字符 汉字 标点符号等 "" 表示空字符串, 而 " " 表示有一个空格的字符串 若字符串中有双引号, 例如 ABD"XYZ, 则用连续两个双引号表示, 例如 : "ABD""XYZ" (4) 逻辑常量逻辑常量只有两个值 True 和 False 将逻辑数据转换成整型时 True 为 1,False 为 0, 其他数据转换成逻辑数据时非 0 为 True,0 为 False (5) 日期常量日期 (Date) 型数据按 8 字节的浮点数来存储, 表示日期范围从公元 100 年 1 月 1 日到 9999 年 12 月 31 日, 而时间范围从 0:00:00 到 23:59:59 一种在字面上可被认作日期和时间的字符, 只要用号码符 # 括起来, 都可以作为日期型数值常量 例如 :#05/01/2005# #January 4,1989# # :30:00 PM# 都是合法的日期型常量 说明 : 当以数值表示日期数据时, 整数部分代表日期, 而小数部分代表时间 例如 1 表示 1899 年 12 月 31 日, 大于 1 的整数表示该日期以后的日期, 小于 0 的整数表示该日期以前的日期 2. 符号常量在程序中, 某个常量多次被使用, 则可以使用一个符号来代替该常量 例如数学运算中的圆周率常数 ( ), 如果使用一个符号 PI 来示, 在程序中使用到该常量时, 就不必每次输入 , 而可以用 PI 来代替它, 这样不仅在书写上方便, 而且有效地增强了程序的可读性和可维护性 Visual Basic 中使用关键字 Const 声明符号常量 其格式如下 : Const 常量名 [As 类型 类型符号 ]= 常数表达式例如 : Const PI#= ' 声明 PI 为双精度符号常量, 值为 等价于 : Const PI As Double= 说明 : 常量名 : 常量名的命名规则与变量的命名相同 ( 见 节 ) 为便于与一般变量区别, 符号常量名常常采用大写字母 40 40

52 第 2 章 Visual Basic 语言基础 As 类型 类型符号 : 说明该符号常量的数据类型, 若省略该项, 则数据类型由右边常数表达式值的数据类型决定 常数表达式 : 可以是直接常量 在此前已声明了的符号常量和系统常量, 或由这些常量与运算符组成的表达式, 在其中不能有函数调用和变量 例如 : Const PI= Const PI2=2*PI ' 声明 PI2 符号常量, 值为 2* 另外, 在标准模块中可在 Const 前面加 Public Private 关键字, 表示符号常量的作用范围, 即作用域, 缺省情况为 Private( 关于作用域问题将在第 5 章中讨论 ) 3. 系统常量 Visual Basic 系统提供了应用程序和控件的系统定义常数 它们存放于系统的对象库中, 在 对象浏览器 中的 Visual Basic(VB) 和 Visual Basic for Applications(VBA) 对象库中列举了 Visual Basic 的常数, 其他提供对象库的应用程序, 如 Microsoft Excel 和 Microsoft Project, 也提供了常数列表, 这些常数可与应用程序的对象 方法和属性一起使用 另外在每个 ActiveX 控件的对象库中也定义了常数 Visual Basic(VB) 和 Visual Basic for Applications(VBA) 对象库中的常量名的前缀是小写字母 vb 在程序中, 使用系统常量, 可使程序变得易阅读和编写 同时,Visual Basic 系统常量的值在 Visual Basic 更高的版本中可能要改变, 系统常量的使用也可使程序保持兼容性 例如, 窗口状态 WindowsState 属性可取 三个值, 对应 3 种不同状态 ( 参见表 1-1 所示 ) 在程序中使用语句 Myform.WindowsState=vbMaxmized, 将窗口极大化, 显然要比使用语句 Myform.WindowsState=2 易于阅读和理解 变量 在程序运行过程中, 其值可以改变的量称为变量 一个变量必须有一个名字和相应的数据类型, 通过名字来引用一个变量, 而数据类型则决定了该变量的存储方式和在内存中占据存储单元的大小 变量名实际上是一个符号地址, 程序编译连接时, 由系统给每一个变量分配一个内存地址, 在该地址的存储单元中存放变量的值 请读者注意变量名和变量值这两个概念的区别, 如图 2-1 所示 在程序中从变量中取值, 实际上是通过变量名找到相应的内存地址, 从其存储单元中取数据 在 Visual Basic 中, 变量有两种形式, 即对象的属性变量和内存变量 属性变量 在一个对象创建时,Visual Basic 系统会自动为它创建一组变量, 即属性变量, 并为每一个属性变量设置其默认值 这类变量可供程序员直接使用, 如引用其值或赋予图 2-1 变量名与变量值新值 41 41

53 Visual Basic 6.0 程序设计基础教程 内存变量, 也就是我们通常所讲的变量 它是用户根据需要所声明的 1. 变量的命名规则在 Visual Basic 6.0 中, 给对象 变量或符号常量命名的规则如下 (1) 必须是以字母或汉字开头, 由字母 汉字 数字和下划线组成的字符串 (2) 变量名最长为 255 个字符 (3) 大小写字母同等对待, 不能使用 Visual Basic 系统保留字 ( 语句 函数名 系统常量名 ) (4) 字符之间必须并排书写, 不能出现上下标 注 : 虽然 VB 中可以使用汉字给变量 对象和符号常量命名, 但为了书写方便, 建议一般不要使用汉字 例如, 以下是合法的变量名 : A, x, x3, BOOK_1, sum5, Do2 以下是非法的变量名 : 3st ( 不能以数字开头 ),s*t ( 出现非法字符 *) wa xy ( 变量名中不能含空格字符 ),If ( 不能用系统语句作变量名 ) Exp ( 不能用系统函数名作变量名 ),VbCrlf ( 不能用系统常量名作变量名 ) ( 不能使用希腊字母 ) 说明 : 变量名虽然可由程序员随意定义, 但在程序中使用的每个变量一般用来存放有具体含义的数据 因此, 命名应尽量有相应的意义, 以便阅读理解, 做到 顾名思义 例如 : 可用 sum 表示求和的量,name 表示姓名等 2. 变量的声明在大多数的编程语言中, 要求变量 先声明, 后使用 声明变量就是声明变量名和变量类型, 以决定系统为它分配存储单元 在 Visual Basic 6.0 中可以不事先声明变量, 而直接引用 因此 Visual Basic 中声明变量分为显示声明和隐式声明两种 (1) 显式声明 程序中使用 Dim 语句声明的变量, 就是显式声明 Dim 语句的使用形式如下 Dim < 变量名 1> [As < 类型 >] [,< 变量名 2> [As < 类型 >]], Dim < 变量名 1>[< 类型符 >][,< 变量名 2>[< 类型符 >]], 例如 : Dim a As single, b As Double Dim YourName As String, Age As Integer Dim YesNo As Boolean 说明如下 1 < 类型 >: 为表 2-2 中所列的关键字, 如 :Integer String Double Long 等 2 < 类型符 >: 为表 2-2 中所列的类型符, 如 % $ # & 等 3 上面两种形式完全等价, 但当要声明没有类型符的数据类型 ( 如日期类型 ) 时, 只能 42 42

54 第 2 章 Visual Basic 语言基础 使用第一种形式来声明 例 :Dim x As Integer, y As Single ' 声明 x 为整型变量,y 为单精度变量此语句等价于 :Dim x%,y! 4 声明时, 如果不提供数据类型, 则指定变量为默认类型 (Variant 类型 ) 例如 : Dim Test, Amount, J As Integer 在上例中,J 为整型, 变量 Test 和 Amount 没有声明其数据类型, 所为它们属于 Variant 数据类型 5 对于字符串类型, 根据其存放的字符串长度是否固定, 其定义方法有两种 Dim 字符串变量名 As String Dim 字符串变量名 As String* 字符个数例如 : Dim strs1 As String ' 声明可变长字符串变量 Dim strs2 As String*80 ' 声明可存放 80 个字符的定长字符串变量在 Visual Basic 中的可变长字符串变量, 其长度由存入字符串的实际长度而确定, 最多可存放 2M 个字符 ; 对于定长字符串变量, 若赋予的字符少于其指定长度, 则尾部用空格字符补足, 若赋予的字符超过指定长度, 系统将会多余部分截去 使用声明语句说明一个变量后,Visual Basic 自动将数值类型的变量赋初值 0, 将字符或 Variant 类型的变量赋空串, 将布尔型的变量赋 False, 将日期型变量赋 :00:00 除了使用 Dim 语句声明变量外, 还可以用 Static Public Private 等关键字声明变量, 它们所声明的变量的作用域和生成期是不相同的, 这将在第 5 章中讨论 (2) 隐式声明 Visual Basic 允许用户在编写应用程序时, 不声明变量而直接使用, 系统临时为新变量分配存储空间并使用, 这就是隐式声明 所有隐式声明的变量都是 Variant 数据类型 Visual Basic 根据程序中赋予变量的值来自动调整变量的类型 例如 : 下面是一个很简单的程序, 其使用的变量 a b Sum 都没有事先定义 Private Sub Form_Click() Sum = 0 a = 10: b = 20 Sum = a + b Print "Sum="; Sum (3) 强制显式声明 Option Explicit 语句 虽然 Visual Basic 允许用户不声明变量而直接使用, 给初学者带来了方便, 但是正因这一点方便, 可能给程序带来不易发现的错误, 同时降低程序的执行效率 例如上面的例子中多次使用变量 Sum, 若用户在输入时将语句 Sum=a+b 误输入为 Sun=a+b, 则系统将 Sun 当成新的变量处理, 使程序运行输出结果不正确 一般地说, 良好的编程习惯都应该是 先声明变量, 后使用变量, 这样做可以提高程序的效率, 同时也使程序易于调试 Visual Basic 中可以强制显式声明, 在窗体模块 标准模块和类模块的通用声明段中加入语句 :Option Explicit 43 43

55 Visual Basic 6.0 程序设计基础教程用户可在 工具 菜单中选取 选项 命令, 然后在打开的对话框中单击 编辑器 选项卡, 再复选 要求变量声明 选项, 这样就可以在新模块中自动插入 Option Explicit 语句 当在插入了 Option Explicit 的模块中编写代码时, 凡是发现程序中使用未经显式声明的变量名,Visual Basic 会自动发出错误警告 这就有效地保证了变量名使用的正确性 2.4 运算符和表达式 在 Visual Basic 中有 4 种运算符 : 算术运算符 连接运算符 关系运算符 逻辑运算符 由运算符 圆括号 常量 变量 函数组成的有意义的式子称为 Visual Basic 表达式 根据表达式计算结果, 把 Visual Basic 表达式分为算术表达式 字符串表达式 关系表达式和逻辑表达式 算术运算符与算术表达式 1. 算术运算符算术运算符要求参与运算量是数值型, 运算的结果也是数值型, 除 取负号运算是单目运算符 ( 要求一个运算量 ), 其余都是双目运算符 ( 要求两个运算量 ) 各算术运算符的运算规则及优先级见表 2-3 表 2-3 算术运算传授运算规则及优先级 运算符含义运算优先级实例结果 ^ 幂方 1 5^ 负号 * 乘 5* / 除 5/2 2.5 \ 整除 4 5\2 2 Mod 求余 5 5 mod 加 减 说明 : (1) 在算术运算中, 如果操作数具有不同的数据精度, 则 Visual Basic 规定运算结果的数据类型以精度高的数据类型为准, 但也有几种特殊情况 1 当 Long 型数据与 Single 型数据运算时, 结果为 Double 型数据 2 除法和乘方运算的结果都是 Double 类型 3 整除 (\) 运算时, 若运算量为实数, 则先取整, 后相除, 结果为整数或长整数 (2) 在求余 (Mod) 运算时, 如果运算量不是整数, 则先将运算量四舍五入为整数, 然后再做求余运算, 求余结果的正负号始终与第一个运算量的符号相同 2. 算术表达式 44 44

56 第 2 章 Visual Basic 语言基础 由算术运算符 括弧 内部函数及数据组成的式子称为算术表达式 Visual Basic 表达式的书写原则如下 (1) 表达式中的所有运算符和操作数必须并排书写 不能出现上下标 ( 如 X 2 X 2 等 ) 和数学中的分数线 ( 如 x/y 1/3 等 ) (2) 数学表达式中省略乘号的地方, 在 Visual Basic 表达式中不能省 ( 如 2ab xy 等 ) (3) 要注意各种运算符的优先级别, 为保持运算顺序, 在写 Visual Basic 表达式时需要适当添加括号 ( ), 若要用到库函数, 必须按库函数要求书写 如 : b b 2 4ac 2a 对应于 (b-sqr(b*b-4*a*c))/(2*a) a b a b 对应于 (a+b)/(a-b) (2 r+e -5 )ln x 对应于 (2* *r+exp(-5))*log(x) 字符串运算符与字符串表达式 字符串运算符有 + 和 &, 它们都可将两个字符串连接在一起 由字符串运算符与 运算量构成的表达式称为字符串表达式 例如 : "ABCD" + "EFGHI" ' 结果为 ABCDEFGHI " Visual Basic " & " 程序设计教程 " ' 结果为 Visual Basic 程序设计教程 说明 : + 运算符与 & 运算符的区别如下 +( 连接运算 ): 两个操作数均应为字符串类型 ; 若其中一个为数字字符型 ( 100, 59 等 ), 另一个为数值型, 则自动将数字字符转换为数值型, 然后进行算术加法运算 ; 若其中一 个为非数字字符型 ( Abc, 2PX 等 ), 另一个为数值型, 则出错 &( 连接运算 ): 两个操作数既可为字符型也可为数值型, 当是数值型时, 系统自动先将 其转换为数字字符, 然后进行连接操作 当连接符两旁的操作量都为字符串时, 上述两个连接符等价 例如 : "100" ' 结果为 223 "100" + "123" ' 结果为 "Abc" ' 出错 "100" & 123 ' 结果为 & 123 ' 结果为 " Abc" & "123" ' 结果为 Abc123 " Abc" & 123 ' 结果为 Abc123 注意 : 使用运算符 & 时, 变量与运算符 & 之间应加一个空格 这是因为 45 45

57 Visual Basic 6.0 程序设计基础教程 符号 & 还是长整型的类型定义符, 如果变量与符号 & 接在一起,Visual Basic 系统先把它作为类型定义符处理, 因而就会出现语法错误 关系运算符与关系表达式 关系运算符都是双目运算, 用来比较两个运算量之间的关系, 由关系运算符与运算量组成的有意义的式子称为关系表达式, 它用来比较两个运算对象之间的关系, 关系表达式的运算结果为逻辑量 若关系成立, 结果为 True; 若关系不成立, 结果为 False Visual Basic 中的关系运算符见表 2-4 表 2-4 Visual Basic 关系运算符 运算符 含 义 优先级 实 例 结 果 < 小于 所有关系运算优 15+10<20 False <= 小于或等于 先级相同 低于算 10<=20 True > 大于 术运算的加 +, 10>20 False >= 大于或等于 减 - 运算, 高 "This">= "That" True = 等于 于逻辑非 Not "This"= "That" False <> 不等于 运算 "This"<> "That" True 关系运算的规则如下 (1) 当两个操作式均为数值型时, 按数值大小比较 (2) 当两个操作数都为字符型时, 按字符的 ASCII 码值从左到右一一比较, 即首先比 较两个字符串的第一个字符, 其 ASCII 码值大的字符串大, 如果第一个字符相同, 则比较第 二个字符, 依此类推, 直到出现不同的字符为止 例如 :"These" > "That" 等价于 "e" > "a" 的比较 结果是 True (3) 日期数据可比较日期的早晚, 晚日期大于早日期 (4) 数值型与可转换为数值型的数据比较, 如 :29>"189", 按数值比较, 结果为 False (5) 数值型与不能转换成数值型的字符型比较, 如 :77>" sdcd", 不能比较, 系统出错 逻辑运算符与逻辑表达式 逻辑运算符有 Not( 逻辑非, 单目运算符 ) And( 逻辑与 ) Or( 逻辑或 ) Xor( 逻辑异或 ) Eqv( 逻辑等于 ) Imp( 逻辑蕴含 ) 其运算规则见表 2-5 逻辑表达式由逻辑运算符 关系表达式 逻辑常量 变量和函数组成, 运算结果为逻辑值 表 2-5 逻辑运算符的运算规则 运算符功能优先级举例 Not 操作数为 True 时, 结果为 False; 操作数 1 Not (5>3) 为 False 46 46

58 第 2 章 Visual Basic 语言基础 为 False, 结果为 True Not (5<3) 为 True And 两操作数都为 True 时, 结果为 True; 否 则为 False 2 (5>3) And (5>=3) 为 True (5>3) And (5<3) 为 False 续表 运算符功能优先级举例 Or Xor 当两操作数都为 Flase, 结果为 Flase; 其他情况则为 True 两操作数的布尔值不相同时, 结果为 True; 否则为 False 3 (5>3) Or (5<3) 为 True (5<3) Or (5<=3) 为 False (5>3) Xor (5<3) 为 True (5>3) Xor (5>=3) 为 False Eqv 两操作数布尔值相同时, 结果为 True; 否则为 False 4 (5>3) Eqv (5>=3) 为 True (5<3) Eqv (5<=3) 为 True Imp 左边为 True, 右边为 False 时, 结果为 False; 其余为 True 5 (5>3) Imp (5<3) 为 False (5>3) Imp (5>=3) 为 True 说明 : (1) 逻辑运算符的优先级不相同,Not( 逻辑非 ) 最高, 但它低于关系运算,Imp( 逻辑蕴含 ) 最低 (2)Visual Basic 中常用的逻辑运算符是 Not And 和 Or 它们用于将多个关系表达式进行逻辑判断 例如, 数学上表示某个数在某个区域时用表达式 10 X<20, 在 Visual Basic 程序中应写成 : X>=10 And X<20 下面两种都是错误的 Visual Basic 表达式 :10<=x<20 或 10<=x Or x<20 又若想在程序中判断输入给变量 X$ 的数据是不是数字字符, 则要用到如下的逻辑表达式 :X$>=''0'' AND X$<=''9'' 关系表达式与逻辑表达式常常用在条件语句与循环语句中, 作为条件控制程序的流程走向 日期型表达式 日期型数据是一种特殊的数值型数据, 它们之间只能进行加 (+) 减 ( -) 运算 日期型表达式由算术运算符 + 算术表达式 日期型常量 日期型变量和函数组成 只能有下面 3 种情况 (1) 两个日期型数据可以相减 :DateB DateA 结果是一个数值型整数 ( 两个日期相差的天数 ) 例如 :#05/08/2005# - #05/01/2005# 其结果为数值型数据 :7 (2) 一个日期型数据 (DateA) 与一数值数据 (N) 可作加法运算 :DateA+N 其结果仍是一个日期型数据 47 47

59 Visual Basic 6.0 程序设计基础教程例如 :#05/01/2005# +7 其结果为日期型数据 :#05/08/2005# (3) 一个日期型数据 (DateA) 与一数值数据 (N) 可作减法运算 : DateA-N 其结果仍是一个日期型数据 例如 :#05/08/2005# - 7 其结果为日期型数据 :#05/01/2005# 运算符的执行顺序 当一个表达式中出现多种运算符时, 即同时出现算术 关系和逻辑运算时, 如何决定运算的次序呢? 在不同的计算机语言系统中有不同的规定 在 Visual Basic 系统中运算次序是由运算符的优先级决定的, 优先级高的运算符先运算 运算符的优先级相同时, 从左向右进行运算 各运算符优先级如下 算术运算符 > 字符串连接运算符 > 关系运算符 > 逻辑运算 Visual Basic 中各类运算符的优先顺序见表 2-6 表 2-6 运算符的优先顺序 优先顺序运算符类型运算符 1 ^ 指数运算 2 - 取负数 3 * / 乘法和除法 算术运算符 4 \ 整数运算 5 Mod 求模 ( 余 ) 运算 6 + 加法和减法 7 字符串运算符 + & 字符串连接 8 关系运算符 = < > > >= < <= 9 Not 10 And 11 逻辑运算 Or Xor 12 Eqv 13 Imp 说明 : 1. 当一个表达式中出现多种运算符时, 首先进行算术运算符, 接着处理字符串连接运算 符, 然后处理比较运算符, 最后处理逻辑运算符, 在各类运算中再按照相应的优先次序进行 2. 可以用括号改变优先顺序, 强令表达式的某些部分优先运行 括号内的运算总是优先 于括号外的运算 对于多重括号, 总是由内到外 48 48

60 第 2 章 Visual Basic 语言基础 例如 : 用一个逻辑表达式表示满足闰年的条件 闰年的条件是 :1 能被 4 整除, 但不能被 100 整除的年份都是闰年 ;2 能被 400 整除的年份是闰年 用 Rh 表示一个年份, 则有如下的判断条件 : Rh Mod 4=0 And Rh Mod l00<>0 Or Rh Mod 400=0 现在用上式判断 2000 年是否闰年? 令 Rh=2000: 首先计算 2000 Mod 4,2000 Mod l00 和 2000 Mod 400, 然后计算 (2000 Mod 4)=0 (2000 Mod l00)<>0 (2000 Mod 400)=0 三个表达式, 最后计算 And 和 Or, 因为 And 比 Or 的优先级高, 所以先进行 And 计算 最后可得到计算结果为 True, 即 2000 年是闰年 在实际编程中, 为了清晰起见可为表达式加上括号, 如 : ((Rh Mod 4=0) And (Rh Mod l00<>0)) Or (Rh Mod 400=0) 2.5 常用内部函数 Visual Basic 中函数的概念与一般数学中函数的概念没有什么根本区别 在 Visual Basic 中, 有内部函数和用户定义函数两类 用户定义函数是用户自己根据需要定义的函数 ( 参见第 5 章 ) 内部函数也称标准函数 ( 有时也称库函数 ), 它们是 Visual Basic 系统为实现一些特定功能而设置的内部程序 本节介绍常用的数学函数 转换函数 字符串函数 日期时间函数等, 其他函数请参见附录 2 在程序中要使用 个函数时, 只要给出函数名并给出它要求的参数, 就能得到它的函数值 函数的使用方法如下 : 函数名 ( 参数列表 ) ' 有参函数函数名 ' 无参函数说明如下 (1) 使用库函数要注意参数的个数及参数的数据类型 (2)Visual Basic 中函数的调用只能出现在表达式中, 目的是使用函数求得一值 (3) 要注意函数的定义域 ( 自变量或参数的取值范围 ) 例如 :sqr(x) 要求:x>=0 (4) 要注意函数的值域 例如 :exp(23773) 的值超出了实数在计算机中的表示范围, 即数据溢出 1. 数学函数下列函数的参数均为数值类型 (1) 三角函数 :Sin(x) Cos(x) Tan(x), 反正切函数 Atan(x) 函数 Sin Cos Tan 的自变量必须是弧度, 如数学式 Sin30, 写作 VB 的表达式为 Sin(30*3.1416/180); Visual Basic 没有余切函数, 求 x 弧度的余切值可以表示为 1/Tan(x); (2)Abs(x): 返回 x 的绝对值 (3)Exp(x): 返回 e 的指定次幂, 即 e x 49 49

61 Visual Basic 6.0 程序设计基础教程 (4)Log(x): 返回 x 的自然对数 (5) 符号函数 Sgn(x), 根据 x 值的符号返回一个整数 (-1 0 或 1) 1 x > 0 Sgn(x)= 0 x = 0-1 x < 0 (6)Sqr(x): 返回 x 的平方根, 如 Sqr(25) 的值为 5,Sqr(2) 的值为 此函数要求 x>0, 如果 x<0 则出错 2. 转换函数 (1) 取整函数 Int(x) 和 Fix(x) Fix(x) 为截断取整, 即去掉小数后的数,Int(x) 取不大于 x 的最大整数 x>0 时两者功能相同, 当 x<0 时,Int(x) 与 Fix(x)-1 相等 例如 : Fix(9.59) 结果是 9, Int(9.59) 结果是 9 Fix(-9.59) 结果是 -9, Int(-9.59) 结果是 -10 如果要对 x(x>0) 实现四舍五入取整, 则可使用表达式 Int(x+0.5) 或 Fix(x+0.5) (2)Chr 和 Asc 函数 Chr 是将 ASCII 码值转换成字符,Asc 函数是字符转换成 ASCII 码值 它们为一对互反函数 例如 :Chr(65) 结果得到字符 A,Asc("A") 结果为 65 但要注意, 如果 Asc 函数中的自变量是含有多个字符的字符串, 则只取首字母的 ASCII 值作为函数的返回值 例如 :Acs("Abcd123") 和 Acs("Axy") 的值都为 65, 即是首字母 A 的 ASCII 值 另外可以使用 Chr 函数得到那些非显示的控制字符 (ASCII 值 <32, 见附录一 ) 的字符 例如 : Chr(13) 回车符, Chr(13)+Chr(10) 回车换行符 Chr(7) 响铃 Beep, Chr(8) 退格符 (3)Val(x) 函数与 Str(x) 函数 Val(x) 将数字字符串 x 转换为相应的数值, 当自变量字符中出现数值规定字符以外的字符时, 则只将最前面的符合数值型规定的字符转换成对应的数值 例如 : Val("1.2sa10") 值为 1.2, Val("abc123 ) 值为 :0 Val("-1.2E3Eg") 值为 :-1200, 注意这里的第一个 E 是作指数符号 Str(x) 返回把数值型数据 x 转换为字符型后的字符串, 字符串的第一个位一定是空格 ( 自变量为正数 ) 或是负号 ( 自变量为负数 ), 小数点最后的 0 将被去掉 例如 : Str(256) 值为 " 256" Str( ) 值为 " " 3. 字符串函数 (1) 删除空格函数 Ltrim(x): 返回删除字符串 x 前导空格符后的字符串 50 50

62 第 2 章 Visual Basic 语言基础 Rtrim(x): 返回删除字符串 x 尾部空格符后的字符串 Trim(x): 返回删除前导和尾部空格符后的字符串 (2) 取子串函数 Left(x,n): 返回字符串 x 前 n 个字符所组成的字符串 Right(x,n): 返回字符串 x 后 n 个字符所组成的字符串 Mid(x,m,n): 返回字符串 x 从第 m 个字符起的 n 个字符所组成的字符串 若 s$ = "abcdefg", 则函数 Left(s$,2) 返回 ab, 函数 Right(s$,2) 返回 fg, 函数 Mid(s$,9,3) 返回空字符串,Mid(s$,2,3) 返回 bcd (3)Len(x): 返回字符串 x 的长度, 如果 x 不是字符串, 则返回 x 所占存储空间的字节数 如函数 Len("abcdefg") 的返回值为 7, 而函数 Len(k%) 的返回值为 2, 因为 VB 用 2 个字节存储 Integer 类型的数据 (4)Lcase(x) 和 Ucase(x): 分别返回以小写字母 大写字母组成的字符串 如 Lcase("abCDe") 返回 "abcde",ucase("abcde") 返回 "ABCDE" (5)Space(n): 返回由 n 个空格字符组成的字符串 如执行语句 a$ = "abc" + Space(5) + "def" 后, 变量 a$ 中的字符串为 abcdef 其中包括 5 个空格字符 (6)Instr(x,y): 字符串查找函数, 返回字符串 y 在字符串 x 中首次出现的位置 如果 y 不是 x 的子串, 即 y 没有出现在 x 中, 则返回值为 0 如 :a$ = "abcdtycdef", 则函数 Instr(a$,"cd") 的计算结果为 3, 因为 a$ 中包含了 cd 第一次出现的位置是在 a$ 中的第 3 个字符 ; 而函数 Instr(a$,"yx") 的返回值为 0, 因为字符串 a$ 中不存在子串 yx 4. 日期和时间函数 (1)Date: 返回系统当前日期 (2)Time: 返回系统当前时间 (3)Minute(Now) Minute(Time): 返回系统当前时间 hh:mm:ss 中的 mm( 分 ) 值 (4)Second(Now) Second(Time): 返回系统当前时间 hh:mm:ss 中的 ss( 秒 ) 值 5. 随机函数与 Randomize 语句 (1) 随机函数 Rnd([N]) Rnd 函数可以不要参数, 其括号也省略 返回 [0 ~ 1]( 即包括 0, 但不包括 1) 之间的双精度随机数 若要产生 1~100 的随机整数, 则可通过下面的表达式来实现 : Int(Rnd *100)+1 ' 包括 1 和 100 Int(Rnd *99)+1 ' 包括 1, 但不包括 100 产生 [N,M] 区间的随机数的 Visual Basic 表达式 :Int(Rnd *(M-N+1))+N (2)Randomize 语句该语句的作用是初始化 VB 的随机函数发生器 ( 为其赋初值 ), 可使 Rnd 产生相同序列的随机数 51 51

63 Visual Basic 6.0 程序设计基础教程 Randomize 语句使用形式 :Randomize [Seed] 其中 :Seed 是随机数生成器的种子值, 若省略, 系统将计时器返回的值作为新的种子值 例如 : 下段程序每次运行, 将产生不同序列的 20 个 [10,99] 之间的随机整数 Randomize For i=1 To 20 Next i Print Int(Rnd * 90) + 10; Print 读者可将上段程序, 写入窗体的单击事件中, 运行 2 次程序, 看看 2 次的输出结果是否 相同 如果不使用 Randomize 语句, 再运行 2 次, 看看 2 次的输出结果是否相同 分析理解 Randomize 语句的作用 本章小结 数据类型 常量 变量 运算符和表达式是计算机程序设计语言的基础 Visual Basic 的数据类型分为标准类型和自定义类型两大类 如图 2-2 所示 图 2-2 Visual Basic 的数据类型 在编写程序时, 常常需要用到不同的数据, 数据有类型之分, 不同类型的数据在计算机中的存放形式不同, 使用的内存空间不同, 参与的运算也不同, 这一点对初学者很难理解, 写程序时常常将数据类型用错 例如, 要计算 S=1+1/2+1/3+1/4+.1/100 如果将 S 定义为整型数据, 就不能得到正确的结果 Visual Basic 有 4 种运算符 : 算术运算符 连接运算符 关系运算符 逻辑运算符 由运算符 括弧 内部函数及数据组成的式子称为表达式 Visual Basic 表达式的书写原则如下 (1) 表达式中的所有运算符和操作数必须并排书写 (2) 数学表达式中省略乘号的地方, 在 Visual Basic 表达式中不能省 (3) 要注意各种运算符的优先级别, 为保持运算顺序, 在写 Visual Basic 表达式时需要 52 52

64 第 2 章 Visual Basic 语言基础 适当添加括号 (), 若要用到库函数, 必须按库函数要求书写 Visual Basic 提供了上百种内部函数也称库函数, 用户需要掌握一些常用函数的功能及使 用方法 Visual Basic 函数的调用只能出现在表达式中, 目的是使用函数求得一个值 习题 一 思考题 1.Visual Basic 定义了哪几种数据类型? 变量有哪几种数据类型? 常量有哪几种数据类 型? 2. 如果希望使用变量 X 来存放数据 , 应该将变量 X 声明为何种类型? 3. 下列哪些字符串不能作为 Visual Basic 中的变量名? xyc@abc, E12, 15eyd, cmd, x23, Is, #END, X8[P] 4. 下列数据哪些是变量? 哪些是常量? 如果是常量, 是什么类型的常量? (1) name (2) ''name'' (3) False (4) x (5) ''10/28/2004'' (6) xh (7) ''120'' (8) n (9) #6/04/2005# (10) 把 Visual Basic 算术表达式 a / (b+c / (d+e / Sqr (f ))) 写成数学表达式 6. 写出下列表达式的值 (1) (2+8*3)/2 (2) 3^2+8 (3) #11/22/99#-10 (4) ''ZYX'' & 123 & ''ABC'' 7. 设 X=5,Y=3,Z=3, 求下列表达式的值 (1) X^2+X/5 (2) X/2*3/2 (3) X Mod 3+Y^3/Z\5 8. 写出下列 Visual Basic 表达式的值 : (1) 4*10>=65 (2) ''ABCDE''<''ABCDF'' (3) ''456''<>''456''& ''xyz'' (4) Not 10*20<>256 (5) 10=10 And 10>4+3 (6) 10<>2 Or Not 5>20+5 (7) 10^2*10>10^3 And 2<2+3 (8) 50>20 And 12=30 9. 将下列命题用 Visual Basic 布尔表达式表示 : (1) z 比 x,y 都大 (2) a b+2 (3) p 是 q 的倍数 (4) x [-5,-2], 并且 x [2,5] (5) x,y 其中有一个小于 z (6) a 是小于正整数 b 的偶数 10. 写出下列函数的值 : (1)Int( ) (2)Chr$(Sqr(64)) (3)Fix( ) (4)Sgn(-7^2+2) (5)Lcase(''Hello'') ( 6 ) Mid(''Hello'',2) (7)Val(''16 Year'') (8)Str( ) (9)Len(''Hello'') 二 填空题 1. 在 Visual Basic 中的 & 12345E D+5 4 个常数分别表 示 类型 53 53

65 Visual Basic 6.0 程序设计基础教程 2. 整型变量 X 中存放了一个两位数, 要将两位数交换位置, 例如,13 变成 31, 实现的表达式是 y x 2e 3. 数学表达式 sin45 的 Visual Basic 算术表达式为 x y a b 4. 数学表达式的 Visual Basic 算术表达式为 2 cd 1 a 5. 表示 x 是 5 的倍数或是 9 的倍数的逻辑表达式为 6. 已知 a=2.5,b=5.0,c=2.5,d=true, 则表达式 :a>=0 AND a+c>b+3 OR NOT d 的值是 7.Int(-2.6) int(2.6) Fix(-2.6) Fix(2.6) 的值分别 8. 表达式 Ucase(Mid("abcdefgh",3,4)) 的值是 9. 在直角坐标系中,(x,y) 是坐标中任意点的位置, 用 x 与 y 表示在第一或第三象限的 表达式是 10. 表示 S 字符变量是字母字符 ( 大小写字母不区分 ) 的逻辑表达式为 三 选择题 1. 函数 Int(Rnd*100) 是在哪个范围内的整数 (A)(0,10) (B)(1,100) (C)[0,100] (D)(1,99) 2. 如果 X 是一个正实数, 对 X 的第 3 位小数四舍五入的表达式是 (A)0.01*Int(x+0.005) (B)0.01*Int(100*(x+0.005)) (C)0.01*Int(100*(x+0.05)) (D)0.01*Int(x+0.05) 3. 已知变量 A B C 中 C 最小, 则判断 A B C 可否构成三角形的逻辑表达式为 (A)A>=B And B>=C And C>0 (B)A+C>B And B+C>A And C>0 (C)(A+B>=C or A-B <=C) And C>0 (D)A+B>C And A-B<C And C>0 4. 下面哪个是算术运算符 (A)Imp (B)Mod (C)Not (D)Like 5. 下面的运算符中, 优先级最高的是 (A)Not (B)Is (C)Like (D)& 四 编程题 1. 在文本框 (Text1) 输入一个三位数据, 单击窗体后, 在窗体打印输出该数的个位数, 十位数和百位数 2. 编程序, 当单击窗体时, 在窗体上随机位置, 随机输出一个大写的英文字母 提示 : 随机大写的英文字母由表达 chr(int(rnd*26)+65) 产生, 窗体的上随机位置通过设 置当前坐标 CurrentX,CurrentY 属性来确定 实验 54 54

66 第 2 章 Visual Basic 语言基础 1. 使用立即窗口 (Debug Window) 显示下列表达式的值 ( 设 x=5,y=15,z=3), 并分析所输出的结果 (1)Len(x & y &''z'') (2)Sgn(10 mod 6) & x+y (3)x mod z +x^2\y+z (4)x^2-y*2>3*z and z^3<>x^2 (5)(y mod 10) *10+y\10 (6)Mid(str(x^3),2,2) & y+z (7)Ucase(Left(Mid(''This is a Book'',6),4)) (8)Date()+10 (9)Timer Mod 3600 (10)Hour(time()) 2. 在窗体上放 1 个标签 Label1,1 个命令按钮 Command1, 当窗体启动时使标签居于窗体的中间, 并显示系统的当前时间, 命令按钮显示为 放大, 当单击命令按钮时, 将标签中显示文字放大 1~3 倍 ( 随机确定 ), 并重新显示系统当前时间 3. 编一模拟袖珍计算器的程序, 运行界面如图 2-3 所示 图 2-3 袖珍计算器的运行结果 55 55

67 第 3 章 程序设计的 3 种基本结构 Visual Basic Visual Basic 是面向对象的程序设计语言, 采用的是面向对象的程序设计方法, 在 Visual Basic 的程序设计中, 具体到每个对象的事件过程或模块中的每个通用过程, 还是要采用结构化的程序设计方法, 所以 Visual Basic 也是结构化的程序设计语言, 每个过程的程序控制结构由顺序结构 选择结构和循环结构组成 读者学习本章后, 应该做到 : (1) 理解程序设计的算法及算法表示 ; (2) 掌握顺序结构程序设计方法 ; (3) 掌握选择控制语句的应用, 能够灵活运用各种选择结构进行综合程序设计 ; (4) 掌握循环控制语句的应用, 能够灵活运用各种循环控制进行综合程序设计 ; (5) 能够运用 3 种结构进行综合程序设计 本章首先介绍程序设计中的算法及算法表示, 对于已学过程序设计的读者, 可跳过 3.1 节, 重点学习 Visual Basic 语言中 3 种基本程序控制结构 3.1 算法及算法的表示 算法概述 人们使用计算机, 就是要利用计算机处理各种不同的问题, 而要做到这一点, 人们就必须事先对各类问题进行分析, 确定 解决问题的具体方法和步骤, 再编制好一组让计算机执行的指 56

68 Visual Basic 6.0 程序设计基础教程令即程序, 交给计算机, 让计算机按人们指定的步骤有效地工作 这些具体的方法和步骤, 其实就是解决一个问题的算法 根据算法, 依据某种规则编写计算机执行的命令序列, 就是编制程序, 而书写时所应遵守的规则, 即为某种语言的语法 广义地讲, 算法是为完成一项任务所应当遵循的一步一步的 规则的 精确的 无歧义的描述, 它的总步数是有限的 狭义地讲, 算法是解决一个问题采取的方法和步骤的描述 下面通过两个简单的例子加以说明 例 3.1 输入 3 个数, 然后输出其中最大的数 首先, 应将这 3 个数存放在内存中, 定义 3 个变量 A B C, 将 3 个数依次输入到 A B C 中, 另外, 再准备一个 Max 存放最大数 由于计算机一次只能比较两个数, 首先把 A 与 B 比, 大的数放入 Max 中, 再把 Max 与 C 比, 又把大的数放入 Max 中 最后, 把 Max 输出, 此时 Max 中装的就是 A B C 这 3 个数中最大的数 算法可以表述如下 (1) 输入 A B C (2)A 与 B 中大的一个放入 Max 中 (3) 把 C 与 Max 中大的一个放入 Max 中 (4) 输出 Max,Max 即为最大数 其中的 (2) ( 3) 两步仍不明确, 无法直接转化为程序语句, 可以继续细化 : 第 (2) 步可改为把 A 与 B 中大的一个放入 Max 中, 若 A>B, 则 Max A; 否则 Max B 第 (3) 步可改为把 C 与 Max 中大的一个放入 Max 中, 若 C>Max, 则 Max C 于是算法最后可以写成 : (1) 输入 A,B,C (2) 若 A>B, 则 Max A; 否则 Max B (3) 若 C>Max, 则 Max C (4) 输出 Max,Max 即为最大数 例 3.2 输入 10 个数, 打印输出其中最大的数 算法设计如下 (1) 输入 1 个数, 存入变量 A 中, 将记录数据个数的变量 N 赋值为 1, 即 N=1 (2) 将 A 存入表示最大值的变量 Max 中, 即 Max=A (3) 再输入一个值给 A, 如果 A>Max 则 Max=A, 否则 Max 不变 (4) 让记录数据个数的变量增加 1, 即 N=N+1 (5) 判断 N 是否小于 10, 若成立则转到第 (3) 步执行, 否则转到第 (6) 步 (6) 打印输出 Max 任何一个问题能否用计算机解决, 关键的就是看能否设计出合理的算法, 有了合适的算法, 再使用合适的计算机语言, 就能方便地编写出程序来 由此可见, 程序设计的关键之一, 是设计合理的算法 学习高级语言的重点, 就是掌握分析问题 解决问题的方法, 锻炼分析 分解, 最终归纳整理出算法的能力 与之相对应, 具体语言, 如 Visual Basic 语言的语法, 是工具, 是算法的一个具体实现 所以在高级语言的学习中, 一方面应熟练掌握该语言的语法, 因为它是算法实现的基础, 另一方面必须认识到 57 57

69 第 3 章 程序设计的 3 种基本结构 算法的重要性, 加强思维训练, 以写出高质量的程序 算法的特性 从上面的例子, 我们看到算法是对一个问题的解决方法和步骤的描述, 是一个有穷规则的集合 一个算法应该具有以下的特性 : (1) 有穷性 : 一个算法必须在执行有穷多个计算步骤后终止 (2) 确定性 : 一个算法给出的每个计算步骤, 必须都是精确定义的 无二义性的 (3) 有效性 : 算法中的每一个步骤必须有效地执行, 并能得到确定结果 (4) 输入 : 一个算法中可以没有输入, 也可以有一个或多个输入信息, 如果需要运行时输入不同数据 这些输入信息是算法所需的初始数据 (5) 输出 : 一个算法应有一个或多个输出, 一个算法得到的结果 ( 中间结果或最后结果 ) 就是算法的输出 没有输出的算法是没有意义的 算法的表示 表示算法的形式很多, 通常有自然语言 传统流程图 N-S 结构化流程图和伪代码等 1. 自然语言与伪代码表示算法自然语言就是指人们日常使用的语言, 可以是汉语 英语或其他语言 在 3.1 节中介绍的算法, 是用自然语言表示的 用自然语言表示的优点是通俗易懂, 缺点是文字冗长, 容易出现 歧义性 另外用自然语言表示分支和循环的算法不方便 伪代码是用介于自然语言和计算机语言之间的文字和符号 ( 包括数学符号 ) 来描述算法 它如同写一篇文章, 自上而下地写下来, 每一行 ( 或几行 ) 表示一个基本操作 它不用图形符号, 因此书写方便 格式紧凑, 也比较好懂, 便于向计算机语言程序转换 例如 : 例 3.1 可用如下的伪代码表示 Begin( 算法开始 ) 输入 A,B,C If A>B 则 A Max 否则 B Max If C>Max 则 C Max Print Max End ( 算法结束 ) 例 3.2 的伪代码表示如下 Begin( 算法开始 ) N=1 Input A Max=A 58 58

70 Visual Basic 6.0 程序设计基础教程 当 N<=10 则 { Input A If A>Max N=N+1 } Print Max 则 Max=A End ( 算法结束 ) 2. 用流程图表示算法 流程图是一种传统的算法表示方法, 它使用不同的几何图形框来代表各种不同性质的操 作, 用流程线来指示算法的执行方向 由于它直观形象, 易于理解, 所以应用广泛 (1) 常用的流程符号 起止框 : 表示算法的开始和结束 处理框 : 表示初始化或运算赋值等操作 输入输出框 : 表示数据的输入输出操作 判断框 : 表示根据一个条件成立与否, 决定执行两种不同操作中的其中一个 流程线 : 表示流程的方向 (2)3 种基本结构的表示 1 顺序结构 顺序结构是简单的线性结构, 各框按顺序执行 其流程图如图 3-1 所示, 语句的执行顺 序为 : 语句 1 语句 2 2 选择 ( 分支 ) 结构 这种结构是对某个给定条件进行判断, 条件为真或假时分别执行不同的框中的内容 其 基本形状有两种, 如图 3-2 所示 图 3-2(a) 的执行序列为 : 当条件为真时执行语句 1, 否 则执行语句 2; 图 3-2(b) 的执行序列为 : 当条件为真时执行语句 1, 否则什么也不做 图 3-1 顺序结构图 3-2 选择结构 3 循环结构循环结构分为当型循环和直到循环两种 当型循环 : 执行过程是先判断条件, 当条件为真时, 反复执行 语句组 ( 也称循体 ), 一旦条件为假, 跳出循环, 执行循环紧后的语句 如图 3-3(a) 所示 59 59

71 第 3 章 程序设计的 3 种基本结构 直到循环 : 执行过程是先执行 语句组, 再判断条件, 条件为真时, 一直循环执行语句 组, 一旦条件为假, 结束循环, 执行循环紧后的下一条语句 如图 3-3(b) 所示 图 3-3 循环结构流程图 所示 例 3.1 的算法用流程图表示, 如图 3-4 所示, 例 3.2 的算法用流程图表示, 如图 3-5 图 3-4 例 3-1 的算法流程图图 3-5 例 3-2 的算法流程图 用 N-S 流程图表示算法 上面介绍的流程图称为传统的流程图, 尽管它表示算法直观, 但占篇幅大, 尤其是它允许用流程线任意转移去向, 在表示复杂算法时, 如果这种情况过多, 就会使流程无规律地转来转去, 如同一团乱麻一样, 分不清其来龙去脉 N-S 图是美国学者 I.Nassi 和 B.Shneiderman 提出的一种新的流程图 在这种图中, 完全去掉了带箭头的流程线, 把全部算法写在一个矩形框内, 在框内还可以包含其他从属于它的框, 或者说, 由一些基本框组成一个大的框 它是一种适于结构化程序设计的流程图 60 60

72 Visual Basic 6.0 程序设计基础教程 3 种基本结构的 N-S 图描述如下所示 1. 顺序结构顺序结构的 N-S 图, 如图 3-6 所示, 执行顺序先 < 语句 1> 后 < 语句 2> 2. 选择结构对应于选择结构, 图 3-2 的 N-S 图如图 3-7 所示 图 3-7(a) 所示为条件为真时执行语句 1, 条件为假时执行语句 2 图 3-7(b) 所示为条件为真时执行语句 1, 为假时什么都不做, 直接执行该控制结构后面的语句 图 3-6 顺序结构的 N-S 图 图 3-7 选择结构的 N-S 图 3. 循环结构 对应于循环结构, 图 3-3 的 N-S 图如图 3-8 所示 图 3-8(a) 所示为当型循环结构的 N-S 图, 图 3-8(b) 所示为直到循环结构的 N-S 图 图 3-8 循环结构的 N-S 图 例 3.1 和例 3.2 的算法用 N-S 流程图表示分别如图 3-9 和图 3-10 所示 图 3-9 例 3-1 的算法的 N-S 流程图图 3-10 例 3-2 的算法的 N-S 流程图最后需要说明的是 : 上面介绍的算法是表示给人看的, 即是为帮助程序开发人员阅读 编写程序而设计的一种辅助工具, 因此算法表述中的文字和符号只要符合人们的约定和习惯即可, 人们将算法流程图用计算机语言 ( 如 Visual Basic) 编写程序时, 必须使用符合其语法规则, 否则计算机是不能处理 61 61

73 第 3 章 程序设计的 3 种基本结构 例如 : 依据图 3-9 所示的算法流程图, 可以很方便地将其转化为相应的程序语句 下面就是用 Visual Basic 语言编写的程序段 : A=Val(InputBox("A=?")) B=Val(InputBox("B=?")) C=Val(InputBox("C=?")) If A>B then Max=A Else Max=B End If If C>Max then Max=C Print " Max=";Max 3.2 顺序结构 从上节的算法, 可以看到顺序结构是各语句按出现的先后次序执行的结构, 如图 3-6 所示 在 Visual Basic 中实现顺序结构的语句有 : 赋值语句 Print 方法 注释语句及在上一章介绍的数据类型声明语句 符号常量声明语句等 Visual Basic 系统中提供的与用户交互的函数和过程, 常常是用来输入 / 输出信息, 相当于其他高级语言的输入 / 输出语句 为教学的方便, 将其也归纳在本节中介绍 赋值语句 赋值语句在 Visual Basic 程序设计中是使用最频繁的语句之一 一般用于对变量赋值或对控件设定属性值 语句形式 : 变量名 =< 表达式 > 对象. 属性 =< 表达式 > 功能 : 计算赋值号 = 右边 < 表达式 > 的值, 并将计算结果赋值给左边的 " 变量名 " 或指定对象的属性, 例如 :Max=0 Text1.Text=" 欢迎进入本系统 " 说明如下 1. 右边的表达式可以是变量 常量 函数调用等特殊的表达式 2. 语句中的 = 称为赋值号, 它不同于数学中的等号, 如 A=A+1 在数学中是不成立的, 但在程序设计中则是经常用到的, 它表示取变量 A 单元中的值, 将其加 1 后, 仍然放回到 A 变量的存储单元 其执行过程如图 3-11 所示 3. 赋值符号 = 左边一定只能是变量名或对象的属性引用, 不能是常量 符号常量 表达式 62 62

74 Visual Basic 6.0 程序设计基础教程 图 3-11 A=A+1 语句的执行过程 例如 :Z=X+Y 是将变量 X 和变量 Y 的值的和赋值给变量 Z 如果写成 X+Y=Z, 就大错特错了 下面的赋值语句都是错的 : 5=X ' 左边是常量 Abs(X)=20 ' 左边是函数调用, 即是表达式 4. 赋值符号 = 两边的数据类型一般要求应一致 如果两边的类型不同, 则以左边变量或对象属性的数据类型为基准, 如果右边表达式结果的数据类型能够转换成左边变量或对象属性的数据类型, 则先强制转换后, 再赋值给左边的变量或对象的属性 ; 如果不能转换, 则系统将提示出错信息 具体处理规则如下 (1) 若都是数值型, 但精度不同, 则强制转换成左边变量的数据精度 例如 : X%= ' 按四舍五入取整, 执行后,X 的值是 4 Y!=123 ' 将整数 123 转换成实数 123.0, 赋值给 Y, 执行后,Y 的值是 (2) 当表达式是数值字符串, 左边变量是数值型, 则将表达式自动转换成数值类型再赋值, 但若表达式中有非数值字符或空串, 则出错 Y%="123" ' 将字符串 ''123'' 转换为数值 123, 赋值给 Y, 执行后,Y 的值是 123 Z%="123A" ' 出错, 提示 类型不匹配 的错误信息 A%=" " ' 出错, 提示 类型不匹配 的错误信息 (3) 任何非字符类型数据赋值给字符类型, 都将自动转换为字符类型 St$=123 ' 将数值 123 转换为字符串 ''123'', 赋值给 St, 执行后,St 的值是 ''123'' St$=True ' 将逻辑值转换 True 为字符串 ''True'', 赋值给 St, 执行后,St 的值是 ''True'' (4) 当逻辑量赋值给数值型时,True 转换为 1,False 转换为 0; 反之当数值型赋值给逻辑型时, 非 0 转换为 True,0 转换为 False A%=True ' 将逻辑量 True 转换为数值 1, 赋值给 A, 执行后,A 的值为 1 Dim X As Boolean X= 5 ' 5( 非零数据 ) 转换为 True, 赋值给 X, 执行后,X 的值为 True 数据的输出 Print 方法 在 Visual Basic 中可以通过文本框 ( 将要输出的数据赋值给文本框的 Text 属性 ) 标签 ( 将 要输出的数据赋值给标签的 Caption 属性 ) 及 节介绍的 MsgBox 函数和 MsgBox 过程来 63 63

75 第 3 章 程序设计的 3 种基本结构 输出数据, 但在窗体 图片框及立即窗口中输出数据, 可使用 Print 方法来实现 Print 方法的一般格式如下 [ 对象名.]Print [< 表达式表 >] [{, ;}] 说明 : [ 对象名.] 可以是窗体名 图片框名, 也可是立即窗口 Debug 若省略对象, 则表示在当前窗体上输出 在 节窗体对象的方法中对 Print 方法做了详细的介绍 用 Print 方法在图片框和立即窗口对象中输出与在窗体对象中输出完全相同 用户交互函数和过程 1. 数据的输入 InputBox 函数 InputBox 函数提供了一个简单的对话框供用户输入信息 在把其他版本的 BASIC 程序移植到 Visual Basic 时,InputBox 函数通常用来代替原来的 INPUT 语句 其使用格式如下 : 变量名 =InputBox[$](< 提示信息 >[,< 标题 >][,< 默认 >][,<x 坐标 >][,<y 坐标 >] ) 该函数的作用是打开一个如图 3-12 所示的对话框, 等待用户输入信息, 当用户按回车键或单击 确定 按钮时, 函数将输入的内容作为字符串返回 例如, 要用 InputBox 函数给变量 n 赋值, 可用下面的赋值语句 : n=val(inputbox(" 请输入成绩 ", " 数据输入框 ",50) ) 该语句执行后, 将出现如图 3-12 所示界面 标题 提示 默认值 图 3-12 InputBox 函数打开的对话框 其中的参数含义如下 (1)< 提示信息 >: 该项是不能省略的 它在对话框中作为提示用户操作的信息, 如上例中的 请输入成绩 该项通常可以是字符串常量 变量和字符串表达式 它的最大长度为 1024 个字符, 若要显示多行, 必须将要显示的信息通过字符连接符 + 或 & 组成字符串表达式, 在要换行处加回车 Chr(13) 换行 Chr(10) 控制符或使用系统常量 vbcrlf (2)< 标题 >: 决定对话框标题区显示的信息, 如上例中的 数据输入框 该项是字符串表达式, 若省略, 则将应用程序名, 即工程名作为对话框的标题 (3)< 默认 >: 输入文本编辑区默认值, 如上例中的 50, 如果用户不输入值而直接按回车键或单击 确定 按钮, 该值便作为函数的返回值 该项为数值常量 字符串常量或常量表达式 若省略, 则相当于空字符串 (4)<x 坐标 > <y 坐标 >: 确定对话框在屏幕上显示的位置, 为整型表达式, 用来确定 64 64

76 Visual Basic 6.0 程序设计基础教程对话框左上角在屏幕上的位置, 屏幕左上角的坐标为 (0,0), 向下为 y 的正方向, 向右为 x 的正方向 坐标单位为 twip 注意 : (1) 各项参数次序必须一一对应, 除第一项参数 提示 不能省略外, 其余参数均可省略, 如果处于中间位置的参数省略, 其对应的逗号不能省略 例如 :Nage= InputBox(" 输入你的年龄?",,18 ) (2) 由 InputBox 函数返回的数据类型是字符类型数据, 如果要得到数值类型数据, 则必须用 Val() 函数进行类型转换 例如 : 上面的例子中, 如果 Nage 被定义为整型变量, 在程序运行需输入时, 如果输入的是数值字符,InputBox 函数返回的是数值字符串, 则在执行赋值时, 按照 节赋值处理规则, 系统会自动转换为数值数据, 然后赋值给变量 Nage 如果输入的包含非数值字符, 该语句将会出错 因此通常将其写成下面的形式 : Nage =Val(InputBox(" 输入你的年龄?",,18 )) 2.MsgBox 函数和 MsgBox 过程 MsgBox 函数的功能是在对话框中显示信息, 等待用户单击按钮, 并返回一个整数告诉系统用户单击的是哪一个按钮 MsgBox 过程与 MsgBox 函数的功能相同, 但它没有返回值, 常常仅用于显示某些信息, 而不作程序流程的选择控制 函数使用形式 : 变量 [%]=MsgBox(< 提示信息 >[,< 对话框样式 >][,< 标题 >]) 过程使用形式 :MsgBox < 提示信息 >[,< 对话框样式 >][,< 标题 >] 例如 : n=msgbox(" 注意 : 你输入的数据不正确 ", 2 + vbexclamation, " 错误提示 ") 或 : MsgBox " 注意 : 你输入的数据不正确 ", 2 + vbexclamation, " 错误提示 " 上述两个语句执行后的界面如图 3-13 所示 标题 图标 提示信息 命令按钮 图 3-13 MsgBox 函数或过程打开对话框 说明如下 (1)< 提示信息 >: 该项不能省略, 其含义与 InputBox 函数中的对应参数相同 (2)< 标题 >: 可选项 在对话框标题栏中显示的字符串表达式 其含义与 InputBox 函数中的对应参数相同 (3)< 对话框样式 >: 可选项 最多可由 4 项数值相加组成, 其形式是 : 65 65

77 第 3 章 程序设计的 3 种基本结构 < 按钮 >[+< 图标 >][+ < 默认按钮 >][+< 模式 >] 其值指定在对话框中显示的按钮数目及形式 图标类型 默认按钮以及对话框模式等 若省略此项, 取其默认值 0 对话框样式中各项的取值及其含义见表 3-1 表 3-1 对话框样式 取值和含义 分组数值内部常数描述 0 VbOKOnly 只显示 OK( 确定 ) 按钮 1 VbOKCancel 显示 OK( 确定 ) 及 Cancel( 取消 ) 按钮 按钮数目及样式 2 VbAbortRetryIgnore 显示 Abort( 终止 ) Retry( 重试 ) 及 Ignore( 忽略 ) 按钮 3 VbYesNoCancel 显示 Yes( 是 ) No( 否 ) 及 Cancel( 取消 ) 按钮 4 VbYesNo 显示 Yes( 是 ) 及 No( 否 ) 按钮 5 VbRetryCancel 显示 Retry( 重试 ) 及 Cancel( 取消 ) 按钮 16 VbCritical 显示 Critical Message 图标 32 VbQuestion 显示 Warning Query 图标 图标类型 48 VbExclamation 显示 Warning Message 图标 64 VbInformation 显示 Information Message 图标 0 VbDefaultButton1 第 1 个按钮是默认值 默认按钮 模式 256 VbDefaultButton2 第 2 个按钮是默认值 512 VbDefaultButton3 第 3 个按钮是默认值 768 VbDefaultButton4 第 4 个按钮是默认值 0 VbApplicationModal 应用程序强制返回 ; 应用程序一直被挂起, 直到用户对消息框作出响应才继续工作 4096 VbSystemModal 系统强制返回 ; 全部应用程序都被挂起, 直到用户对消息框作出响应才继续工作 (4)MsgBox 函数的返回值 : 函数调用后返回 0~7 的整型值, 根据用户操作的不同 ( 单 击或按下的按钮 ) 返回不同的值, 见表 3-2 表 3-2 MsgBox 函数的返回值 用户的操作 ( 单击或按下的按钮 ) 数值 内部常量 OK ( 确定 ) 1 vbok Cancel ( 取消 ) 2 vbcancel Abort ( 中止 ) 3 vbabort Retry ( 重试 ) 4 vbretry Ignore ( 忽略 ) 5 vbignore 66 66

78 Visual Basic 6.0 程序设计基础教程 Yes ( 是 ) 6 vbyes No ( 否 ) 7 vbno 用户要根据 MsgBox 函数的不同返回值, 实现程序的控制流程, 就必须通过编写程序代 码才能实现 例如下面一段程序中的 MsgBox 函数, 显示的对话框包含 是 否 两个按 钮, 默认按钮为第一个按钮 是 i = MsgBox(" 发生错误, 是否继续?", vbyesno + vbquestion, " 提示信息 ") If i = 7 Then End ' 或写成 If i = vbno Then End 当用户单击 否, 程序就结束, 单击 是 或直接按回车键, 程序则继续向下执行 注意 : 如果仅使用 MsgBox 显示信息, 通常使用过程调用方式 例如, 下面的语句是使 用消息框输出一个提示信息 MsgBox " 程序执行结束, 按 确定 返回 ",, " 提示信息 " 注释语句 在使用注释语句之前必须先了解注释的作用, 注释不仅仅是对程序的解释, 有时它对于程序的调试也非常有用, 如可以利用注释屏蔽一条语句以观察变化 发现问题和错误 注释语句将是我们在编程里最经常用到的语句之一 其语法格式为 : Rem < 注释内容 > 或 ' < 注释内容 > 说明如下 (1)< 注释内容 > 指要包括的任何注释文本 在 Rem 关键字和注释内容之间要加一个空格 也可以用一个英文单引号 ' 来代替 Rem 关键字 (2) 如果在其他语句行后面使用 Rem 关键字, 必须用冒号 (:) 与语句隔开 若用英文单引号 ', 则在其他语句行后面不必加冒号 (:) 例如 : Const PI= ' 符号常量 PI S=PI*r*r : Rem 计算圆的面积 应用举例 例 3.3 输入时间 ( 小时, 分和秒 ), 然后使用输出消息框输出总计多少秒 使用文本框输入数据, 使用消息框输出计算结果, 程序运行界面如图 3-14 所示 67 67

79 第 3 章 程序设计的 3 种基本结构 图 3-14 程序运行界面 将窗体及控件的属性设置在程序代码中来完成, 用变量 hh 代表小时,mm 代表分钟,ss 代表秒,Totals 代表总的秒数值 则 Totals=hh*3600+mm*60+ss 程序代码如下 : Private Sub Form_Load() ' 初始化对象属性 Form1.Caption = " 计算时间 " Label1.Caption = " 小时 " Label2.Caption = " 分 :" Label3.Caption = " 秒 :" Text1 = "": Text2 = "": Text3 = "" Command1.Caption = " 计算 " Command2.Caption = " 结束 " Private Sub Command1_Click() ' 计算 Dim hh%, mm%, ss%, Totals! Dim Outstr$ hh = Val(Text1) mm = Val(Text2) ss = Val(Text3) Totals = hh * mm * 60 + ss Outstr = hh & " 小时 " & mm & " 分 " & ss & " 秒 " Outstr = Outstr & vbcrlf & " 总计 :" & Totals & " 秒 " MsgBox Outstr,, " 输出结果 " Private Sub Command2_Click() ' 结束程序运行 End 思考与讨论 : 如果程序运行后, 分别在小时 分 秒文本框中输入 , 单击 计算 命令按钮, 程序还能输出正确结果吗? 如果不能, 那如何修改程序? 例 3.4 编一程序, 求一内半径 R1=10cm, 外半径 R2=20cm 的球环的体积 要求按四舍五入保留到小数点后 4 位 68 68

80 Visual Basic 6.0 程序设计基础教程 解 : 球的体积公式 4 V R 3, 本题所求的球环面的体积公式 V R ( ) 2 R1 R2 R 程序代码写在窗体的单击事件中, 代码如下 Private Sub Form_Click() Dim R1 As Double, R2 As Double 'R1,R2 表示球的内外半径 Dim Vol As Double 'Vol 表示体积 Const PI# = ' 定义符号常量 PI 代表 π R1 = 10 : R2 = 20 Vol = 4 / 3 * PI * (R2 ^ 3 - R1 ^ 3) Vol = Fix(Vol * ) / ' 保留小数点后 4 位 Print " 球环的体积 :V="; Vol; " 立方厘米 " 思考与讨论 : (1) 程序中定义 PI 为符号常量, 能否在程序中使用赋值语句对它进行重新赋值? (2) 如果要求计算结果保留小数 3 位, 如何修改程序? 能否将程序中的 Fix 函数改为 Int 函数? 3.3 选择结构 选择结构是根据条件选择执行不同的分支语句, 以完成问题的要求 在 Visual Basic 程序设计中, 使用 IF 语句和 Select Case 语句来处理选择结构 其特点是 : 根据所给定的条件成立 ( True) 或不成立 (False), 从各实际可能的不同分支中执行某一分支的相应操作 ( 程序块 ), 并且任何情况下总有 无论条件多寡, 必择其一 ; 虽然条件众多, 仅选其一 的特性 If 条件语句 If 语句有单分支 双分支和多分支等结构, 可根据问题的不同, 选择适当的结构 1. 单分支 If.Then 语句格式 1( 块形式 ): If < 表达式 > Then < 语句块 > End If 格式 2( 单行形式 ): If < 表达式 > Then < 语句块 > 说明 : 69 69

81 第 3 章 程序设计的 3 种基本结构 (1) 语句的执行过程如图 3-15 所示 (2)< 表达式 >: 一般为关系表达式 逻辑表达式, 也可为算术表达式, 其值按非 0 为 True,0 为 False 进行判断 (3) 在使用格式 1 时, 必须从 Then 后换行, 也必须用 End If 结束 使用格式 2, 将整个条件语句写在一行, 就不能使用 End If 若有多个语句, 语句之间使用 : 分隔 图 3-15 单分支选择结构的执行过程 例 : 已知两个数 x 和 y, 比较它们的大小, 使得 x 大于 y If x<y Then t=x:x=y:y=t ' t 为中间变量 End If 上面等价形式为 : If x<y Then t=x:x=y:y=t 2. 双分支结构 If Then Else 语句 格式 1( 块形式 ): If < 表达式 > Then < 语句块 1> Else < 语句块 2> End If 格式 2( 单行形式 ): If < 表达式 > Then < 语句块 1> Else < 语句块 2> 语句的执行过程如图 3-16 所示, 即当表达式的值为 True( 非 0) 时执行 Then 后面的 < 语句块 1>, 否则执行 Else 后面的 < 语句块 2> 例如 : 输出 x,y 两个中值较大的一个值 If X>Y Then Print X Else Print Y End If 也可以写成如下的单行形式 : 图 3-16 双分支选择结构执行过程 If X>Y Then Print X Else Print Y 例 设计一个求解一元二次方程 Ax Bx C 0 的程序, 要求考虑实根 虚根等情况 算法分析 : b b 4ac (1) 一元二次方程根的计算公式 : X1,2 2a (2) 求解首先要输入方程的系数 a,b,c, 计算 b 2 4ac 的值, 由其值是否大于等于零来决

82 Visual Basic 6.0 程序设计基础教程定是实根还是虚根 设计如图 3-17 所示的程序界面, 使用 3 个文本框来接受方程系数的输入,2 个文本框来输出方程的根, 求解方程解的主要程序代码写在命令按钮的单击事件中 程序代码如下 Private Sub Command1_Click() Dim a!, b!, c!, x1!, x2!, disc! a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) disc= b * b - 4 * a * c If disc>=0 then x1 = (-b + Sqr(disc)) / (2 * a) x2 = (-b - Sqr(disc)) / (2 * a) Text4.Text = Str$(x1) Text5.Text = Str$(x2) Else X1=-b/(2*a) X2=Sqr(abs(disc))/(2*c) 图 3-17 求解一元二次方程根的程序运行界面 Text4.Text=Str$(x1) & "+"&Str$(x2)&"i" Text5.Text=Str$(x1) & "-"&Str$(x2)&"i" End If 思考与讨论 : (1) 如果要限制 3 个文本框 (Text1 Text2 Text3) 只能输入数字, 而不能接受其他字符输入, 应在什么事件中如何编写程序来处理 (2) 实际上, 根据输入的数据 a,b,c, 一元二次方程有以下几种可能 1 a=0, 不是二次方程 ; 2 b 2 4ac=0, 有两个相等实根 ; 3 b 2 4ac>0, 有两个不等实根 4 b 2 4ac<0, 有两个共轭复根 按照上述 4 种情况进行编程处理, 如何修改程序? 3.IIF 函数 IIF 函数可用来执行简单的条件判断操作, 它相当于 IF Then.Else 结构 IIF 函数的使用格式 : IIF(< 表达式 >,< 表达式 1>,< 表达式 2>) 说明 : 71 71

83 第 3 章 程序设计的 3 种基本结构 (1)< 表达式 > 与 IF 语句中的表达式相同, 通常是关系表达式 逻辑表达式, 也可为算术表达式 如果是算术表达式, 其值按非 0 为 True,0 为 False 进行判断 (2) 当 < 表达式 > 为真时, 函数返回 < 表达式 1> 的值, 当 < 表达式 > 为假时, 函数返回 < 表达式 2> 的值 (3)< 表达式 1> < 表达式 2> 可以是任何表达式 例如 : 将两个变量 X 和 Y 中的最大值存于 Max 变量中, 可使用 : Max=IIF(X>Y, X, Y ) 它与下面语句等价 : IF X>Y Then Max=x Else Max=Y 4.If Then ElseIf 语句 ( 多分支结构 ) 语句形式 : If < 表达式 1> Then < 语句块 1> ElseIf < 表达式 2>Then < 语句块 2>.. ElseIf < 表达式 n> Then < 语句块 n> [Else < 语句块 n+1> ] End If 执行过程是, 首先判断表达式 1, 如果其值为 True, 则执行 < 语句块 1>, 然后结束 If 语句 如果表达式 1 的值为 False, 则判断表达式 2, 如果其值为 True, 则执行 < 语句块 2>, 然后结束 If 语句 如果表达式 2 的值为 False, 再继续往下判断其他表达式的值 如果所有表达式的值都为 False, 则才执行 < 语句块 n+1> 语句的执行流程如图 3-18 所示 图 3-18 多分支 IF 语句执行过程 例 3.6 输入一组学生成绩, 评定其等级 方法是 :90~100 分为 优秀,80~89 分为 良好,70~79 分为 中等,60~69 分为 及格,60 分以下为 不合格 使用 If 语句实现的程序段如下 : If x>=90 then 72 72

84 Visual Basic 6.0 程序设计基础教程 Print " 优秀 " ElseIf x>=80 Then Print " 良好 " ElseIf x>=70 Then Print " 中等 " ElseIf x>=60 Then Else Print " 及格 " Print " 不及格 " End If 思考与讨论 : 上面的程序段中每个 ElseIf 语句中的表达式都作了简化, 例如第一个 ElseIf 的表达式本应写为 x>=80 and X<90, 而写为 x>=80, 为什么能作这样的简化? 如果将上 面的程序段改写成下面两种形式是否正确? 第一种形式 : 第二种形式 : If x >=60 Then If x <60 Then Print " 及格 " Print " 不及格 " ElseIf x>=70 Then ElseIf x<70 Then Print " 中等 " Print " 及格 " ElseIf x>=80 Then ElseIf x<80 Then Print " 良好 " Print " 中等 " ElseIf x>=90 Then ElseIf x<90 Then Print " 优秀 " Print " 良好 " Else Else End If Print " 不及格 " Print " 优秀 " End If Select Case 语句 ( 情况语句 ) 当选择的情况较多 ( 如例 3.6), 虽然可以使用 If 语句来实现, 但不直观 Visual Basic 中 提供了处理多分支情况语句 Select Case 语句, 可以方便 直观地处理多分支的控制结构 1.Select Case 语句 使用格式如下 : Select Case < 表达式 > Case < 表达式列表 1> < 语句块 1> Case < 表达式列表 2> 语句块 2 73 图 3-19 Select Case 语句的执行过程 73

85 第 3 章 程序设计的 3 种基本结构 [ Case Else < 语句块 n+1>] End Select Select Case 语句的执行过程如图 3-19 所示 首先求 < 表达式 > 的值, 然后依次与 Case 后面 < 表达式列表 1> < 表达式列表 2> 中的值比较, 若有相匹配的, 则执行它下面的 < 语句块 >, 执行完该语句块则结束 Select Case 语句, 不再与后面 < 表达式列表 > 比较 因此, 即使后面的 < 表达式列表 > 中还有与 < 表达式 > 的值相匹配, 也不会去执行它对应的语句块了 当 < 表达式 > 的值与后面所有 < 表达式列表 > 的值都不相匹配时, 若有 Case Else 语句, 则执行 Case Else 后面的 < 语句块 n+1>, 若没有 Case Else 语句, 则什么也不做, 直接结束 Select Case 语句 说明 :< 表达式列表 > 是与 < 表达式 > 为同类型的下面 4 种形式之一 (1) 表达式列表为表达式, 例如 :A+5 (2) 一组用逗号分隔的枚举表达式列表, 例如 :2,4,6,8 (3) 表达式 1 to 表达式 2, 例如 :60 to 100 (4)Is 关系运算符表达式, 例如 :Is<60 将例 3.6 使用 Select Case.. 语句来实现的程序段如下 : Select Case x Case 90 to 100 Print " 优秀 " Case 80 to 89 Print " 良好 " Case 70 to 79 Print " 中等 " Case 60 to 69 Print " 及格 " Case Else Print " 不及格 " End Select 2.Choose 函数使用 Choose 函数可实现简单的 Select Case.End Select 语句的功能 Choose 函数使用格式 : Choose(< 数值表达式 >,< 表达式 1>,< 表达式 2>,,< 表达式 n>) 说明如下 (1)Choose 函数根据 < 数值表达式 > 的值来决定返回其后 < 表达式列表 > 中的哪个表达式的值 如果 < 数值表达式 > 的值为 1, 则返回 < 表达式 1> 的值, 如果 < 数值表达式 > 的值为 2, 则返回 < 表达式 2> 的值, 以此类推 若 < 数值表达式 > 的值小于 1 或大于 n, 则函数返回 Null (2)< 数值表达式 > 一般为整数表达式, 如果是实数表达式, 则将自动截断取整 例如 : 根据 Nop 的值, 得到 + - * / 的运算符, 可由下面语句来实现 Nop= Int(Rnd * 4)

86 Visual Basic 6.0 程序设计基础教程 OP= Choose(Nop, "+", "-", "*", "/") 此问题如果使用 Select Case.End Select 语句, 则程序结构将复杂得多 选择结构的嵌套 在 If 语句的 Then 分支和 Else 分支中可以完整地嵌套另一 If 语句或 Select Case 语句, 同 样 Select Case 语句每一个 Case 分支中都可嵌套另一完整的 If 语句或 Select Case 语句 下面 是两种正确的嵌套形式 : (1)IF < 条件 1> Then If < 条件 2> Then Else End If Else IF < 条件 3> Then Else End If End If (2)IF < 条件 1> Then Select Case Case IF < 条件 2> Then Else End If Case End Select End If 说明如下 (1) 嵌套只能在一个分支内嵌套, 不出现交叉 其嵌套的形式将有很多种, 嵌套层次也可以任意多 (2) 多层 IF 嵌套结构中, 要特别注意 IF 与 Else 的配对关系,Else 语句不能单独使用, 它必须与 IF 配对使用, 配对的原则是 :Else 总是与其最靠近的 IF 语句配对, 从 Else 语句处往上查找, 如遇 End If 则需跳过一个 IF, 同时要跳过单行 IF 语句 例如 : 下面程序段 2 个 Else 语句的配对关系 IF x>=0 Then IF x=0 Then y=10*x+5 If x>10 Then y=10/y+2 Else y=5*x-8 End if Else Y=x*x End IF 75 75

87 第 3 章 程序设计的 3 种基本结构 为了便于阅读和维护, 建议在写含有多层嵌套的程序时, 使用缩进对齐方式 例 3.7 编制用户身份验证程序 设三个不同密码表示不同类型用户, 通过身份验证后显示该用户类型 运行界面如图 3-20 所示, 要求在文本框中输入的密码长度不超过 7 个字符 设密码分别为 ( 普通用户 ) ( 授权用户 ) 和 ( 特许用户 ), 按回车键表示密码输入结束 如果输入密码正确, 则用 MsgBox 对话框显示 你的口令正确, 已通过身份验证 并显示用户类型 ; 否则显示 口令不正确, 是否重试 ( 有 是 和 否 两个按钮 ), 当用户单击 是 则将焦点定位到文本框中 清除文本框中的内容并允许再输入一遍, 如果单击 否 则退出程序 图 3-20 用户身份验证程序的运行界面 界面设计如图 3-20 所示, 在窗体上建立 1 个文本框控件 2 个标签控件, 并设置相关属性 根据题目的要求, 初始属性设置放在窗体中 Load 事件来处理 在文本框 Text1 的 KeyPress 事件中完成用户身份验证, 程序代码如下 : Private Sub Form_Load() ' 设置主要对象的属性 Form1.Caption = " 用户身份验证 " Text1.Text = "": Text1.PasswordChar = "*": Text1.MaxLength = 7 Private Sub Text1_KeyPress(KeyAscii As Integer) Dim pw As String, i As Integer If KeyAscii = 13 Then ' 按回车键后进行密码检验 pw = Trim(Text1.Text) ' 判断密码是否正确 If pw = " " Or pw = " " Or pw = " " Then MsgBox " 你的口令正确, 已通过身份验证 ", vbinformation + _ vbokonly, " 用户身份验证 " Select Case pw Case " " Label2.Caption = " 你是普通用户 " Case " " Label2.Caption = " 你是授权用户 " Case " " Label2.Caption = " 你是特许用户 " End Select 76 76

88 Visual Basic 6.0 程序设计基础教程 Else ' 密码不正确 i = MsgBox(" 口令不正确, 是否重试 ", vbyesno + vbquestion, " 提示信息 ") If i = vbyes Then Text1.Text = "": Text1.SetFocus Else End End If End If End If 讨论与思考 : (1) 本程序是选择结构的多层嵌套 : 最外层是 IF Then..End IF 结构, 嵌套了第二层 IF..Then..Eles End IF 结构, 第三层是 Select Case End Select 结构 (2) 程序中 Text1.SetFocus 语句的作用是什么? (3) 如果要求在文本框中只有输入 7 个字符后, 按回车键才起作用, 应如何修改程序? (4) 如果最多允许用户输入 3 次密码, 即当第三次输入仍不对, 则提示 非法用户, 并退出程序, 应如何修改程序? 3.4 循环结构 循环结构是一种重复执行的程序结构 它判断给定的条件, 如果条件成立, 即为 真 (True), 则重复执行某一些语句 ( 称为循环体 ); 否则, 即为 假 (False), 则结束循环 通常循环结构有 当型循环 ( 先判断条件, 后执行循环 ) 和 直到型循环 ( 先执行循环, 再判断条件 ) 两种 在 Visual Basic 中, 实现循环结构的语句主要有 4 种 : For Next 语句 Do While/Until Loop Do Loop While/Until 语句 While Wend 语句 For Next 循环语句 For 语句一般用于循环次数已知的循环, 其使用形式如下 : For < 循环变量 >=< 初值 > to < 终值 > [Step < 步长 >] < 语句块 > [Exit For] 循环体 < 语句块 > Next < 循环变量 > 说明如下 77 77

89 第 3 章 程序设计的 3 种基本结构 (1) 循环执行过程如图 3-21 所示 (2) 关于 步长 : 1 当 初值 < 终值 时, 步长 应取 >0; 如果省略, 则系统默认步长为 1 2 当 初值 > 终值 时, 步长 应取 <0; 如果步长为 0, 而循环体中又无退出循环的语句 ( 如 Exit For), 则循环将构成死循环 (3)Exit For 用来结束 For 语句, 它总是出现在 If 语句或 Select Case 语句内部, 内嵌套在循环语句中 图 3-21 For 语句的执行过程 终值 初值步长 (4) 循环次数 :N=Int ( 1) 例 : For I=2 To 13 Step 3 ' 循环执行次数为 :Int((13-2)/3)+1=4 Print I, ' 输出 I 的值分别为 : Next I Print " I=", I ' 结束循环后, 循环变量的值为 :I=14 例 3.8 编程计算 :S= 本题是一个累加问题, 算法比较简单, 如图 3-22 所示 实现的程序段如下 : Dim S As Integer, I As Integer S=0 ' 累加前变量 S 为 0 For I=1 to 100 S=S+I Next I Print " S=",S Do Loop 循环语句 图 3-22 例 3.8 的算法流程图 Do Loop 语句既可用于循环次数确定的情况, 对于那些循环次数难确定, 但控制循环 的条件或循环结束的条件容易给出的问题, 常常使用 Do Loop 语句 Do Loop 语句的使用 78 78

90 Visual Basic 6.0 程序设计基础教程格式有以下两种 1. 形式 1( 当型循环 ) Do { While Until }< 条件 > < 语句块 > [Exit Do] 循环体 < 语句块 > Loop 2. 形式 2( 直到型循环 ) 为 Do < 语句块 > [Exit Do] 循环体 < 语句块 > Loop { While Until} < 条件 > 说明 : (1) 当使用 While< 条件 > 构成循环时,< 条件 > 为 真, 则反复执行循环体 ; 条件 假, 则退出循环 执行过程如图 3-23 和图 3-24 所示 图 3-23 Do While Loop 执行过程图 3-24 Do Loop While 执行过程 (2) 当使用 Until < 条件 > 构成循环时, 条件为 假, 则反复执行循环体, 直到条件成 立, 即条件为 真 时, 则退出循环 执行过程如图 3-25 和图 3-26 所示 79 79

91 第 3 章 程序设计的 3 种基本结构 图 3-25 Do Until Loop 执行过程 图 3-26 Do Loop Until 执行过程 (3) 在循环体内一般应有一个专门用来改变条件表达式中变量的语句, 以使随着循环的 执行, 条件趋于不成立 ( 或成立 ), 最后退出循环 (4) 语句 Exit Do 的作用是退出它所在的循环结构, 只能用在 Do/Loop 结构中, 并且常 常是同选择结构一起出现在循环结构中, 用来实现当满足某一条件时提前退出循环 例 3.9 用 Do Loop 循环改写例 3.8 的程序 : 用当型循环改写为 : Dim S As Integer, I As Integer S=0 ' 累加前变量 S 为 0 I=1 ' 给控制循环的变量赋初值 Do While I<=100 ' 该语句改为 Do Until I>100 S=S+I I=I+1 Loop Print " S="; S 读者可以自己用直到循环形式 (Do Loop While 和 Do Loop Until ) 改写上面的程 序 While Wend 语句 While Wend 语句使用格式如下 : While < 条件 > < 循环块 > Wend 说明 : 该语句与 Do While < 条件 > Loop 实现的循环完全相同 例 3.10 求两个整数的最大公约数 最小公倍数 编程分析 : 最小公倍数 = 两个整数之积 / 最大公约数 求最大公约数的算法思想是 : (1) 对于已知两数 m n, 使得 m>n; 80 80

92 Visual Basic 6.0 程序设计基础教程 (2)m 除以 n 得余数 r; (3) 若 r=0, 则 n 为求得的最大公约数, 算法结束 ; 否则执行第 (4) 步 ; (4)m n,n r, 再重复执行第 (2) 步 算法的 N-S 流程图如图 3-27 所示 实现程 序的代码如下 Dim n%,m%,nm%,r%,t% m=val(inputbox("m=")) n=val(inputbox("n=")) nm=n*m 图 3-27 求最大公约数的 N-S 流程图 If m<n Then t=m: m=n: n=t r=m mod n Do While (r <> 0) m=n : n=r r= m mod n Loop Print " 最大公约数 =", n Print " 最小公倍数 =", nm/n 思考与讨论 : (1) 将上程序中的 Do While..Loop 循环语句改用 Do.Loop Until 和 For..Next 循 环语句来实现, 并比较它们的区别 (2) 求最大公约数的方法也可以通过递减法来求, 即 :1 取两数中较小的数给 div,2 判断 n 和 m 是否同时被 div 整除, 如果整除, 则 div 为最大公约数, 结束程序, 如果不能整 除则转 3;3 让 div=div-1, 重复 2 要求读者根据此算法编写出相应的程序 循环的嵌套 多重循环结构 如果在一个循环内完整地包含另一个循环结构, 则称为多重循环或循环嵌套, 嵌套的层 数可以根据需要而定, 嵌套一层称为二重循环, 嵌套两层称为三重循环 上面介绍的几种循环控制结构可以相互嵌套, 下面是几种常见的二重嵌套形式 : 81 (1)For I= For J= Next J (5)Do Next I (3)Do While/Until For J= For J= Next J Next J Loop Loop While/Until (2)For I= Do While/Until Loop Next I (6)Do (4)Do While/Until Do Do While/Until While/Until Loop Loop Loop While/Until 81

93 第 3 章 程序设计的 3 种基本结构 例 3.11 将一张面值为 100 元的人民币等值换成 100 张 5 元 1 元和 0.5 元的零钞, 要求每种零钞不少于 1 张, 问有哪几种组合? 编程分析 : 如果用 X Y Z 来分别代表 5 元 1 元和 0.5 元的零钞的张数, 根据题意只能得到下面两个方程 X+Y+Z=100 5X+Y+0.5Z=100 显然从数学上, 本问题无法得到解析求解, 但用计算机可方便地求出各种可能的解, 这类问题属于穷举法 ( 又称 枚举法 ) 问题, 其基本思想是 : 一一列举各种可能的情况, 并判断哪一种可能是符合要求的解, 这是一种 在没有其他办法的情况的方法, 是一种最 笨 的方法, 然而对一些无法用解析法求解的问题往往能奏效, 通常采用循环来处理穷举问题 Dim X%, Y%, Z%,N% Print "5 元 1 元 0.5 元 " N=0 For X = 1 To 100 For Y = 1 To 100 For Z=1 To 100 If X+Y+Z=100 And 5 * X + Y * Z = 100 Then Print X, Y, Z N=N+1 End If Next Z Next Y Next X Print " 共有 " & N & 组合思考与讨论 : 上面的算法设计得不好, 程序效率低, 通过分析知道,X 最大取值应小于 20, 因每种面值不少于 1 张, 因此 Y 最大取值应为 100 X, 同时在 X Y 取定值后,Z 的值便确定了 :Z=100 X Y, 所以本问题的算法使用二重循环即可实现, 优化后的程序代码如下 : Dim X%, Y%, Z%, N% Print "5 元 1 元 0.5 元 " N=0 For X = 1 To 19 For Y = 1 To 100-X Z=100-X-Y If 5 * X + Y * Z = 100 Then Print X, Y, Z N=N

94 Visual Basic 6.0 程序设计基础教程 End If Next Y Next X Print " 共有 " & N & 组合 几种循环语句比较 一般情况下,4 种循环语句可以相互代替, 其中 While Wend 语句与 Do While Loop 语句等价, 表 3-3 给出了各种循环语句的区别 表 3-3 几种循环语句的区别 For To Next Do While/Until Loop Do Loop While/until 循环类别 当型循环 当型循环 直到型循环 循环变量初值 在 For 语句行中 在 Do 之前 在 Do 之前 循环控制条件 循环变量大于或小于终值 条件成立 / 不成立执行循环 条件成立 / 不成立执行循环 提前结束循环 Exit For Exit Do Exit Do 改变循环条件 For 语句中无需专门语句, 由 Next 自动改变 必须使用专门语句 必须使用专门语句 使用场合 循环次数容易确定 循环 / 结束控制条件易给出 循环 / 结束控制条件易给出 循环结构与选择结构的嵌套 在循环结构中可以完整嵌套选择结构即整个选择结构都属于循环体 在选择结构中嵌套 (1)For I= IF Then End IF Next I (2)IF Then For I= Next I End IF (3)For I= IF Then Next I End IF (4)For I= Select Case Case Case 83 End Select Next I (5)Select Case For I= Case Case Next I End Select (6)IF Then For I= End IF Next I 83

95 第 3 章 程序设计的 3 种基本结构 循环结构时, 则要求整个循环结构必须完整地嵌套在一个分支内, 一个循环结构不允许出现 在两个或两个以上的分支内 在下面 For 循环与选择结构组成的嵌套结构中, 只有 (1) ( 2) (4) 的嵌套结构是正确的, 其余都是错误的 3.5 其他控制语句 Goto 语句 Goto 语句将指针无条件地转移到本过程中指定的行 其使用格式如下 GoTo 标号 行号 标号 : 是任何字符的组合, 不区分大小写, 必须以字母开头, 以冒号 (:) 结尾 标号必须是放在行的开始位置 行号 : 行号可以是任何数值的组合, 在使用行号的模块内, 该组合是惟一的 行号必须是放在行的开始位置 说明 : (1)GoTo 只能跳到它所在过程中的行 (2) 在一个过程中, 标号或行号都必须是惟一的 (3)GoTo 语句是非结构化语句, 过多地使用 GoTo 语句, 会使程序代码不容易阅读及调试 建议尽可能地少用或不用 GoTo 语句, 而使用结构化控制语句 Exit 语句 Exit 语句用于退出 Do...Loop For...Next Function 或 Sub 代码块 对应的使用格式为 Exit Do Exit For Exit Function Exit Sub 1.Exit Do 提供一种退出 Do...Loop 循环的方法, 并且只能在 Do...Loop 循环中使用 Exit Do 会将控制权转移到 Loop 语句之后的语句 当 Exit Do 用在嵌套的 Do...Loop 循环中时,Exit Do 会将控制权转移到其所在位置的外层循环 2.Exit For 提供一种退出 For 循环的方法, 并且只能在 For...Next 或 For Each...Next 循环中使用 Exit For 会将控制权转移到 Next 之后的语句 当 Exit For 用在嵌套的 For 循环中时,Exit For 将控制权转移到其所在位置的外层循环 3.Exit Function 执行到该语句, 程序立即从包含该语句的 Function 过程中退出 转回到调用 Function 过程的语句之后的语句继续执行 4.Exit Sub 执行到该语句, 程序立即从包含该语句的 Sub 过程中退出 转回到调用 Sub 过程的语 84 84

96 Visual Basic 6.0 程序设计基础教程句之后的语句继续执行 例如 : 下面的例子使用 Exit 语句退出 For...Next 循环 Do...Loop 循环及子过程 Private Sub Form_Click() Dim I%, Num% Do While True ' 建立无穷循环 For I = 1 To 100 Num = Int(Rnd * 100) Select Case Num Case 10: Exit For Case 50: Exit Do Case 64: Exit Sub End Select Next I Loop ' 循环 100 次 ' 生成一个 0~99 的随机数 ' 如果是 10, 退出 For...Next 循环 ' 如果是 50, 退出 Do...Loop 循环 ' 如果是 64, 退出子过程 End 语句 独立的 End 语句使用形式如下 End 其功能是 : 结束一个程序的运行, 可以放在过程中的任何位置关闭代码执行 关闭以 Open 语句打开的文件并清除变量 返回操作系统 ( 当程序编译成执行文件 ) 或 Visual Basic 系统 ( 程序在 VB 集成环境解释执行 ) End 只是生硬地终止代码的执行, 它不调用 Unload QueryUnload 或 Terminate 事件或任何其他的 Visual Basic 代码 在 Visual Basic 中还有多种形式的 End 语句, 用于结束一个程序块或过程 其形式有 End If End Select End Type End With End Function 等, 它们与对应的语句配对使用 暂停语句 Stop 语句用来暂停程序的执行, 相当于在事件代码中设置断点 语法格式为 Stop 说明 : (1)Stop 语句的主要作用是把解释程序置为中断 (Break) 模式, 以便对程序进行检查和调试 可以在程序的任何地方放置 Stop 语句, 当执行 Stop 语句时, 系统将自动打开立即窗口 (2) 与 End 语句不同,Stop 语句不会关闭任何文件或清除变量 但如果在可执行文件 (.EXE) 中含有 Stop 语句, 则将关闭所有的文件而退出程序 因此, 当程序调试结束后, 在生成可执行文件 (.EXE) 之前, 应清除代码中的所有 Stop 语句 85 85

97 第 3 章 程序设计的 3 种基本结构 With...End With 语句 经常需要在同一对象中执行多个不同的动作, 用 With 语句, 可使该代码更容易编写 阅 读和更有效地运行 语法格式为 : With 对象名 < 与对象操作的语句块 > End With 例如, 需要对同一对象设置几个属性 途径之一是使用多条语句 Private Sub Form_Load() Command1.Caption = " 退出 (E&xit)" Command1.Top = 500 Command1.Left = 4500 Command1.Enabled = True 使用 With...End With 语句, 上面程序的代码如下 Private Sub Form_Load() 说明 : With Command1 End With.Caption = " 退出 (E&xit)".Top = 500.Left = 4500.Enabled = True (1) 程序一旦进入 With...End With 语句, 对象就不能改变, 因此不能用一个 With...End With 语句来设置多个不同的对象 (2) 属性前面的. 不能省略 On Error 语句与 Resume 语句 这两个语句组常常用来处理出错, 即当程序运行过程中, 由于某些数据或用户操作出错时, 程序如何进行处理 程序的错误处理一般是先设置错误陷阱捕获错误, 再进入错误处理程序, 最后退出错误处理 1. 设置错误陷阱用 On Error 语句设置错误陷阱, 捕捉错误, 形式如下 : (1)On Error GoTo 语句标号 ' 发生错误时, 转到 " 语句标号 " 所指示的程序块 86 86

98 Visual Basic 6.0 程序设计基础教程 (2)On Error Resume Next (3)On Error GoTo 0 ' 发生错误时, 忽略错误行, 继续执行下一语句 ' 禁止当前过程中任何已启动的错误 2. 编写错误处理程序编写错误处理程序一般要使用到 Err 对象, 它是一个系统对象, 在 Visual Basic 中, 可以通过 Err 对象来获取错误的消息 当出现 Visual Basic 错误时, 有关错误的信息存储在 Err 对象中 Err 对象每次只维护一个错误的信息 当出现新的错误时,Err 对象将更新为新的错误信息 Err 对象的默认属性是 Number 属性 当运行时发生错误时,Err 对象的属性被填入明确识别错误的信息以及处理这个错误所使用的信息 3. 退出错误处理在错误处理程序中, 当遇到 Exit Sub Exit Function End Function 等语句时, 将退出错误捕获 在错误处理程序结束后, 要恢复原有的运行, 可用 Resume 语句 语法格式为 : (1)Resume ' 重新执行产生错误的语句 (2)Resume Next ' 重新执行产生错误的语句的下一语句 (3)Resume 语句标号 ' 从语句标号初恢复执行一般来说, 一些可以修正的错误, 可使用 Resume, 而在错误处理程序不能修正错误时使用 Resume Next 或 Resume 语句标号 例如, 下面的 Form_Click() 过程是一个错误处理过程的典型用法 Private Sub Form_Click() On Error GoTo out Dim x As Single, y As Single x = 1 / y ' 引发一个 " 除以零 " 的错误 out: Exit Sub MsgBox Err.Number MsgBox Err.Description ' 输出错误信息号 ' 输出错误信息 ' 检查是否发生 " 除以零 " 的错误 If Err.Number = 11 Then y = y + 1 End If Resume ' 重新执行产生错误的语句, 即程序转到执行 x=1/y 语句 程序在执行 x = 1 / y 语句时, 由于 y 未被赋值, 所以其值为 0, 出现错误, 程序转到语句 87 87

99 第 3 章 程序设计的 3 种基本结构 标号 out: 处执行错误处理程序, 然后由 Resume 语句返回到出错的语句, 即 x = 1 / y 语句, 此时由于在错误处理程序中 y 已被赋值, 程序能正常运行了 3.6 应用程序举例 素数与哥德巴赫猜想 例 3.12 判断一个给定的整数是否为素数 编程分析 : 素数指除了能被 1 和自身外, 不能被其他整数整除的自然数 判断整数 N 是 不是素数的基本方法是 : 将 N 分别除以 2,3,,N-1, 若都不能整除, 则 N 为素数 事实上不必除那么多次, 因为 N=Sqr(N)*Sqr(N), 所以, 当 N 能被大于等于 Sqr(N) 的整数整除时, 一定存在一个小于等于 Sqr(N) 的整数, 使 N 能被它整除, 因此只要判断 N 能否被 2,3,, Sqr(N) 整除即可 判断 N 被 I 整除可用表达式 N mod I=0 或 N/I=N\I 或 N/I=Int(N/I) 算法流 程如图 3-28 所示 程序代码写在窗体的单击事件中, 判断结果输出到窗体上 图 3-28 判断素数 N-S 流程图 Private Sub Form_Click() Dim N%, I%, K% N = Val(InputBox(" 输入一个正整数 N=?")) K= Int(Sqr(N)) For I = 2 To K If N Mod I = 0 Then Exit For Next I If I>K Then Print N; " 是素数 " Else Print N; " 不是素数 " End If 88 88

100 Visual Basic 6.0 程序设计基础教程 思考与讨论 : (1) 将过程中的 For/Next 循环分别改用 Do While/Until Loop Do Loop While/Until 循环语句来实现 (2) 如果要打印输出 100 以内的所有素数 只需将上面程序中的 N 分别等于 3,4,, 100 即可, 即在外面加一套 N 的循环, 由于大于 2 的偶数不是素数, 事实上, 只要判断 N 分别等于 3,5,7,,99 时是否为素数就可以了 其算法流程图如图 3-29 所示 读者可以根据该流程图自己写出相应的程序 图 3-29 打印 100 以内的所有素数的 N-S 流程图 例 3.13 编一程序验证哥德巴赫猜想 : 一个大于等于 6 的偶数可以表示为两个素数之和 如 :6=3+3 8=3+5 10= 3+7 编程分析 : 设 N 为大于等于 6 的任一偶数, 将其分解为 N1 和 N2 两个数, 使用 N1+N2=N, 分别判断 N1 和 N2 是否为素数, 若都是, 则为一组解 若 N1 不是素数, 就不必再检查 N2 是否素数 先从 N1=3 开始, 直到 N1=N/2 为止 算法流程图如图 3-30 所示 将程序代码写到窗体的单击事件中 图 3-30 验证哥德巴赫猜想的 N-S 流程图 Private Sub Form_Click() Dim N%, N1%, N2%, I%, K1%, K2% N=Val(InputBox(" 输入大于 6 的偶数 ")) For N1 = 3 To N \ 2 Step

101 第 3 章 程序设计的 3 种基本结构 K1 = Int(Sqr(N1)) For I = 2 To K1 ' 判断 N1 是否是素数 If N1 Mod I = 0 Then Exit For Next I If I > K1 Then ' 如果 N1 为素数, 将 N 分解为 N1+N2 N2 = N - N1 K2 = Int(Sqr(N2)) For I = 2 To K2 ' 判断 N2 是否是素数 If N2 Mod I = 0 Then Exit For Next I If I > K2 Then ' 如果 N2 也为素数, 则打印输出 Print N & "=" & N1 & "+" & N2 End If End If Next N1 思考与讨论 (1) 为什么程序中对 N1 的循环终值要取为 N/2, 步长取为 2? (2) 如果一个偶数有多种可能的分解, 程序是否打印出所有的分解? 如果只打印出一种分解, 应如何修改程序 字符串处理 例 3.14 统计文本框中英文单词的个数 ( 设单词由空格 逗号 分号 感叹号 回车符 换行符作为单词之间的分隔符 ) 编程分析 : (1) 用变量 Last 存放上一次取出的字符 Char 存放当前所取出字符, 变量 Nw 累计单词数, 从左边开始的第 I 个字符的位置用变量 I 存放, 其初值为 1 (2) 从文本 ( 字符串 ) 的左边开始, 取出第 I 个字符值赋给 Char, 如果 Char 是英文字母, 同时它的前一个字符 Last 是为单词分隔符, 则表示当前的字母是新单词的开始, 累计单词数 (3) 将 Char 值赋给 Last I 自增 1, 重复第 2 3 步直到文本末尾 界面设计 : 在窗体上建立文本框 标签和命令按钮控件各一个 运行时的结果如图 3-31 所示 按表 3-4 设置各对象的主要属性, 其他属性为默认值 90 90

102 Visual Basic 6.0 程序设计基础教程 图 3-31 统计文本框中单词数的程序运行界面 表 3-4 各对象的主要属性 控件属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 统计单词数 ") BorderStyle(1) 文本框 1 Name(Text1) Text("") Multiline(True) ScrollBars(2) 图片框 1 Name(Picture1) 命令按钮 1 Name(command1) Caption(" 统计 ") 程序代码如下 Private Sub Command1_Click() Dim Nw As Integer, I As Integer, n As Integer Dim St As String, Char As String, Last As String St = Text1.Text: Last = " ": n = Len(St) For I = 1 To n Char = Mid(St, I, 1) If UCase(Char) >= "A" And UCase(Char) <= "Z" Then Select Case Last ' Last 是单词分隔字符, 回车符 (Chr(13)) 换行符(Chr(10)) Case " ", ",", ";", ".", Chr(13), Chr(10) Nw = Nw + 1 End Select End If Last = Char Next I Label1.Caption = " 共有单词数 :" & Nw 讨论与思考 : (1) 程序中的函数 Ucase 的作用是什么? (2) 为什么将变量 Last 的初值赋值为空格字符? 如果将其赋值为空字符, 即 Last= "", 91 91

103 第 3 章 程序设计的 3 种基本结构 则程序运行会出现什么问题? (3) 分析该程序, 如果在文本框输入了数字和汉字, 能否实现正确统计? 例 3.15 字符的加密和解密 编程分析 : 加密的思想是将每个字母 c 加 ( 或减 ) 一序数 k, 即用它后的第 k 个字母代 替, 变换式公式 :c=c+k 例如序数 k 为 3, 这时 A D, a d,b E, b e... 当加序数后的字母超过 Z 或 z 则 c=c+k 26 例如 You are good! 经上述方法加密后的字符为 Brx duh jrrg! 加密过程如图 3-32 所示 图 3-32 简单的加密过程 解密为加密的逆过程 : 将每个字母 C 减 ( 或加 ) 一序数 K, 即 c=c-k, 例如序数 k 为 3, 这时 Z W,z w,y V,y v 当加序数后的字母小于 A 或 a 则 c=c-k+26 下面在窗体的 Click 事件中给出了加密处理程序, 读者可以上机调试本程序, 并为它设计适当的用户界面, 自己去完成解密处理程序 Private Sub Form_Click() Dim i As Integer, nl As Integer, ia As Integer Dim stri As String, strt As String, strp As String stri = InputBox(" 输入一串字符 ") i = 1: strp = "" nl = Len(RTrim(strI)) Do While (i <= nl) ' 求输入字符的长度 strt = Mid$(strI, i, 1) ' 取第 i 个字符 If (strt >= "A" And strt <= "Z") Then ia = Asc(strT) + 3 If ia > Asc("Z") Then ia = ia - 26 strp = strp + Chr$(iA) ElseIf (strt >= "a" And strt <= "z") Then 92 92

104 Visual Basic 6.0 程序设计基础教程 ia = Asc(strT) + 3 If ia > Asc("z") Then ia = ia - 26 strp = strp + Chr$(iA) Else strp = strp + strt End If i = i + 1 Loop Print stri & " 经加密后为 :" & strp 思考与讨论 : 注意程序中 Do While 循环与 If 选择结构的嵌套关系 试将 If ElseIf Else End If 改用 Selsect Case End Selsect 来实现 迭代法 例 3.16 用迭代法求某个数的平方根 已知求平方根 a 的迭代公式为 : 1 a x1 ( x0 ) 2 x 迭代法在数学上也称 递推法, 由一给定的初值, 通过某一算法 ( 公式 ) 可求得新值, 再由新值按照同样的算法又可求得另一个新值, 经过有限次即可求得其解 编程分析 : 设平方根 a 的解为 x, 可假定一初值 x 0 =a/2( 估计值 ), 根据迭代公式得到一 个新的值 x 1, 这个新值 x 1 比初值 x 0 更接近要求的值 x; 再以新值作为初值, 即 :x 1 x 0, 重 新按原来的方法求 x 1, 重复这一过程直到 x 1 -x 0 <ε( 某一给定的精度 ) 此时可将 x 1 作为问题 的解 将程序代码写在窗体的单击事件中 代码如下 Private Sub Form_Click() Dim x As Single, x0 As Single, x1 As Single, a As Single a = Val(InputBox(" 请输入一个数 a=?")) If Abs(a) < Then x = 0 ElseIf a < 0 Then Print "Data Error" Exit Sub Else 0 x0 = a / 2 ' 取迭代初值 x1 = 0.5 * (x0 + a / x0) Do While Abs(x1 - x0) >

105 第 3 章 程序设计的 3 种基本结构 x0 = x1 ' 为下一次迭代作准备 x1 = 0.5 * (x0 + a / x0) Loop x = x1 End If Print a & " 的平方根为 :"; x 思考与讨论 : (1 ) 上面的 If 语句中在处理 a=0 的情况时, 为什么不用 a=0 来判断, 而改用 Abs(a)< (2) 迭代初值为什么取为 a/2, 可否取其他值? 取不同值对计算结果有影响吗? (3) 将程序求得的结果与直接调用 Visual Basic 系统的库函数 Sqr() 计算结果进行比较 本章小结 1. 本章介绍了结构化程序设计方法及其算法表示, 这对初学程序设计的同学来说可能认识不到它的重性, 其实算法是程序设计的灵魂, 因为要编写一个好的程序, 首先就要设计好的算法 即使一个简单程序, 在编写时也要考虑先做什么, 再做什么, 最后做什么 2. 面向对象的程序设计并不是要抛弃结构化程序设计方法, 而是站在比结构化程序设计更高 更抽象的层次上去解决问题 当它被分解为低级代码模块时, 仍需要结构化编程的方法和技巧 程序都是由顺序结构 选择结构和循环结构 3 种结构的复杂组合 3. 在 Visual Basic 程序设计中, 实现选择结构的语句是 : IF Else End If 语句, 它有多种使用形式 Select Case..End Select 语句 它们的特点是 : 根据所给定的条件成立 (True) 或不成立 (False), 从各实际可能的不同分支中执行某一分支的相应程序块, 在任何情况下总有 无论条件多寡, 必择其一 ; 虽然条件众多, 仅选其一 的特性 4.Visual Basic 中可以使用 4 种循环控件结构, 要注意它们实现循环控制的条件, 在程序中选用哪一种循环语句, 通常要根据具体问题具体分析 一般情况下,For 循环结构用于循环次数已知的循环,Do Loop 语句既可用于循环次数确定的情况, 也可用于那些循环次数难确定, 但控制循环的条件或循环结束的条件容易给出的问题 while Wend 语句与 Do While < 条件 > Loop 实现的循环完全相同 不过在用 Do While < 条件 > Loop 语句实现的循环结构中, 可用 Exit Do 语句退出循环 而在 while Wend 语句中, 却并没有这样的语句可以提前结束循环 使用循环要注意循环控制条件及每次执行循环体后循环控制条件如何改变, 随着一次次循环的执行, 控制循环的条件也应一次次被改变, 使其通过有限次运行后结束循环, 防止出现死循环 94 94

106 Visual Basic 6.0 程序设计基础教程 习题 一 判断题 1. 使用 MsgBox 函数与 MsgBox 过程可接受用户输入数据 2.If 语句中的条件表达式中只能使用关系或逻辑表达式 3. 在 Select Case 情况语句中, 各分支 ( 即 Case 表达式 ) 的先后顺序无关 4. 要实现同样的循环控制, 在 Do While-Loop 和 DO-Loop While 循环结构中给定的循环 条件是一样的 5.Do-Loop While 语句实现循环时, 不管条件真假, 首先无条件地执行一次循环 6.Do-Loop Until 语句实现循环时, 只要条件是假, 循环将一直进行下去 7. 一个 Do 循环只能使用一个 Loop 关键字, 但是可以使用多个 Exit 语句 8.For 循环语句正常结束 ( 即不是通过 Exit For 语句或强制中断 ), 其循环控制变量的 值一定大于 终值, 并等于 终值 + 步长 二 选择题 1. 下面程序段运行后, 显示的结果是 Dimx As Integer If x Then Print x Else Print x+1 (A)1 (B)0 (C)-1 (D) 显示出错信息 2. 下面的程序段求两个数中的大数, 不正确 (A)Max = Iif(x>y,x,y) (B)If x>y Then Max = x Else Max = y (C)Max=x (D)If y>=x Then Max=y If y>=x Then Max =y Max = x 3. 下列循环正常结束的是 (A)i=5 (B)i=1 Do Do i=i+1 i=i+1 Loop Until i<0 Loop Until i=10 (C)i=10 (D)i=6 Do Do i=i+1 i=i-2 Loop while i>0 Loop Until i=1 4. 哪个程序段不能分别正确显示 1! 2! 3! 4! 的值 (A)For i=1 To 4 (B)For i=1 To 4 n=1 For j=1 To i For j=1 To i n=1 n=n*j n=n*j Next j Next j 95 95

107 第 3 章 程序设计的 3 种基本结构 Print n Next i (C)n=1 For j=1 To 4 n=n*j Print n Next j 5. 下段程序执行的输出结果是 Print n Next i (D)n=1:j=1 Do While j<=4 n=n*j Print n j=j+1 Loop (A) (B) (C) (D) S=0:T=0:U=0 For I=1 To 3 For J=1 To I For K=J To 3 S=S+1 Next K T=T+1 Next J U=U+1 Next I Print S;T;U 三 程序阅读 写出下列各段程序执行后的输出结果 1. 程序运行时单击 Command1 后, 输入 , 写出窗体上的输出结果 Private Sub Command1_Click() Dim x As long, y As String x = InputBox(" 输入一个数 ") Do While X 0 Loop y = y & x Mod 10 y = x\lo Mod 10 & y x = x\100 print y 2. 下面程序运行后, 单击窗体, 分别输入数据 时, 标签框 Label1.Caption 的值分别是什么? Private Sub Form_Click() Dim b As Integer 96 96

108 Visual Basic 6.0 程序设计基础教程 a=val(inputbox(" 请输入数据 ",,100)) Select Case a Mod 5 Case Is <4 w=a+10 Case Is <2 w=a * 2 Case Else w=a 10 End Select Label1.Caption="w=" & Str(w) 3. 程序运行后, 在文本框 Text1 输入 abcd12 xyz&, 写出文本框 Text2 中显示的内容 Private Sub Text1_KeyPress(KeyAscii As Integer) Dim k As Integer,c AS string k = KeyAscii c =Ucase(Chr(k)) If c >= "A" And c <= "Z" Then k = k - 3 If k < Asc("A") Then k = k + 26 End If Text2.Text = Text2.Text + Chr(k) 4. 程序运行后, 当单击窗体之后, 窗体上输出的是 Private Sub Form_Click() Dim i%,j% For i = 1 To 5 For j=1 to 2*i-1 Print chr$(65+i-1); Next j Print Next i 5. 下面程序运行后, 在文本框 Text1 中输入 并按回车键后, 写出文本框中显示的内容 Dim n%,m% Private Sub Text1_KeyPress(KeyAscii As Integer) If IsNumeric(Text1) Then Select Case Val(Text1) Mod

109 第 3 章 程序设计的 3 种基本结构 Case 0 n=n+val(text1) Case 1 m=m+val(text1) End Select End If Text1="" Text1.SetFocus IF KeyAsci=13 Then Text1=n & m End If 四 程序填空题 1. 下面程序的功能是 : 计算 f=1-1/(2*3)+1/(3*4)-1/(4*5)+ +1/(19*20) Private Sub Form_Click() Dim f As Single, i As Integer, sign As Integer 1 f = 1 2 f = f + sign / (i * (i + 1)) 3 Next i Print "f="; f 2. 下面程序的功能是 : 输入英文句子, 将其每个单词首字母变为大写字母, 再输出 Public Sub Form_Click() Dim oldsen As String, newsen As String Dim char As String, lastchar As String Dim n As Integer, i As Integer oldsen = InputBox(" 请输入英文句子 :") n = 1 ' 以空格作为单词的界定, 空格后的字母转换为大写字母 lastchar = " " For i = 1 To n char = 2 If lastchar = " " Then char = 3 End If 98 98

110 Visual Basic 6.0 程序设计基础教程 newsen = newsen & char lastchar = 4 Next i Print "input:"; oldsen Print "output:"; newsen 3. 下面的程序是在一个字符串变量中查找 at, 并用消息框给出查找结果的报告, 即没有找到或找到的个数 程序如下 : Public Sub Findat() Dim str1 As String Dim length As Integer Dim sum As Integer Dim i As Integer ' 在字符串 str1 中查找 "at" ' 字符串长度 ' 查到的个数 str1 = InputBox(" 请输入一个字符串 ") length = i = 1 sum = 0 1 Do While i <= 2 If 3 = "at" Then sum = sum + 1 End If i = i + 1 Loop If 4 Then MsgBox " 没有找到!" Else MsgBox " 找到了 " & Str(sum) & " 个 " End If 4. 下面程序的功能是 : 找出 1~1000 之间所有的同构数 所谓同构数是指一个数出现在它的平方数的右端, 如 25 在 25 平方 625 的右端, 则 25 为同构数 Public Sub Form_Click() Dim i As Integer Dim x1 As String, x2 As String For i = 1 To 1000 x1 = 1 ' 将 i 转字符型 x2 = 2 ' 将 i^2 转字符型 If 3 Then Print i; " 是同构数 " 99 99

111 第 3 章 程序设计的 3 种基本结构 End If Next i 5. 下面的程序功能是 : 求 Fabonia 数列的第 17 个数是多少? 第几个数起每个数都超过 1E+8? Public Sub Form_Click() 'Fabonia 数列的前三个数是 0,1,2, 从第四个数起, 每个数都是它前面的两个数之和 Dim last_one As Long,last_two As Long,this_one As Long,i As Integer last_one = 1 ' 数列的第二个数 last_two = 2 ' 数列的第三个数 i = 4 ' 从数列的第四个数求起 Do this_one = last_one + last_two 1 2 If i = 17 Then Print "No:17="; this_one End If 3 Loop While this_one <= # Print "No:"; 4 ; "is > 1E+8" 五 编程题 1. 编写程序, 使用 InputBox 函数输入两个电阻的值, 求它们并联和串联的电阻值, 使用 MsgBox 消息框输出结果, 要求结果保留三位小数 注 : 并联和串联的电阻值计算公式如下 : R1 并联电阻 R P = * R 串联电阻 R S =R 1 +R 2 R R 输入一公元年号, 判断是否是闰年 闰年的条件是 : 年号能被 4 整除但不能被 100 整除, 或者年号能被 400 整除 3. 用 InputBox 函数输入 3 个数据, 如果这 3 个数据能够构成三角形, 计算并在窗体上输出三角形的面积 提示 :(1) 构成三角形的条件是 : 任意两边之和大于第三边 1 (2) 计算三角形面积的公式是 : s x( x a)( x b)( x c), 其中 : x ( a b c) 2 4. 编程计算下列分段函数值 :

112 Visual Basic 6.0 程序设计基础教程 x f ( x) x x x 6, 5x 6, x 1, x 0且 x 3 0 x 10且 x 2及 x 3 其他 具体要求如下 : 分别用 if 语句和 Select Case 语句实现分支 5. 编程序计算 :1!+2!+3!+.+10! n 编程序计算 : 1... ( 1), 精度为 ! 3! 4! n! 7. 编一程序, 显示出所有的水仙花数 所谓水仙花数, 是指一个三位数, 其各位数字立 方和等于该数字本身 例如,153 是水仙花数, 因为 :153= 迭代法求 x 3 a 求立方根的迭代公式为: 2 x1 x 3 0 a 3x 提示 : 初值 x 0 可取为 a, 精度为 a 值由键盘输入 2 0 实验 1. 设计一个字符大小写转换程序, 程序运行界面如图 3-33 所示 当在文本框 Text1 中输 入大写字母时, 在文本框 Text2 中同时显示其小写字母 ; 当在文本框 Text1 中输入小写字母时, 在文本框 Text2 中同时显示其大写字母 ; 当输入其他字符, 在文本框 Text2 中原样输出 图 3-33 程序运行界面图 3-34 华氏温度与摄氏温度的转换 2. 编一个华氏温度与摄氏温度的转换程序, 程序运行效果如图 3-34 转换公式如下 : 9 F C C ( F 32) 9 要求按两种方法进行转换 摄氏温度转换为华氏温度,F 为华氏度 华氏温度转换为摄氏温度,C 为摄氏度 (1) 用命令按钮实现转换 即单击 转换华氏 按钮, 则将摄氏温度转换为华氏温度 ; 同样, 单击 转换摄氏 按钮, 则将华氏温度转换为摄氏温度 (2) 不用命令按钮, 当文本输入时直接完成转换 当用户在 摄氏温度 文本输入框 内输入值后按回车键, 自动将摄氏温度转换为华氏温度 ; 同样, 华氏转换为摄氏的方法也 是如此

113 第 3 章 程序设计的 3 种基本结构 提示 : 在文本框内输入时要激发 KeyPress 事件, 当按回车键时,KeyAscii 的值为 编程, 输入平面上任一点的坐标 (x,y), 判断并显示该点位于哪个象限的信息 例如, 当输入 -2,5 时, 输出 (-2,5) 位于第二象限 运行结果如图 3-35 所示 图 3-35 程序运行界面 提示 : 首先从文本框输入的数据中分离出坐标 x y, 然后再进行判断 4. 设计 健康称 程序, 界面设计如图 3-36 所示 具体要求如下 (1) 将两个文本框的文字对齐方式均设置为右对齐, 最多接受 3 个字符 ; (2) 单击 健康状况 按钮后, 根据计算公式将相应提示信息通过标签显示在按钮下面, 如图 3-36 所示 计算公式为 : 标准体重 = 身高 -105 体重高于标准体重的 1.1 倍为偏胖, 提示 偏胖, 加强锻炼, 注意节食 ; 体重低于标准体重的 90% 为偏瘦, 提示 偏瘦, 增加营养 ; 其他为正常, 提示 正常, 继续保持 图 3-36 健康称 程序运行效果图 3-37 数字组成的示金字塔图案 5. 打印由数字组成的如图 3-37 所示的金字塔图案 6. 计算 π 的近似值,π 的计算公式为 : (2n 2 2 (2n) 1) (2n 1) 要求, 精度为 , 并输出 n 的大小, 注意表达式的书写, 避免数据的 溢出 7. 规范整理英语文章, 即对输入的任意大小写英语文章进行整理 要求 : 句子开头应为大写字母 ( 句子以符号?. 和! 作为结束符的 ), 其他都是小写字母 提示 : 应设置一个变量, 存放当前处理字符的前一个字符, 来判断前一字符是否为句子结束符

114 第 4 章 数组及其应用 Visual Basic 数组是各种计算机程序设计语言中很重要的一个概念, 用于处理大量数据的问题 为了处理方便, 常常把具有相同类型的若干数据按有序的形式组织起来, 这些按序排列的同类型数据元素的集合称为数组 在 Visual Basic 语言中, 一个数组元素可以是基本数据类型 用户定义类型 对象类型, 也可以是变体类型 读者学习本章后, 应该做到 : (1) 理解数组的概念 用途和存放形式 ; (2) 掌握一维数组和二维数组的定义及引用方法 ; (3) 掌握动态数组的定义和使用 ; (4) 能应用数组解决一些常见问题, 如复杂统计 平均值 排序和查找等 4.1 概述 在前面各章中使用的数据, 例如字符串 数值型 逻辑型等都是简单类型的数据 存放这些简单类型的数据的变量称为简单变量 每个变量都有一个单独的名字, 系统给它们分配一存储单元, 通过变量名来实现数据的存取 然而在实际应用中往往需要处理同一性质的成批数据 例如, 要求 60 个学生的平均成绩, 并统计高于平均成绩的学生人数, 如果使用简单变量进行处理, 就需要使用 a 1 a 2 a 3 a 个变量来存放学生成绩, 需要使用 60 个输入语句 ; 再求平均值和统计大于平均值的学生人数, 则程序代码很多 为处理此类具有较多数据的问题,Visual Basic 中采用了数组 在程序中使用数组的最大好处是用一个数组名代表逻辑上相关的一批数据, 用下标表示该数组中的 103

115 Visual Basic 6.0 程序设计基础教程各个元素, 与循环语句结合使用, 使得程序书写简洁 结构清晰 数组并不是一种数据类型, 而是一组相同类型的变量的集合, 数组中的每个数据称为数组的元素, 元素在数组中按线性顺序排列 用数组名代表逻辑上相关的一批数据, 每个元素用下标变量来区分 ; 下标变量代表元素在数组中的位置 高级语言中, 可以定义不同维数的数组 所谓维数, 是指一个数组中的元素, 需要用多少个下标变量来确定 常用的是一维数组和二维数组 一维数组相当于数学中的数列, 二维相当于数学中的矩阵 Visual Basic 中的数组, 按不同的方式可分为以下几类 按数组的大小 ( 元素个数 ) 是否可以改变, 可分为定长数组 动态 ( 可变长 ) 数组 按元素的数据类型可分为数值型数组 字符串数组 日期型数组 变体数组等 按数组的维数可分为一维数组 二维数组 多维数组 对象数组 : 菜单对象数组 控件数组 4.2 一维数组 只有一个下标变量的数组, 称为一维数组 一维数组的声明 Visual Basic 中的数组没有隐式声明, 所有使用的数组必须先声明 后使用 数组的声明包括声明数组名 数组的维数 每一维的元素个数及元素的数据类型 一维数组的声明格式如下 : Dim 数组名 ([< 下界 >to]< 上界 >)[As < 数据类型 >] 或 Dim 数组名 [< 数据类型符 >]([< 下界 >to]< 上界 >) 例如 : Dim a(10) As Integer ' 声明了 a 数组有 11 个元素与上面声明等价形式为 Dim a%(10) 说明如下 (1) 数组名的命名规则与变量的命名规则相同 (2) 数组的元素个数, 由它的 < 下界 > 和 < 上界 > 决定, 即上界 下界 +1 (3) 默认 < 下界 > 为 0, 若希望下标从 1 开始, 可在模块的通用部分使用 Option Base 语句将其设为 1 其使用格式如下 Option Base 0 1 ' 后面的参数只能取 0 或 1 例如 : Option Base 1 ' 将数组声明中默认 < 下界 > 下标设为 1 注意 : 该语句只能放在模块的通用部分, 不能放在任何过程中使用 它只能对本模块中声明时默认下界的数组起作用, 对其他模块的数组不起作用 (4)< 下界 > 和 < 上界 > 不能使用变量, 必须是常量, 常量可以是直接常量 符号常量,

116 第 4 章 数组及其应用 一般是整型常量 其取值不得超过 Long 数据类型的范围 ( ~ ) 若是实数, 系统则自动按四舍五入取整 例如 : M=50 Dim S(M) As Integer Const NUM=50 ' 错误, 因为 M 是变量 Dim Y(NUM) As Integer ' 正确, 因为 NUM 是符号常量 Dim X(3.65) As String ' 等价于 Dim X(4) As String (5) 如果省略 As 子句, 则数组的类型为变体类型 (6) 数组中各元素在内存占一片连续的存储空间, 一维数组在内存中存放的顺序是按下标大小的顺序, 如图 4-1 所示 A(0) A(1) A(2). 图 4-1 数组中各元素的存储顺序 由于数组要在内存中占用连续的存储单元, 为了让系统为它开辟并保留连续的必要的存 储空间, 在使用一个数组之前, 必须先对此数据进行定义 一维数组元素的引用 对于数组必须先定义, 后使用 对数组元素的操作与对简单变量的操作基本一样, 在高级语言中一般只能逐个引用数组元素, 而不能一次引用整个数组 Visual Basic 6.0 中虽然可以将一个数组的内容赋值给另一个数组, 但在实际操作中有许多注意事项 ( 具体参考 VB 系统的在线帮助 ), 建议不要整体使用 使用形式数组名 ( 下标 ) 其中, 下标可以是整型变量 常量或表达式 例如 : 设有数组定义 DIM A(10)As Integer, B(10) As Integer, 则下面的语句都是正确的 A(1)=A(2)+B(1)+5 ' 取数组元素运算, 并将结果赋值给一元素 A(i)=B(i) ' 下标使用变量 B(i+1)=A(i+2) ' 下标使用表达式注意 : 引用时下标不能超界 ( 小于下界或大于上界 ), 否则将出错 如有定义 :Dim A(10)As Integer, 请分析下面程序的错误 For i = 1 To 10 A (i) = InputBox(" 输入 A(" & i & ") 的值 ") Next i Print A(i) 上面的程序段运行后将出现 数组超界错误

117 Visual Basic 6.0 程序设计基础教程 一维数组的基本操作 1. 可通过循环给数组元素的初值 For i = 1 To 10 ' A 数组的每个元素值为 1 A(i)=1 Next i 2. 求数组中最小元素及其下标 Dim a(1 to 10)As Integer Dim min As Integer, p As Integer min = a(1) p= 1 For i = 2 To 10 If a(i) < min Then min = a(i) p = i End If Next i ' 假设第一元素就是最小元素 Print " 数组第 " & p & " 个元素值最小值为 " & min 3. 一维数组的倒置要求 : 将第一个元素与最后一个元素交换 第二个元素与倒数第二个元素交换 第 i 个与第 n-i+1 个元素的交换, 直到 i<=n/2 For i=1 To n\2 t=a(i) : a(i)=a(n-i+1): a(n-i+1)=t Next i 一维数组的应用 1. 统计问题统计是编程中经常用到的算法之一, 一般是根据分类条件, 使用计数器变量进行累加 对于分类较多的情况, 使用数组作为计数器, 可使程序大大简化 例 4.1 编程求某班 60 个学生某门课程考试的平均成绩及高于平均成绩的学生人数 将程序代码写在 Form 的单击事件中, 数据的输入通过 InputBox 来实现 界面设计略, 程序代码如下 : Private Sub Form_Click() Const NUM = 60 ' 声明代表班上学生人数的符号常量 Dim a(num) As Integer, i As Integer

118 第 4 章 数组及其应用 Dim Sum As Integer, Aver As Single, N As Integer Sum = 0 For i = 1 To NUM ' 给 Sum 赋初值 ' 输入学生成绩, 并求和 a(i) =Val( InputBox(" 输入第 (" & i & ") 学生的成绩 ")) Sum = Sum + a(i) Next i Aver = Sum / NUM N = 0 For i = 1 To NUM If a(i) > Aver Then N = N + 1 Next i ' 统计高于平均成绩的人数 Print " 全班平均成绩 :" & Aver & " 共有 " & N & " 高于平均成绩 " 思考与讨论 : 程序中将代表学生人数的量定义为符号常量有什么好处? 例 4.2 段及 100 分的学生人数 编程序统计一批学生考试成绩在 0~9,10~19,20~29,,80~89,90~99 分数 编程分析 : 可另用数组 bn 来存储各分数段的人数, 并用 bn(0) 存储 0~9 分的人数,bn(1) 存储 10~19 分的人数 bn(9) 存储 90~99 分的人数,bn(10) 存储 100 分的人数 实现分段统计的程序代码如下 : Const NUM = 60 Private Sub Form_Click() ' 声明代表班上学生人数的符号常量 Dim a(num) As Integer, i As Integer Dim bn(0 To 10) As Integer, k As Integer For i = 1 To NUM Next i Print ' 输入学生成绩, 并求和 a(i) = InputBox(" 输入第 (" & i & ") 学生的成绩 ") Print a(i); k = Int(a(i) / 10) bn(k) = bn(k) + 1 For i = 0 To 9 Next i ' 打印输出各分数段的学生人数 Print (i * 10) & " ~ " & (i * ) & " 的学生人数 :" & bn(i) Print Tab(10); "100 学生人数 :" & bn(i) 思考与讨论 : (1) 程序中的学生成绩分段是以 10 为一个段, 如果不这样分段, 此程序还能适用吗? 如要求统计 85~100 70~84 60~75 60 分以下的各段人数程序应如何编写? (2) 注意打印输出各段人数程序段的格式控制, 为何要将打印 100 分的人数放到循环

119 Visual Basic 6.0 程序设计基础教程外? 2. 排序问题排序是数据处理中最常见的问题, 它是将一组数据按递增或递减的次序排列 例如对一个班的学生考试成绩排序 多个商场的日平均销售额排序等 排序的算法有很多种, 常用的有选择法 冒泡法 插入法 合并法等 不同算法执行的效率不同, 由于排序要使用数组, 需要消耗较多的内存空间, 因此在处理数据量很大的排序时, 选择适当的算法就显得很重要了 (1) 选择法排序选择法排序的算法思路如下 ( 设按递增排序 ) 1 对有 n 个数的序列 ( 存放在数组 a(n) 中 ), 从中选出最小的数, 与第 1 个数交换位置 ; 2 除第 1 个数外, 从其余 n-1 个数中选最小的数, 与第 2 个数交换位置 ; 3 依此类推, 选择了 n-1 次后, 这个数列已按升序排列 算法流程如图 4-2 所示 选择法排序程序代码段如下 : For i = 1 To n - 1 p = i For j = i + 1 To n If a(p) > a(j) Then p = j Next j temp = a(i) a(i) = a(p) a(p) = temp Next i 图 4-2 选择法排序流程图 (2) 冒泡法排序 ( 升序 ) 冒泡法基本思想 : 将相邻两个数比较, 小的交换到前头 1 有 n 个数 ( 存放在数组 a(n) 中 ), 第一趟将相邻两个数比较, 小的调到前头, 经 n-1 次两两相邻比较后, 最大的数已 沉底, 放在最后一个位置, 小数上升 浮起 ; 2 第二趟对余下的 n-1 个数 ( 最大的数已 沉底 ) 按上述方法比较, 经 n-2 次两两相

120 第 4 章 数组及其应用 邻比较后得次大的数 ; 3 依此类推,n 个数共进行 n-1 趟比较, 在第 j 趟中要进行 n-j 次两两比较 算法流程 如图 4-3 所示 图 4-3 冒泡法排序流程图 冒泡法排序程序段如下 : For i = 1 To n - 1 For j = 1 To n-i If a(j) > a(j+1) Then temp=a(j): a(j)=a(j+1): a(j+1)=temp End if Next j Next i 读者比较选择法排序与冒泡法排序的程序段, 分析一下这两种算法, 哪种算法较好 例 4.3 用随机函数产生 50 个 10~100 的随机整数, 并按由小到大的顺序打印出来 编程分析 : 很显然程序分为三大块, 第一块是使用循环产生 50 个随机整数, 存入数组 a 中 ; 第二块使用前面介绍的两种排序算法之一对数组 a 进行排序 ; 第三块是输出排序后的数据 注意为了方便比较, 在产生数组时, 同时打印输出原始数据 程序代码如下 : Option Base 1 Private Sub From_Click() Dim i As Integer, j As Integer, t As Integer, p As Integer Const N = 50 Dim a(n) As Integer Form1.Cls Print " 排序前数据 :" For i = 1 To N ' 产生 [10,99] 之间的随机整数 a(i) = Int(Rnd * 90) + 10 Print a(i); Next i If i Mod 10 = 0 Then Print ' 每行打印 10 个元素

121 Visual Basic 6.0 程序设计基础教程 Print ' 排序 For i = 1 To N - 1 p = i For j = i + 1 To N If a(p) > a(j) Then p = j Next j t = a(i): a(i) = a(p): a(p) = t ' 交换数据 Next i Print " 排序后数据 :" For i = 1 To N Print a(i); If i Mod 10 = 0 Then Print ' 打印换行 Next i 思考与讨论 : (1) 程序中变量 p 是用来记录最小的数在数组中的位置, 若将 Form_Click() 事件中的语句 If A(p) > A(j) Then p = j 改成 If A(p) > A(j) Then A(p) =A(j) 是否可以? (2) 若改用冒泡排序法实现,Form_Click() 事件代码该如何编写? (3) 程序中事件中语句 If i Mod 10 = 0 Then Print 的作用是什么? 4.3 二维数组及多维数组 二维数组用来处理如二维表格 数学中的矩阵等问题 例如矩阵 A: A= 每个元素需要两个下标 ( 行 列 ) 来确定位置, 如 A 中值为 8 的元素的行是 2, 列为 3, 它们共同确定了其在矩阵 A 中的位置 当用一个数组存储该矩阵时, 每个元素的位置都需要用行和列两个下标来描述, 例如 A(2,3) 表示数组 A 中第 2 行第 3 列的元素 数组 A 是一个二维数组 同理, 数组中的元素有 3 个下标的数组称为三维数组 三维以上的数组也称为多维数组 二维数组的声明 声明格式如下 : Dim 数组名 ([< 下界 >] to < 上界 >,[< 下界 > to ]< 上界 >) [As < 数据类型 >]

122 第 4 章 数组及其应用 其中的参数与一维数组完全相同 例如 : Dim a(2,3) As Single 定义了一个单精度类型二维数组 同一维数组一样, 如果没有使用 Option Base 1 指定下标从 1 开始, 默认下界时都是从 0 开始, 所以上面数组 a 的定义 a(0,0)~a(2,3) 共有 12 个元素 二维数组在内存的存放顺序是 先行后列 例如数组 a 的各元素在内存中的存放顺序是 : a(0,0) a(0,1) a(0,2) a(0,3) a(1,0) a(1,1) a(1,2) a(1,3) a(2,0) (2,1) a(2,2) a(2,3) 二维数组的引用 与一维数组一样, 二维数组也是要先声明, 再使用 引用形式如下 数组名 ( 下标 1, 下标 2) 例如 : a(1,2)=10 a(i+2,j)=a(2,3)*2 在程序中常常通过二重循环来操作使用二维数组元素 二维数组的基本操作 例如, 设有下面的定义 : Const N=4, M=5, L=6 Dim a(1 to N,1 to M) As Integer, i As Integer, j As Integer,k% (1) 给二维数组 a 输入数据的程序段如下 For i=1 to 4 For j=1 to 5 A(i,j)=InputBox( " 输入元素 a(" & i & "," & j & ")=?" ) Next j Next i (2) 求最大元素及其所在的行和列 基本思路同一维数组, 用变量 max 存放最大值,row column 存放最大值所在行列号, 则可用下面程序段实现 : Max = a(1, 1): row = 1: Column = 1 For i = 1 To N For j = 1 To M If a(i, j) > a(row, Column) Then Max = a(i, j) row = i

123 Visual Basic 6.0 程序设计基础教程 Column = j End If Next j Next i Print " 最大元素是 "; Max Print " 在第 " & row & " 行,"; " 第 " & Column & " 列 " (3) 计算两矩阵相乘设有矩阵 A 有 M L 个元素, 矩阵 B 有 L N 个元素, 则矩阵 C=A B 有 M N 个元素 矩阵 C 中任一元素 : l C( i, j) ( A( i, k) B( k, j)) k 1 (i=1,2,,m; j=1,2,,n) 下面是两矩阵相乘的程序段 : For i = 1 To M For j = 1 To N C(i, j) = 0 For k =1To L C(i, j) = C(i, j) + A(i, k) * B(k, j) Next k Next j Next i (4) 求矩阵的转置如果是方阵, 即 A 是 M M 的二维数组, 则可以不必定义另一数组, 否则就需要再定义新数组 方阵转置的程序代码如下 : For i = 2 To M For j = 1 To I-1 Temp=A(i,j) A(i, j) = A(j, i) A(j, i)=temp Next j Next i 如果不是方阵, 则要定义另一个数组 设 A 是 M N 的矩阵, 要重新定义一个 N M 的二维数组 B, 将 A 转置得到 B 的程序代码如下 : For i = 1 To M For j = 1 To N B(j,i) = A(i,j) Next j Next i 读者可以自已设计适当的应用程序界面, 定义相应的变量和数组, 对上面的基本操作进

124 第 4 章 数组及其应用 行调试 理解掌握这些基本操作, 并能应用到一些实际的编程中去 二维数组应用举例 例 4.4 设某一个班共有 60 个学生, 期末考试 5 门课程, 请编一程序评定学生的奖学金, 要求打印输出一 二等奖学金学生的学号和各门课成绩 ( 奖学金评定标准 : 总成绩超过全班总平成绩 20% 发给一等奖学金, 超过全班总平成绩 10% 发给二等奖学金 ) 编程分析 : 此问题需要定义一个存放学生成绩的二维数组, 第一维表示某个学生, 第二维表示该学生的某门课程, 可以将第二维个数定义比实际课程数多一个, 即最后一列存放该学生的总成绩 Option Base 1 Const NUM=60,KCN=5 Private Sub Form_Click() ' 定义存放学生人数和课程数目的符号常量 Dim x(num,kcn+1) As Single ' 存放学生成绩, 第 6 列为该学生的总成绩 Dim i%,j%,k%,sum!,tt!,ver! tt=0 For i=1 to NUM sum=0 For j=1 to KCN ' tt 表示全班总成绩 ' 某一 ( 第 i 个 ) 学生的总成绩 ")) x(i,j)=val(inputbox(" 输入第 " & i & " 位学生的第 " & j & " 门课程成绩 sum=sum+x(i,j) Next j x(i,kcn+1)=sum tt=tt+x(i,kcn+1) Next i ver=tt/num ' 计算全班总平成绩 Print " 学号 " & KCN & " 考试课程成绩 奖学金等级 " For i=1 to NUM If x(i,kcn+1)>=1.2*ver Then Print i ; For j=1 to KCN Print " ";x(i,j); Next j Print " 一等奖学金 " End IF Next i For i=1 to NUM If x(i,kcn+1)>=1.1*ver and x(i,kcn+1)<1.2*ver Then

125 Visual Basic 6.0 程序设计基础教程 Print i ; For j=1 to KCN Next j Print " ";x(i,j); Print " 二等奖学金 " End IF Next i 思考与讨论 : (1) 程序中, 定义符号常量 NUM 和 KCN 代表学生人数和课程数目, 使得程序便于维护 (2) 为什么要将 sum=0 放到 For 语句内, 如果将其移到 For 语句外, 即放在 tt=0 后面, 程序结果正确吗? 多维数组的声明和引用 在处理三维空间问题等其他复杂问题时要使用到三维及三维以上的数组, 通常把三维及三维以上的数组称为多维数组 例如果不是一个班, 而是一个年级多个班, 就要用到三维数组, 用第一个下标代表班号, 第二个下标代表学生序号, 第三个下标学生的课程序号 定义多维数组的格式如下 : Dim 数组名 ([< 下界 >] to < 上界 >,[< 下界 > to ]< 上界 >, ) [As < 数据类型 >] 例如 : Dim a(5,5,5)as Integer ' 声明 a 是三维数组 Dim b(2,6,10,5)as Integer ' 声明 b 是四维数组多维数组的使用与二维数组的使用大同小异, 只要确定各维的下标值, 就可以使用多维数组的元素了 操作多维数组常常要用到多重循环, 一般每一循环控制一维下标 要注意下标的位置和取值范围 另外要说明的是, 由于数组在内存中占据一片连续的存储空间, 多维数组如果每维下标声明太大, 可能造成大量存储空间浪费, 从而严重影响程序的执行速度 例如, 声明一个双精度数组 A(100,100,100), 则存储这一数组需要用 字节的连续存储空间 4.4 动态数组 前两节介绍的数组都是在声明时就确定了数组的维数和每一维的大小, 这种在声明时就确定数组维数及大小的数组, 称为定长数组 但有时在编写程序时, 数组的大小 维数还不能确定, 常常在程序运行时, 需根据用户的操作, 如输入某一数据, 或某一些操作结束才能确定 在这种情况下, 使用动态数组或称可变长数组来处理就比较方便 动态数组是指在声明时未给出数组的大小, 在程序执行时, 再由 Redim 语句来确定维

126 第 4 章 数组及其应用 数及大小, 分配存储空间的数组 这与定长数组不同, 定长数组是在程序编译时分配存储空间 注意 : 在许多 Visual Basic 教材上把 定长数组 称为 静态数组, 可变数组 称为 动态数组 这严格说来是不对的 将 定长数组 称为 静态数组, 容易与 静态变量 的概念混淆, 因为按变量的存储类别来分, 定长数组也有 静态定长数组 ( 在过程中用 Static 定义 ) 和 自动定长数组 ( 在过程中用 Dim 定义 ) 之分 动态数组的建立及使用 建立动态数组包括声明和大小说明两步 (1) 在使用 Dim Private 或 Public 语句声明括号内为空的数组 格式 :Dim 数组名 ( ) As [ 数据类型 ] (2) 在过程中用 ReDim 语句指明该数组的大小 格式 ReDim [Preserve] 数组名 (< 下标 1>[,< 下标 2> ] ) 例 : Dim MyArray() As Integer ' 在过程外声明动态数组 Redim MyArray(5) ' 在过程中定义数组为 5 个元素 Redim Preserve MyArray(15) ' 在过程中定义数组为 15 个元素, 保留数组中原数据说明如下 1 ReDim 语句是一个可执行语句, 只能出现在过程中, 并且可以多次使用, 用来改变数组的维数和大小 2 ReDim 语句的下标可以是常量, 也可以是有了确定值的数值型变量, 这与声明定长数组的下标只能使用常量不同 例如 : 设已在过程中定义 Dim x() As Integer, 则在过程中可以使用下面的语句 Redim x(10) Redim x(20,30) 3 可以使用 ReDim 语句反复地改变数组的元素个数及维数, 但是不能在将一个数组定义为某种数据类型之后, 再使用 Redim 将该数组改为其他数据类型 例如 : 下面的语句是错的 Redim x(10) As Single 4 每次执行 ReDim 语句会使原来数组中的值丢失, 可用 Preserve 参数 ( 可选 ) 保留数组中的原来的数据, 但如果使用了 Preserve 关键字, 就只能重定义数组最末维的大小, 不能改变数组的维数 例如, 如果数组就是一维的, 则可以重定义该维的大小, 因为它是最末维, 也就是仅有的一维 对于二维或更多维数组, 则只有改变其最末维才能同时仍保留数组中的内容

127 Visual Basic 6.0 程序设计基础教程例如, 下面的二维动态数组增加第二维大小, 同时不清除其中所含的任何数据 ReDim X(10, 10)... ReDim Preserve X(10, 15) 例 4.5 通过输入对话框输入一批正整数, 将其中的偶数和奇数分别存入数组 a 和数组 b 中, 然后再以每行 10 个输出数组 a 和 b 界面设计略, 将程序代码写在窗体的单击事件中, 结果输出到窗体上 Private Sub Form_Click() Dim a() As Integer, b() As Integer Dim os%, js%, n%, i% ' 声明两个可变数组 n = Val(InputBox(" 输入一个, 输入 -1 结束 ")) Do While n <> -1 If n Mod 2 = 0 Then os = os + 1 ReDim Preserve a(os) a(os) = n Else js = js + 1 ReDim Preserve b(js) b(js) = n End If ' 当输入 -1 时结束 ' 判断是不是偶数 ' 重新定义数组 a 的大小, 并存持原来的值 n = Val(InputBox(" 输入一个, 输入 -1 结束 ")) Loop Print " 输入的偶数有 :" For i = 1 To os Print a(i); Spc(2); If i Mod 10 = 0 Then Print Next i Print ' 输出 10 个数据后换行 Print " 输入的奇数有 :" For i = 1 To js Print b(i); Spc(2); If i Mod 10 = 0 Then Print Next i 上面的例子中, 因为编程序时不知道要输入多少个数据, 因此若使用定长数组, 就需要将数组 a 和 b 定义的足够大, 这样就会造成较大的存储空间浪费 使用动态数组便可解决这个矛盾

128 第 4 章 数组及其应用 与数组操作有关的几个函数 1.Array 函数使用问题 Array 函数可方便地对数组整体赋值, 但它只能给声明为 Variant 的变量或仅由括号括起 的动态数组赋值 赋值后的数组大小由赋值的个数决定 例如, 要将 1,2,3,4,5,6,7 这些值赋值给数组 a, 可使用下面的方法赋值 Dim a() a=array(1,2,3,4,5,6,7) Dim a a=array(1,2,3,4,5,6,7) 注意 : 使用 Array 函数建立动态数组的下界由 Option Base 语句指定的下界决定, 缺省情况为 0 2. 求数组指定维数的上界 下界 Array 函数可方便地对数组整体赋值, 但在程序中要获得数组的上界 下界, 以保证访 问的数组元素在合法的范围内, 则可使用 Ubound 和 Lbound 函数 Ubound 函数和 Lbound 函数分别用来确定数组某一维的上界和下界值 使用形式如下 说明如下 UBound(< 数组名 >[, <N>]) LBound(< 数组名 > [, <N>]) < 数组名 >: 必需的 数组变量的名称, 遵循标准变量命名约定 <N> : 可选的, 一般是整型常量或变量 指定返回哪一维的上界 1 表示第一维,2 表 示第二维, 等等 如果省略默认是 1 例如, 要打印动态数组 a 的各个值, 可通过下面程序段实现 : For I=Lbound(a) To Ubound(a) Next Print I a(i) 3.Split 函数 使用 Split 函数可从一个字符串中, 以某个指定符号为分隔符, 分离若干个子字符串, 建 立一个下标从零开始的一维数组 使用格式 : Split(< 字符串表达式 > [,< 分隔符 >]) 说明如下 < 字符串表达式 >: 必需的 包含子字符串和分隔符的字符串表达式 如果 < 字符串表达 式 > 是一个长度为零的字符串 (""), 则 Split 返回一个空数组, 即没有元素和数据的数组

129 Visual Basic 6.0 程序设计基础教程 < 分隔符 >: 可选的 用于标识子字符串边界的字符串字符 如果忽略, 则使用空格字符 (" ") 作为分隔符 如果 < 分隔符 > 是一个长度为零的字符串, 则返回的数组仅包含一个元素, 即完整的 < 字符串表达式 > 字符串 应用举例 例 4.6 在一个文本框中, 输入多个用, 分隔的整数, 按回车键后, 将各数据按升序 打印输出在窗体上 程序运行情况如图 4-4 所示 图 4-4 程序运行情况 根据题意, 此题程序代码应写在文本框的 KeyPress 事件中, 程序如下 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Dim i%, j%, p%, n%, m%, t% Dim b() As Integer, a() As String ' 将文本框输入的文本, 以 "," 为分隔符分离字符子串存入数组 a 的各元素中 a = Split(Text1.Text, ",") n = LBound(a): m = UBound(a) ReDim b(n To m) ' 重新定数组 b For i = n To m ' 将数组 a 中的数字字符串转化成数字存入数组 b 中 b(i) = Val(a(i)) Next i For i = n To m - 1 ' 排序 p = i For j = i + 1 To m If b(p) > b(j) Then p = j Next j t = b(i): b(i) = b(p): b(p) = t Next i For i = n To m Print b(i); Next i End If ' 将排序后的数据输出到窗体上

130 第 4 章 数组及其应用 思考与讨论 : (1) 如果在文本框中输入的数据包含非数字字符, 程序运行会出现什么情况? (2) 如果文本框中数据输入使用空格分开, 应如何修改程序? 本章小结 1. 数组的概念通常数组用来存放具有相同性质的一组数据, 即数组中的数据必须是同一个类型 数组元素是数组中的某一个数据项, 引用数组通常是引用数组元素, 数组元素的使用同简单变量的使用类似 数组可以被看作一组带下标的变量集合, 系统分配一块连续的内存空间来存放数组中的元素 当所需处理的数据个数确定时, 通常使用定长数组, 否则应该考虑使用动态数组 2. 数组的声明 Visual Basic 中使用数组必须先定义, 后使用, 长度可变的动态数组, 使用之前还必须通过 ReDim 确定其维数及每一维的大小 声明一个已确定数组元素个数的数组 : Dim 数组名 ([ 下界 To ] 上界 [,[ 下界 To] 上界 [, ]]) As 类型关键字它声明了数组名 数组维数 数组大小 数组类型 下界 上界必须为常数, 不能为表达式或变量, 若省略下界, 则默认为 0, 也可用 Option Base 语句将默认下界设置为 1 声明一个长度可变的动态数组 : Dim 数组名 ()As 类型关键字 ReDim [Preserve ] 数组名 ([ 下界 To] 上界 [,[ 下界 To] 上界 [, ]]) 其上界 下界可以是赋了值的变量或表达式 若有 Preserve 关键字, 表示当改变原有数组最末尾的大小时, 可以保持数组中原来的数据 3. 数组的操作对数组的操作通常需要使用循环控制结构来实现 数组的基本操作有 : 数组初始化 数组输入 数组输出 求数组中的最大 ( 最小 ) 元素及下标 求和 数据倒置等 应用数组解决的常用问题有 : 复杂统计 平均值 排序和查找等 习题 一 判断题 1. 在使用 ReDim 重定义动态数组时的下标可以用变量来表示

131 Visual Basic 6.0 程序设计基础教程 2. 使用 ReDim 语句既可以改变数组的大小, 也可以改变数组类型 3. 若要定义数组下标下界默认值为 2, 则可用语句 Option Base 2 4. 在 Visual Basic 中, 用 Dim 定义数组时, 数组元素也自动赋初值为 0 5. 数组在内存中占据一片连续的存储空间 二 选择题 1. 以下程序输出的结果是 Dim a, i% a=array(1,2,3,4,5,6,7) For i =Lbound(A) to Ubound(A) a(i)=a(i) *a(i) next i print a(i) (A)49 (B)0 (C) 不确定 (D) 程序出错 2. 以下程序输出的结果是 Private Sub Command1 click() Dim a%(3,3), i%, j% For i=1 to 3 for j=1 to 3 If j>1 and i>1 then a(i,j)=a(a(i-1,j-1),a(i,j-1))+1 Else a(i,j)=i*j End if Print a(i,j); ; Next j Print Next I (A)1 2 3 (B)1 2 3 (C)1 2 3 (D) 程序运行后, 单击窗体, 输入的数据为 8, 则输出结果为 Private Sub Form_Click() Dim ia, i%, n%,t% n=inputbox("enter N=?") ia=array(1,2,3,4,5,6,7,8,9,10) For i =1 To n\2 t=ia(i) : ia(i)=ia(n-i+1) : ia(n-i+1)=t

132 第 4 章 数组及其应用 Next i For i=0 to Ubound(iA) Print ia(i); Next i (A) (B) (C) (D) 三 程序填空 1. 下面的程序是将输入的一个数插入到递减的有序数列中, 插入后使该序列仍有序 Private sub form_click() Dim a,i%,n%,m% a=array(29,21,15,13,11,9,7,5,3,1) n=ubound(a) Redim m=val(inputbox(" 输入欲插入的数 ")) For i = ubound(a) -1 to 0 step-1 If m>=a(i) then else if i = 0 then a(i) =m exit for end if Next i For i = 0 to Print a(i) Next i 2. 下程序产生并输出一个 4 4 的二维矩阵, 将其转置后, 再在窗体上输出 Public Sub Form_Click() Dim a(4, 4) As Integer Dim k, j, t As Integer For k = 1 To 4 For j = 1 To 4 a(k, j) = int(rnd*10)+1 Form1.Print (a(k, j)); Next j

133 Visual Basic 6.0 程序设计基础教程 Next k Form1.Print For k = 2 To 4 For j = 1 To Next j Next k For j = 1 To 4 Form1.Print a(j, 1); a(j, 2); a(j, 3); a(j, 4) Next j 3. 下面的程序产生 100 个 [0,99] 范围内的随机整数, 统计个位上的数字分别为 1,2,3, 4,5,6,7,8,9,0 的数的个数 Public Sub Calculate() Dim X(1 To 10) As Integer, A(1 To 100) As Integer Dim P As Integer, J As Integer For J = 1 To 100 A(J) = P = A(J) - Int(A(J) / 10) * 10 If P = 0 Then X(P) = X(P) + 1 Next J Form1.Print " 个位数的个数 " For J = 1 To 10 If J =10 Then Form1.Print " 个位数是 " & P & " 有 " & X(J) & " 有个数 " Next J 四 编程题 1. 用随机函数产生 50 个 10~100 之间的整数, 并按升序且每行 10 个数打印输出到窗体上 2. 使用输入对话框输入 100 个整数, 放入数组 a 将其中的偶数放入数组 b, 然后运用选择法将数组 b 中的数据按从大到小的顺序排序, 并将数组 b 以每行 10 个数据在窗体上输出 3. 编制程序, 打印一个 5 行 5 列的数字方阵, 使两对角线上元素均为 0, 其余均为 1 要求打印的数字方阵两列数字之间空 3 格, 两行数字之间空一行 4. 用随机函数产生 30 个 10~50 之间的整数, 存放于一个数组中, 并打印输出到窗体

134 第 4 章 数组及其应用 上 然后将其中相同的数删除, 只保留最前面的一个, 再打印输出删除后的数组 5. 编制程序, 用随机函数产生 20 个两位数的整数, 存于 4 行 5 列的二维数组中, 将数 组按行 ( 矩阵形式 ) 输出到窗体, 并求出其中的最大元素及它的行 列坐标 实验 1. 在一维数组中利用元素移位的方法显示如图 4-5 所示的结果 2. 随机产生 10 个任意的二位正整数并存放在一维数组中, 求数组的最大值 平均值, 并实现将数据按升序排列 使用 InputBox 函数在数组中插入一个新数据, 并使数组仍然按升序排列, 结果显示在图片框中, 程序运行运行情况如图 4-6 所示 图 4-5 运行界面图 4-6 程序运行界面 3. 打印如图 4-7 所示的杨辉三角形 ( 杨辉三角形为一个下三角矩阵, 每一行第一个和主对角线上元素都为 1, 其余每一个数正好等于它上面一行的同一列与前一列数之和 ) 4. 输入一系列字符串, 按升序排列输出 要求 : (1) 每输入一个字符串, 按回车键后即把该字符串存放到数组中, 并输出在排序前的文本框 Text2 中 图 4-7 杨辉三角形 (2) 单击 排序 命令按钮, 字符数组 升序 排序, 并在排序后的文本框 Text3 中输出 (3) 程序运行后窗体界面如图 4-8 所示 提示 : (1) 定义窗体级字符型动态数组 s 和整型变量 n( 表示输入字符串的个数 ), 即在通用声明段声明如下 : Dim n As Integer,s() As String

135 Visual Basic 6.0 程序设计基础教程 图 4-8 程序运行界面 (2) 在文本框 Text1 的 KeyPress 事件中编写程序处理输入单词, 并存入数组中, 同时记录输入次数 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then End If ' 此处写处理输入单词, 并存入数组中, 同时记录输入次数

136 第 5 章 过 程 在前面章节的学习中, 我们使用系统提供的事件过程和内部函数进行程序设计 事实上,Visual Basic 允许用户定义自己的过程和函数 用户使用自定义函数和过程, 不仅能够提高代码利用率, 并且使得程序结构更为清晰简洁, 便于调试和维护 读者学习本章后, 应该做到 : (1) 掌握 Sub 子程序和 Function 函数过程的定义和调用方法 ; (2) 掌握各子过程或函数调用之间数据按传址和传值传递方式的区别及其用途 ; (3) 理解过程的嵌套调用和递归调用的执行过程 ; (4) 掌握过程的作用域 变量的作用域和生存期 ; (5) 了解多模块程序设计的方法 5.1 过程概述 在设计程序时, 有些程序代码常常需要重复执行, 或者许多个程序都要进行同类的操作 这些重复执行的程序是相同的, 只不过每次都以不同的参数进行重复罢了 例如在第 3 章例 3.10 中验证哥德巴赫猜想的程序中, 判断 N1 和 N2 是否是素数的两段程序几乎完全相同 若将判断任意整数 N 是否是素数写成一个返回逻辑值的函数 ( 见例 5.2), 则此程序结构就变得简单清晰 ( 见例 5.3) 将程序分割成一些较小的 完成一定任务的 相对独立的程序段 ( 通常称为逻辑部件 ), 以简化程序设计, 称这些部件为过程 它们可以变成增强和扩展 Visual Basic 的构件 过程可用于压缩重复程序或共享程序, 用过程编程有两大好处 : 125

137 Visual Basic 6.0 程序设计基础教程 (1) 过程可使程序划分成离散的逻辑单元, 每个单元都比无过程的整个程序容易调试 (2) 一个程序中的过程, 往往不必修改或只需稍作改动, 便可以成为另一个程序的构件 一个过程程序仍然由顺序 选择 循环这 3 种基本结构所组成, 但它却有自己的特点, 主要体现在主程序与子程序之间的数据输入 输出, 即主程序与子程序之间的数据传递 在 Visual Basic 中, 除了系统提供的内部函数过程和事件过程外, 用户可自定义下列 4 种过程 : Sub 保留字开始的为子过程, 不返回值 ; Function 保留字开始的为函数过程, 返回一函数值 ; Property 保留字开始的为属性过程, 返回并指定值, 以及设置对象引用 ; Event 保留字开始的事件过程 本章主要介绍 Sub 子过程和 Function 函数过程 5.2 Sub 过程 在 Visual Basic 中, 有两类子过程 (Sub): 事件过程和自定义过程 ( 也称通用过程 ) 事件过程 当 Visual Basic 中的对象对一个事件被触发时, 便自动用相应的事件名调用该事件的过程 事件名在对象和代码之间建立了一种联系, 事件过程是附加在窗体和控件上的程序 一个控件的事件过程将控件的实际名字 ( 在 Name 属性中规定的 ) 下划线 (_) 和事件名组合起来 例如, 如果希望在单击了一个名为 CmdOk 的命令按钮之后, 这个按钮会调用事件过程, 则要使用 CmdOk_Click() 过程 一个窗体事件过程将词汇 Form 下划线和事件名组合起来 例如, 如果希望在单击窗体之后, 窗体会调用事件过程, 则要使用 Form_Click() 过程 控件事件的语法格式如下 Private Sub 控件名 _ 事件名 ( 参数列表 ) < 语句组 > 窗体事件的语法格式如下 Private Sub Form_ 事件名 ( 参数列表 ) < 语句组 > 其中,< 语句组 > 就是程序设计者编写的在该事件发生后完成的操作的程序代码 虽然可以自己编写事件过程, 但使用 Visual Basic 提供的代码过程会更方便, 这个过程自动将正确的过程名包括进来 从 对象框 中选择一个对象, 从 过程框 中选择一个过程, 就可在 代码编辑器 窗口中生成一个模板 例如 : 当对象选为窗体 Form, 过程选择为 Click, 则在代码窗口就生成如下模板, 用户把单击窗体要做的操作写入其中就可以了

138 第 5 章 过程 Private Sub Form_Click() 注意 : 在开始为控件编写事件过程之前, 一般应先设置控件的 Name 属性, 如果对控件事件过程编写代码之后, 又更改控件的名字, 那么也必须更改过程名, 以符合控件的新名字 否则,Visual Basic 无法自动使控件名和过程名相符 当过程名与控件名不符时, 此过程就成为通用过程 自定义过程 (Sub 过程 ) 当几个不同的过程要执行同样的程序段, 为了不必重复编写代码, 可以采用子过程来实 现 子过程只有在被调用时才起作用, 它一般由事件过程来调用 子过程可以保存在窗体模 块 (.Frm) 和标准模块 (.Bas) 中 子过程的定义形式如下 [Public Private] [Static] Sub 子过程名 ( [ 形式参数列表 ] ) < 局部变量或常数定义 > < 语句组 > [Exit Sub] < 语句组 > 说明如下 (1)Sub 过程以 Sub 开头, 以 结束, 在 Sub 和 之间是描述过程操作的 语句块, 称为 过程体 或 子程序体 (2) 子过程名 : 命名规则与变量名规则相同 子过程名不返回值, 而是通过形参与实参 的传递得到结果, 调用时可返回多个值 (3) 形式参数列表 : 形式参数通常简称 形参, 该列表仅表示形参的类型 个数 位 置, 定义时是无值的, 只有在过程被调用时, 虚实参结合后才获得相应的值 过程可以无形 式参数, 但括号不能省 参数的定义形式 :[ByVal ByRef] 变量名 [( )][As 类型 ][, ] ByVal 表示当该过程被调用时, 参数是按值传递的 ; 默认或 ByRef 表示当该过程被调用 时, 参数是按地址传递的 形参可以是简单变量, 也可以是数组 例 5.1 编一个交换两个整型变量值的子过程 Private Sub Swap( X As Integer, Y As Integer) Dim temp As Integer Temp=X : X=Y : Y=Temp 当然也可将其过程的第一语句等价写为 :Private Sub Swap( X%, Y%) 或写为 :Private Sub Swap( ByRef X As Integer, Byref Y As Integer) (4) 可选项 [Public( 全局 ) Private( 局部 )] [Static( 静态 )]: 其意义及其作用在

139 Visual Basic 6.0 程序设计基础教程 节中详细讨论 (5)Exit Sub 语句 : 表示退出子过程 子过程的建立 自定义子过程常常创建和保存在窗体文件 (.FRM) 和标准文件 (.BAS) 中 可以在窗体的 代码窗口 或标准模块的 代码窗口 中直接按定义形式输入, 也可以通过选择 工具 菜单中的 添加过程 命令, 出现 添加过程 对话框, 如图 5-1 所示, 选择过程类型 ( 子过程 函数 属性 事件 ) 及作用范围 ( 公有的 Public 私有的 Private), 单击 确定 按钮后得到一个过程或函数定义的结构框架 ( 模板 ), 如 : Public Sub Sort( ) 如果需要形参, 则必须在括号中填写形参的定义 过程中的代码当然要由用户自己根据问题的要求来写入 图 5-1 添加过程 对话框 过程的调用 Visual Basic 中过程的调用有两种方法, 调用格式如下 : 过程名 [ 实参数列表 ] Call 过程名 ( 实参数列表 ) 例 : 调用上面定义的 Sawp 子过程的形式如下 Swap a,b Call Swap(a,b) 注意 : 用过程名调用时必须省略参数两边的 () 使用 Call 语句调用时, 参数必须在括号内, 除非没有参数, 则 () 也能省 在调用时, 实参和形参的数据类型 顺序 个数必须匹配 调用时的参数是实参, 实参可以是变量 常数 表达式和数组 如果希望传递地址, 实参应是变量或数组 根据过程的调用关系, 如果过程 A 调用过程 B, 则将过程 A 称为主调过程, 过程 B 称为被调过程 主调过程与被调过程是相对的, 一般来说, 一个过程既可作主调过程又可以作

140 第 5 章 过程 被调过程 图 5-2 所表示的是过程调用的执行过程 在图 5-2 中, 主调过程 CmdOk 第一次调用子过程 Swap, 从第一个调用语句 Call Swap(a,b) 处转到执行子过程 Swap, 在子过程中从第一条 Sub( 或函数过程 Function) 语句开始执行子过程 Sawp 中的程序代码, 当执行到子过程的 ( 或函数过程 End Function) 语句时, 便返回到主过程中调用本次子过程语句的下一条语句, 并由此继续执行本程序 从 Call Swap(a,b) 语句开始的调用与返回如图中的实箭头线表示 当程序流程执行主过程 CmdOK 中子过程调用语句 Swap a,b 时, 程序流程则再次转去执行子过程 Swap, 从子程序的 语句返回到本次调用子过程语句的下一条语句, 再继续执行主过程中的其他语句, 如图中的长虚箭头线表示 图中细点画线表示参数的传递 图 5-2 调用子过程的示意图 5.3 Function 过程 Visual Basic 函数分为内部函数和外部函数 内部函数是系统预先编好的 能完成特定功能的一段程序, 如 Sqr Cos Len 等 关于内部函数请参阅 2.5 节 外部函数是用户根据需要用 Function 关键字定义的函数过程, 与子过程不同的是函数过程将返回一个值 函数过程 (Function 过程 ) 的定义 和子过程一样, 函数过程也是用来执行一个特定任务的独立程序代码 与 Sub 子过程不同的是,Function 函数过程返回一个值到调用的表达式 函数过程的定义形式如下 [Public Private][Static]Function 函数名 ([< 参数列表 >])[As< 类型 >]

141 Visual Basic 6.0 程序设计基础教程 < 局部变量或常数定义 > < 语句块 > [ 函数名 = 返回值 ] [Exit Function] 函数体 < 语句块 > [ 函数名 = 返回值 ] End Function 说明如下 (1) 函数名 : 命名规则与变量名规则相同, 但不能与系统的内部函数或其他通用子过程同名, 也不能与已定义的全局变量和本模块中模块级变量同名 (2) 在函数体内, 函数名可以当变量使用, 函数的返回值就是通过对函数名的赋值语句来实现的, 即函数值通过函数名返回, 因此在函数过程中至少要对函数名赋值一次 (3)AS 类型 : 是指函数返回值的类型, 若省略, 则函数返回变体类型值 (Variant) (4)Exit Function: 表示退出函数过程, 常常是与选择结构 (If 或 Select Case 语句 ) 联用, 即当满足一定条件时, 退出函数过程 (5) 形参列表 : 形参的定义与子过程完全相同 例 5.2 将第 3 章的例 3.9 判断一个整数是不是素数的程序改写成函数过程 如果给定的整数是素数, 则返回逻辑值 True, 否则返回 False 程序代码如下 Private Function Prime(n As Integer) As Boolean Dim k%,yes As Boolean Yes=True For k=2 to Int(Sqr(n)) IF n mod k =0 then Yes=False : Exit For Next k Prime=Yes ' 给函数名赋值, 作为函数的返回值 End Function 思考与讨论 : (1) 为什么要将变量 Yes 的初值赋值为 True? (2) 调用该函数来实现例 3.9 判断一个整数是不是素数的程序如下 Private Sub Form_Click() Dim N As Integer N = Val(InputBox(" 输入一个正整数 N=?")) If prime(n) Then ' 等处可以写成 If prime(n)=true Then print N; " 是素数 " Else print N; " 不是素数 " End If

142 第 5 章 过程 函数的调用 通常, 调用自定义函数过程的方法和调用 Visual Basic 内部函数过程 ( 例如 Sqr) 的方 法一样, 即在表达式中写上它的名字 调用形式如下 函数名 ( 实参列表 ) 注意 : 在调用时实参和形参的数据类型 顺序 个数必须匹配 函数调用只能出现在表 达式中, 其功能是求得函数的返回值 例 5.3 用例 5.2 中 prime() 函数, 改写第 3 章例 3.10 验证哥德巴赫猜想 大于 6 的 偶数可以分为两个素数的和 的程序 将程序写在窗体的单击事件中, 代码如下 Private Sub Form_Click() Dim n%,n1%,n2% n=val(inputbox(" 输入大于 6 的偶数 ")) For n1=3 to n\2 step 2 n2=n-n1 ' 让 n1 从 3 开始分解 ' 求得 n2 If prime(n1) And prime(n2) then ' 如果 n1 和 n2 都是素数, 则打印输出 Print n & "=" & n1 & "+" & n2 Exit For End if Next n1 思考与讨论 : ' 结束循环 (1) 程序中的 Exit For 语句的作用是结束循环, 如果不用此语句, 程序将输出结果所有 可能的分解情况 (2) 程序可改写成如下形式, 请读者分析它们执行过程的异同 Private Sub Form_Click() End Dim n%,n1%,n2% n=val(inputbox(" 输入大于 6 的偶数 ")) For n1=3 to n\2 step 2 ' 让 n1 从 3 开始分解 If prime(n1) then ' 如果 n1 素数 End if Next Sub n2=n-n1 ' 求得 n2 If prime(n2) then ' 如果 n1 和 n2 都是素数, 则打印输出 Print n & "=" & n1 & "+" & n2 Exit For End if n1 ' 结束循环

143 Visual Basic 6.0 程序设计基础教程 5.4 过程之间参数的传递 Visual Basic 中不同模块 ( 过程 ) 之间数据的传递有两种方式 : 通过过程调用实参与形参的结合实现 ; 使用全局变量来实现各过程中共享数据 关于全局变量我们将在下一章专门讨论, 本节讨论使用参数实现过程间数据的传递 形式参数与实际参数 1. 形式参数形式参数是指在定义通用过程时, 出现在 Sub 或 Function 语句中变量名后面圆括号内的参数, 用来接收传送给子过程的数据, 形参表中的各个变量之间用逗号分隔 2. 实际参数实际参数是指在调用 Sub 或 Function 过程时, 写入子过程名或函数名后括号内的参数, 其作用是将它们的数据 ( 数值或地址 ) 传送给 Sub 或 Function 过程与其对应的形参变量 实参表可由常量 表达式 有效的变量名及数组名 ( 后加左 右括号, 如 A()) 组成, 实参表中各参数用逗号分隔 参数传递 ( 虚实结合 ) 参数传递指主调过程的实参 ( 调用时已有确定值和内存地址的参数 ) 传递给被调过程的形参, 参数的传递有两种方式 : 按值传递和按地址传递 形参前加 ByVal 关键字的是按值传递, 默认或加 ByRef 关键字的为按地址传递 (1) 按值传递 : 将实参的数值传递给过程中对应的形参变量 按值传递参数时,Visual Basi c 给传递的形参分配一个临时的内存单元, 将实参的值传递到这个临时单元中去 按值传递是单向的, 如果在被调用的过程中改变了形参变量的值, 则只是临时单元的值变动, 不会影响实参变量本身, 当被调过程结束返回主调过程时,Visual Basic 将释放形参变量的临时内存单元, 实参变量的值不变 (2) 按地址传递 : 形参前没有 ByVal 关键字或用 ByRef 关键字说明的, 是一种将实参数的地址传递给过程中对应形参变量的方式, 形参变量和实参变量具有相同的地址, 即形参 实参共用一存储单元 如果在被调过程中改变形参变量的值, 则返回后相应实参变量的值也被改变 因此, 按地址传递是双向传递 下面通过一个例子来说明 例 5.4 分别用 传值 传址 编写交换两变量 x y 的子过程 Swap1 和 Swap2 在 Form_Click() 事件中分别调用 Swap1 和 Swap2 过程, 并输出交换后的值 程序代码如下

144 第 5 章 过程 Public Sub swap1(byval x As Integer, ByVal y As Integer) ' 形参定义为传值方式 Dim t As Integer t = x: x = y: y = t Public Sub swap2(x As Integer,y As Integer) Dim t As Integer t = x: x = y: y = t Private Sub Form_Click() Dim a As Integer, b As Integer ' 形参定义为传地址方式 ' 窗体的单击事件 a = Val(InputBox(" 输入 A=?")) b = Val(InputBox(" 输入 B=?")) Print " 交换前 :", "a="; a, "b="; b Swap1 a, b ' 调用子过程 Swap1 Print " 交换后 :", "a="; a, "b="; b 程序运行后, 单击窗体, 输入两个值, 例如 10 和 20, 输出结果如图 5-3 所示, 若将单击事件中的 Swap1 a,b 改为 Swap2 a,b, 其输出结果如图 5-4 所示 图 5-3 调用 Swap1 的输出结果图 5-4 调用 Swap2 的输出结果从输出结果可以看到, 调用子过程 Swap1 没能交换变量的值, 其原因是 : 过程 Swap1 采用传值形参, 过程被调用时系统给形参分配临时内存单元 x 和 y, 将实参 a 和 b 的值分别传递 ( 赋值 ) 给 x 和 y, 如图 5-5(b), 在过程 Swap1 中, 变量 a b 不可使用,x y 通过临时变量 t 实现交换, 如图 5-5(c), 调用结束返回主调过程后形参 x y 的临时内存单元将释放, 实参单元 a 和 b 仍保留原值, 如图 5-5(d) 值传递的执行过程如图 5-5 所示 图 5-5 值传递的执行过程 子过程 Swap2 采用传地址形参, 当调用子过程 Swap2 时, 通过虚实结合, 形参 x y 获 得实参 a b 的地址, 即 x 和 a 使用同一存储单元,y 和 b 使用同一存储单元, 见图 5-6(b)

145 Visual Basic 6.0 程序设计基础教程因此, 在被调子过程 Swap2 中 x y 通过临时变量 t 实现交换后, 实参 a 和 b 的值也同样被交换, 见图 5-6(c), 当调用结束运行返回后,x y 被释放, 实参 a b 的值就是交换后的值 通过地址传递数据的执行过程如图 5-6 所示 图 5-6 通过地址传递数据的执行过程 有关过程之间数据传递的几点说明 1. 参数的数据类型在定义子过程和函数过程时, 一般要求说明形参变量的数据类型, 若形参被默认类型说明, 则此时形参为 Variant 数据类型, 由调用时实参的数据类型来确定, 这样程序的执行效率低, 且容易出错 关于 Visual Basic 的数据类型, 请参阅第 2 章有关内容 2. 形参与实参数据类型要求相同当按地址传递时, 形参与实参的数据类型必须相同, 否则就会出错 当按值传递时, 实参数据类型如与形参类型不同, 系统将实参的数据类型转换为形参的数据类型, 然后再传递 ( 赋值 ) 给形参, 如果实参的数据类型不能转换, 则会出错 3. 调用实参使用形式与形参传递方式在子过程和函数过程调用时, 如果实参是常量 ( 包括系统常量 用 Const 自定义的符号常量 ) 或表达式, 无论在定义时使用值传递还是地址传递, 此时都是按值传递方式将常量或表达式计算的值传递给形参变量 如果形参定义是按传地址方式, 但调用时想使实参变量按值方式传递, 可以把实参变量加上括号, 将其转换成表达式即可 例 5.5 下面程序是在窗体的单击事件中,5 次调用子过程 Sabc, 每次使用了不同的实参数 共运行结果如图 5-7 所示 请读者认真阅读此程序, 分析程序的输出结果 Private Sub Sabc(a As Integer) a = a + 5 Print " a="; a, Private Sub Form_Click() Dim x As Integer, y As Integer, z As Integer x = 10: y =

146 第 5 章 过程 Print " 1:...x="; x; Sabc x + y Print "...x="; x Print z = x + y Print " 2:...z="; z; Sabc z Print "...z="; z Print Print " 3:...x="; x; Sabc x + 5 Print "...x="; x Print Print " 4:...x="; x; Sabc (x) Print "...x="; x Print Print " 5:...x="; x; Sabc x Print "...x="; x 程序的运行结果如下 ' 实参用表达式, 按传值方式传递 ' 实参用变量, 按传地址方式传递 ' 实参用表达式, 按传值方式传递 ' 实参用括号强行转换表达式, 按传值方式传递 ' 实参用变量, 按传地址方式传递 图 5-7 例 5.5 程序运行结果 4. 使用子过程还是使用函数过程解决一个问题既可以使用子过程, 也可以使用函数过程 如果是需要求得一个值, 一般情况使用函数过程, 如果为了完成一些操作, 或需要返回多个值, 则使用子过程比较方便 例 5.6 分别编写计算下面级数的子过程和函数过程, 并在窗体的单击事件中调用 3 (2n 1) x x x 6 级数为 s..., 要求精度为 : 10 2! 4! (2n)! (2n)! x n Function Funs1(x As Single, eps As Double) As Double ' 函数过程

147 Visual Basic 6.0 程序设计基础教程 Dim n%, k#, t#, f# n = 2: k = x t = 2: f = 0 Do While k / t > eps f = f + k / t n = n + 2 t = t * (n - 1)*n k = k * x * x Loop ' 当要累加的项比 eps 大, 则继续循环累加 Funs1 = f End Function ' 将计算结果赋值给函数名返回 Sub Funs2(s As Double, x As Single, eps As Double) Dim n%, k#, t#, f# n = 2: k = x t = 2: f = 0 ' 子过程 Do While k / t > eps f = f + k / t n = n + 2 t = t * (n - 1)*n k = k * x * x Loop s = f Private Sub Form_Click() Dim f1#, f2# ' 当要累加的项比 eps 大, 则继续循环累加 ' 将计算结果赋值给形参 s 返回 ' 主调程序调用函数过程和子过程 f1 = Funs1(2.5, ) ' 调用函数过程 Call Funs2(f2, 2.5, ) ' 调用子过程, 也可写为 Funs2 f2,2.5, Print "f1="; f1, "f2 = "; f2 思考与讨论 : 从上面的例题可以看到, 一个可以用函数实现的过程, 也可以使用子过程来完成, 但必须通过传地址方式的形参变量来返回函数值, 如上面 Funs2 中的 s 参数 子过程与函数过程调用方式不同, 读者应分清两者的异同 数组作过程的参数 Visual Basic 允许把数组作为实参传送到过程中 如前所述, 数组一般通过传地址方式传送 在传送数组时, 除遵守参数传送的一般规则外, 还应注意以下几点 : (1) 为了把一个数组的全部元素传送给一个过程, 应将数组名写入形参表中, 并略去数

148 第 5 章 过程 组的上下界, 但括号不能省略 其形式如下 Private Sub Sort( a( ) As single) 其中形参 a() 即为数组 (2) 被调过程可通过 Lbound 和 Ubound 函数确定实参数组的上 下界 (3) 当用数组作形参时, 对应的实参必须也是数组, 且类型一致 (4) 实参和形参结合是按地址传递, 即形参数组和实参数组共用一段内存单元 例如 : 定义了实参数组 b(1 to 8), 给它们赋了值, 调用 Sort() 函数过程的形式如下 Sort b() 或 Call Sort(b() 实参数组后面的括号可以省略, 但为便于阅读, 建议一般不要省略为好 调用时形参数组 a 和实参数组 b 虚实结合, 共用一段内存单元, 如图 5-8 所示 因此在 Sort() 过程中改变数组 a 的各元素值, 也就相当于改变了实参数组 b 中对应的元素的值, 当调用结束时, 形参数组 a 成为无定义 b(1) b(2) b(3) b(4) b(5) b(6) b(7) b(8) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) 图 5-8 参数为数组时虚实参结合示意图 例 5.7 改写上章例 4.3 的排序程序, 分别将排序用子过程 Sort(), 产生 N 个随机整数用子过程 GetData(), 输出 N 个数组元素用 PrData() 子过程来完成 Private Sub Form_Click() ' 窗体的单击事件过程 Dim x(1 To 10) As Integer Print GetData x() Print " 排序前的数据 :" PrData x() Print Sort x() Print " 排序后的数据 :" PrData x() Private Sub Sort(a() As Integer) Dim i%, j%, p%, n%, temp! n = UBound(a) k = LBound(a) For i = k To n - 1 p = i ' 排序子过程

149 Visual Basic 6.0 程序设计基础教程 For j = i + 1 To n If a(p) > a(j) Then p = j Next j temp = a(i) a(i) = a(p) a(p) = temp Next i Private Sub GetData(a() As Integer) Dim i%, n% n = UBound(a) k = LBound(a) For i = k To n a(i) = Int(Rnd * 90) + 10 Next i Private Sub PrData(a() As Integer) ' 产生数据子过程 ' 打印输出子过程 Dim i%, n% n = UBound(a) k = LBound(a) For i = k To n Print a(i); " "; Next i Print 思考与讨论 : (1) 本题的窗体单击事件 Form_Click 是主调过程, 先调用 GetData() 产生 N 个随机整数 存入数组 x 中, 调用输出子过程 PrData() 来输出排序前的数组元素, 然后调用排序子过程 Sort() 对数组 x 排序, 最后再一次调用输出子过程 PrData() 来输出排序后的数组元素 (2) 产生数组 x 的元素个数是由什么来决定? 5.5 过程的嵌套和递归调用 过程的嵌套 Visual Basic 的过程定义都是互相平行和相对独立的, 也就是说在定义过程时, 一个过程内不能包含另一个过程 Visual Basic 虽然不能嵌套定义过程, 但可以嵌套调用过程, 也就是

150 第 5 章 过程 主程序可以调用子过程, 在子过程中还可以调用另外的子过程, 这种程序结构称为过程的嵌 套 过程的嵌套调用执行过程如图 5-9 所示 图 5-9 过程的嵌套调用执行过程 过程的递归调用 用自身的结构来描述自身, 称为递归 例如, 对阶乘的定义如下 : n! n ( n 1)! ( n 1)! ( n 1) ( n 2)! Visual Basic 允许在一个 Sub 子过程和 Function 过程的定义内部调用自己, 即递归 Sub 子过程和递归 Function 函数 例 5.8 编求阶乘 fac(n)=n! 的递归函数 Private Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Else fac = n * fac(n - 1) End If End Function Private Sub Form_Click() Print "fac(4)=";fac(4) 递归处理一般用栈来实现, 分为递推和回归两个过程, 如图 5-10 所示 图 5-10 递归调用执行过程

151 Visual Basic 6.0 程序设计基础教程递推过程 : 每调用一次自身, 把当前参数 ( 形参 局部变量及返回地址等 ) 压入栈, 直到递归结束条件成立 回归过程 : 从栈中弹出当前参数, 直到栈空 递归算法设计简单, 解决同一问题, 使用递归算法消耗的机时和占据的内存空间要比使用非递归算法大 使用递归算法必须要满足以下的递归条件 : (1) 存在递归结束条件及结束时的值 (2) 能用递归形式表示, 且递归向终止条件发展 5.6 过程与变量的作用域 一个 Visual Basic 工程可以由若干个窗体模块和标准模块组成, 每个模块又可以包含多个过程 同一模块中的过程之间是可以相互调用的, 那么不同模块中的过程之间是否可以相互调用呢? 每个过程中都包含多个变量, 一个变量可以在定义它的过程中使用, 那么能否在其他过程中使用呢? 过程的作用域 1.Visual Basic 工程的组成一个 Visual Basic 工程至少包含一个窗体模块, 还可以根据需要包含若干个标准模块和类模块, 本书将只讨论窗体模块和标准模块的使用方法 通过图 5-11 可以清楚看出 Visual Basic 工程的模块层次关系 工程名 窗体名 工程文件名 窗体文件名 模块名 类模块名 模块文件名 类模块文件名 图 5-11 Visual Basic 工程的组成 (1) 窗体模块窗体模块文件的扩展名为.frm, 其中可以包含用户编写的事件过程 子程序及函数过程和一些变量 常量及用户自定义类型等内容的声明 可以通过执行 工程 菜单中的 添加窗体 命令, 为工程添加多个窗体, 有关多重窗体方面的内容将在 5.7 节介绍

152 第 5 章 过程 (2) 标准模块标准模块文件的扩展名为.bas, 其中可以包含用户编写的子程序 函数过程和一些变量 常量及用户自定义类型等内容的声明 可以执行 工程 菜单中的 添加模块 命令, 为工程新建或添加已有模块文件, 如图 5-12 所示 一般将常用的子程序 函数过程等写在模块文件中 例如, 可以把实现与数组操作相关的排序 查找 插入及删除过程放在一个模块文件中, 如果以后编程中涉及此类操作, 就可以把此模块添加到工程中, 从而提高了代码编写效率 图 5-12 添加模块 对话框 通用子过程和函数过程既可写在窗体模块中也可写在标准模块中, 在定义时可选用关键字 Private( 局部 ) 和 Public( 全局 ), 来决定它们能被调用的范围 2. 过程的作用域过程可被访问的范围称为过程的作用域, 它随所定义的位置和语句的不同而不同 按过程的作用范围来划分, 过程可分为以下两种 模块级过程 全局级过程 1 窗体 / 模块级 : 在窗体模块或标准模块中加 Private 关键字定义的过程, 只能被定义它的窗体模块或标准模块中的过程调用 2 全局级 : 在窗体模块或标准模块中加 Public 关键字 ( 或缺省 ) 定义的过程, 可被该应用程序的所有窗体模块和标准模块中的过程调用 综上所述, 现把过程的定义和调用规则归纳总结如表 5-1 所示 表 5-1 不同作用范围的 2 种过程定义及调用规则 全局级 模块级 定义位置窗体标准模块窗体标准模块 定义方式过程名前加 Public 或省略过程名前加 Private 能否被本模块的其他过 程调用 能否被本应用程序的其 他模块调用 能能能能 能, 但必须在函数 名前加窗体名 能, 但函数名必须惟一, 否则要加标准模块名 不能 不能

153 Visual Basic 6.0 程序设计基础教程说明 : (1) 全局级过程若是在窗体模块中定义, 其他模块的过程要调用, 必须在该过程名前加该过程所处的窗体名 例如 : 在窗体 Form1 中调用窗体模块 Form2 中的名为 Mysub 的全局过程, 使用如下形式 Call Form2. MySub[( 实参表 )] 或 Form2. MySub[( 实参表 )] (2) 在标准模块中定义的全局级过程, 外部过程均可调用, 但过程名必须惟一, 即在工程的多个标准模块中全局过程名不相同 否则调用时就必须要加标准模块名 例如 : 若在 Module1 和 Module2 中都有一个名为 Mysub 的全局过程, 则调用 Module1 的 Mysub 过程, 就应使用如下形式 Call Module1.MySub[( 实参表 )] 或 Module1.Mysub 实参表 (3) 若是一个只包含一个窗体的简单应用程序, 可直接在本窗体模块中用 Private 或 Public 关键字定义过程 (4) 若是包含多个窗体的应用程序, 一般把子过程和函数过程放在标准模块中, 并用 Public 关键字定义, 这样定义的过程可被本应用程序的所有过程直接访问 而且 Visual Basic 应用程序中可以直接添加已经存储在磁盘上的标准模块, 通过这个功能, 可以实现不同应用程序间代码的共享 变量的作用域 在过程中用 Dim 或 Static 定义变量 ( 过程级 ), 在各模块的通用部分可用关键字 Dim 或 Private 定义变量 ( 模块级 ), 也可用 Public 定义变量 ( 全局级 ), 在不同地方或用不同关键字定义的变量能被访问的范围是不同的 变量可被访问的范围称为变量的作用域 当一个应用程序中出现多个过程或函数时, 在它们各自的子程序中都可以定义自己的常量 变量, 这些名字在程序中不是到处可用的 变量的作用范围指变量能被某一过程识别的范围其根据作用范围分为局部变量 模块级变量和全局变量 在 Visual Basic 中, 由于可以在过程中和模块中声明变量, 根据定义变量的位置和定义变量的语句不同, 变量可以分为以下几种 : 局部变量 ( 过程级变量 ); 窗体 / 模块级变量 ( 私有的模块级变量, 能被本模块的所有过程和函数使用 ); 全局级变量 ( 公有的模块级变量 ) 1. 过程级变量 局部变量过程级变量也称局部变量, 是在过程内部使用 Dim 或者 Static 关键字来声明的变量, 只在声明它们的过程中才能被访问或改变该变量的值, 其他过程不可访问 所以可以在不同的过程中声明相同名字的局部变量而互不影响 过程级变量的定义形式如下 Dim 变量名 As 数据类型或 Static 变量名 As 数据类型例如 :

154 第 5 章 过程 Dim a As Integer, b As Single Static str As String 对任何临时计算来说, 采用局部变量 ( 过程级变量 ) 是最佳选择 例如, 可以建立多个不同的过程, 每个过程都包含变量名为 i 的变量 只要每个 i 都声明为局部变量, 那么每个过程只识别它自己的变量 i, 改变它自己的变量 i 的值, 而不会影响其他过程中的变量 i 如果在过程中未作说明而直接使用某个变量, 该变量也被当成局部变量 用 Static 说明的变量在应用程序的整个运行过程中一直存在, 而用 Dim 说明的变量只在过程执行时存在, 退出过程后, 这类变量就会消失 过程级变量通常用于保存临时数据 局部变量在主程序 子程序或函数中声明, 但是只能在建立的过程内有效, 即便是在主程序中建立的变量, 也不能在子过程中使用 局部变量的作用域仅限于它们自己所在的过程, 使用局部变量的程序比仅使用全局变量的程序更具有通用性 2. 窗体 / 模块级变量窗体 / 模块级变量, 是在 通用声明 段中用 Dim 语句或用 Private 语句声明的变量, 可被本窗体 / 模块的任何过程访问 但其他模块却不能访问该变量 举例如下 Private s As String Dim a As Integer,b As Single 注意 : 在模块声明中使用 Private 或 Dim 作用相同, 但使用 Private 会提高代码的可读性 例如 : 通过在代码窗口单击过程列表框的 通用 下拉箭头, 如图 5-13 所示, 在窗体模块 (Form1) 中声明私有的模块级变量 n 私有的模块级变量简称为模块级变量 图 5-13 声明私有的模块级变量 3. 全局变量 全局变量也称公有的模块级变量, 在窗体模块或标准模块的顶部的 通用 声明段用 Public 关键字声明, 它的作用范围是整个应用程序, 即可被本应用程序的任何过程或函数访 问 例如 : Public a As Integer,b As single 但在标准模块中声明的全局变量, 在应用程序的任何一个过程中可以直接用该变量名来

155 Visual Basic 6.0 程序设计基础教程引用它, 而在某个窗体模块中声明的全局变量, 当其他窗体模块引用它时, 必须用定义它的窗体模块名为前缀 例 :Form1.max, 表示访问在 Form1 窗体中定义的全局变量 max 全局变量是指在所有程序 ( 包括主程序和过程 ) 中都可以使用的内存变量 全局变量就像在一个过程中定义的变量一样, 在子过程中可以任意改变和调用, 当某子过程执行完后, 其值带回主程序 把变量定义为全局变量虽然很方便, 但这样会增加变量在程序中被无意修改的机会, 因此, 如果有更好的处理变量的方法, 就不要声明全局变量 不同作用范围的 3 种变量声明及使用规则如表 5-2 所示 表 5-2 不同作用范围的 3 种变量声明及使用规则 全局级窗体 / 模块级变量局部变量 定义位置窗体标准模块窗体标准模块 声明方式 Public Dim Private Dim Static 声明位置 窗体 / 模块的 通用声明 段 窗体 / 模块的 通用 声明 段 在过程中 能否被本模块的其他过程存取能能不能 能否被其他模块的过程存取 能, 但在变量名 前加窗体名 能不能不能 注意 : 在编写一个较复杂的程序时, 可能有多个过程或函数, 在书写过程 ( 函数 ) 说明时, 应该把注意力集中在这 相对独立的子程序内 其中所用到的变量名如果都是局部变量, 则无论怎样处理都不会影响到其他过程 如果使用模块级或全局变量, 就必须清楚它们在各过程中所起的作用, 以及数据传递关系 考虑不周时容易引起错误, 所以, 为安全起见, 过程 ( 函数 ) 体内应尽可能用局部变量 4. 关于多个变量同名 (1) 全局变量与局部变量同名在不同过程中定义同名变量, 它们互不影响, 但若在一过程中定义使用了与全局变量同名的变量, 就应注意 例如, 有名为 Temp 的全局变量, 然后在过程中声明名为 Temp 的局部变量 在过程内通过引用名字 Temp 来访问局部变量 ; 而在过程外则通过引用名字 Temp 来访问全局变量 通过用模块名限定模块级变量就可在过程内访问这样的变量 Public Temp As Integer ' 定义全局变量 Private Sub Form_Load() Temp = 1 ' 将全局变量 Temp 的值设置成 1 Private Sub Command1_Click() Dim Temp As Integer ' 定义局部变量

156 第 5 章 过程 Temp = 2 ' 将局部变量 Temp 的值设置成 2 Print "temp="; Temp ' 输出局部变量 Temp 的值为 2 Print "temp="; Form1.Temp ' 输出全局变量 Temp 的值为 1 Private Sub Command2_Click() Print "temp="; Temp ' 输出全局变量 Temp 的值为 1 一般说来, 当变量名称相同而作用域不同时, 在作用域较小有效范围内, 优先访问作用 域较小的变量 也就是说若全局变量和局部变量同名, 则在过程内优先访问局部变量, 若想 访问全局变量, 要在变量名前加模块名 注意 : 在过程中, 如果定义了与模块级变量 ( 在通用部分使用 Private 或 Dim 声 明的变量 ) 同名的局部变量, 则在该过程内不能引用同名的模块级变量 例如, 上面 的例子中, 如果将定义全局变量的语句 Public Temp As Integer 改为 Private Temp As Integer, 则在 Command1 的单击事件中就不能使用模块级的 Temp 变量 (2) 全局变量同名 如果不同模块中的全局变量使用同一名字, 则通过同时引用模块名和变量名就可以在 代码中区分它们 例如, 如果有一个在 Form1 和 Module1 中都声明了公用的 Integer 变 量 intx, 则把它们作为 Module1.intX 和 Form1.intX 来引用便得到正确值 也就是说如 果不同模块中的全局变量使用同一名字, 引用时就需要使用 模块名. 变量名 的形式来区分 它们 5. 静态变量 除作用域之外, 变量还有存活期, 在这一期间变量能够保持它们的值 在应用程序的存 活期内一直保持模块级变量和全局变量的值 但是, 对于 Dim 声明的局部变量仅当过程执行 期间存在, 当一个过程执行完毕, 它的局部变量的值就已经不存在, 而且变量所占据的内存 也被释放 当下一次执行该过程时, 它的所有局部变量将重新初始化 若将局部变量定义成 静态的 ( 用 Static 声明 ), 可保留变量的值 静态变量在过程结束后仍保留变量的值, 即其占 用的内存单元未释放 在过程内部用 Static 关键字声明静态变量 例 5.9 有一个人编了下面一段程序, 想用变量 n 记录单击窗体的次数 Private Sub Form_Click() Dim n As Integer n = n + 1 Print " 已单击次数 :"; n & " 次 " 程序运行以后, 单击窗体一次, 窗体上输出 已单击次数 :1 次 ; 再次单击窗体, 窗体 上输出 已单击次数 :1 次 ; 第三次单击窗体, 窗体上还是输出 已单击次数 :1 次 这是 为什么呢? 原来问题出在变量 n 是一个用 Dim 定义的局部变量, 前面讲过对于 Dim 声明的 局部变量仅在过程执行期间存在, 当一个过程执行完毕, 它的局部变量的值就已经不存在,

157 Visual Basic 6.0 程序设计基础教程 而且变量所占据的内存也被释放 当下一次执行该过程时, 它的所有局部变量将重新初始化 为了用变量 n 记录单击窗体的次数, 可以把变量 n 用 Static 定义成静态变量, 从而保留变量 的值, 达到预期的效果 Private Sub Form_Click() Static n As Integer n = n + 1 Print " 已单击次数 :"; n & " 次 " 如果不把 n 声明为静态变量, 还有其他方法可以达到上述程序运行的效果 把 n 声明为 窗体模块级变量 但是, 这种方法改变了变量的作用范围, 窗体模块中的其他过程也可访问 和改变模块级变量的值, 所以运算也许不可靠, 代码将难于维护 为了使过程中所有的局部变量为静态变量, 可在过程的起始处加上 Static 关键字 例如 : Static Sub RunningTotal (num) 这就使过程中的所有局部变量都变为静态, 无论它们是用 Static 或 Dim 声明的变量, 还 是隐式声明的变量 可以将 Static 放在任何 Sub 或 Function 过程的前面, 包括事件过程和 声明为 Private 的过程 定义变量要注意以下几点 (1) 对任何临时计算来说, 局部变量是最佳选择 当过程执行结束, 变量的值不需要保 留, 可在过程内用 Dim 关键字声明, 否则的话用 Static 关键字声明 (2) 当同一模块的不同过程间需要共享数据变量的值时, 可用 Private 或 Dim 关键字在 通用声明 段定义其为模块级变量 (3) 当同一应用程序的不同过程间需要共享数据变量的值时, 可用 Public 关键字在 通 用声明 段定义其为全局变量 例 5.10 用函数调用的方法计算 S=a+aa+aaa+ +aaaa aa 程序代码如下 Private Static Function sum(a As Integer) As Single Dim s As Single s = s * 10 + a sum = s End Function Private Sub Form_Click() ' 分别求出前 6 项结果 Dim s As Single, a As Integer, i As Integer a = Val(InputBox(" 输入一个小于 10 的正整数 ")) For i = 1 To 6 Next i s = s + sum(a) Print "S" & i & "="; s n

158 第 5 章 过程 运行程序, 可以看到程序输出结果是 S1~S6 的值 思考与讨论 (1) 程序运行后, 先后两次单击窗体, 在窗体上的输出结果相同吗? 为什么? (2) 过程定义语句 Private Static Function sum(a As Integer) As Single 中的关键字 Static 起什么作用? 若没有 Static 关键字, 程序输出结果是什么? (3) 若不使用静态变量, 要达到上程序运行的效果, 如何修改程序? (4) 如果把 s 声明为窗体模块级变量, 其他代码都不变, 程序运行后, 先后两次单击窗体, 在窗体上的输出结果是什么? 比较使用不同级 ( 全局 窗体 / 模块 局部 ) 变量的区别 5.7 多重窗体与多模块程序设计 设置启动对象 在程序运行时, 首先被加载并执行的对象, 称为程序的启动对象 一个程序的启动对象可以是一个窗体, 也可以是标准模块中名为 Main 的自定义 Sub 过程 缺省情况下, 第一个创建的窗体被指定为启动对象 要设定工程的启动对象, 可选择 工程 菜单中的最后一项 ** 属性 ( 这里 ** 表示工程名 ), 弹出 ** 工程属性 对话框, 如图 5-14 所示 图 5-14 在 工程属性 对话框设置启动对象 在 启动对象 组合框中选择要作为启动对象的窗体或 Sub Main 过程 如果选择 Sub Main 作为启动对象, 必须保证当前工程已经在标准模块中定义了一个 Sub Main 过程 有时也许要求应用程序启动时不加载任何窗体 例如 : 想先运行装入数据文件的代码, 然后再根据数据文件的内容决定显示几个不同窗体中的哪一个 要做到这一点, 可在标准模

159 Visual Basic 6.0 程序设计基础教程块中创建一个名为 Main 的子过程, 如下面的例子所示 Sub Main() Dim Userstr As String Open "C:\MyDir\Insys.dat" For Input As 1 Input #1, Userstr If Userstr = "Muser1" Then frmmain.show ElseIf Userstr = "Muser2" Then frmpassword.show Else End End If 上段程序运行后, 打开文件 C:\MyDir\Insys.dat 如果读入的第一行内容是 Muser1 则启动 frmmain 窗体, 如果第一行内容是 Muser2 则启动 frmpassword 窗体, 否则不启动任何窗体 关于文件的操作读者可参阅 7 章相关内容 窗体的加载与卸载过程 在一个窗体显示在屏幕之前, 必须先建立, 接着被装入内存 (Load 语句 ), 最后显示 (Show 方法 ) 在屏幕上 同样, 当窗体要结束之前, 会先从屏幕上隐藏 (Hide 方法 ), 接着从内存中删除 (Unload 方法 ) 图 5-15 和图 5-16 分别说明了在窗体加载和卸载过程的各阶段所用的语句或方法以及所触发的事件 建立窗体装入内存显示在屏幕上装入内存 New 关键字或 New 关键字或 Visual Basic Load Show Show Visual Basic 方法语句方法自动建立 所触发的事件所触发的事件 Initialize Load Resize Paint Initialize Load Resize Paint 图 5-15 窗体的加载过程 隐藏窗体 从内存中删除 Hide 方法 UnLoad 方法 所触发的事件 QueryUnload Unload 图 5-16 窗体的卸载过程 Terminate

160 第 5 章 过程 1. 窗体的加载与显示 (1)Load 语句使用 Load 语句把指定窗体件加载到内存 其使用格式如下 Load < 窗体名 > 说明如下 1 执行 Load 语句后, 窗体并不显示出来, 但可引用该窗体中的控件及各种属性 2 格式中的窗体名称是窗体的 Name 属性, 而不是窗体的文件名, 以下相同 3 除非在加载窗体时不需要显示窗体, 否则对于一般窗体不需要使用 Load 语句 在窗体还未被加载时, 对窗体的任何引用会自动加载该窗体 例如,Show 方法在显示窗体前会先加载它 4 当 Visual Basic 加载 Form 对象时, 先把窗体属性设置为初始值, 再执行 Load 事件过程 当应用程序开始运行时,Visual Basic 自动加载并显示应用程序的启动窗体 (2)Show 方法 Show 方法用于在屏幕上显示一个窗体, 使指定的窗体在屏幕上可见, 调用 Show 方法与设置窗体 Visible 属性为 True 具有相同的效果 如果要显示的窗体事先未加载, 该方法会自动加载该窗体 ( 相当于先执行 Load 语句 ) 再显示 此方法的使用请参阅 节 注意 : 除非使用 Show 方法或将窗体的 Visible 属性设置为 True, 否则, 一个用 Load 语句加载的窗体是不可见的 2. 窗体的隐藏与卸载 (1)Hide 方法在多窗体的应用程序中, 各窗体之间的切换可使用窗体的 Show 方法或 Hide 方法 用 Hide 方法使指定的窗体不显示, 但不从内存中删除窗体 这与将窗体的 Visible 属性设置为 False 的效果相同 此方法的使用请参阅 节 (2)Unload 语句 Unload 语句用于把窗体从内存中卸载 具体的格式如下 Unload < 窗体名 > 说明 : 1 当窗体卸载之后, 所有在运行时放到该窗体上的控件都不再是可访问的 在设计时放到该窗体上的控件将保持不变 2 在卸载窗体时, 只有显示的部件被卸载 与该窗体模块相关联的代码还保持在内存中 与窗体加载与卸载过程的相关的事件 窗体对象的事件有很多, 在其加载与卸载过程中, 系统将自动引发一系列事件, 这里仅

161 Visual Basic 6.0 程序设计基础教程介绍与窗体对象被加载与卸载过程有关的几个事件 1.Initialize 事件当应用程序根据用户在设计阶段设计的窗体创建真正的窗体 (Form 类的实例 ) 时, 会发生 Initialize 事件 在程序运行阶段, 一个窗体可能多次被加载或卸载, 但 Initialize 事件只会发生一次 2.Load 事件此事件在一个窗体被装载时发生 当使用 Load 语句启动应用程序, 或引用未装载的窗体属性或控件时, 此事件发生 通常,Load 事件过程用来对窗体进行初始化操作 3.Paint 事件当一个窗体被移动或放大之后, 或当一个覆盖在窗体上的其他窗体被移开之后, 此事件发生 可通过将窗体的 AutoRedraw 属性设置为 True, 使得重新绘图自动进行, 此时系统将不触发 Paint 事件 4.QueryUnLoad 事件在一个窗体关闭之前, 该窗体的 QueryUnload 事件先于该窗体的 Unload 事件发生 此事件的典型应用是在关闭一个应用程序之前, 用来确保包含在该应用程序的窗体中没有未完成的任务 例如, 如果还未保存某一窗体中的新数据, 则应用程序会提示保存该数据 将该事件过程的 Cancel 参数设置为 True 可防止该窗体或应用程序的关闭 5.UnLoad 事件从内存中卸载窗体时会触发该窗体的 UnLoad 事件 将该事件过程的 Cancel 参数设置为 True 可防止窗体被卸载 6.Activate 事件当一个窗体成为活动窗口时触发该窗体的 Activate 事件,Activate 事件在 GotFocus 事件之前发生 7.Terminate 事件 Terminate 事件是窗体对象从内存删除之前最后一个触发的事件 即该事件在 Unload 事件之后发生 注意 : 如果窗体从内存删除, 是因为应用程序是非正常结束的, 例如, 使用 Ctrl+Break 键或出错而被中断, 则不会触发 Terminate 事件, 也不触发 QueryUnLoad 事件和 UnLoad 事件 另外, 如果应用程序在从内存中删除窗体之前, 调用 End 语句结束程序, 虽然窗体对象也将从内存删除, 但不会触发 Terminate 事件 QueryUnLoad 事件和 UnLoad 事件

162 第 5 章 过程 例 5.11 验证与窗体加载与卸载过程相关的事件被触发的先后顺序 通过在窗体模块的相应事件中编写代码, 在立即窗口 (Debug) 打印输出信息 根据输 出信息的先后顺序来判断相关事件的触发顺序 Private Sub Form_Click() Unload Me Private Sub Form_Activate() Debug.Print "Form_Activate" Private Sub Form_GotFocus() Debug.Print "Form_GotFocus" Private Sub Form_Initialize() Debug.Print "Form_Initialize" Private Sub Form_Load() Debug.Print "Form_Load" Private Sub Form_Paint() Debug.Print "Form_Paint" Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Debug.Print "Form_QueryUnload" Private Sub Form_Resize() Debug.Print "Form_Resize" Private Sub Form_Terminate() Debug.Print "Form_Terminate" Private Sub Form_Unload(Cancel As Integer) Debug.Print "Form_UnLoad" 思考与讨论 : (1) 程序运行后, 单击窗体结束程序, 实际上就完成了一次窗体的加载与卸载过程, 打 开立即窗口, 可看到如图 5-17 所示的结果 (2) 如果将窗体单击事件改写为 End 语句结束程序, 运行程序结束后在立即窗口的输 出结果有什么不同, 分析其原因 (3) 读者可上机调试, 程序运行后, 单击窗体右上角的关闭按钮或使用 Ctrl+Break 键中

163 Visual Basic 6.0 程序设计基础教程 断程序运行, 查看立即窗口的输出结果有什么不同, 分析其原因 图 5-17 窗体加载与卸载触发相关事件顺序 应用举例 例 5.12 编一个学生成绩处理程序 要求如下 : (1) 程序包含 3 个窗体和 1 个标准模块 (2) 主窗体是程序的主界面, 提供用户选择操作, 并根据用户选择的操作打开对应功能的窗体 主窗体的界面如图 5-18(a) 所示 (3) 在主窗体上单击 输入成绩 按钮后, 打开输入成绩窗口, 如图 5-18(b) 所示 在窗体中输入一同学 4 门课程的成绩后, 单击 返回 按钮, 将输入的成绩保存在全局变量中 (4) 在主窗体上单击 计算成绩 按钮后, 打开计算成绩窗口, 如图 5-18(c) 所示 图 5-18(a) 主窗体界面图 5-18(b) 成绩录入界面图 5-18(c) 成绩输出界面 (5) 在标准模块中, 定义存放学生 4 门课程成绩的全局变量,Math Chinses English Comptuer (6) 评价学生的等级 : 平均成绩 >=90 为优秀 80~89 为良好 70~79 为中等 60~69 为及格 60 分以下为不合格 将评价程序写成一函数过程 Function FunDj( x% ) As String, 并存放在标准模块中 根据题的要求, 本题为一个多窗体多模块程序 Form1( 主窗体 ) 中有 3 个按钮 1 个标签框 ; 窗体 Form2( 成绩录入 ) 上有 4 个标签框 4 个文本框 (Txtmath Txtchinese Txtenglish Txtcomputer) 1 个命令按钮和 1 个框架 ; 窗体 Form3( 成绩输出 ) 上有 3 个标签框 3 个文本框 (TxtSum Txtave Txtdj) 和 1 个命令按钮

164 第 5 章 过程 编写程序代码 (1) 在标准模块 Module1 中定义全局变量, 编写评定等级的函数过程如下 Public Math As Integer, Chinese As Integer 量 Public English As Integer, Computer As Integer Public Function FumDj(X%) As String Select Case X Case Is >= 90 FumDj = " 优秀 " Case Is >= 80 FumDj = " 良好 " Case Is >= 70 FumDj = " 中等 " Case Is >= 60 FumDj = " 及格 " Case Else ' 声明存放四门课程成绩的全局变 ' 评定等级的函数过程 FumDj = " 不及格 " End Select End Function (2) 在 FrmMain( 主窗体 ) 代码编辑窗口编写如下程序代码 Private Sub Command1_Click() ' 输入成绩 Me.Hide Form2.Show Private Sub Command2_Click() Me.Hide Form3.Show ' 计算成绩 Private Sub Command3_Click() ' 结束 End (3) 在 Form2( 成绩录入 ) 代码编辑窗口编写如下程序代码 Private Sub Command1_Click() Math = Val(Txtmath) Chinese = Val(Txtchinese) English = Val(Txtenglish) Computer = Val(Txtcomputer) Me.Hide Form1.Show

165 Visual Basic 6.0 程序设计基础教程 (4) 在 Form3( 成绩输出 ) 代码编辑窗口编写如下程序代码 Private Sub Form_Load() TxtSum.Text = Math + Chinese + English + Computer Txtave.Text = Str(Val(TxtSum.Text) / 4) Txtdj.Text = FumDj(Val(Txtave.Text)) Private Sub Command1_Click() ' 返回 Unload Me FrmMain.Show 思考与讨论 : (1)4 个全局变量 Math Chinese English 及 Computer 为什么要在标准模块 Module1 中定义, 可以在 Form1 Form2 或 Form3 中定义吗? (2)FumDj 函数过程是否也可以在 Form1 Form2 或 Form3 窗体中定义, 若在 Form1 中定义, 调用形式如何? 本章小结 本章主要介绍了两类用户自定义过程 子程序和函数过程, 前者没有返回值, 后者可以返回一个函数值 使用过程时, 最重要的是掌握调用者与被调用者之间的数据传递 这种传递主要是通过形参与实参相结合来实现的, 因此被调用者需要从调用者处获得多少数据, 就应该定义多少形参 过程中形参的个数和传递方式的确定 过程中参数的作用是实现过程与调用者的数据通信 一方面, 调用者为子过程或函数过程提供初值, 这是通过实参传递给形参实现的 ; 另一方面, 子过程或函数过程将结果传递给调用者, 这是通过地址传递方式实现的 因此, 形参的个数由上述两方面决定的 除了可以通过调用函数得到一个返回值外, 还可以利用传址参数传递方式, 通过过程调用来改变实参变量的值, 从而实现数据的返回 当需要返回多个数据时, 可以考虑使用此方法 此外, 还可以通过窗体 / 模块级变量和全局变量在过程之间共享数据, 通过静态变量在同一过程前后两次调用之间传递数据 习题 一 判断题 1. 定义一个过程时有几个形参, 则在调用该过程时就必须提供几个实参

166 第 5 章 过程 调用 2. 因为 Function 过程有返回值, 所以其只能在表达式中调用, 而不能使用 Call 语句 3. 事件过程只能由系统调用, 在程序中不能直接调用 4.Visual Basic 的过程可以直接或间接调用自身称为递归调用 5. 数组作参数, 传递的是地址数据 6. 如果在定义过程时, 一个形参使用传地址方式说明, 则调用过程时与之对应的实参只 能按地址方式传递 二 选择题 1. 下面子过程说明合法的是 (A)Sub f1(byval n%()) (B)Sub f1(n%) As integer (C)Function f1%(f1%) (D)Function f1(byval n%) 2. 要想从子过程调用后返回两个结果, 则子过程语句说明方法是 (A)Sub f2(byval n%,byval m%) (B)Sub f1(n%,byval m%) (C)Sub f1(n%, m%) (D)Sub f1(byval n%,m%) 3. 下面过程运行后显示的结果是 Public Sub f1(n%,byval m%) n=n mod 10 Private sub command1_click() dim x%,y% m=m\10 x=12: y=34 End sub call f1(x,y) print x,y End sub (A) 2 34 (B) (C) 2 3 (D) 如下程序, 运行的结果是 Private sub command1_click() Print p1(3,7) End sub Public Function p1!(x!,n%) If n = 0 then p1=1 Else If n mod 2 = 1 then Else End if End if End function p1 = x*p1(x,n\2) p1=p1(x,n\2)\x (A) 18 (B) 7 (C) 14 (D)

167 Visual Basic 6.0 程序设计基础教程 5. 如下程序, 运行的结果是 Public sub proc(a()as Integer) Static i As Integer a(i)=a(i)+a(i+1) i=i+1 Loop while i<2 End sub Private sub command1_click() Dim m%,i%,x(10) As Integer For i = 0 to 4 x(i)=i+1 next i call proc(x) call proc(x) For i = 0 to 4 print x(i) next i End sub (A) (B) (C) (D) 三 程序填空题 1. 两质数的差为 2, 称此对质数为质数对, 下列程序是找出 100 以内的质数对, 并成对显示结果 其中, 函数 nsp 判断参数 m 是否为质数 Public Functiom nsp(m As Integer)as boolean Dim i As Integer 1 For i = 2 to int(sqr(m)) if 2 then nsp = false Next i End function Private Sub command1_click() dim i As Integer p1=nsp(3) for i = 5 to 100 step 2 p2=nsp(i) if 3 then print i 2, i p1 4 next i

168 第 5 章 过程 2. 下面 total() 过程功能是计算 s= (n 个 7 组成的数 ) 程序代码如下 Public Sub total() Const n = 20 Dim s As Single, i As Integer For i = 1 To n Next i s = s + 1 Form1.Print "s="; s Public Function number( 2 ) As Single Dim i As Integer number = 0 For i = 1 To n Next i End Function 四 程序阅读 3 1. 下面程序运行时单击窗体, 输入的数据为 2 4 时, 窗体的输出结果是什么? Sub ASay(x As Integer, ByVal y As Integer) Dim a As Integer a=2*x+ y x=a+1 y=x+10 Private Sub Form_Click() Dim a As Integer, b As Integer a = Val(InputBox(" 请输入一个整数 ")) b = Val(InputBox(" 请输入一个整数 ")) Call Asay(a, b) Print " a=";a, "b="; 2.( 1) 写出运行以下程序后 Forml 上的输出结果 b (2) 如果将标记有 1 和 2 的两条语句对调后, 重新运行程序时 Forml 上的输出结果 Private Sub Const n =6 Dim xx(n) As Forml.cls For i =l TO Form _Click() n Integer

169 Visual Basic 6.0 程序设计基础教程 xx(i)=i*i Next i Call fchange(xx(),n) For i =l To n Forml.Print xx(i) Next i Sub fchange(a() As Integer, m As Integer) For i=l To m/2 t=a(i) a(i)=a(m-i+l) ' 1 a(m-i+l)=t ' 2 Next i 3. 分析以下程序运行的输出结果 Public function f(m As Integer,n As Integer) Do while m<>n Do while m>n m=m-n Loop Do while n>m n=n-m Loop Loop f=m End function Pivate sub command1_click() Print f(24,18) 4. 写出下面程序运行之后窗体上的显示结果 Dim x As Integer, y As Integer, z As Integer Private Sub Form_Click() Dim x As Integer x = 1: y = 2: z = 3 Call SPPA(y) z = FunB(x) Print x, y, z Public Sub SPPA(z As Integer)

170 第 5 章 过程 x = x + y y = z + y Public Function FunB(ByVal y As Integer) As Integer y = z + 1 FunB = x + y End Function 五 编程题 m! 1. 编写一个计算表达式值的程序 (m>=n>=0), 要求 : 用输入对话框输入 n! ( m n )! m 和 n 的值, 用编写函数 Function fact(x as Interger) 求 x! 的值 2. 编写一子过程 Insertfun(a%(), y%), 它的功能是 : 把 y 值插入到有序 ( 升序 ) 数组 a 中, 插入后数组中的数仍然有序 3. 编写一个判断字符串是否是回文的函数过程, 函数的返回值是一逻辑量, 即 : 是回文返回 True, 不是回文返回 False 所谓回文是指顺读与倒读都相同, 例如 ABCDCBA 2 n x x 4. 编程序求表达式 e 1 x... 的值, 并在窗体上输出 要求如下 : 2! n! (1) 变量 x 与 n 的值在窗体单击事件中用 InputBox() 函数输入, 通过调用函数过程 fe 实现题目要求 (2) 求表达式的值用函数过程 Function fe (n%, x!) As Single 完成 5. 编一个函数过程, 判断已知数 m 是否为 完数 所谓 完数 是指该数等于其因子之和 如 :6=1+2+3,6 就是完数 实验 1. 键盘输入 10 个整数, 输出其中的最大数和平均值, 并将这 10 个数从小到大排序输出 到窗体上 要求分别编写子过程 Maxnum Avenum 和 ordernum 来求最大数 平均值和排序, 然后在窗体的单击事件中调用这些函数 2. 统计在一个文本框内各英文字母出现的次数 ( 不区分大小写 ), 并按英文字母的先后 顺序输出各个字符与其对应的出现次数, 要求将统计各字母出现次数的运算编写为过程 程 序界面自定 提示 : 自定义统计过程 CharCount, 各形参定义如下, 其中,str1 为被统计文本, 数组 a 存放各 个字符出现次数 Sub CharCount(Str1 as string,a() as integer) 3. 设计一个由计算机来当小学低年级学生算术老师的 Visual Basic 应用程序, 要求随机 给出一系列的两个 10~100 数的加减, 一个 10~100 数与一个 1~10 数的乘除 ( 整除 ) 运算

171 Visual Basic 6.0 程序设计基础教程 的算术题 学生输入该题的答案, 计算机根据学生的答案判断正确与否, 并给出成绩, 单击 结束 命令按钮, 退出应用程序 程序运行界面如图 5-19 所示 图 5-19 算术四则运行程序运行界面

172 第 6 章 常用控件 通过第 1 章的学习, 读者已经对可视化的面向对象程序设计方法有了初步的认识 对象是 Visual Basic 程序设计的核心, 对象具有属性 方法和事件, 不同的对象具有不同的用途, 用户根据需要选择相关对象创建应用程序 除了前面介绍过的窗体对象外,Visual Basic 还提供了一些其他的控件对象 本章将从用途 属性 方法和事件 4 个方面系统地介绍一些常用的标准控件, 以及一些常用的 ActiveX 控件 与文件操作 图形操作等有关的控件将在后面相应的章节中进行介绍 限于篇幅, 这里仅介绍了最常用的内容, 如需了解更详细的信息, 读者可查询 Visual Basic 的帮助系统 读者学习本章后, 应该做到 : (1) 掌握命令按钮 文本框 标签 单选钮 检查框 框架 滚动条 列表框 组织框以及时钟等标准控件的常用属性 方法和事件 ; (2) 掌握鼠标和键盘事件的使用方法 ; (3) 了解 ActiveX 控件的使用方法 6.1 命令按钮 标签与文本框 命令按钮 1. 用途在 Visual Basic 应用程序中, 命令按钮 (CommandButton) 是使用最多的控件对象之一, 常用于开始 中断或者结束一个过程 命令按钮在工具箱中的图标为 161

173 Visual Basic 6.0 程序设计基础教程命令按钮可以通过以下 3 种方式进行选择 : (1) 鼠标单击 ; (2) 按 Tab 键将焦点跳转到该按钮, 再按回车键 ; (3) 快捷键 (Alt+ 带下划线的字母 ) 2. 属性每一类对象都具有许多属性, 在 Visual Basic 中对象的特征是通过属性来描述的, 即不同的对象是通过不同的属性值来区分的 不同的对象具有许多相同的基本属性, 也有许多自己特有的属性, 命令按钮也不例外 命令按钮所具有的 Name Height Width Top Left Enabled Visible 以及 Font 等基本属性, 其用法已经在前面章节中有过详细介绍, 此处不再重复 下面将主要介绍一些命令按钮的特有属性 ( 后续章节在学习新的控件时也将只介绍其特有的属性 ) (1)Caption 属性该属性用于设置命令按钮上显示的标题文本 它既可以在属性窗口中设置, 也可以在程序运行时设置 在运行时设置 Caption 属性将动态更新按钮文本 Caption 属性最多包含 255 个字符 若显示内容超过了命令按钮的宽度, 文本将会自动换行 如果显示内容超过 255 个字符, 则超出部分将被截去 可通过 Caption 属性创建命令按钮的快捷访问键, 其方法为在作为快捷访问键的字母前添加一个连字符 (&) 例如为标题为 Print 的命令按钮创建快捷访问键 Alt+P, 则该命令按钮的 Caption 属性应设为 &Print, 如图 6-1 所示, 字母 P 将带有下划线 运行时, 按 Alt+P 键即可选择该命令按钮 图 6-1 快捷访问键 (2)Default 和 Cancel 属性当窗体上命令按钮数目较多时, 通过键盘操作选择按钮就比较复杂 通常, 在一组按钮中, 对于 确定 和 取消 操作的按钮,Windows 应用程序使用 Enter 键和 Esc 键来进行选择 Visual Basic 通过将一个命令按钮的 Default 属性设置为 True, 使其成为 默认按钮 此时, 不管窗体上的哪一个非命令按钮控件具有焦点, 只要用户按 Enter 键, 就相当于单击此按钮 注意 : 如果焦点在某命令按钮上, 按回车就执行该命令按钮的单击事件, 不会去执行 Defanlt 属性设置为 True 的命令按钮 同样,Visual Basic 通过将一个命令按钮的 Cancel 属性设置为 True, 使其成为 取消按钮 此时, 不管窗体上的哪一个非命令按钮控件具有焦点, 只要用户按 Esc 键, 就相当于单

174 第 6 章 常用控件 击此按钮 注意 : 一个窗体只能有一个命令按钮的 Default 属性设置为 True, 也只能有一个命令按钮的 Cancel 属性设置为 True (3)Value 属性在程序代码中, 通过将一个命令按钮的 Value 属性设置为 True, 即可触发该命令按钮的 Click 事件, 执行相应的 Click 事件过程 (4)Style 属性确定命令按钮的显示形式, 设置为 0 只能显示文字, 设置为 1 则文字 图形均可显示 (5)Picture 属性确定命令按钮上显示的图片文件 (.bmp 和.ico), 此属性只有当 Style 属性值设置为 1 时才有效 (6)ToolTipText 属性凡是使用过 Windows 应用软件的用户都非常熟悉这种情况, 当自己不是十分清楚软件中某个图标按钮的作用时, 可以把光标移到这个图标按钮上, 停留片刻, 在这个图标按钮的下方就会出现一个简短的文字提示, 说明这个图标按钮的作用, 把光标移开后, 提示信息立刻消失 在运行或设计时, 只需将命令按钮的 ToolTipText 属性设置为需要显示的提示信息, 即可十分方便地实现此功能 例如, 在命令按钮的属性窗口, 将一命令按钮的 Caption 属性设置为 取消,FontSize 设置为 18 磅,Style 属性值设为 1, 给 Picture 属性加载一图形 (*.bmp 或 *.Gif) 文件,ToolTipText 属性值设置为 单击此命令按钮可取消以前操作 程序运行后, 将鼠标指针移动到命令按钮上的情况如图 6-2 所示 图 6-2 命令按钮的提示信息 3. 方法不同的控件具有不完全相同的方法, 有些方法为许多控件所共有, 有些则不然 与命令按钮相关的常用方法主要有以下几种 (1)Move 方法该方法的使用与窗体对象的 Move 方法相同 Visual Basic 系统中的所有可视控件都有该方法, 不同的是窗体的移动是相对屏幕而言, 而控件的移动则是相对其 容器 对象而言 (2)SetFocus 方法该方法用于设置指定的命令按钮获得焦点 使用该方法之前, 必须保证指定命令按钮当前处于可见和可用状态, 即其 Visible 和 Enabled 属性应为 True

175 Visual Basic 6.0 程序设计基础教程 4. 事件对命令按钮控件来说,Click 事件是最重要的触发方式 单击命令按钮时, 将触发 Click 事件, 并调用和执行已写入 Click 事件中的代码 多数情况下, 主要是针对该事件过程来编写代码 标签控件 1. 用途标签控件 (Label) 是用来显示文本的控件, 其在工具箱中的图标为 该控件和文本框控件都是专门用来对文本进行处理的控件, 但标签控件没有文本输入的功能 标签控件在界面设计中的用途十分广泛, 它主要用来标注和显示提示信息, 通常是标识那些本身不具有标题 (Caption) 属性的控件 例如, 可用 Label 控件为文本框 列表框及组合框控件添加描述性的文字, 或者用来显示处理结果 事件进程等信息 标签控件显示的内容既可以在设计时通过属性窗口设定, 也可以在程序运行时通过代码改变 2. 属性 (1)Caption 属性 Caption 属性用来改变 Label 控件显示的文本 其允许文本的长度最多为 1024 个字符 默认情况下, 当文本超过控件宽度时, 文本会自动换行, 而当文本超过控件高度时, 超出部分将被裁剪掉 (2)Alignment 属性 Alignment 属性用于设置 Caption 属性中文本的对齐方式, 共有 3 种可选值 : 值为 0 时, 左对齐 (Left Justify); 值为 1 时, 右对齐 (Right Justify); 值为 2 时, 居中对齐 (Center Justify) (3)BorderStyle 属性 BorderStyle 属性用于设置标签控件是否有边框, 共有 2 种可选值 : 值为 0 时, 标签无边框 ; 值为 1 时, 标签有固定单边框 (4)BackStyle 属性 BackStyle 属性用于确定标签的背景是否透明, 共有 2 种可选值 : 值为 0 时, 表示背景透明, 标签后的背景和图形可见 ; 值为 1 时, 表示背景不透明, 标签后的背景和图形不可见 (5)AutoSize 属性 AutoSize 属性确定标签是否会随标题内容的多少自动变化 如果值为 True, 则随 Caption 内容的多少自动调整控件本身的大小, 且不换行 ; 如果值为 False, 表示标签的尺寸不能自动调整, 超出尺寸范围的内容不予显示 (6)WordWrap 属性 Wordwrap 属性用来设置当标签在水平方向上不能容纳标签中的文本时是否换行显示文本 当其值为 True 时, 表示文本换行显示, 标签在垂直方向上放大或缩小以适合文本的大小,

176 第 6 章 常用控件 标签水平方向的宽度保持不变 ; 其值为 False 时, 表示文本不换行 AutoSize 属性和 Wordwrap 属性主要用来确定文本在标签中如何显示, 有时, 标签中的文字内容会动态地变化, 此时, 如果想保持标签水平方向的长度不变, 应使 Wordwrap 和 AutoSize 属性同时为 True 若希望仅在水平方向上改变标签的大小, 只需将 AutoSize 属性设为 True,Wordwrap 属性保持为 False 即可 例 6.1 在窗体上, 放置 5 个标签, 它们的高度与宽度相同, 在属性窗口中按表 6-1 所示设置它们的属性 运行后界面如图 6-3 所示 表 6-1 各对象的主要属性设置 对象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 标签 1 Name(Label1) Caption(" 左对齐 ") Alignment(0) BorderStyle(1) 标签 2 Name(Label2) Caption(" 水平居中 ") Alignment(2) BorderStyle(1) 标签 3 Name(Label3) Caption(" 自动 ") AutoSize(True) BorderStyle(1) 标签 4 Name(Label4) Caption(" 背景白 ") BackColor(&H00FFFFFF&) BorderStyle(0) 标签 5 Name(Label5) Caption(" 前景红 ") ForeColor(&H000000FF&) BorderStyle(0) 图 6-3 标签框的常用属性设置的效果 文本框控件 1. 用途在 Visual Basic 应用程序中, 文本框控件 (TextBox) 用于显示用户输入的信息, 作为接受用户输入数据的接口 ; 或者在设计或运行时, 通过对控件的 Text 属性赋值, 作为信息输出的对象 文本框控件在工具箱中的图标为 2. 属性 (1)Text 属性文本框控件无 Caption 属性, 只有 Text 属性用于输入或显示信息, 该属性值为字符型 (String) 当文本内容改变时,Text 属性也会随之变化 (2)MultiLine 属性 MultiLine 属性的默认值为 False, 表示只允许单行输入, 并忽略回车键的作用 ; 当把

177 Visual Basic 6.0 程序设计基础教程 MultiLine 属性设为 True 时, 表示允许多行输入, 当文本长度超过文本框宽度时, 文本内容会自动换行 (3)ScrollBars 属性 ScrollBars 属性用于指定在文本框中是否添加水平和垂直滚动条, 从而允许用户滚动浏览文本框中的内容, 共有以下 4 种可选值 0-None: 表示无滚动条 1-Horizontal: 表示只使用水平滚动条 2-Vertical: 表示只使用垂直滚动条 3-Both: 表示在文本框中同时添加水平和垂直滚动条 注意 :ScrollBars 属性生效的前提是设置 MultiLine 属性为 True 一旦设置 ScrollBars 属性为非零值, 文本框中的自动换行功能就失效, 要使文本在文本框中换行, 必须键入回车键 (4)MaxLength 属性 MaxLength 属性用于设置在文本框中所允许输入的最大字符数, 默认值为 0, 表示无字符限制, 若给该属性赋一个具体的值, 该数值就作为文本的限制长度 ; 当输入的字符数超过设定值时, 文本框将不接受超出部分的字符, 并发出警告声 (5)PassWordChar 属性 PasswordChar 属性用于掩盖文本框中输入的字符, 它常用于设置密码输入, 其只能是一个字符 例如, 将 PasswordChar 属性设置为 *, 则无论用户在文本框中输入什么字符, 文本框中只显示用户设置的替代字符 *, 显示形式为, 如要恢复文本在文本框中的正常显示, 只须将该属性设置为空串 注意 :PasswordChar 属性的设置不会影响 Text 属性的内容, 它只会影响 Text 属性在文本框中的显示方式 ; 当 Multiline 属性为 True 时,PasswordChar 属性失效 (6)Locked 属性 Locked 属性用于设置文本框的内容是否可以编辑 如果 Locked 属性设为 True, 则文本框中的文本成为只读文本, 此时与标签控件类似, 文本框只能用于显示, 不能进行输入和编辑操作 (7)SelStart SelLength 和 SelText 属性以上 3 个属性是文本框中对文本的编辑属性 SelStart 属性确定在文本框中所选择文本的开始位置, 若没有选择文本, 则用于返回或设置文本的插入点位置 ; 如果 SelStart 的值大于文本的长度, 则 SelStart 取当前文本的长度 SelLength 属性用于设置或返回文本框中选定的文本字符串长度 SelText 属性用于设置或返回当前选定文本中的文本字符串 3. 事件 (1)Change 事件当用户在文本框中输入新的信息或在程序运行时将文本框的 Text 属性设置为新值时, 触发该事件 用户每向文本框输入一个字符就触发一次该事件 因此,Change 事件常用于对输

178 第 6 章 常用控件 入内容进行实时检测 (2)LostFocus 事件当用户用 Tab 键或鼠标选择窗体上的其他对象而离开文本框时, 触发该事件 通常, 可用该事件来检查文本框中用户输入的内容 (3)KeyPress 事件当进行文本输入时, 每一次键盘输入, 都将使文本框接受一个 ASCII 码字符, 触发一次 KeyPress 事件, 因此, 通过该事件可以对某些特殊键 ( 如回车键和 ESC 键等 ) 进行有效的处理 例 6.2 设计一个打字练习程序, 界面如图 6-4 所示 要求 : 程序运行后, 单击 开始 按钮, 即在上方标签中产生一行练习文字, 用户可在下方文本框中输入文字, 单击 结束 按钮后, 显示统计信息并结束程序 图 6-4 打字练习 在属性窗口中按表 6-2 所示设置各对象的属性 表 6-2 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 打字练习 ") 标签 Name(lblExample) Caption("") BorderStyle(1) 文本框 Name(txtInput) Text("") 命令按钮 1 Name(cmdStart) Caption(" 开始 ") TabIndex(0) 命令按钮 2 Name(cmdEnd) Caption(" 结束 ") 程序代码如下 ' 定义窗体变量 n 表示输入文字的个数,right 表示正确文字的个数 Dim n As Integer, right As Integer ' 开始 按钮的单击事件过程 Private Sub cmdstart_click() lblexample.caption = "The quick brown fox jumps over the lazy dog." txtinput.maxlength = Len(lblExample.Caption)' 限定输入文字的个数 txtinput.text = "" txtinput.setfocus

179 Visual Basic 6.0 程序设计基础教程 n = 0 right = 0 ' 输入文本框的 KeyPress 事件过程 Private Sub txtinput_keypress(keyascii As Integer) n = n + 1 ' 统计正确文字的个数 If Mid(lblExample, n, 1) = Chr(KeyAscii) Then right = right+1 ' 结束 按钮的单击事件过程 Private Sub cmdend_click() ' 显示统计信息 MsgBox " 正确率 " & right / txtinput.maxlength * 100 & "%" End 思考与讨论 : (1) 如果要求在输入完毕后, 按回车键即可显示统计信息, 应该如何修改程序? (2) 如何实现每单击一次 开始 按钮, 能够显示不同的练习文字? (3) 如果要计算打字速度, 即每分钟打的字符个数应该如何编写程序? 6.2 单选钮 检查框及框架 单选钮 1. 用途单选钮 (OptionButton) 也称作选择按钮 一组单选钮控件可以提供一组彼此相互排斥的选项, 任何时刻用户只能从中选择一个选项, 实现一种 单项选择 的功能, 被选中项目左侧圆圈中会出现一黑点 单选钮在工具箱中的图标为 注意 : 同一 容器 中的单选钮提供的选项是相互排斥的, 即只要选中某一选项, 其余选项就自动取消选中状态 2. 属性 Value 属性是单选钮控件最重要的属性, 为逻辑型值, 当为 True 时, 表示已选择了该按钮, 为 False( 默认值 ) 则表示没有选择该按钮 用户可在设计阶段通过属性窗口或在运行阶段通过程序代码设置该属性值, 也可在运行阶段通过鼠标单击某单选钮将其 Value 属性设置为 True

180 第 6 章 常用控件 3. 方法 SetFocus 方法是单选钮控件最常用的方法, 可以在代码中通过该方法将 Value 属性设置为 True 与命令按钮相同, 在使用该方法之前, 必须要保证单选钮当前处于可见和可用状态 ( 即 Visible 与 Enabled 属性值均为 True) 4. 事件单选钮控件最基本的事件是 Click 事件, 从前面的叙述可知, 用户无需为单选钮编写 Click 事件过程, 因为当用户单击它时, 它会自动改变状态 例 6.3 设计一个字体设置程序, 界面如图 6-5 所示 要求 : 程序运行后, 单击 宋体 或 黑体 单选钮, 可将所选字体应用于标签, 单击 结束 按钮则结束程序 图 6-5 字体设置 在属性窗口中按表 6-3 所示设置各对象的属性 表 6-3 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 字体设置 ") 标签 Name(lblExample) Caption(" 字体示例 ") Alignment(2) BorderStyle(1) 单选钮 1 Name(optSong) Caption(" 宋体 ") 单选钮 2 Name(optHei) Caption(" 黑体 ") 命令按钮 Name(cmdEnd) Caption(" 结束 ") 程序代码如下 ' 设置宋体 Private Sub optsong_click() lblexample.fontname = " 宋体 " ' 设置黑体 Private Sub opthei_click() lblexample.fontname = " 黑体 "

181 Visual Basic 6.0 程序设计基础教程 '" 结束 " 按钮的单击事件过程 Private Sub cmdend_click() End 检查框 1. 用途检查框 (CheckBox) 也称作复选框或选择框 一组检查框控件可以提供多个选项, 它们彼此独立工作, 所以用户可以同时选择任意多个选项, 实现一种 不定项选择 的功能 选择某一选项后, 该控件将显示, 而清除此选项后, 消失 检查框在工具箱中的图标为 2. 属性 Value 属性也是检查框控件最重要的属性, 但与单选钮不同, 该控件的 Value 属性为数值型数据, 可取 3 种值 :0 为没有检查 ( 默认值 ),1 为已检查,2 为变灰 同样, 用户可在设计阶段通过属性窗口或程序代码设置该属性值, 也可在运行阶段通过鼠标单击来改变该属性值 注意 : 检查框的 Value 属性值为 2 并不意味着用户无法选择该控件, 用户依然可以通过鼠标单击或 SetFocus 方法将焦点定位其上, 若要禁止用户选择, 必须将其 Enabled 属性设置为 False 3. 事件检查框控件最基本的事件也是 Click 事件 同样, 用户无需为检查框编写 Click 事件过程, 但对 Value 属性值的改变需遵循以下规则 : 单击未选中的检查框时,Value 属性值变为 1; 单击已选中的检查框时,Value 属性值变为 0; 单击变灰的检查框时,Value 属性值变为 0 例 6.4 设计一个字体设置程序, 界面如图 6-6 所示 要求 : 程序运行后, 单击各检查框, 可将所选字形应用于标签, 单击 结束 按钮则结束程序 图 6-6 字形设置

182 第 6 章 常用控件 在属性窗口中按表 6-4 所示设置各对象的属性 表 6-4 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 字形设置 ") 标签 Name(lblExample) Caption(" 字体示例 ") Alignment(2) BorderStyle(1) 检查框 1 Name(chkBold) Caption(" 加粗 ") 检查框 2 Name(chkItalic) Caption(" 倾斜 ") 检查框 3 Name(chkUline) Caption(" 下划线 ") 检查框 4 Name(chkSth) Caption(" 删除线 ") 命令按钮 Name(cmdEnd) Caption(" 结束 ") 程序代码如下 Private Sub chkbold_click() ' 设置加粗 If chkbold.value = 1 Then lblexample.fontbold = True Else lblexample.fontbold = False End If Private Sub chkitalic_click() ' 设置倾斜 If chkitalic.value = 1 Then lblexample.fontitalic = True Else lblexample.fontitalic = False End If Private Sub chkuline_click() ' 设置下划线 If chkuline.value = 1 Then lblexample.fontunderline = True Else lblexample.fontunderline = False End If Private Sub chksth_click() ' 设置删除线 If chksth.value = 1 Then lblexample.fontstrikethru = True Else lblexample.fontstrikethru = False

183 Visual Basic 6.0 程序设计基础教程 End If Private Sub cmdend_click() End '" 结束 " 按钮的单击事件过程 框架 同窗体一样, 框架 (Frame) 控件也是一种 容器, 主要用于为其他控件分组, 从而在功能上进一步分割一个窗体 例如将单选钮分成若干组, 这样每组同时只能选择一个单选钮, 而整个窗体在同一时刻则可以选择多个 框架在工具箱中的图标为 注意 : 为将控件分组, 先要建立 容器 控件, 再单击工具箱上的工具按钮, 然后在 容器 里面利用拖动方法建立同组的控件 如果希望将已经存在的若干控件放在某个框架中, 可以先选择这些控件, 将它们剪切到剪贴板上, 然后选定框架控件并把它们粘贴到框架上 一般情况下, 除 Caption 属性外, 框架控件很少使用其他的属性 例 6.5 设计一个字体属性设置程序, 界面如图 6-7 所示 要求 : 程序运行后, 当选择好相应的检查框和单选钮, 并单击 确定 按钮后, 标签的内容会发生相应变化, 单击 取消 按钮则恢复默认设置 图 6-7 字体设置窗体 在属性窗口中按表 6-5 所示设置各对象的属性 表 6-5 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 字体设置 ") 标签 Name(lblExample) Caption(" 字体示例 ") Alignment(0) BorderStyle(1) 框架 1 Name(Frame1) Caption(" 字体 ") 单选钮 1 Name(optSong) Caption(" 宋体 ") Value(True) 单选钮 2 Name(optHei) Caption(" 黑体 ") 框架 2 Name(Frame2) Caption(" 字形 ")

184 第 6 章 常用控件 续表 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 检查框 1 Name(chkBold) Caption(" 加粗 ")z 检查框 2 Name(chkItalic) Caption(" 倾斜 ") 框架 3 Name(Frame3) Caption(" 字号 ") 单选钮 3 Name(optTen) Caption("10 号 ") Value(True) 单选钮 4 Name(optTwelve) Caption("12 号 ") 命令按钮 1 Name(cmdOK) Caption(" 确定 ") 命令按钮 2 Name(cmdCancel) Caption(" 取消 ") 程序代码如下 Private Sub cmdok_click() ' 确定 按钮的单击事件过程 If optsong.value Then ' 设置字体 lblexample.fontname = optsong.caption Else lblexample.fontname = opthei.caption End If lblexample.fontbold = chkbold.value lblexample.fontitalic = chkitalic.value If optten.value Then lblexample.fontsize = 10 Else lblexample.fontsize = 12 End If ' 设置字形 ' 设置字号 Private Sub cmdcancel_click() ' 取消按钮的单击事件过程 Form_Load ' 调用窗体的初始化过程 思考与讨论 : 比较例 6.4 与例 6.5 中字形设置的方法有何区别? 为什么两种方法都可以正确设置标签的字形? 6.3 滚动条 1. 用途 滚动条控件 (ScrollBar) 分为水平滚动条 (HscrollBar) 和垂直滚动条 (VscrollBar) 两 种, 通常附在窗体上协助观察数据或确定位置, 也可用作数据输入工具, 用来提供某一范

185 Visual Basic 6.0 程序设计基础教程围内的数值供用户选择 水平滚动条控件和垂直滚动条控件在工具箱中的图标分别为和 具体来说, 当项目列表很长或者信息量很大时, 可以通过滚动条实现简单的定位功能 此外滚动条还可以按比例指示当前位置, 以控制程序输入, 作为速度 数量的指示器来使用 例如, 可以用它来控制多媒体程序的音量, 或者查看定时处理中已用的时间等 注意 : 滚动条是一个独立的控件, 它有自己的事件 属性和方法集 文本框 列表框和组合框内部在特定情况下都会出现滚动条, 但它们属于这些控件的一部分, 不是一个独立的控件 2. 属性 (1)Value 属性返回或设置滚动条的当前位置, 其返回值始终为介于 Max 和 Min 属性值之间的整数 (2)Max Min 属性使用滚动条作为数量或速度的指示器 输入设备时, 可以利用 Max 和 Min 属性设置控件的 Value 属性变化范围 Max 属性 : 返回或设置当滚动框处于底部或最右位置时, 滚动条 Value 属性的最大设置值 取值范围是 ~ 之间的整数, 包括 和 , 默认设置值为 Min 属性 : 返回或设置当滚动框处于顶部或最左位置时, 滚动条 Value 属性的最小设置值 取值范围同 Max 属性, 默认设置值为 0 (3)LargeChange SmallChange 属性 LargeChange 属性返回和设置当用户单击滚动条和滚动箭头之间的区域时, 滚动条控件 Value 属性值的改变量 SmallChange 属性返回或设置当用户单击滚动箭头时, 滚动条控件 Value 属性值的改变量 LargeChange 与 SmallChange 属性的取值范围是 1~ 之间的整数, 包括 1 和 , 默认设置值均为 1 3. 事件 (1)Change 事件滚动条的 Change 事件在移动滚动框或通过代码改变其 Value 属性值时发生 可通过编写 Change 事件过程来协调各控件间显示的数据或使它们同步 (2)Scroll 事件当滚动框被重新定位, 或按水平方向或垂直方向滚动时,Scroll 事件发生 可通过编写 Scroll 事件过程进行计算或操作必须与滚动条变化同步的控件 Scroll 事件与 Change 事件的区别在于 : 当滚动条控件滚动时 Scroll 事件一直发生, 而 Change 事件只是在滚动结束之后才发生一次 例 6.6 设计一个坐标设置程序, 界面如图 6-8 所示 要求 : (1) 在文本框中输入 0~100 范围内的数值后, 对应滚动条的滚动块会滚动到相应位置, 同时在标签中显示当前坐标

186 第 6 章 常用控件 (2) 在滚动条的滚动块的位置改变后, 对应文本框中也会显示出相应的数值, 标签中 也会显示出当前坐标 图 6-8 坐标设置 在属性窗口中按表 6-6 所示设置各对象的属性 表 6-6 各对象的主要属性设置 对象属性 ( 属性值 ) 属性 ( 属性值 ) 体窗 Name(Form1) Caption(" 滚动条 ") 标签 Name(lblXY) Caption(" 当前坐标为 (0,0)") 水平滚动条 垂直滚动条 Name(hsbX) Name(vsbY) 文本框 1 Name(txtX) Text("0") 文本框 2 Name(txtY) Text("0") 程序代码如下 : ' 初始化滚动条设置 Private Sub Form_Load() hsbx.min = 0 hsbx.max = 100 hsbx.smallchange = 1 hsbx.largechange = 10 hsbx.value = 0 vsby.min = 0 vsby.max = 100 vsby.smallchange = 1 vsby.largechange = 10 vsby.value = 0 ' 水平滚动条的 Change 事件过程 Private Sub hsbx_change() lblxy.caption = " 当前坐标为 (" & hsbx.value & "," & vsby.value & ")" ' 垂直滚动条的 Change 事件过程

187 Visual Basic 6.0 程序设计基础教程 Private Sub vsby_change() lblxy.caption = " 当前坐标为 (" & hsbx.value & "," & vsby.value & ")" ' 横坐标文本框的 Change 事件过程 Private Sub txtx_change() If IsNumeric(txtX.Text) And Val(txtX.Text) >= 0 And _ Else Val(txtX.Text) <= 100 Then hsbx.value = Val(txtX.Text) ' 判断坐标合法性 lblxy.caption = " 无效坐标 " End If ' 纵坐标文本框的 Change 事件过程 Private Sub txty_change() If IsNumeric(txtY.Text) And Val(txtY.Text) >= 0 And _ Val(txtY.Text) <= 100 Then vsby.value = Val(txtY.Text) Else lblxy.caption = " 无效坐标 " End If 思考与讨论 : 试将程序中滚动条的 Change 事件过程改写为 Scroll 事件过程, 比较运行情况 6.4 列表框与组合框 当用户仅需要从少量选项中作出选择时, 单选钮与检查框就完全能够胜任, 但是当需要在有限空间里为用户提供大量选项时, 就不适于使用单选钮与检查框了 Visual Basic 为用户提供的列表框与组合框控件是解决这一问题的一种十分有效的方法 由于这两种控件具有许多共同的属性 方法与事件, 下面将把它们放在一起加以介绍 1. 用途列表框控件 (ListBox) 用于显示项目列表, 用户可从中选择一个或多个项目 如果项目总数超过了可显示的项目数,Visual Basic 会自动加上滚动条 列表框控件在工具箱中的图标为 它有两种风格: 标准和复选列表框 通过 Style 属性来设置 组合框控件 (ComboBox) 将文本框和列表框的功能结合在一起, 用户可以在列表中选择某项或在编辑区域中直接输入文本内容来选定项目 组合框控件在工具箱中的图标为 同样, 如果项目过多时, 也会自动出现滚动条

188 第 6 章 常用控件 通常, 组合框适于创建建议性的选项列表, 即用户除了可以从列表中进行选择外, 还可以通过编辑区域将不在列表中的选项输入列表区域中 ( 需编程实现 ) 而列表框则适用于将用户的选择限制在列表之内的情况 组合框共 3 种风格 : 下拉式组合框 简单组合框和下拉式列表框 其中两种下拉风格的组合框, 只有单击向下箭头时才会显示全部列表, 这样就节省了窗体的空间, 所以无法容纳列表框的地方可以很容易地容纳组合框 注意 : 下拉式列表框与下拉式组合框的区别在于前者不能输入列表中没有的项目 2. 属性 (1)List ListCount 和 ListIndex 属性 1 List 属性 : 字符串数组 与其他只含有单值的控件属性 ( 例如标签的 Caption 属性或文本框的 Text 属性 ) 不同, 列表框和组合框的 List 属性含有多个值, 这些值构成一个数组, 数组的每一项都是一个列表项目 引用列表框和组合框的项目可以按如下形式 : 对象名.List( i ) 其中, 对象名为列表框或组合框名,i 为项目的索引号, 取值范围是 0~ListCount-1 在设计模式下, 可以通过属性窗口的 List 下拉框输入项目, 如图 6-9 所示 图 6-9 在 List 属性中输入项目 若要连续输入多个项目, 在每输入一项后, 可以按 Ctrl+ 回车键, 便可继续输入下一项目 当所有项目输入后, 再按回车键结束输入 2 ListCount 属性 : 整型数值, 用于返回列表框或组合框中列表项目的个数即 List 数组中的元素个数 3 ListIndex 属性 : 整型数值, 用于返回或设置列表框控件或组合框控件中当前选择项目的索引, 第一个项目的索引为 0, 最后一个项目的索引为 ListCount-1 如果没有选择任何项, 则 ListIndex 属性值为 -1 例如 : 表达式 List1.List(List1.ListIndex) 返回列表框 List1 当前选择的项目 ( 字符串 ), List1.List(0) 返回列表框 List1 的第一个项目 ( 字符串 ),List1.List(List1. ListCount-1) 返回列表框 List1 的最后一个项目 ( 字符串 ) (2)Style 属性 Style 属性用于指示列表框控件或组合框控件的显示类型和行为, 在运行时是只读的 列表框控件与组合框控件 Style 属性的取值及含义分别如表 6-7 和表 6-8 所示

189 Visual Basic 6.0 程序设计基础教程 表 6-7 ListBox 控件的 Style 属性取值及含义 值内部常数含义 0 VbListBoxStandard ( 默认值 ) 标准的文本项列表 1 VbListBoxCheckbox 复选框 在 ListBox 控件中, 每一个文本项的边上都有一个复选框, 可以选择多项 说明 : 对于 ListBox 控件, 当将 Style 属性值设置为 1 时,MultiSelect 属性值只能设置为 0 表 6-8 ComboBox 控件的 Style 属性取值及含义 值 内部常数 含 义 0 VbComboDropDown ( 默认值 ) 下拉式组合框, 包括一个下拉式列表和一个文本框, 可以从列表中选择或在文本框中输入 1 VbComboSimple 简单组合框, 包括一个文本框和一个不能下拉的列表, 可以从列表中选择或在文本框中输入 2 VbComboDrop-DownList 下拉式列表框, 这种样式仅允许从下拉式列表中选择 各种显示风格的列表框与组合框如图 6-10 所示 图 6-10 列表框与组合框 (3)MultiSelect 属性 MultiSelect 属性用于指示能否在列表框控件中进行复选以及如何进行复选, 在运行时是 只读的 其取值及含义如表 6-9 所示 注意, 组合框控件无此属性 表 6-9 MultiSelect 属性设置值及含义 设 置 值 含 义 0 ( 默认值 ) 不允许复选 1 简单复选, 通过鼠标单击或按下空格键在列表中选中或取消选中项 扩展复选, 通过按下 SHIFT 键并单击鼠标或按下 SHIFT 键以及一个方向键, 将在以前 2 选中项的基础上扩展选择到当前选中项 通过按下 CTRL 并单击鼠标, 可在列表中选 中或取消选中项

190 第 6 章 常用控件 (4)Selected 属性 Selected 属性返回或设置列表框控件中的一个项目的选择状态 ( 注意, 组合框控件无此属性 ) 该属性是一个逻辑类型的数组, 数组元素个数与列表框中的项目数相同, 其下标的变化范围与 List 属性相同 例如 List1.Selected(0)=True 表示列表框 List1 的第一个项目被选中, 此时 ListIndex 的值设置为 0 Selected 属性在设计阶段是不可用的, 即无法在属性窗口中设置该属性 注意 :Visual Basic 中各种对象的大部分属性既可在设计阶段使用, 也可在运行阶段使用 但是也有一部分属性, 如 Name 属性, 只能在设计阶段设置 还有一些属性则只能在运行阶段设置 Selected 属性与 ListIndex 属性的区别 : 如果 MultiSelect 属性被设置为 0, 那么可以使用 ListIndex 属性来获得选中项的索引 ;Selected 属性则对允许复选的列表框十分有用, 通过该属性可以快速检查列表中哪些项已被选中, 也可以在代码中使用该属性选中或取消选中列表中的一些项 (5)NewIndex 属性 NewIndex 属性用于返回最新加入列表框控件或组合框控件的项目的索引 如果列表中已没有项目或删除了一个项目, 该属性将返回 -1 (6)TopIndex 属性 TopIndex 属性用于返回或设置一个值, 该值指定哪个项被显示在列表框控件或组合框控件的顶部位置 该属性的取值范围从 0 到 ListCount-1, 在设计阶段不可用 (7)Sorted 属性 Sorted 属性类型为一个逻辑值, 当 Sorted 属性为 True 时列表框控件或组合框控件的项目自动按字母表顺序 ( 升序 ) 排序, 为 False 时项目按加入的先后顺序排列显示 该属性只能在设计阶段设置, 不能在程序代码中设置 (8)Text 属性对于下拉式组合框与简单组合框,Text 属性返回编辑区域中的文本 对于列表框控件或下拉列表框,Text 属性的返回值总与 List(ListIndex) 的值相同 3. 方法 (1)AddItem 方法用于将项目添加到列表框控件或组合框控件 语法格式 : 对象名.AddItem item [, index] 其中,item 参数是一个字符串表达式, 用来指定添加到对象的项目 ;index 参数是一个整数, 用来指定新项目在该对象中的位置 ( 首项的 index 为 0) 例如, 将一文本框 (Text1) 输入的内容添加到列表框 (List1) 中, 并使其成为第 2 项内容, 应使用下面的语句 : List1.AddItem Text1.text, 1 Index 参数的有效范围与 ListIndex 属性的取值范围相同, 如果给出的 Index 值有效, 则 item 将放置在列表框控件或组合框控件中相应的位置 如果省略 index, 当 Sorted 属性设置

191 Visual Basic 6.0 程序设计基础教程为 True 时,item 将添加到恰当的排序位置, 当 Sorted 属性设置为 False 时,item 将添加到列表的结尾 (2)RemoveItem 方法用于从列表框控件或组合框控件中删除一项 语法格式 : 对象名. RemoveItem index 对 index 参数的规定同 AddItem 方法 例如, 要删除列表框 (List1) 中所有选中的项目, 可使用下面的程序段 : Dim i As Integer i = 0 Do While i <= List1.ListCount - 1 If List1.Selected(i) = True Then List1.RemoveItem i Else i = i + 1 End If Loop 请注意, 如果将上面程序中的 Do 循环语句改为 For Next 语句, 程序能正常运行吗? 为什么? (3)Clear 方法用于清除列表框控件或组合框控件中的所有项目 语法格式 : 对象名.Clear 例如, 要删除列表框 (List1) 中所有项目, 可使用语句 :List1. Clear 4. 事件 (1)Click 事件当单击某一列表项目时, 将触发列表框与组合框控件的 Click 事件 该事件发生时系统会自动改变列表框与组合框控件的 ListIndex Selected 及 Text 等属性, 无需另行编写代码 (2)DblClick 事件当双击某一列表项目时, 将触发列表框与简单组合框控件的 DblClick 事件 (3)Change 事件对于下拉式组合框或简单组合框控件, 当用户通过键盘输入改变了文本框部分的内容, 或者通过代码改变了 Text 属性的设置时, 将触发 Change 事件 例 6.7 设计一个畅销书排行榜程序, 界面如图 6-11 所示 要求 : (1) 在列表框中选择一书名后, 单击 按钮该书名次上升一位, 单击 按钮该书名次下降一位, 单击 按钮该书下榜 (2) 在文本框中输入新书名和排行名次后, 单击 按钮可令该书加入列表框指定位次 (3) 单击 清除 按钮将清除列表框中所有内容, 单击 结束 按钮将结束程序 在属性窗口中按表 6-10 所示设置各对象的属性

192 第 6 章 常用控件 图 6-11 畅销书排行榜窗体 表 6-10 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 畅销书排行榜 ") 标签 1 Name(Label1) Caption("Top10") 标签 2 Name(Label2) Caption(" 新书入榜 ") 标签 3 Name(Label3) Caption(" 名次 ") 列表框 Name(lstBook) 文本框 1 Name(txtNewBook) Text("") 文本框 2 Name(txtNo) Text("") 命令按钮 1 Name(cmdUp) Caption(" ") 命令按钮 2 Name(cmdDown) Caption(" ") 命令按钮 3 Name(cmdIn) Caption(" ") 命令按钮 4 Name(cmdOut) Caption(" ") 命令按钮 5 Name(cmdClear) Caption(" 清除 ") 命令按钮 6 Name(cmdEnd) Caption(" 结束 ") 程序代码如下 : Private Sub cmdup_click() Dim book As String ' 定义变量 book 表示排在已选择项目前一位的书名 Dim index As Integer ' 定义变量 index 表示已选择项目原来的排名 index = lstbook.listindex ' 判断是否已选择某一书名且该书目前排名并非第一 If index <> -1 And index <> 0 Then book = lstbook.list(index - 1) ' 将选择项目的前一项存入变量 book 中 lstbook.removeitem index 1 ' 删除已选择项目的前一项 lstbook.additem book, index ' 将已删除项目添加到其原来排名的下一位 End If Private Sub cmddown_click() Dim book As String, index As Integer

193 Visual Basic 6.0 程序设计基础教程 index = lstbook.listindex If index <> -1 And index <> lstbook.listcount - 1 Then book = lstbook.list(index + 1) lstbook.removeitem index + 1 lstbook.additem book, index End If ' 将选中项后一项目存到变量 book 中 ' 删除选中项的后一项 Private Sub cmdin_click() ' 入榜 Dim book As String, index As Integer book = txtnewbook.text index = Val(txtNo.Text) ' 判断是否已输入书名和有效的排名 If book <> "" And index >= 0 And index <= lstbook.listcount-1 Then lstbook.additem book, index-1 End If Private Sub cmdout_click() ' 下榜 Dim index As Integer index = lstbook.listindex If index <> -1 Then lstbook.removeitem index End If Private Sub cmdclear_click() lstbook.clear Private Sub cmdend_click() End 思考与讨论 : (1) 如果列表框允许复选, 如何修改程序使得单击 按钮时, 可将当前选择的所有书同时下榜? (2) 在调整所选书的排行名次时, 是否必须判断该书的当前名次? 例 6.8 设计一个设置字体属性的程序, 界面如图 6-12 所示 要求 : (1) 启动工程后, 在 字体 列表框中自动列出当前系统中可用的屏幕字体供用户选择 (2) 在 字号 下拉组合框中列出部分字号供用户选择, 默认值为 10 磅, 用户也可根据需要在编辑区中直接输入字号大小 (3) 所做的任何设置都直接在 示例 标签中显示效果, 单击 取消 按钮将恢复初

194 第 6 章 常用控件 始设置, 单击 确定 按钮将结束程序 图 6-12 字体窗体 在属性窗口中按表 6-11 所示设置各对象的属性 表 6-11 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 字体 ") 标签 1 Name(Label1) Caption(" 字体 ") 标签 2 Name(Label2) Caption(" 字号 ") 标签 3 Name(Label3) Caption("Visual Basic 6.0 程序设计教程 ") 框架 Name(Frame1) Caption(" 示例 ") 组合框 1 Name(cboFontName) 组合框 1 Name(cboFontSize) 命令按钮 1 Name(cboOK) Caption(" 确定 ") 命令按钮 2 Name(cboCancel) Caption(" 取消 ") 程序代码如下 : Private Sub Form_Load() Dim i As Integer For i = 0 To Screen.FontCount - 1 ' 加载屏幕字体 cbofontname.additem Str(Screen.Fonts(i)) Next i For i = 8 To 30 Step 2 ' 初始化字号组合框 cbofontsize.additem Str(i) Next i ' 初始设置标签与组合框 lblexample.fontname = " 宋体 " lblexample.fontsize = 10 cbofontname.text = " 宋体 " cbofontsize.text = Str(10) Private Sub cbofontname_click() ' 选择字体的单击事件过程

195 Visual Basic 6.0 程序设计基础教程 lblexample.fontname = cbofontname.text Private Sub cbofontsize_click() ' 选择字号的单击事件过程 lblexample.fontsize = Val(cboFontSize.Text) Private Sub cbofontsize_change() ' 输入字号的处理过程 lblexample.fontsize = Val(cboFontSize.Text) Private Sub cmdcancel_click() lblexample.fontname = " 宋体 " lblexample.fontsize = 10 ' 恢复初始设置 cbofontname.text = " 宋体 " cbofontsize.text = Str(10) Private Sub cmdok_click() ' 结束程序 End 思考与讨论 : 在程序运行过程中, 如果在字号组合框的文本区中输入了非法数据 ( 如 -10,abc 等 ), 将会出现什么情况? 如何避免这种情况发生? 6.5 时钟控件 1. 用途时钟控件 (Timer) 又称计时器 定时器控件, 用于有规律地定时执行指定的工作, 适合编写不需要与用户进行交互就可直接执行的代码, 如倒计时 动画等 时钟控件在工具箱中的图标为, 在程序运行阶段, 时钟控件不可见 2. 属性 (1)Interval 属性取值范围在 0~ 之间 ( 包括这两个数值 ), 单位为毫秒 (0.001 秒 ), 表示计时间隔 若将 Interval 属性设置为 0 或负数, 则时钟控件停止工作 (2)Enabled 属性无论何时, 只要时钟控件的 Enabled 属性被设置为 True 而且 Interval 属性值大于 0, 则时钟控件开始工作 ( 以 Interval 属性值为间隔, 触发 Timer 事件 ) 通过把 Enabled 属性设置为 False 可使时钟控件无效, 即令时钟控件停止工作 3. 方法

196 第 6 章 常用控件 Visual Basic 没有为时钟控件提供有关的方法

197 Visual Basic 6.0 程序设计基础教程 4. 事件时钟控件只能响应 Timer 事件, 当 Enabled 属性值为 True 且 Interval 属性值大于 0 时, 该事件以 Interval 属性指定的时间间隔发生, 需要定时执行的操作即放在该事件过程中完成 例 6.9 设计一个倒计时程序, 界面如图 6-13 所示 要求 : (1) 程序运行后, 通过单选钮选择计时时间 ( 默认为 1 分钟 ), 单击 计时开始 按钮进行倒计时 (2) 在标签中显示计时情况, 计时结束后在标签中显示 时间到 (3) 单选钮和 计时开始 按钮在计时开始后被禁用, 直到计时结束后才可以使用 图 6-13 倒计时窗体 在属性窗口中按表 6-12 所示设置各对象的属性 表 6-12 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 倒计时 ") BorderStyle(1) 框架 Name(Frame1) Caption(" 选择时间 ") 单选钮 1 Name(optOne) Caption("1 分钟 ") Value(True) 单选钮 2 Name(optFive) Caption("5 分钟 ") 单选钮 3 Name(optTen) Caption("10 分钟 ") 标签 Name(lblTime) Caption("1 分 0 秒 ") BorderStyle(1) Alignment(2) 命令按钮 Name(cmdStart) Caption(" 计时开始 ") 时钟 Name(Timer1) Interval(1000) Enabled(False) 程序代码如下 : ' 声明窗体级变量 pretime mm 及 ss 用于存放余下时间的总秒 分钟数及除去整分钟后的秒数 Dim pretime As Integer, mm As Integer, ss As Integer Private Sub cmdstart_click() cmdstart.enabled = False Frame1.Enabled = False Timer1.Enabled = True Private Sub optone_click() pretime = 60 ' 开始倒计时 ' 禁用框架中的所有单选钮

198 第 6 章 常用控件 mm = pretime \ 60 ss = pretime Mod 60 lbltime.caption = Str(mm) & " 分 " & Str(ss) & " 秒 " Private Sub optfive_click() pretime = 300 mm = pretime \ 60 ss = pretime Mod 60 lbltime.caption = Str(mm) & " 分 " & Str(ss) & " 秒 " Private Sub optten_click() pretime = 600 mm = pretime \ 60 ss = pretime Mod 60 lbltime.caption = Str(mm) & " 分 " & Str(ss) & " 秒 " Private Sub Timer1_Timer() mm = pretime \ 60 ' 计算剩余的分钟 ss = pretime Mod 60 ' 除去整分后的秒数 lbltime.caption = Str(mm) & " 分 " & Str(ss) & " 秒 " If mm = 0 And ss = 0 Then lbltime.caption = " 时间到!" Timer1.Enabled = False Frame1.Enabled = True cmdstart.enabled = True End If pretime = pretime - 1 ' 减少 1 秒 思考与讨论 : (1) 同样是有规律地重复执行特定的操作, 循环结构与 Timer 事件过程有什么区别? (2) 如果不编写 3 个单选按钮单击事件, 而将实现时间选择处理放到 开始计时 命令按钮的单击事件中那么该如何改写该事件代码? 6.6 控件数组 控件数组的概念 控件数组是一组具有共同名称 (Name 属性 ) 的同类型的控件, 它们共享同样的事件过

199 Visual Basic 6.0 程序设计基础教程 程 建立控件数组时, 每个元素 ( 控件 ) 被自动赋予一个惟一的索引号 (Index 属性 ) 一个 控件数组至少应有一个元素 ( 控件 ), 元素数目可在系统资源和内存允许的范围内增加 在控 件数组中可用到的最大索引值为 同一控件数组中的元素可以有自己的属性设置值 当希望若干控件共享代码时, 可采用控件数组以简化编程 例如, 如果创建了一个包含 3 个命令按钮的控件数组 cmdbotton, 则无论单击哪个按钮 都将执行相同的事件过程 在事件过程中通过返回的索引值来区分用户单击的是哪一个按钮, 以处理不同的操作 Private Sub cmdbotton_click(index As Integer) ' 3 个命令按钮共享代段 Select Case Index Case 0 Case 1 Case 2 End Select ' 处理第一个命令按钮的操作 ' 处理第二个命令按钮的操作 ' 处理第三个命令按钮的操作 控件数组的建立 1. 在设计阶段建立控件数组的步骤 (1) 在窗体上画出控件数组的第一个控件, 并进行相关属性设置 ( 此时设置的 Name 属性即控件数组名 ); (2) 选中该控件, 进行复制操作, 然后再进行若干次粘贴操作, 即可建立所需个数的控件数组元素 2. 在运行阶段添加控件数组元素的步骤 (1) 在窗体上画出控件数组的第一个控件, 并将该控件的 Index 属性设为 0, 表示该控件为控件数组的第一个元素 除设置 Name 属性外, 还可以对一些取值相同的属性进行设置, 如所有文本框的字体都相同等 (2) 可以在代码中通过 Load 方法添加其余的若干个元素, 也可以通过 Unload 方法删除某个添加的元素 Load 方法和 Unload 方法的使用格式为 : Load 控件数组名 (< 表达式 >) Unload 控件数组名 (< 表达式 >) 其中,< 表达式 > 为整型数据 表示控件数组的某个元素

200 第 6 章 常用控件 (3) 通过 Left 和 Top 属性确定每个新添加的控件数组元素在窗体上的位置, 并将 Visible 属性设置为 True 例 6.10 设计一个 IP 电话拨号程序, 界面如图 6-14 所示 要求 : 单击相应的数字按钮时, 标签的内容会发生相应变化 ; 单击 清除 按钮将清除标签中显示的内容 ; 单击 重拨 按钮将再现原来的拨号过程 图 6-14 IP 电话拨号窗体 本例中将 10 个命令按钮控件构成了一个控件数组, 在属性窗口中按表 6-13 所示设置各 对象的属性 表 6-13 各对象的主要属性设置 对 象 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption("IP 电话 ") 标签 Name(lblNumber) Caption("") BorderStyle(1) 命令按钮数组 1 Name(cmdNumber(0)~ cmdnumber(9)) Caption("0" "9") Index(0~9) 命令按钮 2 Name(cmdClear) Caption(" 清除 ") 命令按钮 3 Name(cmdRedial) Caption(" 重拨 ") 时钟 Name(Timer) Interval(500) Enabled(False) 程序代码如下 : Dim number As String ' 定义窗体级变量表示需要重拨的号码 Private Sub cmdclear_click() lblnumber.caption = "" Private Sub cmdnumber_click(index As Integer) ' 拨号过程 lblnumber.caption = lblnumber.caption + cmdnumber(index).caption Private Sub cmdredial_click() Timer1.Enabled = True number = lblnumber.caption lblnumber.caption = ""

201 Visual Basic 6.0 程序设计基础教程 Private Sub Timer1_Timer() ' 重拨过程 Static n As Integer n = n + 1 If n <= Len(number) Then lblnumber.caption = lblnumber.caption + Mid(number, n, 1) Else Timer1.Enabled = False n=0 End If 思考与讨论 : (1) 如果数字命令按钮不使用控件数组, 就必将为每一个数字命令按钮编写程序 (2) 如果将 Timer1_Timer() 事件定义的静态变量 n 改为 Dim 定义, 程序能实现重拨吗? 过程中 n=0 语句的功能是什么? 如果没有该语句, 程序运行会出现什么问题 例 6.11 设计一个霓虹灯程序, 界面如图 6-15 所示 要求 : 利用时钟控件模拟霓虹灯的效果 图 6-15 霓虹灯窗体 本例中 7 个标签构成了一个控件数组, 在属性窗口中按表 6-14 所示设置各对象的属性 表 6-14 各对象的主要属性设置 对象属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 霓虹灯 ") 标签 1 数组 Name(Label1(0)~Label1(7)) Caption("V" "B" " 编 " " 程 " " 俱 " " 乐 " " 部 ") Index(0~6) 程序代码如下 : Private Sub Form_Load() Dim i As Integer For i = 0 To 6 Label1(i).Visible = False Label1(i).ForeColor = vbred Next i Timer1.Enabled = True Timer1.Interval = 500 ' 开始时隐藏标签控件数组

202 第 6 章 常用控件 Private Sub Timer1_Timer() Static index As Integer ' 定义静态变量 index 表示当前显示的标签编号 Dim i As Integer If index <> 7 Then Label1(index).Visible = True index = index + 1 Else For i = 0 To 6 Label1(i).Visible = False Next i index = 0 End If 思考与讨论 : (1) 此题是通过时钟控件有规律地实现标签控件的隐藏和显示来达到霓虹灯的效果的 (2) 如果在运行阶段创建标签控件数组, 放在什么事件中最好? 如何编写程序? 6.7 鼠标事件与键盘事件 在前面各章节的编程中, 已用到了鼠标的 Click 事件 DblClick 事件和键盘的 KeyPress 事件 Visual Basic 应用程序能够响应多种鼠标事件和键盘事件 例如, 窗体 图片框与图像框控件都能检测鼠标指针的位置, 并可判定其左 中或右键是否已按下, 还能响应鼠标按钮与键盘的 Shift Ctrl 或 Alt 键的各种组合 利用键盘事件可以编程响应多种键盘操作, 也可以解释 处理 ASCII 字符 鼠标事件 大多数控件能够识别鼠标的 MouseMove MouseDown 和 MouseUp 事件, 通过响应这些鼠标事件, 应用程序能对鼠标位置及状态的变化作出响应操作 MouseMove: 每当鼠标指针移动到屏幕新位置时发生 MouseDown: 按下鼠标任意键时发生 MouseUp: 释放鼠标任意键时发生 当鼠标指针位于无控件的窗体上方时, 窗体将识别鼠标事件 当鼠标指针在控件上方时, 控件将识别鼠标事件 MouseMove MouseDown 及 MouseUp 3 个事件过程的语法格式如下 Sub Object_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single) Sub Object _MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single) Sub Object _MouseUp(Button As Integer,Shift As Integer,X As Single,Y As Single)

203 Visual Basic 6.0 程序设计基础教程说明 : (1)Object 是一个对象名, 可以是窗体对象和大多数可视控件 (2)Button 参数根据按下或松开鼠标的不同按钮, 将得到不同的值 如图 6-16 所示, Button 参数所对应的二进制数低 3 位 L R 及 M 分别表示左按钮 右按钮和中间按钮的状态, 相应二进制位为 0 时表示未按下对应按钮, 为 1 时表示按下了对应按钮 因此, 按下左键,Button 参数的值为 1; 按下右键,Button 参数的值为 2( 二进制是 010); 按下中间键, Button 参数的值为 4( 二进制是 100) (3)Shift 参数表示在 Button 参数指定的按钮被按下或者被松开的情况下键盘的 Shift Ctrl 和 Alt 键的状态, 可用于编写鼠标键盘组合操作的代码 如图 6-17 所示,Shift 参数所对应的二进制数低 3 位 A C 及 S, 分别表示 Alt Ctrl 与 Shift 键的状态, 相应二进制位为 0 时表示未按下对应键, 为 1 时表示按下了对应键 图 6-16 Button 参数的值图 6-17 Shift 参数的值 表 6-15 中列出了 Shift 参数的各种可能值及其含义 表 6-15 Shift 参数的值 二进制值 十进制值 系统常数 意 义 未按下任何键 vbshiftmask + vbctrlmask 同时按下 Shift 和 Ctrl 键 vbshiftmask +vbaltmask 同时按下 Shift 和 Alt 键 vbctrlmask +vbaltmask 同时按下 Ctrl 和 Alt 键 vbctrlmask +vbaltmask+ vbshiftmask 同时按下 Ctrl Alt 和 Shift 键 (4)x 和 y 参数表示鼠标指针当前的位置 注意 : 鼠标事件被用来识别和响应各种鼠标状态, 并把这些状态看作独立的事件, 不应将其与 Click 事件和 DblClick 事件混为一谈 在按下鼠标按钮并释放时,Click 事件只能把此过程识别为一个单一的单击操作 鼠标事件不同于 Click 事件和 DblClick 事件之处还在于, 鼠标事件能够区分各鼠标按钮及键盘的 Shift Ctrl 和 Alt 键的状态 例 6.12 编写程序动态显示鼠标移动过程中指针的位置, 当按下并放开鼠标时在窗体上随机打印输出一个字母, 程序运行效果如图 6-18 所示 根据题的要求, 使用文本框 Text1 Text2 来显示鼠标移动过程中指针所在的当前位置 程序代码如下 :

204 第 6 章 常用控件 图 6-18 例 6.12 程序的运行效果 ' MouseDown 事件用当前坐标 X Y 设置 CurrentX CurrentY 属性 Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Form1.CurrentX = X Form1.CurrentY = Y ' 在当前坐标处随机打印输出 1 个字母 Private Sub Form_MouseUp(Button As Integer, Shift As Integer, _ X As Single, Y As Single) If Button = 1 Then Print Chr(Int(26 * Rnd) + 65) If Button = 2 Then Print Chr(Int(26 * Rnd) + 97) ' 打印输出 1 个大写字母 ' 打印输出 1 个小写字母 ' 将鼠标指针的所在位置 X Y 动态输出在 Text1 Text2 中, 并设置 CurrentX CurrentY 属性 Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Text1 = X: Text2 = Y Form1.CurrentX = X Form1.CurrentY = Y 思考与讨论 : (1) 如果不在 Form_MouseMove 过程重新设置窗体的 CurrentX 与 CurrentY 属性, 程序运行有什么不同? (2) 如果将 Form_MouseUp 过程的打印输出字母程序移到 Form_MouseDown 中, 程序运行又有什么不同? (3) 能否通过编写窗体的单击事件来实现本程序要求随机打印字母的功能? 比较并理解 MouseDown MouseUp 及 Click 事件的触发机制 键盘事件 1.KeyPress 事件 当按下键盘上与 ASCII 字符对应的键时, 将触发 KeyPress 事件 KeyPress 事件过程的

205 Visual Basic 6.0 程序设计基础教程语法格式如下 Sub Object_KeyPress (KeyAscii As Integer) 其中 : Object 表示窗体或控件对象名,KeyAscii 参数返回对应于 ASCII 字符代码的整型数值 可使用 KeyPress 事件来处理标准 ASCII 字符 例如, 可通过下面的代码将输入文本框中的所有字母都强制转换为大写字母 Private Sub Text1_KeyPress (KeyAscii As Integer) KeyAscii = Asc(Ucase(Chr(KeyAscii))) 上述过程用 Chr 将 ASCII 字符代码转换成对应的字符, 然后用 Ucase 将字符转换为大写, 再用 Asc 将结果转换回字符代码 例 6.13 通过编程序, 在一个文本框 (Text1) 中限定只能输入数字 小数点, 并能响应 BackSpace 键及回车键 Private Sub Text1_KeyPress (KeyAscii As Integer) Select Case KeyAscii Case 48 to 57,46,8,13 Case Else KeyAscii=0 End Select 在以上过程中, 当输入 0~9 的数字字符 (ASCII 码是 48~57) 小数点 ( ASCII 码是 46) 按 BackSpace 键 (ASCII 码是 8) 及回车键 (ASCII 码是 13) 时, 不作任何操作, 即接受该操作, 因此在该 Case 分支没有写任何语句 当按其他键时, 令 KeyAscii=0, 即不接受该操作 2.KeyDown 事件和 KeyUp 事件当按下或松开键盘上一个键时, 具有焦点的对象将触发 KeyDown 或 KeyUp 事件 KeyDown 事件和 KeyUp 事件能够报告键盘本身准确的物理状态 : 按下键 (KeyDown) 或松开键 (KeyUp), 而 KeyPress 事件并不直接地报告键盘的按下或松开状态, 它只提供键所代表的字符 KeyPress 事件只识别 Enter Tab 和 Backspace 键, 不能够检测其他功能键 编辑键和定位键, 而 KeyDown 和 KeyUp 事件能够检测其他键 KeyUp 和 KeyDown 事件过程的语法格式如下 Sub Object_KeyDown(KeyCode As Integer, Shift As Integer) Sub Object_KeyUp(KeyCode As Integer, Shift As Integer) 说明 : (1)KeyCode 参数 KeyCode 表示按下的物理键 这时将 A 与 a 作为同一个键返回, 具有相同的 Keycode 值 也就是说, 大小字母使用同一键, 它们的 KeyCode 相同, 为大写字母的 ASCII 码 上档键字符和下档键字符也是使用同一键, 它们的 KeyCode 值也是相同的, 为下档字符的 ASCII

206 第 6 章 常用控件 码 注意, 键盘上的 1 和数字小键盘的 1 被作为不同的键返回, 尽管它们生成相同的 字符, 但它们的 Keycode 值是不同的 表 6-16 列出了部分字符的 KeyDown 或 KeyUp 事件 的 KeyCode 值和 KeyPress 事件的 KeyAscii 值, 请读者注意区别它们的异同 表 6-16 Keycode 和 KeyAscii 值 键 ( 字符 ) KeyCode 值 KeyAscii 值 "A" &H41 &H41 "a" &H41 &H61 "!" &H31 &H21 "1"( 大键盘上 ) &H31 &H31 "1"( 数字键盘上 ) &H61 &H31 HOME 键 &H24 &H24 F10 键 &H79 无 关于字符代码, 可通过 MSDN 的 Visual Basic 文档 参考 其他信息 字符集 中的 字符集 (0 127) 和 字符集 ( ) 得到它们的完整列表 也可通过 对象浏览器 搜索 KeyCodeConstants 获得此列表 (2)Shift 参数 Shift 参数表示当 KeyDown 和 KeyUp 事件发生时,Shift Ctrl 和 Alt 键的状态 它是一个整数, 其含义与上一节中 MouseMove MouseDown 和 MouseUp 事件中的 Shift 参数完全相同 例如 : 可以通过 Shift 参数判断是否按下了字母的大写形式 代码如下 Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbkeya And Shift = 1 Then MsgBox "You pressed the uppercase A key." End if 6.8 ActiveX 控件 概述 Visual Basic 的工具箱为用户提供了 20 种标准控件, 利用这些控件用户可以十分方便地创建出符合 Windows 界面风格的应用程序 但是利用这些标准控件无法直接设计出工具条 选项卡 进度栏以及带图标的组合框等 Windows 应用程序的常见界面 为帮助用户解决这一问题, 微软公司以及一些第三方厂商开发了许多扩展的高级控件, 这些控件被称为 ActiveX 控件 ActiveX 控件的使用方法与标准控件一样, 但首先应把需要使用的 ActiveX 控件添加到

207 Visual Basic 6.0 程序设计基础教程工具箱中 ActiveX 控件文件的类型名为.ocx, 一般情况下 ActiveX 控件被安装和注册在 \Windows\System 或 System32 目录下 执行 工程 菜单中的 部件 命令, 打开 部件 对话框, 如图 6-19 所示, 该对话框列出当前系统中所有注册过的 ActiveX 控件 可插入对象和 ActiveX 设计器 图 6-19 部件 对话框 事实上, 用户除可以使用已经设计好的 ActiveX 控件外, 还可以通过 Visual Basic 提供 的 ActiveX 设计器自己设计 ActiveX 控件 限于篇幅, 本节只对部分 ActiveX 控件做一个简 单介绍 ProcessBar 控件 ProcessBar 控件位于 Microsoft Windows Common Controls 6.0 部件中, 其添加到工具箱后的图标为 ProcessBar 控件常用于监视一个较长操作完成的进度, 它通过从左到右用一些方块填充矩形的形式来表示操作处理的进程 ProgressBar 控件通过 Min 和 Max 属性设置应用程序完成整个操作的持续时间, 通过 Value 属性指明应用程序在完成该操作过程时的进度 ProgressBar 控件的 Height 属性和 Width 属性决定填充控件的方块的数量和大小 方块数量越多, 就越能精确地描述操作进度, 可通过减少 ProgressBar 控件的 Height 属性或者增加其 Width 属性来增加显示方块的数量 例 6.13 ProgressBar 控件示例 设计一个进度条, 用来指示程序结束的时间进度 界面如图 6-20 所示 图 6-20 ProgressBar 控件示例

208 第 6 章 常用控件 代码如下 : Private Sub Form_Load() ProgressBar1.Min = 0 ProgressBar1.Max = 10 ProgressBar1.Value = 0 Timer1.Interval = 1000 Timer1.Enabled = True Private Sub Timer1_Timer() If ProgressBar1.Value >= 10 Then End ProgressBar1.Value = ProgressBar1.Value ImageList 控件与 ImageCombo 控件 ImageList 控件与 ImageCombo 控件均位于 Microsoft Windows Common Controls 6.0 部件中, 其添加到工具箱后的图标分别为和 ImageList 控件不能独立使用, 它只是一个向其他控件提供图像的资料中心, 运行时不可见 ImageCombo 控件是支持图片的组合框, 控件列表中的每一项都可以有一幅图片指定给它 在属性窗口中选择 ImageList 控件的 自定义 项可以打开该控件的属性页, 如图 6-21 所示 ), 在通用选项卡中设置图片的大小, 在图像选项卡中插入图片 每个图片按插入的顺序分配一个索引号 ( 从 1 开始 ), 图片总数可由 ImageList 控件所包含的 ListImage 对象集合 ( 由列表中的所有项组合起来构成 ) 的 Count 属性获得 图 6-21 ImageList 控件的属性页 为了在 ImageCombo 控件中显示出 ImageList 控件的图片, 需要将 ImageCombo 控件的 ImageList 属性设置为 ImageList 控件的对象名 此外,ImageCombo 控件包括一个 ComboItems 对象的集合 ( 由列表中的所有项组合起来构成 ), 可以采用与组合框类似的 Add Remove 和 Clear 方法管理控件的列表部分 Add 方法的基本使用格式为 : ImageCombo 控件名. ComboItems.Add 索引号, 关键字, 文本内容, 图片索引例 6.14 ImageList 控件与 ImageCombo 控件示例 设计一个程序, 运行时自动将

209 Visual Basic 6.0 程序设计基础教程 ImageList 控件中的图片与组合框 cbofriend 中对应项目组合在一起, 添加到 ImageCombo 控件中, 且选择 ImageCombo 控件中某一项目后, 该项目的文本内容自动在昵称文本框 txtfriend 中显示 界面如图 6-22 所示 图 6-22 ImageList 控件与 ImageCombo 控件示例 代码如下 : Private Sub Form_Load() Dim i As Integer ImageCombo1.ImageList = ImageList1 cbofriend.visible = False For i = 1 To ImageList1.ListImages.Count ImageCombo1.ComboItems.Add i,, cbofriend.list(i), i Next i Private Sub ImageCombo1_Click() txtname.text = ImageCombo1.Text SSTab 控件 SSTab 控件位于 Microsoft Windows Tabbed Dialog Control 6.0 部件中, 其添加到工具箱后的图标为 使用 SSTab 控件可以十分方便地创建出类似于图 6-23 所示的包含选项卡的界面 每个选项卡都可作为其他控件的容器, 即可以将其他控件放置于选项卡中, 放置的方法与在框架中放置控件的方法相同 在 SSTab 控件中, 同一时刻只有一个选项卡是活动的, 该选项卡向用户显示它本身所包含的控件而隐藏其他选项卡中的控件 图 6-23 SSTab 控件示例

210 第 6 章 常用控件 SSTab 控件常用的属性有以下几种 (1)Style 属性 : 决定选项卡的样式 0 为 Windows 3.1 的风格,1 为 Windows 95 的风格 (2)Tabs 属性 : 决定选项卡的总数 (3)Rows 属性 : 决定选项卡的总行数 (4)TabsPerRow 属性 : 决定每一行上选项卡的数目 (5)Tab 属性 : 返回或设置 SSTab 控件的当前选项卡 本章小结 Visual Basic 提供的控件十分丰富, 本章主要介绍了 Visual Basic 的单选钮 检查框 框架 滚动条 列表框 组合框与时钟等一些常用的标准控件以及部分常用的 ActiveX 控件的使用方法, 同时也介绍了鼠标和键盘事件的编程 学习控件, 要掌握一种学习方法, 即从用途 属性 方法和事件 4 个方面去把握一个控件 明确控件的用途有助于在编程时选择合适的控件以达到预期的效果, 对于控件的属性 方法和事件的使用方法, 掌握一些常用的即可 命令按钮控件常用于实现程序的交互控制, 当用户单击命令按钮后完成特定的操作 它的标题一般说明其功能, 而实现其功能需要为相应事件过程编写代码, 命令按钮的常用事件过程为 Click 标签控件常用于为其他没有 Caption 属性的控件 ( 如文本框 列表框等 ) 做说明, 也可以在运行时显示运行结果或提示信息 文本框控件是程序与用户进行交互的控件 用户既可以在文本框内用键盘输入数据, 也可以把文本框作为输出控件 与 InputBox 函数不同的是, 输入对话框窗口在输入结束后是即时关闭的 文本框与标签控件不同的是, 前者在运行时可以编辑文本框的内容, 后者不能获得焦点, 不能直接编辑标签的内容, 它们共同点是都可以作为输出控件 单选钮和复选框提供了两种选择的方式 : 同处在一个容器中的多个单选钮只能选择其中的一个, 而多个复选框可以同时选中多个 框架是一个容器控件, 建立框架控件除了可以实现单选钮的分组功能外, 在界面设计时, 常常将一些功能相近的控件置于同一个框架控件中, 使得界面更加清晰 列表框和组合框也是提供选择的控件 如果有较多的选项又不想占用较大的界面空间, 运用这两个控件最为合适 列表框控件支持复选, 可以同时选择多个选项 ; 组合框控件组合了文本框和列表框的性能, 可以直接输入选项内容, 也可以在列表中进行选择, 但不能多选 滚动条控件提供了更直观 更方便地利用鼠标操作向应用程序输入数据的手段, 通过设置 Min 和 Max 属性, 还可以将输入的数据限制在一定的范围内 通常是通过编写滚动条控件的 Change 事件过程和 Scroll 事件过程实现滚动条的操作 程序中有规律的 自动执行的过程要利用定时器控件实现, 例如动画程序 定时器的惟一事件是 Timer 事件, 每过 Interval/1000 秒自动调用执行一次 在设计应用程序时, 如果在同一界面上需要用到多个性质相同 用途相似的控件, 建立

211 Visual Basic 6.0 程序设计基础教程 控件数组是较好的选择, 控件数组的建立会令编程更简洁更易维护 习题 一 判断题 1. 如果要时钟控件每分钟发生一个 Timer 事件, 则 Interval 属性应设置为 1,Interval 属性值为 0 时, 表示屏蔽计时器 2. 计时器控件在 Visual Basic 应用程序启动后自动计时, 无法暂停或关闭 3. 要在同一窗体中建立几组相互独立的单选钮时, 要用框架将每一组单选钮框起来 4. 如果将框架控件的 Enabled 属性设为 False, 则框架内的控件都不可用 5. 清除 List1 列表框对象的内容的语句是 List1.Cls, 清除 Combo1 组合框的内容的语句是 Combo1.Clear 6. 若在列表框中第 5 项后插入一项目 ABCD, 则所用语句为 List1.AddItem "ABCD",6 7. 组合框的 Change 事件在用户改变组合框的选中项时被触发 8. 不同控件具有不完全相同的属性集合 一些属性是所有控件共有的, 一些属性则是部分控件所特有的 9. 一些属性既可以在属性窗口中设置, 又可以在代码中进行修改 另一些属性则是只读的, 只能在设计阶段进行设置 10. 除了标准控件以外,Visual Basic 可以使用其他控件 用户自定义控件和第三方厂商研制的控件 11. 移动框架时框架内的控件也跟随移动, 并且框架内各控件的 Top 和 Left 属性值也将分别随之改变 12. 在用户拖动滚动滑块时, 滚动条的 Change 事件连续发生 二 填空题 1. 将文本框的 ScrollBars 的属性设置为 2( 有垂直滚动条 ), 但没有出现垂直滚动条, 这是因为没有将 属性设置为 True 2. 检查框的 属性设置为 2-grayed 时, 其将变成灰色 3. 列表框中的 和 属性是数组 列表框中项目的序号是从 开始的 列表框 List1 中最后一项的序号用 表示 4. 组合框是组合了文本框和列表框的特性而形成的一种控件 风格的组合框不允许用户输入列表中没有的项 5. 当用户单击滚动条的空白处时, 滑块移动的增量值由 属性决定 滚动条产生 Change 事件是因为 值改变了 三 程序填空 1. 完成一个字体设置程序的设计, 要求分别单击三个组合列表框的列表项时, 都能实

212 第 6 章 常用控件 现对标签控件 Label1 VB 程序设计 字体的设置 程序启动后, 组合列表框 Combo3 的文本框显示为 12, 对 Combo3 的相关属性做合理设置 Private Sub Form_Load() ' 给组全框 Combo3 中添加字号 Dim i As Integer For i = 4 To 72 Step 4 Combo3.AddItem Str(i) Next i Private Sub Combo1_Click() 1 Private Sub Combo2_Click() Select Case 2 ' 选择并设置字体 ' 选择并设置字形 Case " 常规 " Label1.FontBold = False Label1.FontItalic = False Case " 斜体 " Label1.FontBold = False Label1.FontItalic = True Case " 粗体 " Label1.FontBold = True Label1.FontItalic = False Case " 粗体斜体 " 3 4 End Select Private Sub Combo3_Click() ' 选择并设置字号 5 2. 下列程序段的功能是交换如图 6-24 所示的两个列表框中的项目 当双击某个项目时, 该项目从本列表框中消失, 并出现在另一个列表框中 列表 1 的名称为 List1, 列表 2 的名称为 List2 程序界面设计如图 6-24 所示 Private Sub Form_Load() List1.AddItem "IBM" List1.AddItem "Compaq" List1.AddItem "AST"

213 Visual Basic 6.0 程序设计基础教程 Private Sub List1_DblClick() List2.AddItem 1 2 Private Sub List2_DblClick() 3 4 List2.ListIndex 图 6-24 程序界面 四 选择题 1. 将数据项 CHINA 添加到列表框 List1 中, 且使之成为第一项, 使用 语句 (A)List1.AddItem "CHINA", 0 (B)List1.AddItem "CHINA",1 (C)List1.AddItem,0,"CHINA" (D)List1.AddItem, 1, "CHINA" 2. 执行了下面的程序后, 列表框中的数据项为 Private Sub Form_Click() Dim I As Integer For I =1 to 6 List1.AddItem I Next I For I = 1 to 3 List1.Removeltem I Next I End sub (A)1,5,6 (B)2,4,6 (C)4,5,6 (D)1,3,5 3. 如果列表框 List1 中没有被选定的项目, 则执行 List1.RemoveItem List1.ListIndex 语句的结果是 (A) 移去第一项 (B) 移去最后一项 (C) 移去最后加入列表的一项 (D) 以上都不对 4. 如果列表框 List1 中只有一个项目被用户选定, 则执行 Debug.Print List1. Selected(List1.ListIndex) 语句的结果是 (A) 在 Debug 窗口输出被选定的项目的索引值 (B) 在 Debug 窗口输出 True

214 第 6 章 常用控件 (C) 在窗体上输出被选定的项目的索引值 (D) 在窗体上输出 True 5. 假定时钟控件 Timer1 的 Interval 属性 1000,Enabled 属性为 True, 并且有下面的事件 过程, 计算机将发出 次 Beep 声 Private Sub Timer1_Timer() Dim I As Integer For I = 1 to 10 Beep Next I End sub (A)1000 次 (B)10000 次 (C)10 次 (D) 以上都不对 6. 在下列说法中, 正确的是 (A) 通过适当的设置, 可以在程序运行期间, 让时钟控件显示在窗体上 (B) 在列表框中不能进行多项选择 (C) 在列表框中能够将项目按字母顺序从大到小排列 (D) 框架也有 Click 和 DblClick 事件 五 编程题 1. 设计如图 6-25 所示的添加和删除程序, 根据以下要求编写相应的事件代码 : (1) 在组合框中输入内容后, 单击 添加 按钮, 如果组合框中设有该内容, 则将输 入内容加入到列表中, 否则将不添加, 另外要求组合框中内容能自动按字母排序 (2) 在列表中选择某一选项后, 单击 删除 按钮, 则删除该项 在组合框中输入内 容后, 单击 删除 按钮, 若列表中有与之相同的选项, 则删除该项 (3) 单击 清除 按钮, 将清除列表中的所有内容 2. 设计如图 6-26 所示的 偶数迁移 程序 根据以下要求编写相应的事件代码 : 图 6-25 添加和删除程序图 6-26 偶数迁移 程序运行效果 (1) 窗体的左边有一个标签 Label1, 标题为 两位正整数 :, 标签的下面是一个列表框 List1 (2) 窗体的右边有一个标签 Label2, 标题为 偶数 :, 标签的下面是一个列表框 List2 (3) 单击 产生 按钮 (Command1), 计算机产生 10 个两位正整数放入列表框 List1 中 同时清空列表框 List2 中的内容

215 Visual Basic 6.0 程序设计基础教程 (4) 单击 --> 按钮 (Command2), 将列表框 List1 中所有偶数迁移到列表框 List2 中 实验 1. 设计一个家电提货单管理程序 程序运行界面如图 6-27 所示 具体要求如下 : (1) 根据选项中选择的家电及数量, 单击 确定 后, 将选择的清单及总价在列表框中列出 (2) 每选择一种家电, 光标自动定位在相应的文本框中, 取消选择时, 相应的文本框自动清空 (3) 清除 按钮用于清空列表框中的项目 (4) 所有文本框只接受数字 图 6-27 家电提货单管理程序 2. 设计一个 电子钟 程序 程序运行界面如图 6-28 所示 具体要求如下 : (1) 设计两个定时器,Timer1 用于显示系统时间, 时间间隔为一秒 ;Timer2 用于判断闹钟时间, 时间间隔为 0.5 秒,Timer2 设置为不可用 (2) 窗体的上半部是标签 Label1, 用于显示时间, 设置 Label1 的 Font 为宋体 粗体 二号, 背景为白色, 文字居中对齐, 固定边框 (3) 窗体的下半部是标签 Label2, 标题为 闹钟时间 : ;Label2 的右边是文本框 Text1 (4) 在文本框中输入闹钟时间并按回车后, 启动判断闹钟时间的定时器 Timer2, 如果 Label1 显示的时间超过闹钟时间, 则标签 Label1 的背景色按红白两色交替变换 图 6-28 电子钟 程序运行效果 3. 设计一个调色板应用程序, 使用 3 个滚动条作为 3 种基本颜色的输入工具, 合成的颜色显示在右边的颜色区 ( 一个标签 ), 即用合成的颜色设置标签的背景色 (BackColor 属性 )

216 第 6 章 常用控件 当完成调色以后, 用 设置前景颜色 或 设置背景颜色 按钮设置一文本框的前景和背景颜色 程序设计界面如图 6-29 所示 4. 设计一个人资料输入窗口, 使用单选按钮选择 性别, 组合列表框选择 民族, 复选框选择 个人爱好, 单击 确定 按钮, 将个人资料信息输出在 个人资料 的框架内, 程序运行界面如图 6-30 所示 图 6-29 调色板应用程序图 6-30 个人资料程序运行界面

217 第 7 章 文 件 前面编写的应用程序, 其数据的输入都是通过使用键盘 文本框或 InputBox 对话框来实现的, 程序的运行结果打印到窗体或其他可用于显示的控件上 但如果要再次查看结果, 就必须重新运行程序, 并输入数据 另外当计算机关闭或退出应用程序时, 其相应的数据也将全部丢失, 无法重复使用 因此为了长期保存数据, 方便修改和供其他程序调用, 就必须将其以文件的形式保存在磁盘中 Visual Basic 具有较强的文件处理能力, 同时又提供了用于制作文件系统的控件和大量的与文件管理有关的语句 函数, 使用户既可以直接读写文件, 又可以方便地访问文件系统 读者学习本章后, 应该做到 : (1) 理解 Visual Basic 文件系统的基本概念 ; (2) 掌握文件系统控件的使用 ; (3) 掌握顺序文件 随机文件以及二进制文件的特点及它们的打开 关闭和读写操作 ; (4) 掌握与文件管理有关的常用语句 函数的使用 7.1 文件的概念 文件是存储在外部介质上的数据的集合 计算机处理的数据一般都以文件的形式存放在外部介质 ( 如磁盘 ) 上, 操作系统以文件为单位进行数据管理 用户要识别数据, 必须先按文件名找到指定文件, 再对其中的数据进行读写等操作 磁盘文件由数据记录组成 记录是计算机处理数据的基本单位, 它由一组具有共同属性相互关联的数据项组成 根据计算机访问文件的方式可将文件分成 3 类 : 顺序文件 206

218 Visual Basic 6.0 程序设计基础教程随机文件和二进制文件 1. 顺序文件顺序文件 (Sequential File) 是普通的文本文件 其中的记录按顺序一个接一个地排列 读写文件存取记录时, 都必须按记录顺序逐个进行 所以要在顺序文件中找一个记录, 必须从第一个记录开始读取, 直到找到该记录为止 例如要读取文件中的第 100 个记录, 就必须先读出前 99 条记录, 写入记录也是如此 顺序文件中的每一行字符串就是一条记录, 每条记录可长可短, 并且记录之间以 换行 字符为分隔符 顺序文件的优点是文件结构简单, 且容易使用 ; 缺点是如果要修改数据, 必须将所有数据读入到计算机内存 (RAM) 中进行修改, 然后再将修改好的数据重新写入磁盘 由于无法灵活地随意存取, 它只适用于有规律的 不经常修改的数据, 如文本文件 2. 随机文件随机文件 (Random Access File) 是可以按任意次序读写的文件, 其中每个记录的长度必须相同 在这种文件结构中, 每个记录都有其惟一的一个记录号, 所以在读取数据时, 只要知道记录号, 便可以直接读取记录 随机文件数据是作为二进制信息存储的 其优点是存取数据快, 更新容易 ; 缺点是所占空间较大, 设计程序较繁琐 3. 二进制文件二进制文件 (Binary File) 是字节的集合, 它直接把二进制码存放在文件中 除了没有数据类型或者记录长度的含义以外, 它与随机访问很相似 二进制访问模式以字节数来定位数据, 在程序中可以按任何方式组织和访问数据, 对文件中各字节数据直接进行存取 因此这类文件的灵活性最大, 但程序的工作量也最大 7.2 文件系统控件 Visual Basic 提供了 3 种可直接浏览系统目录结构和文件的常用控件 : 驱动器列表框 (DriveListBox) 目录列表框 (DirListBox) 和文件列表框 (FilelistBox) 用户可 以使用以上 3 种控件建立与文件管理器类似的窗口界面, 如图 7-1 所示 驱动器列表框 (DriveListBox) 驱动器列表框是下拉式列表框 在默认时显示计算机系统中当前的驱动器 当该控件获得焦点时, 用户可输入任何有效的驱动器标识符, 或者单击驱动器列表框右侧的箭头, 以下拉列表框形式列出所有的有效驱动器, 但不提供网络驱动器, 如图 7-2 所示 若用户从中选定新驱动器, 则这个驱动器将出现在列表框的顶端

219 第 7 章 文件 驱动器列表框 目录列表框 文件列表框 图 7-1 驱动器 目录和文件列表框 图 7-2 驱动器列表框 1. 重要属性 驱动器列表框控件最重要和常用的属性是 Drive 属性, 用于返回或设置运行时选择的驱 动器, 默认值为当前驱动器 该属性在设计时不可用 使用格式 :object.drive [= < 字符串表达式 >] 其中 : Object 为对象表达式, 其值是驱动器列表框对象的名称 ; < 字符串表达式 >, 指定所选择的驱动器 例如 : A: 或 a:, C: 或 c: 驱动器列表框显示可用的有效驱动器 从列表框中选择驱动器并不能使计算机系统自动 地变更当前的工作驱动器, 必须通过 ChDrive 语句来实现, 其使用格式如下 : ChDrive Drive1.Drive 2. 重要事件 Change 事件 在程序运行时, 当选择一个新的驱动器或通过代码改变 Drive 属性的设置时都会触发驱 动器列表框的 Change 事件发生 例如, 要实现驱动器列表框 (Drive1) 与目录列表框 (Dir1) 同步, 就要在该事件过程中写入如下代码 : Dir1.Path=Drive1.drive 目录列表框 (DirListBox) 目录列表框从最高层目录开始显示用户系统上的当前驱动器目录结构及当前目录下的所有子目录 当前目录名被突出显示, 且当前目录和在目录层次结构中比它更高层的目录一起向根目录方向缩进 在目录列表框中当前目录下的子目录也缩进显示 用户可以通过双击任一个可见目录来显示其所有子目录或关闭显示, 并使该目录成为当前目录, 如图 7-3 所示

220 Visual Basic 6.0 程序设计基础教程 图 7-3 目录列表框 1. 常用属性目录列表框控件的 Path 属性是其最常用的属性, 用于返回或设置当前路径 该属性在设计时是不可用的 使用格式 :Object.Path [= < 字符串表达式 >] 其中 : Object 为对象表达式, 其值是目录列表框的对象名 < 字符串表达式 > 用来表示路径名的字符串表达式 例如, C:\Mydir 默认值是当前路径 另外,Path 属性也可以直接设置限定的网络路径, 如 \\ 网络计算机名 \ 共享目录名 \path 如果要在程序中对指定目录及其他的下级目录进行操作, 就要用到 List ListCount 和 ListIndex 等属性, 这些属性与列表框 (ListBox) 控件基本相同 目录列表框中的当前目录的 ListIndex 值为 1 紧邻其上的目录 ListIndex 值为 2, 再上一个的 ListIndex 值为 3, 依次类推 当前目录 (Dir1.Path) 中的第一个子目录的 ListIndex 值为 0 若第一级子目录有多个目录, 则每个目录的 ListIndex 值按 的顺序依次排列, 如图 7-4 所示 ListCount 是当前目录的下一级子目录数 List 属性是一个字符串数组, 其中每个元素就是一个目录路径字符串 当前目录可用目录列表框的 Path 属性设置或返回, 也可使用 List 属性来得到 图 7-4 目录列表框的 ListIndex 属性值 例如, 图 7-4 中 Dir1.Path 属性和 Dir1.List(Dir1. ListIndex) 的值相同, 并且都是 : C:\Program Files\Microsoft Office\Office\Bitmaps 单击目录列表框中的某个项目时将突出显示该项目 双击时则把该路径赋值给 Path 属

221 第 7 章 文件 性, 同时将其 ListIndex 属性设置为 1, 然后重绘目录列表框以显示直接相邻的下级子目录 注意 : 目录列表框并不在操作系统级设置当前目录, 要设置当前工作目录应使用 ChDir 语句 例如, 下列语句将当前目录变成目录列表框中显示的一个目录 : ChDir Dir1.Path 在应用程序中, 也可用 Application 系统对象 ( 对象名为 App) 将当前目录设置成应用程序的可执行 (.exe) 文件所在的目录 : ChDrive App.Path ChDir App.Path ' 设置当前驱动器 ' 设置当前目录 2. 重要事件 Change 事件 与驱动器列表框一样, 在程序运行时, 每当改变当前目录, 即目录列表框的 Path 属性发 生变化时, 都要触发其 Change 事件 例如, 要实现目录列表框 (Drive1) 与文件列表框 (File1) 同步, 就要在目录列表框的 Change 事件过程中写入如下代码 : File1.Path= Dir1.Path 文件列表框 (FileListBox) 文件列表框以简单列表的形式显示当前目录中的文件列表, 图 7-1 中右边所示为文件列表框 1. 常用属性 (1)Path 属性文件列表框的 Path 属性, 用于返回和设置文件列表框当前目录, 设计时不可用 使用格式与目录列表框的 Path 属性相似 当 Path 值改变时, 会引发一个 PathChange 事件 (2)Filename 属性用于返回或设置被选定文件的文件名, 设计时不可用 注意 :Filename 属性不包括路径名, 这与通用对话框中的 Filename 属性不同 在程序中要使用文件系统控件浏览文件或进行进一步操作如打开 复制等, 就必须获得全路径的文件名, 如 C:\Windows\Config.sys 通常采用将文件列表框的 Path 属性值和 File 属性值字符串连接的方法来获取带路径的文件名, 但要判断 Path 属性值的最后一个字符是否是目录分隔号 \, 如果不是应添加一个 \, 以保证目录分隔正确 例如, 要从文件列表框 (File1) 中获得全路径的文件名 Fname$, 用下面的程序代码 : If Right(file1.path,1) ="\" Then Fname$=file1.path & file1.filename

222 Visual Basic 6.0 程序设计基础教程 Else Fname$=file1.path & "\" & file1.filename End If (3)Pattern 属性用于返回或设置文件列表框所显示的文件类型 可在设计阶段设置或在程序运行时设置 默认时表示所有文件 设置形式为 : Object.Pattern [= value] 其中 value 是一个用来指定文件类型的字符串表达式, 并可包含通配符 * 和? 例如 : File1.Pattern= "*.txt " ' 只显示所有文本文件 File1.Pattern= "*.txt; *.Doc " ' 只显示所有文本文件和 Word 文档文件 File1.Pattern= "???.txt" ' 只显示文件名包含 3 个字符文本文件 (4) 文件属性文件属性包括 Archive Normal System Hidden 和 ReadOnly 可在文件列表框中用这些属性指定要显示的文件类型 System 和 Hidden 属性的默认值为 False Normal Archive 和 ReadOnly 属性的默认值为 True 例如, 为了在列表框中只显示只读文件, 可直接将 ReadOnly 属性设置为 True, 并把其他属性设置为 False: File1.ReadOnly = True File1.Archive = False File1.Normal = False File1.System = False File1.Hidden = False 当 Normal = True 时将不显示 System 或 Hidden 属性的文件 当 Normal =False 时仍然可显示具有 ReadOnly 和 Archive 属性的文件, 只需将这些属性设置为 True (5)MultiSelect 属性文件列表框 MultiSelect 属性与 ListBox 控件的 MultiSelect 属性使用方法完全相同 默认情况是 0, 即不允许选取多项 (6)List ListCount 和 ListIndex 属性文件列表框中的 List ListCount 和 ListIndex 属性与列表框 (ListBox) 控件的 List ListCount 和 ListIndex 属性的含义和使用方法相同, 在程序中对文件列表框中的所有文件进行操作, 就要用到这些属性 例如, 下段程序是将文件列表框 (File1) 中的所有文件名显示在窗体上 For i = 0 To File1.ListCount - 1 Print File1.List(i) Next i 2. 主要事件 (1)PathChange 事件

223 第 7 章 文件 当路径被代码中 FileName 或 Path 属性的设置所改变时, 此事件发生 说明 : 可使用 PathChange 事件过程来响应 FileListBox 控件中路径的改变 当将包含新路径的字符串给 FileName 属性赋值时,FileListBox 控件就调用 PathChange 事件过程 (2)PatternChange 事件当文件的列表样式, 如 : *.*, 被代码中对 FileName 或 Path 属性的设置所改变时, 此事件发生 说明 : 可使用 PatternChange 事件过程来响应在 FileListBox 控件中样式的改变 (3)Click DblClick 事件在文件列表框中单击, 选中所单击的文件, 将改变 ListIndex 属性值, 并将 Filename 的值设置为所单击的文件名字符串 例如 : 单击输出文件名 Sub File1_Click( ) MsgBox File1.FileName 文件列表框能识别双击事件, 常常用于对所双击的文件进行处理 例如 : 下面的程序段是用来执行双击的应用程序 (*.EXE 或 *.COM) Sub File1_DblClick( ) Dim Fname As String If Right(file1.path,1) ="\" Then Fname=file1.path & file1.filename Else Fname=file1.path & "\" & file1.filename End If RetVal = Shell(Fname, 1) ' 执行程序 文件系统控件的联动 在类似文件管理器的目录文件窗口中, 要使驱动器列表框中当前驱动器的变动引发目录列表框中当前目录的变化, 并进一步引发文件列表框目录的变化, 则必须在驱动器列表框和目录列表框的 Change 事件过程中设置程序代码, 以实现文件系统控件的联动 例如, 要建立图 7-1 所示的文件浏览程序, 设驱动器列表框名为 Drive1, 目录列表框名为 Dir1, 文件列表框名为 File1, 程序代码如下 : Private Sub Drive1_Change() Dir1.Path=Drive1.drive Private Sub Dir1_Change( ) File1.Path=Dir1.Path

224 Visual Basic 6.0 程序设计基础教程 7.3 顺序文件 在程序中对文件的操作, 通常按 3 个步骤进行 : 打开 读取或写入以及关闭 顺序文件的打开与关闭 1. 打开顺序文件在 Visual Basic 中, 使用 Open 语句打开要操作的文件, 其使用格式如下 : Open FileName For [Input Output Append] [Lock]As filenumber [Len = Buffersize] 说明如下 FileName: 为文件名字符串表达式, 该文件名一般应包括盘符 路径及文件名, 此参数不可省 Output: 以此方法打开的文件, 是用来输出数据的, 可将数据写入文件, 即进行写操作 如果 FileName 指定的文件不存在, 则创建新文件, 如果是已存在的文件, 则覆盖原文件 不能对此文件进行读操作 Iuput: 以此方法打开的文件, 是用来读入数据的, 可从文件中把数据读入内存, 即进行读操作 FileName 指定的文件必须是已存在的文件, 否则会出错 不能对此文件进行写操作 Append: 以此方法打开的文件, 也是用来输出数据的 与用 Output 方式打开不同的是, 如果 FileName 指定的文件已存在, 则不覆盖文件原内容, 新写入的数据追加到文件末尾 如 FileName 指定的文件不存在, 则创建新文件 Filenumber: 为每个打开的文件指定一个文件号, 在后续程序中可用此文件号来指代相应的文件, 参与文件读写和关闭命令 文件号为 1~511 之间的整数 可用 Freefile 函数获得下一个要利用的文件号 Buffersize: 可选项参数, 用于在文件与程序之间拷贝数据时, 指定缓冲区的字符数 Lock: 可选项参数, 设定要打开文件的共享权限, 它可以是下列关键字之一 Shared 其他文件可以读写此文件 ; Lock Read 其他文件不能读此文件 ; Lock Write 其他文件不能写此文件 ; Lock Read Write 其他文件不能读也不能写此文件 例如 :OPEN "C:\TEMP\A.TXT" FOR INPUT AS #1 表示将 C: 盘 TEMP 目录下的文件 A.TXT 打开进行读入操作, 文件号为 1 此时文件不可写 2. 关闭顺序文件在打开一个文件 Input Output 或 Append 以后, 在被其他类型的操作重新打开它之前必

225 第 7 章 文件 须先使用 Close 语句关闭它 Close 语句的使用格式如下 : Close [filenumberlist] 说明如下 filenumberlist 是可选项, 为文件号列表, 如 #1, #2, #3, 如果省略, 则将关闭 Open 语句打开的所有活动文件 例如 : Close #1,#2,#3 Close 顺序文件的读写操作 1. 写操作要向顺序文件中写入 ( 存储 ) 内容, 应以 Output 或 Append 方式打开它, 然后使用 Print# 语句或 Write# 语句 (1)Print 语句使用格式 : Print #< 文件号 >,[< 输出列表 >] 文件号为以写方式打开文件的文件号 ; 输出列表为用分号或逗号分隔的变量 常量 空格和定位函数序列 数据写入文件的格式与使用 Print 方法获得的屏幕输出格式相同 (2)Write 命令使用格式 : Write #< 文件号 >,[< 输出列表 >] 各项含义与 Print 命令相同, 但输出列表只用逗号分隔, 数据写入文件中以紧凑格式存放, 并在数据项之间插入, 给字符串加上双引号 例 7.1 Print 与 Write 语句输出数据结果比较 Private Sub Form_Click() Dim St As String, Anum As Integer Open "D:\Myfile.dat" For Output As 1 St = "ABCDEFG" Anum = Print #1, St, Anum Write #1, St, Anum Close #1 上面的程序运行后, 在 D 盘根目录中, 将建立一个 D:\Myfile.dat 的文本文件, 并写入两行数据 使用记事本打开该文件, 可见其输出结果, 如图 7-5 所示

226 Visual Basic 6.0 程序设计基础教程 图 7-5 Print 与 Write 输出结果比较 例 7.2 编程实现 : 把一个文本框中的内容, 以文件形式存入磁盘 假定文本框的名称为 Mytxt, 文件名为 Myfile.dat 方法 1: 把整个文本框的内容一次性地写入文件 Open "Myfile.dat" For Output As #1 Print #1, Mytxt.Text Close #1 方法 2: 把整个文本框的内容一个字符一个字符地写入文件 Open "Myfile.dat" For Output As #1 For i=1 To len(mytxt.text) Print #1,Mid(Mytxt.Text,i,1); Next i Close #1 2. 读操作在程序中, 要使用一现存文件中的数据, 必须先把它的内容读入到程序的变量中, 然后操作这些变量 要从现存文件中读入数据, 应以顺序 Input 方式打开该文件 然后使用 Line Input#, Input( ) 函数或者 Input# 语句将文件读入到程序变量中 (1)Input# 语句使用格式 : Input #< 文件号 >,< 变量列表 > 从文件中依次读出数据, 并放在变量列表中对应的变量中 ; 变量的类型与文件中数据的类型要求对应一致 为了能够用 Input # 语句将文件的数据正确读入到变量中, 要求文件中各数据项应用分隔符分开 (2)Line Input # 语句使用格式为 : Line Input #< 文件号 >,< 字符串变量 > 其功能是, 从已打开的顺序文件中读出一行, 并将它分配给字符串变量 Line Input # 语句一次只从文件中读出一个字符, 直到遇到回车符 (Chr(13)) 或回车 换行符 (Chr(13)+Chr(10)) 为止 回车 / 换行符将被跳过, 不会附加到字符变量中 (3)Input 函数函数引用形式为 :Input$(< 读取字符数 >,#< 文件号 >)

227 第 7 章 文件 该函数根据所给定的参数从指定文件中读取指定的字符数, 以字符串形式返回给调用程序 (4) 与读文件操作有关的几个函数 1 Lof 函数 Lof 函数将返回某文件的字节数 例如,Lof(1) 返回 #1 文件的长度, 如果返回 0 值, 则表示该文件是一个空文件 2 Loc 函数 Loc 函数将返回在一个打开文件中读写的记录号 ; 对于二进制文件, 它将返回最近读写的一个字节的位置 3 Eof 函数 Eof 函数将返回一个表示文件指针是否到达文件末尾的标志 如果到了文件末尾,Eof 函数返回 TRUE( 1), 否则返回 FALSE(0) 例 7.3 编程将一文本文件的内容读到文本框中 假定文本框名称为 txttest, 文件名为 MYFILE.TXT 可以通过下面 3 种方法来实现 方法 1: 一行一行读 txttest.text = "" Open "MYFILE.TXT" For Input As #1 Do While Not EOF(1) Line Input #1, st 'vbcrlf 为表示回车换行符的系统常量 txttest.text = txttest.text + st +vbcrlf Loop Close #1 方法 2: 一次性读 txttest.text = "" Open "MYFILE.TXT" For Input As #1 txttest.text = Input( LOF(1),1) Close #1 方法 3: 一个字符一个字符读 Dim st as String*1 txttest.text = "" Open "MYFILE.TXT" For Input As #1 Do While Not EOF(1) st = Input(1,#1) txttest.text = txttest.text + st Loop Close #1 例 7.4 利用文件系统控件 组合框以及文本框, 制作一个文件浏览器, 组合框限定文件列表框中显示文件的类型, 例如选定 *.Txt 文件 当在文件列表框选定欲显示的文件时,

228 Visual Basic 6.0 程序设计基础教程 在文本框中显示出该文件的内容 程序运行效果如图 7-6 所示 图 7-6 文本浏览器运行界面 各控件的主要属性设置如表 7-1 所示 表 7-1 文本浏览器 中控件的主要属性设置 控 件 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 文件浏览 ") 驱动器列表框 1 Name(Drive1) 目录列表框 1 Name(Dir1) 文件列表框 1 Name(File1) 组合框 1 Name(CboType) Style(2) 文本框 1 Name(Text1) MultiLine(True) ScrollBox(3) 程序代码如下 : Sub Drive1_Change() ' 当驱动器 1 改变后, 使目录列表框 1 同步 Dir1.Path = Drive1.Drive Sub dir1_change() ' 当目录改变后, 使文件列表 1 框同步 File1.Path = Dir1.Path Private Sub File1_Click() ' 将选中的文件显示在文本 Text1 中 Dim st As String, Fpath As String Text1.Text = "" ' 判断当前目录是否是根目录, 并组合得到包含路径的文件名 If Right(Dir1.Path, 1) = "\" Then Fpath = Dir1.Path & File1.FileName Else Fpath = Dir1.Path & "\" & File1.FileName End If Open Fpath For Input As #1 ' 打开文件 Do While Not EOF(1) ' 读入文件, 并将其显示在文本框中 Line Input #1, st

229 第 7 章 文件 Loop Text1.Text = Text1.Text + st + vbcrlf Close #1 Sub Form_Load() Dim Item As String ' 关闭文件 ' 初始化组合列表框 Item = " 所有文件 (*.*)" cbotype.additem Item + Space(20 - Len(Item)) + "*.*" Item = " 窗体文件 (*.Frm)" cbotype.additem Item + Space(20 - Len(Item)) + "*.Frm" Item = " 文本文件 (*.Txt)" cbotype.additem Item + Space(20 - Len(Item)) + "*.Txt" cbotype.listindex = 2 Sub cbotype_click() ' 限定文件列表框中显示文件的类型 File1.Pattern = Mid(cboType.Text, 21) 思考与讨论 : (1) 在 Load 事件给选择文件类型组合框添加项目时, 表达式中 Space(20 - Len(Item)) 的作用是什么? (2) 如果组合框添加项目直接是 cbotype.additem " 所有文件 (*.*)" 形式, 实现选择一种文件类型后, 文件列表框中显示的文件类型也随之发生变化, 如何修改程序? 7.4 随机文件 在随机文件中, 每个记录都有自己的记录号, 可通过记录号直接访问某条记录, 且每条 记录的长度必须相同 随机文件的打开与关闭 1. 打开随机文件打开随机文件格式为 : OPEN FileName FOR Random [Access <Mode>][Lock] As filenumber [Len = reclength] 用 OPEN 命令以 Random 模式打开随机文件, 同时指出记录的长度 文件打开后, 可同时进行读写操作 其中 :FileName filenumber 以及 Lock 选项的含义与顺序文件相同 reclength 为记录的长度字节数, 默认值是 128 个字节

230 Visual Basic 6.0 程序设计基础教程 Access <Mode>: 可选项参数,Access 是关键字,<Mode> 是操作模式, 说明打开的文件可以进行的操作, 有 Read Write 或 Read Write 操作 默认为 Read Write 例如 : Open "d:\abc.dat" For Random Access Read As #1 Len = 关闭随机文件随机文件的关闭与关闭顺序文件相同 写随机文件 使用 PUT 命令写随机文件, 其形式如下 PUT#< 文件号 >, [< 记录号 >], < 表达式 > 其中 : < 文件号 > 是已打开的随机文件的文件号 ; < 记录号 > 是可选参数, 指定把数据写到文件中的第几个记录上 如果省略这个参数, 则写在上一次读写记录的下一个记录 如果打开文件, 尚未进行读写, 则为第一个记录 记录号应为大于等于 1 的整数 < 表达式 > 是要写入文件中的数据, 可以是变量 PUT 命令将 表达式 的值写入由记录号指定的记录位置处, 同时覆盖原记录内容 如果省略记录号, 则表示在当前记录后插入一条记录 随机文件的操作不受当前文件中的记录数的限制 假设当前文件中有 5 条记录, 则可使用 PUT 语句把数据写在第 2 条记录上, 原来第 2 条记录上的数据被覆盖 ; 也可以使用 PUT 语句把数据写在第 8 条记录上, 系统自动在第 6 7 条记录上填写入随机数据 读随机文件 使用 GET 命令读取随机文件中的记录, 其形式如下 GET # 文件号,[ 记录号 ], 变量名其功能是 : 将指定的记录内容存放到变量中 记录号为大于等于 1 的整数, 如果省略则表示读取当前记录 例 7.5 有一个记录学生成绩的随机文件 stud.dat, 它的记录结构为 : name string *20 Chinese integer Math integer English integer 编写程序, 要求可以增加记录和显示某个记录, 程序的运行界面如图 7-7 所示 按图 7-7 所示设计程序界面, 主要控件属性设置如表 7-2 所示

231 第 7 章 文件 图 7-7 学生成绩程序运行界面 表 7-2 主要控件属性设置 控 件 属性 ( 属性值 ) 属性 ( 属性值 ) 说 明 窗体 Name(Form1) Caption(" 学生信息管理 ") 框架 1 Name(Frame1) Caption(" 学生信息 ") 文本框 1 Name(TxtName) Text("") 输入 / 显示学生姓名 文本框数组 1 Name(TxtScore(0)~ TxtScore(3)) 输入 / 显示学生成绩 标签 1~ 标签 4 Name(Label~Label4) Caption(" 姓名 " " 语文 " " 数学 " " 英语 ") 框架 2 Name(Frame2) Caption(" 操作 ") 标签 5 Name(LabNum) Caption("")AutoSize(True) 显示学生记录总数 标签 6 Name(Label6) Caption(" 记录 ") 文本框 1 Name(TxtRec) Text("") 输入学生记录号 命令按钮 1 Name(CmdAdd) Caption(" 增加 (&A)") 命令按钮 2 Name(CmdDisp) Caption(" 显示 (&D)") Private Type Student ' 定义学生信息记录类型 Name As String * 10 Mark(0 To 2) As Integer End Type Dim RecLen As Integer, stu As Student 'stu 为学生记录数据变量 Private Sub CmdAdd_Click() ' 增加记录 Dim no As Integer stu.name = TxtName.Text For i = 0 To 2 stu.mark(i) = Val(TxtScore(i).Text) Next i no = LOF(1) / RecLen ' 计算文件中记录总数 Put #1, no + 1, stu ' 在最后增加一条新记录 LabNum.Caption = " 一共有 " & LOF(1) / RecLen & " 个学生 " Private Sub CmdDisp_Click() ' 显示指定的记录

232 Visual Basic 6.0 程序设计基础教程 Dim x As Integer x = Val(TxtRec.Text) Get #1, x, stu With stu TxtName.Text =.Name For i = 0 To 2 TxtScore(i).Text =.Mark(i) Next i End With Private Sub Form_Load() ' 初始化, 打开文件, 显示数据文件中的记录总数 RecLen = Len(stu) ' 求一个记录数据的长度 Open App.Path & "\stud.dat" For Random As #1 Len = RecLen LabNum.Caption = " 一共有 " & LOF(1) / RecLen & " 个学生 " 思考与讨论 : (1) 模块变量 RecLen 在程序中代表什么意义? (2) 程序中增加记录语句 Put #1, no + 1, stu, 如果写成 Put #1, no, stu, 其结果如何 (3) 本例是一个简单的对随机文件进行读写的操作, 读者可以进一步给程序增加一些操作, 例如可以给程序增加 修改 删除 当前记录功能 (4) 程序中使用系统对象 App.Path 来获得应用程序的路径, 程序运行时数据文件必须与应用程序在同一个文件夹中 7.5 二进制文件 二进制文件指以二进制方式存取的文件 一个文件以二进制方式打开就可以认为它是二 进制文件 任何文件都可以二进制方式打开, 进行读写操作 二进制文件以字节为单位对文 件进行访问操作 在其打开后, 可同时进行读写操作 打开与关闭二进制文件 打开二进制文件格式为 : OPEN FileName FOR Binary [Access <Mode>][Lock] As filenumber 可以看到, 以二进制方式打开文件和以随机存取方式打开文件不同的是, 前者使用 FOR Binary, 后者使用 FOR Random; 前者不指定 Len = reclength 如果在二进制访问的 Open 语句中包括了记录长度, 则其被忽略

233 第 7 章 文件 关闭打开的二进制文件的方法与其他文件相同 二进制文件的读写操作 1. 写文件操作访问二进制文件与访问随机文件类似, 也是用 GET 和 PUT 语句读写, 区别在于二进制文件的读写单位是字节, 而随机文件的读写单位是记录 写二进制文件的语句形式为 : PUT [#]< 文件号 >,[< 位置 >],< 变量名 > PUT 命令从 位置 指定的字节数后开始, 一次写入长度等于变量长度的数据 如果忽略位置, 则表示从文件指针所指的当前位置开始写入 2. 读文件操作读二进制文件的形式为 : GET #< 文件号 >,[< 位置 >],< 变量名 > GET 命令从指定位置开始读取长度等于变量长度 ( 字节数 ) 的数据并存放到变量中, 如果省略位置, 则从文件指针所指的位置开始读取, 数据读出后指针向后移动变量长度位置 另外, 也可使用 INPUT 函数返回从文件指针当前位置开始指定字节数的字符串 通常的使用格式是 : 变量名 =INPUT(< 字节数 >,#< 文件号 >) 例 7.6 编程序实现 : 将 D 盘根目录中的文件 Abc.dat 复制到 A 盘, 且文件名改为 Myfile.dat Dim char As Byte Open "D:\Abc.dat" For Binary As # 1 Open "A:\Myfile.dat" For Binary As # 2 Do While Not EOF(1) ' 打开源文件 ' 打开目标文件 Get #1,, char ' 从源文件读出一个字节 Put #2,, char ' 将一个字节写入目标文件 Loop Close#1, #2 上例仅仅是用来说明二进制文件的读写操作, 在 Visual Basic 中提供了文件复制命令 FileCopy( 参阅 7.6 节 ) 可以完成上面的操作 7.6 常用的文件操作语句和函数 Visual Basic 提供了许多与文件操作有关的语句和函数, 用户可以方便地应用这些语句和函数对文件或目录进行复制 删除等维护工作

234 Visual Basic 6.0 程序设计基础教程 文件操作语句 1. 改变当前驱动器改变当前的驱动器使用 ChDrive 语句 其使用语法格式为 : ChDrive drive 必要的 drive 参数是一个字符串表达式, 它指定一个存在的驱动器 如果使用零长度的字符串 (""), 则当前的驱动器将不会改变 如果 drive 参数中有多个字符, 则 ChDrive 只会使用首字母指定当前驱动器的盘符 例如 :ChDrive "D" ChDrive "D:\" 和 ChDrive "Dasd" 都是将当前驱动器设为 D 盘 2. 改变当前目录改变当前的目录或文件夹使用 ChDir 语句 其使用语法格式为 : ChDir path 必要的 path 参数是一个字符串表达式, 它指定哪个目录或文件夹将成为新的默认目录或文件夹 path 可能会包含驱动器 如果没有指定驱动器, 则 ChDir 在当前的驱动器上改变默认目录或文件夹 例如 :ChDir "D:\Mydir" 说明,ChDir 语句改变默认目录位置, 但不会改变默认驱动器位置 例如, 如果默认的驱动器是 C, 则上面的语句将会改变驱动器 D 上的默认目录, 但是 C 仍然是默认的驱动器 3. 删除文件从磁盘中删除文件使用 Kill 语句 其使用语法格式为 : Kill FileName 必要的 FileName 参数用来指定一个文件名的字符串表达式 FileName 可以包含目录 文件夹以及驱动器 说明 : 在 Microsoft Windows 中,Kill 支持多字符 (*) 和单字符 (?) 的统配符来指定多重文件 例如 : Kill "C:\Mydir\Abc.dat" Kill "C:\Mydir\*.bak" ' 删除 C 盘中 Mydir 文件夹中扩展名为 bak 的所有文件 4. 建立和删除目录创建一个新的目录或文件夹使用 MkDir 语句 其使用语法格式 : MkDir path 其中,path 参数是必要的, 用来指定所要创建的目录或文件夹的字符串表达式 path 可以包含驱动器 如果没有指定驱动器, 则 MkDir 会在当前驱动器上创建新的目录或文件夹

235 第 7 章 文件 例如 : MkDir "D:\Mydir\ABC" ' 在 D 盘的 Mydir 文件目录中创建一个名为 ABC 的子目录 RmDir 语句用于删除一个存在的目录或文件夹 命令格式 :RmDir path 其中,path 参数是必要的, 为一个字符串表达式, 用来指定要删除的目录或文件夹 path 可以包含驱动器 如果没有指定驱动器, 则 RmDir 会在当前驱动器上删除目录或文件夹 例如 : RmDir "D:\Mydir\ABC" ' 删除在 D 盘的 Mydir 文件目录中名为 ABC 的子目录说明,RmDir 只能删除空子目录, 如果想要使用 RmDir 来删除一个含有文件的目录或文件夹, 则会发生错误 在试图删除目录或文件夹之前, 可先使用 Kill 语句来删除其包含的所有文件, 再用 RmDir 语句删除它 5. 拷贝文件复制一个文件使用 FileCopy 语句 其使用语法格式为 : FileCopy source, destination FileCopy 语句的命令格式中参数的含义如下 source: 必要参数 字符串表达式, 用来表示要被复制的文件名 source 可以包含目录 文件夹以及驱动器 destination: 必要参数 字符串表达式, 用来指定要复制的目地文件名 destination 可以包含目录 文件夹以及驱动器 例如 : FileCopy "D:\Mydir\Test.doc" "A:\MyTest.doc" 说明, 如果对一个已打开的文件使用 FileCopy 语句, 则会产生错误 6. 文件的更名重新命名一个文件 目录或文件夹使用 Name 语句 其使用语法格式为 : Name oldfilename As newfilename Name 语句的命令格式中参数的含义如下 oldfilename: 必要参数 字符串表达式, 指定已存在的文件名和位置, 可以包含目录 文件夹以及驱动器 newfilename: 必要参数 字符串表达式, 指定新的文件名和位置, 可以包含目录 文件夹以及驱动器 newfilename 所指定不能是已有的文件, 否则将出错 例如 : Name "D:\Mydir\Test.doc" As "A:\MyTest.doc" 说明如下 (1)Name 语句重新命名文件并将其移动到一个不同的目录或文件夹中, 可以跨驱动器移动文件 但当 newfilename 和 oldfilename 都在相同的驱动器中时,Name 只能重新命名已经存在的目录或文件夹, 而不能创建新文件 目录或文件夹 (2) 在一个已打开的文件上使用 Name, 将会产生错误 必须在改变名称之前, 先关闭

236 Visual Basic 6.0 程序设计基础教程打开的文件 (3)Name 参数不能包括多字符 (*) 和单字符 (?) 的统配符 7. 设置文件属性给一个文件设置属性使用 SetAttr 语句 其使用语法格式为 : SetAttr FileName, Attributes SetAttr 语句的命令格式中参数的含义如下 FileName: 必要参数 用来指定一个文件名的字符串表达式, 可能包含目录 文件夹以及驱动器 Attributes: 必要参数 常数或数值表达式, 其总和用来表示文件的属性 Attributes 参数设置如表 7-3 所示 表 7-3 Attributes 参数设置 内部常数 数 值 描 述 vbnormal 0 常规 ( 默认值 ) vbreadonly 1 只读 vbhidden 2 隐藏 vbsystem 4 系统文件 vbarchive 32 上次备份以后, 文件已经改变 例如 : 将 C 盘的 Mydir 目录中的 Test.doc 文件设置为只读属性, 可使用下面的命令 SetAttr "D:\Mydir\Test.doc", VbReadOnly 说明 : 如果给一个已打开的文件设置属性, 则会产生运行时错误 文件操作函数 在 节中已经介绍了 Lof 函数 Loc 函数和 Eof 函数, 本小节将介绍一些在编程中用到的其他函数 1.CurDir 函数函数功能 : 获得当前目录 调用格式 :CurDir[(drive)] 返回值 : 返回一个 Variant (String), 用来代表当前的路径 参数说明 : 可选的 drive 参数是一个字符串表达式, 它指定一个存在的驱动器 如果没有指定驱动器, 或 drive 是零长度字符串 (""), 则 CurDir 会返回当前驱动器的路径 2.GetAttr 函数函数功能 : 获得文件属性 调用格式 :GetAttr(FileName)

237 第 7 章 文件 返回值 : 由 GetAttr 返回的值及其代表的含义如表 7-4 所示 表 7-4 GetAttr 返回的值 内部常数 数 值 描 述 Vbnormal 0 常规 Vbreadonly 1 只读 Vbhidden 2 隐藏 Vbsystem 4 系统文件 Vbdirectory 16 目录或文件夹 Vbarchive 32 上次备份以后, 文件已经改变 Vbalias 64 指定的文件名是别名 参数说明 : 必要的 FileName 参数是用来指定一个文件名的字符串表达式, 可以包含目录 文件夹以及驱动器 若要判断是否设置了某个属性, 在 GetAttr 函数与想要得知的属性值之间使用 And 运算符逐位比较 如果所得的结果不为零, 则表示设置了这个属性值 例如, 在下面的 And 表达式中, 如果档案 (Archive) 属性没有设置, 则返回值为零 Result = GetAttr(FName) And vbarchive 如果文件的档案属性已设置, 则返回非零的数值 3.FileDateTime 函数函数功能 : 获得文件的日期和时间 调用格式 :FileDateTime(FileName) 返回值 : 返回一个 Variant (Date), 此值为一个文件被创建或最后修改时的日期和时间 参数说明 :FileName 参数是必要的, 它用来指定一个文件名的字符串表达式, 可以包含目录 文件夹以及驱动器 4.FileLen 函数函数功能 : 获得文件的长度 调用格式 :FileLen(FileName) 返回值 : 返回一个 Long, 代表一个文件的长度, 单位是字节 参数说明 :FileName 参数是必要的, 它用来指定一个文件名的字符串表达式, 可以包含目录 文件夹以及驱动器 当调用 FileLen 函数时, 如果所指定的文件已经打开, 则返回的值是这个文件在打开前的大小 5.Shell 函数函数功能 : 调用格式 :ID=Shell( FileName [,WindowType] )

238 Visual Basic 6.0 程序设计基础教程返回值 : 返回一个 Variant (Double), 如果成功的话, 返回这个程序的任务 ID, 它是一个惟一的数值, 用来指明正在运行的程序 若不成功, 则返回 0 如果不需要返回值, 则可使用过程调用形式来执行应用程序, 即 Shell FileName [,WindowType]) 参数说明 :FileName 是要执行的应用程序名, 包括盘符 路径, 它必须是可执行的文件 WindowType 为整型值, 表示执行应用程序打开的窗口类型, 其取值如表 7-5 所示 表 7-5 窗口类型参数 WindowType 的取值 内部常量 值 描 述 VbHide 0 窗口被隐藏, 且焦点会移到隐式窗口 VbNormalFocus 1 窗口具有焦点, 且会还原到它原来的大小和位置 VbMinimizedFocus 2 ( 默认 ) 窗口会以一个具有焦点的图标来显示 ( 最小化 ) VbMaximizedFocus 3 窗口是一个具有焦点的最大化窗口 VbNormalNoFocus 4 窗口还原到最近使用的大小和位置, 而当前活动的窗口仍然保持活动 VbMinimizedNoFocus 6 窗口会以一个图标来显示 而当前活动的的窗口仍然保持活动 在 Visual Basic 中, 可以调用在 DOS 或 Windows 下运行的应用程序 例如 : i = Shell("C:\WINDOWS\NOTEPAD.EXE") ' 调用执行 Windows 系统中的记事本 j = Shell("c:\command.com", 1) ' 进入 MS_DOS 状态也可按过程形式调用 Shell "C:\WINDOWS\NOTEPAD.EXE" Shell "c:\command.com", 1 注意, 上面指定的执行文件, 可能因计算机系统 文件路径的不同有所不同 本章小结 本章学习了有关文件的概念 文件系统控件 对文件的操作及有关文件操作的语句和函数 本章的重点是对文件的读写操作 Visual Basic 中根据访问模式将文件分为 : 顺序文件及随机文件及二进制文件 顺序文件可以按行 按字符和整个文件一次性读三种方式读写 ; 随机文件以记录为单位读写 ; 二进制文件以字节为单位读写 Visual Basic 对文件的操作为分三个步骤, 即首先打开文件, 然后进行读或写操作, 最后关闭文件 1. 顺序文件的打开与读写操作 (1) 打开顺序文件 :Open 文件名 For 模式 As[#] 文件号 [Len= 记录长度 ] (2) 写语句的格式 :Print # < 文件号 >,[< 输出列表 >] 或 Write # < 文件号 >,[< 输出列表 >]

239 第 7 章 文件 (3) 读语句的格式 :Input # 文件号,[< 记录号 >], 变量名 Line Input # 文件号,[< 记录号 >], 变量名变量名 =Input $ (< 读取的字符数 >,#< 文件号 >) 顺序文件结构简单, 其中记录的写入 存放及读取顺序都是一致的, 也就是说记录的逻辑顺序与物理顺序相同 顺序文件可以用普通的字处理软件 ( 如 : 记事本 ) 进行建立 显示和编辑 2. 随机文件的打开与读写操作随机文件由一组长度完全相同的记录组成, 每个记录都有惟一的记录号 随机文件以二进制形式存放数据其适宜对某条记录进行读写操作 (1) 打开随机文件格式 :Open 文件名 For Random As # 文件号 [Len= 记录长度 ] (2) 写语句格式 :Put # < 文件号 >,[< 记录号 >],< 表达式 > (3) 读语句格式 :Get # 文件号,[< 记录号 >], 变量名 3. 以二进制方式打开与读写操作任何格式的文件, 都可以按二进制方式访问, 即进行读写操作, 这种方式不指定记录长度 (1) 以二进制方式打开文件 :Open 文件名 For Binary As # 文件号 (2) 写语句格式 :Put # < 文件号 >,[< 位置 >],< 表达式 > (3) 读语句格式 :Get # 文件号,[< 位置 >], 变量名 4. 关闭文件使用 Open 语句打开的顺序文件 随机文件和以二进制方式打开的文件, 都是使用 Close 语句关闭 关闭文件格式 :Close [[#] 文件号 ][,[#] 文件号 ] 习题 一 判断题 1. 驱动器列表框 目录列表框和文件列表框三者之间能够自动实现关联 2. 驱动器列表框 目录列表框和文件列表框都具有列表框 ListBox 中的 List ListCount 和 ListIndex 属性 3. 可以使用 AddItem 和 RemoveItem 方法来增加或删除文件列表框中的项目 4. 在文件列表框中可以实现多项选择 5. 在一个过程中用 Open 语句打开的文件, 可以不用 Close 语句关闭, 因为当过程执行结束后, 系统会自动关闭在本过程中打开的所有文件 6. 以操作模式 Append 打开的文件, 既可以进行写操作, 也可以进行读操作

240 Visual Basic 6.0 程序设计基础教程 二 选择题 1. 下面关于顺序文件的描述正确的是 (A) 每条记录的长度必须相同 (B) 可通过编程对文件中的某条记录方便地修改 (C) 数据只能以 ASCII 码形式存放在文件中, 所以可通过文本编辑软件显示 (D) 文件的组织结构复杂 2. 下面关于随机文件的描述不正确的是 (A) 每条记录的长度必须相同 (B) 一个文件记录号不必惟一 (C) 可通过编程对文件中的某条记录方便地修改 (D) 其组织结构比顺序文件复杂 3. 按文件的组织方式分有 (A) 顺序文件和随机文件 (B)ASCII 文件和二进制文件 (C) 程序文件和数据文件 (D) 磁盘文件和打印文件 4. 文件号最大可取的值为 (A)255 (B)511 (C)512 (D)256 5.Kill 语句在 VB 语言中的功能是 (A) 清内存 (B) 清病毒 (C) 删除磁盘上的文件 (D) 清屏幕 6. 建一个随机文件, 其中每一条记录由多个不同的数据类型的数据组成, 应使用 (A) 自定义类型 (B) 数组 (C) 字符串类型 (D) 变体类型 7. 要从磁盘上读入一个文件名为 c:\t1.txt 的顺序文件, 如下程序正确的是 (A)F="C:\t1.txt" (B)F="C:\t1.txt" Open F For Input As #1 Open "F" For Input As #2 (C)Open "C:\t1.txt" For Output As #1 (D)Open C:\t1.txt For Output As #2 三 程序填空 1. 顺序文件的建立 要建立的顺序文件名为 C:\stud1.txt, 内容来自文本框, 每按 Enter 键写入一条记录, 然后清除文本框的内容, 直到文本框内输入 End 字符串 Private sub Form_load() text = " " End sub Private sub Text1_keyPress(KeyAscii As Integer) If keyascii = 13 then If then close # 1 End

241 第 7 章 文件 Else Text = " " End if End if 2. 将 C 盘根目录下的一个文本文件 old.dat 中的内容复制到新的文件 new.dat 中, 并利用文件操作语句将 old.dat 文件从磁盘上删除 Private Sub Command1_Click() Dim str1$ Open "c:\old.dat" As #1 Open "new.dat" Do while print #2,str1 Loop End sub 3. 文本文件合并 将文本文件 t2.txt 合并到 t1.txt 文件中 Private Sub Command1_click() Dim s$ Open "t1.txt" Open "t2.txt" Do while Not EOF (2) Line Input #2,s Print #1,s Loop Close #1, #2 End sub 四 编程题 1. 编程统计 C 盘 Mydir 文件夹中文本文件 data.txt 中字符 $ 出现的次数 并将统计结果写入到文本文件 C:\Mydir\res.txt 中 2. 建立一个文件, 用二进制访问模式写入 50 个 10~100 的随机整数, 然后将其读出, 并求出其中的最大值和最小值 3. 设计应用程序, 统计某个文本文件中各英文字母出现的次数, 不区分大小写, 并将结果打印到窗体上

242 Visual Basic 6.0 程序设计基础教程 实验 1. 建立如图 7-8 所示的文件操作窗口, 将选中的文件复制到目标文件夹 在源文件部分 实现文件的查询 ; 在目标文件夹部分实现文件的查询 删除, 并支持新建文件夹 图 7-8 文件复制程序设计界面 2. 利用文件系统控件 组合框, 制作一个文件浏览器, 组合框限定文件列表框中显示文件的类型 ( 有 所有文件 (*.*) 应用程序 (*.exe) 文本文件 (*.txt) 等 ), 如选定 应用程序 (*.exe) 项, 则只显示 *.exe 文件 当在文件列表框中双击某个文件时, 如果是 *.exe 文件, 则通过 shell 函数调用执行, 否则用 MsgBox 显示提示信息 程序运行效果如图 7-9 所示 图 7-9 文件浏览器运行界面和记事本运行界面 3. 有一个 Student 文本文件, 是一个班学生 ( 假定多个学生 ) 的考试成绩, 数据排列形式是 : 学号 姓名 数学成绩 英语成绩及计算机成绩 请编写程序实现在每个数据行后面添加该学生的总分及平均成绩两个数据项 提示 : 另外新建一文件, 先将 Student 文件中的数据依次读入, 计算总分和平均成绩, 再将学号 姓名 数学成绩 英语成绩 计算机 总分和平均成绩写入到新文件中, 把原 Student 文件删除, 最后将新文件更名为 Student 4. 有一个记录学生成绩的随机文件 Score.dat, 它的记录结构是 : Num String*8 Name String*

243 第 7 章 文件 Chinese Integer Math Integer English Integer Physics Integer Computer Integer 请编写程序, 查找其中有两门以上的课程不及格的学生的记录, 并将它们写入到另一个 文件中

244 第 8 章 图形操作 Visual Basic 为用户提供了强大的绘图功能 用户不仅可以把图片装入窗体 图片框或图像控件中, 还可以直接在窗体 图片框等对象上使用绘图方法绘制图形, 也可以用直线 Line 控件 形状 Shape 控件创建变化灵活的图形 读者学习本章后, 应该做到 : (1) 掌握建立图形坐标系统的方法 (2) 掌握 Visual Basic 的图形控件和图形方法及其应用 (3) 掌握使用绘图方法绘制简单的二维几何图形 8.1 图形控件 Visual Basic 包含的与图形有关的控件有图片框 (PictureBox) 图像框 (Image) 形状控件 (Shape) 和直线控件 (Line) 窗体 图形框和图像框可以显示来自图形文件的图形 图形文件的存储形式有多种, 常见的有以下几种 1. 位图 (bitmap): 用像素表示的图像, 将它作为位的集合存储起来, 每个位都对应一个像素, 在彩色系统中会有多个位对应一个像素 位图通常以.bmp 或.dib 为文件扩展名 2. 图标 (icon): 表示一个对象或概念的图形 在 Microsoft Windows 中一般用来表示最小化的应用程序 图标是位图, 最大为 像素, 以.ico 为文件扩展名 3. 元文件 (metafile): 将图像作为线 圆或多边形这样的图形对象来存储, 而不是存储其像素 其类型有两种, 分别是标准型 (.wmf) 和增强型 (.emf) 在图像的大小发生改变时, 元文件保 233

245 Visual Basic 6.0 程序设计基础教程存图像会比位图更精确 4.JPEG 文件 : 支持 8 位和 24 位颜色的压缩位图格式 5.GIF 文件 : 一种压缩位图格式, 可支持多达 256 种的颜色 能作为图形容器的对象有窗体 (Form) 和图片框 (PictureBox), 它们既可以作为各种图形控件的载体, 也可以作为各种绘图方法的操作对象 图片框控件 图片框 (PictureBox) 控件既可用来显示图形, 也可作为其他控件的容器和绘图方法输出或显示 Print 方法输出的文本 向图片框中加载图形 在图片框中显示的图片是由 Picture 属性决定的, 有两种加载图形的方法 在设计时加载 从控件的 属性 窗口中选择 Picture 属性 单击右边 按钮, 就会出现打开文件对话框, 找到自己想要的图形文件即可 在设计时设置的 Picture 属性, 当保存窗体时, 系统将自动生成一主名与窗体文件名相同 的 后缀为.frx 的二进制文件, 图形数据就保存在该文件中 如果将应用程序编译成一个可 执行文件, 图像将保存在 EXE 文件中, 因此可以在没有原始图形文件的计算机上运行 在运行时显示或替换图片, 可使用 LoadPicture 函数设置 Picture 属性, 使用格式为 : [Object].Picture = LoadPicture ([FileName FileName]) 参数 FileName 为包含全路径名或有效路径名的图片文件名 若省略 FileName 参数, 则 清除图片框中的图像 例如, 下列代码将在运行时向窗体 Form1 中加载一幅图片 : Private Sub form_load() Form1.Picture = LoadPicture("C:\windows\flower.gif") 如果未指定文件名,LoadPicture 函数将清除控件对象中的图片 例如 :Form1.Picture = LoadPicture( ) 在运行时加载图片时, 应用程序必须能够访问该图形文件才能显示图像 如果将应用程 序编译成一个可执行文件, 图像将不会保存在 EXE 文件中, 要成功地显示图像, 运行时必须 在宿主计算机上有该图形文件可用 2. 保存图片 使用 SavePicture 语句, 可将对象或控件的 Picture 或 Image 属性保存为图形文件, 其使 用格式如下 : 234 SavePicture [Object.]Picture Image, FileName 各参数意义如下 Object 为对象表达式, 可以是窗体 图片框 影像框及有 Picture 或 Image 属性的对象,

246 第 8 章 图形操作 如命令按钮等 Picture Image, 是指对象的 Picture 或 Image 属性 注意, 对于使用绘图方法和 Print 方法输出到窗体或图片框中的图形和文字, 只能使用 Image 属性保存, 而在设计时或在运行时通过 LoadPicture 函数给 Picture 属性加载的图片, 则既可使用 Image 属性, 也可使用 Picture 属性来保存 若用 Image 属性保存, 既包括使用绘图方法和 Print 方法输出到窗体或图片框中的图形和文字, 也包含在设计时或在运行时通过 LoadPicture 函数给 Picture 属性加载的图片 FileName 为必选参数, 指定将图形保存的文件名, 一般包含盘符 路径及文件名 说明 : (1) 无论在设计时还是运行时从文件加载到对象 Picture 属性的位图 图标 元文件或增强元文件, 图形将以原始文件同样的格式保存 如果它是 GIF 或 JPEG 文件, 则将保存为位图文件 (2)Image 属性中的图形总是以位图的格式保存, 不管其原始格式是怎样的 3. 图片框的两个特有属性 (1)AutoSize 属性如果想让图片框能自动扩展到可容纳新图片的大小, 可将该图片框的 AutoSize 属性设置为 True 这样, 在运行中往图片框加载或复制图片时,Visual Basic 会自动扩展该控件到恰好能够显示整个图片 由于窗体不会改变大小, 所以如果加载的图像大于窗体的边距, 图像将在从右边和底部被裁剪后才被显示出来 也可以使用 AutoSize 属性使图片框自动收缩, 以便对新图片的尺寸作出反应 注意 : 窗体没有 AutoSize 属性, 并且不能自动扩大以显示整个图片 (2)Align 属性该属性值用来决定图片框出现在窗体上的位置, 即决定它的 Height Width Left 和 Top 的取值,Align 属性的取值及含义如表 8-1 所示 表 8-1 Align 属性的取值及含义 内部常数数值含义 VbAlignNone 0 VbAlignTop 1 ( 非 MDI 窗体的默认值 ), 可以在设计时或在程序中确定大小和位置 如果对象在 MDI 窗体上, 则忽略该设置 (MDI 窗体的默认值 ), 显示在窗体的顶部, 其宽度自动等于窗体的 ScaleWidth 属性设置值 VbAlignBottom 2 显示在窗体的底部, 其宽度自动等于窗体的 ScaleWidth 属性设置值 VbAlignLeft 3 显示在窗体的左面, 其高度自动等于窗体的 ScaleHeight 属性设置值 VbAlignRight 4 显示在窗体的右面, 其高度自动等于窗体的 ScaleHeight 属性设置值 说明 : 当 Align 属性的值为 1 或 2 时, 设置图片框和窗体的顶部或底部对齐, 该图片框的宽度

247 Visual Basic 6.0 程序设计基础教程等于窗体内部的宽度, 可以自动改变大小以适合窗体的宽度 当 Align 属性的值为 3 和 4 时, 设置图片框和窗体的左边或右边对齐, 该图片框的高度等于窗体内部的高度 通常利用这个特点来建立一个图片框, 用作位于窗体顶端的工具条和位于底部的状态栏, 这就是手工创建工具栏或状态栏的方法 ( 参见第 14 章 ) 图像框控件 图像框 (Image) 控件与 PictureBox 控件相似, 但它只用于显示图片, 而不能作为其他控件的容器, 也不支持绘图方法和 Print 方法 因此, 图像框比图片框占用更少内存 Image 控件加载图片的方法和 PictureBox 中的方法一样, 设计时, 将 Picture 属性设置为文件名, 运行时, 可利用 LoadPicture 函数为图像框加载图片文件, 格式与图片框相同 Image 控件调整大小的行为与 PictureBox 不同, 它具有 Stretch( 拉伸 ) 属性, 该值用来指定一个图片是否要调整大小, 以适应 Image 控件的大小 Stretch 属性设为 False( 默认值 ) 时,Image 控件可根据图片大小调整 ; 当 Stretch 属性设为 True 时, 根据 Image 控件的大小来调整图片的大小, 这可能使图片变形 特别要提出的一点是, 使用 Image 控件可创建自己的控钮 因为 Image 控件也可以识别 Click 事件, 所以, 可在要用 CommandButton 的任何地方使用该控件 例 8.1 在窗体上放置两个 Image 控件 Image1 和 Image2 在窗体的 Load 事件中编写如下代码 : Private Sub Form_Load() Image1.Stretch = False ' 将 Stretch 属性设置为 False ' 加载图片, 不同计算机系统, 图形文件的路径可能不同 Image1.Picture = LoadPicture("C:\WINDOWS\Bubbles.bmp") Image2.Stretch = True ' 将 Stretch 属性设置为 true Image2.Picture = LoadPicture("C:\WINDOWS\Bubbles.bmp") 程序运行结果如图 8-1 所示 图 8-1 Image 控件的 Stretch 属性应用 形状控件 Shape Shape 控件在工具箱中显示为, 使用它可在窗体 框架或图片框中创建矩形 正方形

248 第 8 章 图形操作 椭圆形 圆形 圆角矩形或圆角正方形等图形 Shape 控件预定义形状是由其 Shape 属性的 取值决定的 在表 8-2 中列出了所有预定义形状 形状值和相应的 Visual Basic 常数 表 8-2 Shape 控件的 Shape 属性设置 常 数 Shape 属性值 显示效果 VbShapeRectangle 0 矩形 ( 默认值 ) VbShapeSquare 1 正方形 VbShapeOval 2 椭圆形 VbShapeCircle 3 圆形 VbShapeRoundedRectangle 4 圆角矩形 VbShapeRoundedSquare 5 圆角正方形 例如, 将 Shape 控件的 Shape 属性值设置为 0~5 时, 其对应的图形如图 8-2 所示 图 8-2 Shape 属性取不同值对应的形状 BackStyle 属性决定形状的背景是否为透明, 默认值为 1, 显示一个不透明形状 直线控件 Line 直线控件 Line 可用来在窗体上显示各种类型和宽度的线条, 在工具箱中显示为 对于直线控件来说, 程序运行时最重要的属性是 X1 Y1 X2 及 Y2 属性, 这些属性决定着直线显示时的位置坐标, X1 属性设置 ( 或返回 ) 了直线的最左端水平位置坐标, Y1 属性设置 ( 或返回 ) 了最左端垂直坐标, X2 Y2 则分别表示最右端的水平 垂直坐标 注意 : 利用线与形状控件, 用户可以迅速地显示简单的线与形状或将之打印输出, 与其他大部分控件不同的是, 这两种控件不会响应任何事件, 它们只用来显示或打印 8.2 坐标系统 默认坐标系统 Visual Basic 系统中的容器对象, 都有一套默认的坐标系统, 其坐标原点 (0,0) 总是在左上角,x 轴的正向水平向右,y 轴的正向垂直向下, 默认坐标的刻度单位是缇 (twips) 图 8-3 所示为窗体和图片框对象的默认坐标系统

249 Visual Basic 6.0 程序设计基础教程 图 8-3 窗体 图片框容器的默认坐标系统 所谓容器对象, 就是可以放置其他对象的对象, 比如窗体中可以绘制各种控件, 所以窗体是容器 Visual Basic 中能作容器的对象除窗体外还有图片框 框架控件 系统对象 Screen ( 屏幕 ) 也是一个容器, 窗体就是放置在屏幕中的, 此外系统容器还有 Printer( 打印机 ) 移动控件或调整控件的大小时, 使用控件的容器的坐标系统 ; 所有的绘图方法和 Print 方法, 也使用容器的坐标系统 例如, 那些在窗体上绘制的控件, 使用的是窗体的坐标系统, 而在图片框里绘制控件, 使用的是图片框的坐标系统 窗体是放在屏幕中的对象, 因此在编写用来调整窗体大小或移动窗体位置的代码时, 则要用到屏幕坐标系统, 此时应先检查屏幕对象 Screen 的 Height 属性和 Width 属性, 以确保窗体在屏幕上大小合适 用户自定义坐标系统 在 Visual Basic 中, 坐标系统坐标轴的方向 原点和坐标系统的刻度单位, 都是可以根据需要改变的, 从而用户可以建立自己的坐标系统 1. 设置坐标系统的刻度单位用户可用 ScaleMode 属性设置坐标系统的刻度单位 ScaleMode 属性的取值及含义如表 8-3 所示 表 8-3 ScaleMode 属性值及含义 内 部 常 数 值 含 义 VbUser 0 指出 ScaleHeight ScaleWidth ScaleLeft 和 ScaleTop 属性中的一个或多个被设置为自定义的值 VbTwips 1 ( 默认值 ) 单位是缇 VbPoints 2 磅 VbPixels 3 像素 ( 监视器或打印机分辨率的最小单位 ) VbCharacters 4 字符 ( 水平每个单位 =120 缇 ; 垂直每个单位 =240 缇 ) VbInches 5 英寸 VbMillimeters 6 毫米 VbCentimeters 7 厘米

250 第 8 章 图形操作 说明 : (1) 当设置容器对象 ( 如窗体或图片框 ) 的 ScaleMode 属性值 >0 时, 容器对象的 ScaleLeft 和 ScaleTop 将自动设置为 0,ScaleHeight 和 ScaleWidth 的度量单位也将发生改变 CurrentX 和 CurrentY 的设置值发生改变以反映当前点的新坐标 在容器中所有控件的 Left Top Height 及 Width 属性的值也将用容器对象新的刻度单位来表示 (2) 用 ScaleMode 属性只能改变刻度单位, 不能改变坐标原点及坐标轴的方向 2. 使用 Scale 属性建立自己的坐标系容器对象的 Scale 属性共有 4 个, 即 ScaleLeft ScaleTop ScaleWidth 和 ScaleHeight 属性, 可使用它们来创建用户自定义坐标系统及刻度单位 其含义如表 8-4 所示 表 8-4 Scale 属性 属性含义 ScaleLeft ScaleTop ScaleWidth ScaleHeight 确定对象左边的水平坐标确定对象顶端的垂直坐标确定对象内部水平的宽度, 它不包括边框确定对象内部垂直的高度, 它不包括边框标题 ( 对窗体 ) 和边框 (1) 重定义坐标原点从上表可看到属性 ScaleTop ScaleLeft 的值用于控制对象左上角坐标, 所有对象的 ScaleTop ScaleLeft 属性的默认值为 0, 坐标原点在对象的左上角 因此可以通过 ScaleTop ScaleLeft 属性来重定义坐标原点 = m, 表示将 x 轴向 y 轴的负方向平移 m 个单位 ScaleTop = -m, 表示 x 轴向 y 轴的正方向平移 m 个单位 =n 表示将 y 轴向 x 轴的负方向平移 n 个单位同样,Scaletept = -n 表示将 y 轴向 x 轴的正方向平移 n 个单位例如 : 将窗体坐标系统的 x 轴向 y 轴的正方向 y 轴向 x 轴正方向分别平移 m 和 n 单位 结果如图 8-4 所示 图 8-4 用 ScaleTop,ScaleLeft 属性定义坐标原点 (2) 重定义坐标轴方向和度量单位使用对象的 ScaleWidth ScaleHeight 属性的值可确定对象坐标系 x 轴与 y 轴的正向及最

251 Visual Basic 6.0 程序设计基础教程大坐标值 默认时其值均大于 0, 此时,x 轴的正向向右,y 轴的正向向下 对象右下角坐标值为 (ScaleLeft+ScaleWidth,ScaleTop+ScaleHeight) 根据左上角和右下角坐标值的大小, 就可确定坐标轴的方向 显然若 ScaleWidth 的值小于 0, 则 x 轴的正向向左, 若 ScaleHeight 的值小于 0, 则 y 轴的正向向上 x 轴与 y 轴的度量单位分别为 1/ScaleWidth 和 1/ScaleHeight 例 8.2 将窗体坐标系统的原点定义在其中心,x 轴的正向向右,y 轴的正向向上, 窗体高与宽分别为 200 和 300 单位长度 应将 4 个 Scale 属性设置如下, 建立的笛卡尔坐标系如图 8-5 所示 Form1.ScaleLeft = -150 Form1.ScaleTop = 100 Form1.ScaleWidth = 300 Form1.ScaleHeight = -200 图 8-5 自定义的笛卡尔坐标系 (3) 使用 Scale 方法设置坐标系 Scale 方法是建立用户坐标系最方便的方法, 其使用格式如下 : [Object.]Scale [(x1, y1) (x2, y2)] 其中的参数说明如下 Object 是可选的一个对象表达式 如果省略, 则指带有焦点的 Form 对象 x1 y1: 是可选的, 均为单精度数值, 指示定义对象左上角的水平 (x 轴 ) 和垂直 (y 轴 ) 坐标 这些数值必须用括号括起 x1 y1 就是 ScaleLeft ScaleTop x2 y2: 是可选的, 均为单精度数值, 指示定义对象右下角的水平和垂直坐标 这些数值必须用括号括起 x2-x1 y2-y1 就是 ScaleWidth ScaleHeight Scale 方法能够将坐标系统重置到所选择的任意刻度 它对运行时的图形语句以及控件位置的坐标系统都有影响 如果使用不带参数的 Scale( 两组坐标都省略 ), 对象的坐标系统将重置为默认坐标系统 例如, 将窗体设置为如图 8-5 所示笛卡尔坐标系统, 使用 Scale 方法的语句如下 : Form1.Scale (-150, 100)-(150,-100) 8.3 绘图属性 上一节介绍了用于建立用户自定义坐标系统的几个属性, 本节将再集中介绍与绘图有关的一些其他常用属性

252 第 8 章 图形操作 CurrentX CurrentY 属性 返回或设置窗体 图形框或打印机对象当前的水平 (CurrentX) 或垂直 (CurrentY) 坐标 设计时不可用 使用格式如下 object.currentx [= x] object.currenty [= y] 说明 : 当前坐标总是相对于对象的坐标原点的 在默认坐标系中, 在对象的左边 CurrentX 属性值为 0, 上边的 CurrentY 为 0 坐标以缇, 或以用户自定义的坐标系统度量单位来表示 注意 : 当使用某些图形方法后, 对象的 CurrentX 和 CurrentY 的设置值将发生变化, 其具体的改变如表 8-5 所示 表 8-5 图形方法与当前坐标 方 法 设置 CurrentX, CurrentY 的值 Circle 对象的中心 Cls 0,0 Line 线终点 NewPage 0,0 Print 下一个打印位置 Pset 画出的点 例 8.3 编程序, 当单击窗体时在窗体中的随机位置打印输出 200 个不同颜色 ( 随机确 定 ) 的 * 程序运行界面如图 8-6 所示 图 8-6 例 8.3 的运行结果 程序代码如下 : Private Sub Form_Click() Dim i As Integer Form1.Cls For i = 0 To

253 Visual Basic 6.0 程序设计基础教程 CurrentX = Form1.ScaleWidth * Rnd CurrentY = Form1.ScaleHeight * Rnd ' 设置当前坐标 Form1.ForeColor = QBColor(Int(16 * Rnd)) ' 设置前景颜色 Print "*" Next i 程序使用颜色函数 QBColor 来设置窗体的前景颜色, 即输出字符的颜色 线宽与线型 1.DrawWidth 属性 DrawWidth 属性返回或设置图形方法 (Line Pset 及 Circle) 输出的线宽 使用格式如下 : [Object.]DrawWidth [= Size] 其中各参数说明如下 Object: 为对象表达式, 可以是窗体 图片框和打印机对象 Size: 为数值表达式, 其范围是 1~ 该值以像素为单位表示线宽, 默认值为 1, 即一个像素的宽度 2.DrawStyle 属性返回或设置一个值, 以决定图形方法输出的线型的样式 使用格式如下 : Object.DrawStyle [= Number] 其中各参数说明如下 Object 为对象表达式, 可以是窗体 图片框和打印机对象 Number 为整型表达式, 其范围是 0~6, 用来指定图形方法输出的线型 具体含义如表 8-6 所示 表 8-6 DrawStyle 属性设置 内部常数 数 值 描 述 VbSolid 0 ( 默认值 ) 实线 VbDash 1 虚线 VbDot 2 点线 VbDashDot 3 点划线 VbDashDotDot 4 双点划线 VbInvisible 5 透明线 ( 不可见 ) VbInsideSolid 6 内收实线 例 8.4 用不同的 DrawStyle 属性值在窗体中画直线 将如下程序代码写在窗体的单击事件中 Private Sub Form_Click()

254 第 8 章 图形操作 Dim I As Integer DrawWidth = 1 ScaleHeight = 8 For I = 0 To 6 ' 将窗高设置为 8 个单位 DrawStyle = I ' 改变线形 Line (0,I+ 1)-(ScaleWidth*2/3, I+1) ' 画新线 CurrentY =CurrentY-0.25 ' 在当前点 Y 坐标向上移 0.25 个刻度单位 Print " DrawStyle="; DrawStyle ' 在当前点输出 DrawStyle Next I 程序运行的输出结果如图 8-7(a) 所示, 如果将第 3 行改为 DrawWidth = 2, 即 DrawWidth 属性设置为大于 1, 则不论 DrawStyle 属性为何值, 都只能产生实线效果, 如图 8-7(b) 所示 (a) DrawWidth=1 的输出结果 图 8-7 例 8.4 的输出结果 (b) DrawWidth=2 的输出结果 图形的填充 封闭图形的填充方式由 FillStyle 决定, 填充颜色和线条颜色由 FillColor 属性决定 1.FillStyle 属性用来设置填充 Shape 控件以及由 Circle 和 Line 图形方法生成的圆和方框的方式 为数值数据, 具体取值及含义如表 8-7 所示 表 8-7 FillStyle 属性设置 FillStyle 属性值 效 果 0 绘制实心图形 1 透明 ( 默认方式 ) 2 水平线 3 垂直线 4 左上到右下斜线 5 右上到左下斜线 6 网状格线 7 网状斜线

255 Visual Basic 6.0 程序设计基础教程 例如, 图 8-8 所示是形状控件的 FillStyle 属性设置为 0~7 时的填充效果 图 8-8 FillStyle 属性设置的填充效果 说明 : (1)FillStyle 为 0 是实填充,1 为透明方式 填充图案的颜色由 FillColor 属性决定 (2) 对于窗体和图片框对象,FillStyle 属性设置后, 并不能看到其填充效果, 只能在使用 Circle 和 Line 图形方法生成圆和方框时, 在圆和方框中显示其填充效果 2.FillColor 属性用于设置填充形状的颜色, 默认情况下,FillColor 设置为 0( 黑色 ) AutoRedraw 属性 AutoRedraw 属性用于设置和返回对象或控件是否能自动重绘 若值为 True, 使 Form 对象或 PictureBox 控件的自动重绘有效, 此时图形和文本不仅输出到屏幕, 还存储在内存中, 该对象不接受绘制事件 (Paint 事件 ), 必要时用存储在内存中的图像进行重绘 若值为 False ( 默认值 ), 使对象的自动重绘无效, 则将图形或文本只写到屏幕上 当需要重画该对象时, Visual Basic 会激活对象的 Paint 事件 使用如 Circle Cls Line Print 和 Pset 等图形方法工作时, 该属性极为重要 利用这些方法, 在改变对象大小或隐藏在另一个对象后又重新显示的情况下, 设置 AutoRedraw 为 True, 将使其在 Form 或 PictureBox 控件中自动重绘输出 图形颜色 在 Visual Basic 系统中, 所有的颜色属性都由一个长整数表示 在运行时有 4 种方式可指定颜色值 : 使用 RGB 函数 使用 QBColor 函数, 选择 16 种 Qbasic 颜色中的一种 使用系统提供的颜色常数 直接使用 long 型颜色值 1. 使用 RGB 函数 RGB 函数可返回一个长整数, 用来表示一个 RGB 颜色值 其使用格式如下 RGB(red, green, blue) 说明 : 可以用 RGB 函数来指定任何颜色, 因为每一种可视的颜色, 都由红 绿及蓝 3 种主要颜色组合产生 为了用 RGB 函数指定颜色, 要对 3 种主要颜色中的每一种, 赋给从 0~

256 第 8 章 图形操作 255 之间的一个亮度值 (0 表示亮度最低,255 表示亮度最高 ), 将结果赋给颜色属性或颜色参数 例如 : Form1.BackColor = RGB(255, 0, 0) ' 设定背景为红色 2. 使用 QBColor 函数 QBColor 函数可返回一个 Long 值, 用来表示所对应颜色值的 RGB 颜色码 其使用格式如下 : QBColor(color) 其中,color 参数是一个界于 0~15 的整型数, 分别代表 16 种颜色, 如表 8-8 所示 表 8-8 QBColor 函数的 Color 参数 参 数 值 颜 色 参 数 值 颜 色 0 黑色 8 灰色 1 蓝色 9 亮蓝色 2 绿色 10 亮绿色 3 青色 11 亮青色 4 红色 12 亮红色 5 洋红色 13 亮洋红色 6 黄色 14 亮黄色 7 白色 15 亮白色 3. 使用系统定义的颜色常数在 Visual Basic 6.0 中, 系统已经预先定义了常用颜色的颜色常数, 如常数 VbRed 代表红色,VbGreen 代表绿色等 可在 对象浏览器 中查询常数列表, 表 8-9 是系统预定义的最常用的颜色常数 表 8-9 常用颜色常数 内部常数 值 颜 色 VbBlack &H0 黑色 VbRed &HFF 红色 VbGreen &HFF00 绿色 VbYellow &HFFFF 黄色 VbBlue &HFF0000 蓝色 VbMagenta &HFF00FF 洋红 VbCyan &HFFFF00 青色 VbWhite &HFFFFFF 白色 例如, 要将窗体的背景色设为红色可使用如下语句 : Form1.BackColor = vbred

257 Visual Basic 6.0 程序设计基础教程 4. 直接使用颜色设置值 Visual Basic 可以直接使用数值来指定颜色, 给颜色参数和属性指定一个值, 通常使用十六进制数 其语法格式如下 : &HBBGGRR 其中,BB 指定蓝颜色的值,GG 指定绿颜色的值,RR 指定红颜色的值 每个数段都是两位十六进制数, 即 00~FF 例如, 将窗体背景指定为蓝颜色可用下面的语句 : Form1.BackColor = &HFF0000 它相当于 Form1.BackColor = RGB(0, 0, 255) 8.4 绘图方法 Point 方法 格式为 [Object.] Point(x,y) 功能 :Point 方法用于获取对象上指定位置的点的 RGB 颜色值, 即读一个像素 说明 : 式中 Object 为对象表达式, 可以是窗体 图片框和打印机对象, 如果缺省的话, 则当前窗体成为作用对象 Pset 方法 Pset 方法用于画点, 其语法格式如下 : [Object.]Pset [Step] (X,Y) [, 颜色 ] 其中, 参数 (X,Y) 为所画点的坐标, 关键字 Step 表示采用当前作图位置的相对值 采用背景颜色可清除某个位置上的点 利用 Pset 方法可画任意曲线 例 8.5 编程序, 将图片框 1(Pic1) 中的图像复制到图片框 2(Pic2) 中, 要求保持色彩 纵横比例不变 程序运行效果如图 8-9 所示 图 8-9 图片复制的运行效果

258 第 8 章 图形操作 编程分析 : 本题可通过 Point 方法将图片框 1 中从左到右 从上到下逐点取出其颜色值, 在图片框 2 中对应点使用 Pset 方法用同样的颜色画点 实现的程序代码如下 : Private Sub Command1_Click() Dim i As Integer, j As Integer Dim x As Single, y As Single Dim color As Long For i = 1 To Pic1.ScaleWidth For j = 1 To Pic1.ScaleHeight ' i,j 代表图片框 1 中的坐标点 ' x,y 代表图片框 2 中的坐标点 ' 代表颜色值 color = Pic1.Point(i, j) ' 取出 (i,j) 处的颜色值 ' 按比例计算图片框 1 中坐标点 (i,j) 对应于图片框 2 中的坐标点 (x,y) x = Pic2.ScaleWidth / Pic1.ScaleWidth * i y = Pic2.ScaleHeight / Pic1.ScaleHeight * j Pic2.PSet (x, y), color ' 在图片框 2 中的坐标点 (x,y) 画点 Next j Next i 思考与讨论 : (1) 由于图片框使用的是缺省坐标单位 (Twip), 循环次数很大, 图片框 2 中的图像将是慢慢显示出来 分析上面的程序运行时, 图片框的图像是从上到下显示还是从左到右显示? (2) 如果直接使用语句 Pic2.Picture= Pic1.Picture, 即将图片框 1 的 Picture 属性赋值给图片框 2 的 Picture 实现图片复制, 与使用本例的程序实现复制有何不同? Line 方法 Line 方法用于画直线或矩形, 其使用格式如下 : [Object.]Line [[Step](X1,Y1)]-(X2,Y2)[,Color][,B[F]] 其中,Object 为对象表达式, 它可以是窗体或图片框, 默认时为当前窗体 关键字 Step 表示采用当前作图位置的相对值, 即从当前坐标移动相应的步长后所得的点为画线起点 (X1,Y1) 为线段的起点坐标或矩形的左上角坐标,(X2,Y2) 为线段的终点坐标或矩形的右下角坐标 如果省略 (X1,Y1), 则表示从当前坐标点 (CurrentX,CurrentY) 到 (X2,Y2) 画线 Color 为可选参数, 指定画线的颜色, 默认值取对象的前景颜色, 即 ForeColor 关键字 B 表示画矩形, 关键字 F 表示用画矩形的颜色来填充矩形 F 为默认值则矩形的填充由 FillColor 和 FillStyle 属性决定 注意 : 各参数可根据实际要求进行取舍, 但如果舍去的是中间参数, 其位置分隔符不能舍去

259 Visual Basic 6.0 程序设计基础教程例如 : Line (250,300)-(400,500) ' 画一条从 (250,300) 到 (400,500) 点的直线 Line - (400,500) ' 从当前位置 ( 由 CurrentX,CurrentY 决定 ) 画到 (400,500) ' 出发点是 (150,250), 终点是向 x 轴正向走 150, 向 y 轴正向走 50 的点 等同于 :Line (150,250) - (300,300) Line (150,250) - Step (150,50) ' 画一个左上角在 (20,40), 右下角在 (150,200) 的矩形, 注意在 color 参数省略时, 逗号并不省略 Line (20,40) - (150,200),, B ' 用红色从 (20,40) 到 (70,110) 画一个实心的矩形 Line (20,40) - Step (50,70), RGB(255,0,0), BF Circle 方法 Circle 方法用于画圆 椭圆 圆弧和扇形, 其语法格式如下 [Object] Circle [[Step](X,Y), r[, color[, start[, end[, aspect]]] 其中 : Object 是对象表达式, 它可以是窗体 图片框或打印机, 默认时为当前窗体 (X,Y) 为圆心坐标, 如前面加关键字 Step, 则表示相对于当前坐标点 ( 由 CurrentX CurrentY 决定 ) 的增量值 r 是不能省略的参数, 表示半径 color 是可以省略的参数, 表示所画图形的颜色 start end 也是可以省略的参数, 用于画圆弧和扇形的起始角 终止角, 单位是弧度, 取值在 0~2π 之间时为圆弧, 以 X 轴正半轴为基准, 方向为逆时针, 如图 8-10 所示 ; 当起始角 终止角取值前加一负号时, 负号表示画圆心到圆弧的径向线, 即可画扇形 aspect 为可选参数, 控制画椭圆的长短轴比率, 默认值为 1, 即画圆 例如, 图 8-11 所示为运用 Circle 方法画圆 椭圆 圆弧和扇形的示例 ( 绘图对象的 ScaleMode 属性设置为 7, 单位为厘米 ) 图 8-10 起始角 终止角的表示

260 第 8 章 图形操作 Circle (15,15), 10 Circle (15,15), 10,,-0.7,-2.1 Circle (15,15), 10,,,,2 Circle (15,15), 10,, -2, 0.7 图 8-11 Circle 方法应用示例 8.5 应用举例 绘制函数曲线 例 8.6 在窗体上画出 [-π,π] 区间的正弦曲线 要求将图片框的坐标系重新定义, 左上角坐标为 (-π,1), 右下角坐标为 (π,-1), 并在窗体上画出坐标的 x 轴和 y 轴 程序运行界面如图 8-12 所示 图 8-12 绘制正弦曲线 程序代码如下 : Const pi = Private Sub Form_Click() Dim i As Single Form1.Scale (-pi, 1)-(pi, -1.01) Form1.Line (-pi, 0)-(pi, 0) Form1.Line (0, 1)-(0, -1) Form1.CurrentX = -pi Form1.CurrentY = -0.1 ' 定义符号常量 pi ' 定义用户的坐标系 ' 画出 x 轴直线 ' 画出 y 轴直线 ' 以下语句对坐标轴进行标注 Form1.Print "-π" Form1.CurrentX = pi Form1.CurrentY =

261 Visual Basic 6.0 程序设计基础教程 Form1.Print "π" Form1.CurrentX = 0.2 Form1.CurrentY = -0.1 Form1.Print "0"; Form1.CurrentX = 0.2 Form1.CurrentY = Form1.Print "1" Form1.CurrentX = 0.2 Form1.CurrentY = Form1.Print "-1" For i = -pi To pi Step ' 画 [-π,π] 区间的正弦曲线 Form1.PSet (i, Sin(i)), RGB(255, 0, 0) Next i Form1.CurrentX = 0.6 Form1.CurrentY = 0.4 Form1.Print "y=sin(x)" ' 设置当前坐标 Private Sub Form_Paint() ' 当窗体的大小改变时, 将重画 Form1.Cls Call Form_Click 思考与讨论 : 编写 Form_Paint 事件过程, 是为了当窗体大小发生改变时, 重画曲线, 但这必须将窗体的 AutoRedraw 属性设置为 False, 否则将不触发该事件 当然也可以通过编写 Form_Resize 事件过程来实现重画曲线 简单动画设计 在程序设计中, 简单动画设计就是有规律地改变对象的形状 尺寸或位置, 使其形成动态效果 动画的速度通常使用时钟控件来控制 例 8.7 设置一个模拟行星绕太阳运动的程序 程序的运行结果如图 8-13 所示 图 8-13 行星运行模拟

262 第 8 章 图形操作 编程分析 : 行星运动的椭圆方程为 x=x0+rx*cos(alfa),y=y0+ry*sin(alfa) 其中,x0 y0 为椭圆圆心坐标,rx 为水平半径,ry 为垂直半径,alfa 为圆心角 在窗体中引入两个合适大小的形状控件 Shape1 Shape2 将 Shape1 的 Shape 属性设置为圆形, 显示填充色为红色, 用它代表太阳 将 Shape2 的 Shape 属性设置为圆形, 显示填充色为蓝色, 用它代表行星 用时钟 Timer1 来控制行星运行速度, 将其时间间隔设置为 0.1 秒 窗体模块代码窗口的程序代码如下 : Dim rx As Single, ry As Single ' 定义窗体级变量 Dim alfa As Single Private Sub Form_Load() ' 窗体最大化充满屏幕, 窗体的宽度 高度与屏幕同宽 同高 Form1.Left = 0 Form1.Top = 0 Form1.Width = Screen.Width Form1.Height = Screen.Height ' 让 Shape1 位于窗体中央 Shape1.Left = Form1.ScaleWidth/2 - Shape1.Width/2 Shape1.Top = Form1.ScaleHeight/2 - Shape1.Height/2 rx =Form1.ScaleWidth/2 - Shape2.Width/2 ' 计算椭圆轨道的水平半径 ry =Form1.ScaleHeight/2 - Shape2.Height/2 ' 计算椭圆轨道的垂直半径 ' 画行星的运行轨迹 Circle(Form1.ScaleWidth/2, Form1.ScaleHeight/2), rx,,,, ry/rx ' 将 shape2 的起始位置定位在水平轴的 0 度位置上 Shape2.Left = Form1.ScaleWidth/2 + rx - Shape2.Width/2 Shape2.Top = Form1.ScaleHeight/2 - Shape2.Height/2 Private Sub Timer1_Timer() DIM x As Single, y As single alfa = alfa x = Form1.ScaleWidth/2 + rx * Cos(alfa) ' 椭圆的 x 坐标 y = Form1.ScaleHeight/2 + ry * Sin(alfa) ' 椭圆的 y 坐标 Shape2.Left = x - Shape2.Width / 2 Shape2.Top = y - Shape2.Height / 2 思考与讨论 : (1) 为什么要将 rx,ry 定义为模块级变量? (2) 如果在窗体上添加 启动 和 停止 两个命令按钮, 来控制小球运动 如何修改程序 (3) 小球运动轨迹与设计时小球的初始位置是否有关?

263 Visual Basic 6.0 程序设计基础教程 本章小结 1.Visual Basic 缺省的坐标系统的原点 (0,0) 始终位于各个容器对象的左上角,x 轴的正方向水平向右,y 轴的正方向垂直向下 坐标系统的量度单位由 ScaleMode 属性决定 Visual Basic 允许用户自定义坐标系, 方法有两种 : (1) 使用 Scale 属性, 即通过 ScaleLeft ScaleTop ScaleWidth ScaleHeight 及 ScaleMode 设计置坐标原点 坐标轴方向和刻度单位 (2) 使用 Scale 方法,Scale 方法是建立用户坐标系最简便的方法 格式 :[Object.]Scale [( 左上角坐标 x1,y1)-( 右下角坐标 x2,y2)] 2.Visual Basic 提供的 4 个图形控件, 如表 8-10 所示 表 8-10 图形控件 Image( 图像控件 ) Picture Box( 图片框 ) Shape( 形状控件 ) Line( 直线控件 ) 图形控件属性要点图像控件的 Stretch 属性值为 True 时, 加载到控件中的图像可以自动调整尺寸以适应图像控件的大小图片框的 AutoSize 属性值为 True 时, 能使其按装载的图片大小重新调整尺寸, 即图片框的大小与图片匹配 可作为容器使用形状控件的 Shape 属性确定六种形状用来绘制几何图形主要属性 X1 Y1 X2 及 Y2 的值确定了直线显示的起止位置 3. 绘图方法 ( 又称图形方法 ) 如表 8-11 所示 表 8-11 绘图方法 方法 使用格式 功 能 Pset [Object.] Pset[step](x,y) [,color] 绘制指定颜色的点 Line [Object.]Line[[step](X1,Y1)]-[step](X2,Y2) [,color][,b][f] 用于画直线或矩形 Circle [Object.]Circle [Step](x,y),r[,color[,start,end[,aspect]]] 画圆 椭圆 圆弧和扇形 Point [Object.] Point(x,y) 获取指定位置的点的 RGB 颜色值 Cls [Object.]Cls 清除图像 习题 一 判断题 1. 窗体 图片框和图像框控件都可以显示图片 2. 图像框控件的 Stretch 属性设置为 True 时, 允许控件中的图片变大或变小 3.Picture 图片框既可以用来显示图片和绘制图形, 也可用 Print 方法来显示文字

264 第 8 章 图形操作 4.*.bmp 格式的图片, 如果在 Autosize 设为 False 的图片框中, 它会按图片框大小完整 显示出来 5. 已知窗体的 Fillcolor=rgb(255,0,0) 红,Forecolor=rgb(0,255,0) 绿,Fillstyle=0(solid) 语 句 Circle(200,100),500,,,,2 的输出结果是红边绿心的长椭圆 6.Image 与 PictureBox 的 Autosize 属性功能相同 7. 用 Cls 方法能清除窗体或图片框中用 Print 方法打印的文本或用 Circle 或 Line 方法绘 制的图形 8. 用长整型数表示的颜色数要比使用 RGB 函数返回的颜色数多 二 填空题 1. 在 Visual Basic 中可作为其他控件的容器的, 除窗体外, 还有 和 控件 2. 设 Picture1.Scaleleft=-200,Picture1.Scaletop=250,Picture1.Scalewidth=500, Picture1.Scaleheight=-400, 则 Picture1 右下角坐标为 3. 窗体 From1 在左上角坐标为 (-200,250), 窗体 From1 在右下角坐标为 (300,-150) x 轴的正向向,y 轴的正向向 4. 当 Scale 方法不带参数时, 采用 坐标系 5.PictureBox 控件的 Autosize 属性设置为 True 时, 能自动调整大小 6.Circle 方法绘画采用 时针方向 三 选择题 1. 坐标度量单位可通过 来改变 (A)DrawStyle 属性 (B)DrawWidth 属性 (C)ScaleWidth 属性 (D)ScaleMode 属性 2. 以下的属性和方法中 可重定义坐标系 (A)DrawStyle 属性 (B)DrawWidth 属性 (C)Scale 方法 (D)ScaleMode 属性 3. 当使用 Line 方法画直线后, 当前坐标在 (A)( 0,0) (B) 直线起点 (C) 直线终点 (D) 容器的中心 4. 语句 Circle(1000,1000),500,8,-6,-3 将绘制 (A) 圆 (B) 椭圆 (C) 圆弧 (D) 扇形 5. 执行指令 Line(1200,1200)-Step(1000,500),B 后,CurrentX= (A)2200 (B)1200 (C)1000 (D) 下列 途径在程序运行时不能将图片添加到窗体 图片框或图像框的 Picture 属性 (A) 使用 LoadPicture 方法 (B) 对象间图片的复制 (C) 通过剪贴板复制图片 (D) 使用拖放操作 7. 设计时添加到图片框或图像框的图片数据保存在 (A) 窗体的 frm 文件 (B) 窗体的 frx 文件 (C) 图片的原始文件内 (D) 编译后创建的 exe 文件

265 Visual Basic 6.0 程序设计基础教程 8. 当窗体的 AutoRedraw 属性采用默认值时, 若在窗体装入时使用绘图方法绘制图形, 则应将程序放在 (A)Paint 事件 (B)Load 事件 (C)Initialize 事件 (D)Click 事件 9. 当对 DrawWidth 进行设置后, 将影响 (A)Line Circle 及 Pset 方法 (B)Line 和 Shape 控件 (C)Line Circle 及 Point 方法 (D)Line Circle 及 Pset 方法和 Line Shape 控件四 编程题 1. 编程序, 在窗体上分别用 Pset 方法和 Line 方法绘制曲线 y= Sinx-Cos2x 2. 编程序, 在窗体的中央绘制一半径随机 色彩随机的同心圆, 如图 8-14 所示 图 8-14 程序运行情况 实验 1. 设计一个图片欣赏程序, 要求程序启动后可以通过选择驱动器 文件夹, 最后单击文件列表框中的图片文件, 令图片载入图片框 Picture2 中 如果图片的宽度或高度超过容器 Picture1 的宽度或高度, 则可以使用水平或垂直滚动条移动 Picture2 在 Picture1 中的位置进行浏览 程序运行操作界面如图 8-15 所示 图 8-15 图片欣赏程序运行效果

266 第 8 章 图形操作 提示 : (1) 在图片框控件 Picture1 内加入另一个图片框控件 Picture2, 并将 Picture2 设置为自动适应载入的图片的大小, 没有边框 (2) 将文件列表框控件显示的文件类型设置为 BMP 文件和 GIF 文件 2. 设计一个完成 反弹球 程序的设计 程序运行界面如图 8-16 所示 具体要求如下 : (1) 在窗体中添加一个图片框控件 (Picture1), 在图片框控件内引入一个形状控件 Shapel, 填充色为红色 定时器 (Timerl) 的时间间隔为 0.1 秒 (2) 单击 启动 按钮, 圆球先向右上角方向运动, 碰壁后改变方向 每个时间间隔内, 水平方向改变量 bx 和垂直方向改变量 by 都是 100Twips 单击 停止 按钮, 圆球停止运动 再单击 启动 按钮, 圆球继续运动 图 8-16 弹球程序运行效果图 8-17 作图程序运行效果 3. 设计一个 作图 程序 程序运行结果如图 8-17 所示 具体要求如下 : (1) 窗体的标题为 作图, 窗体的右边是一个图片框 Picture1, 用于绘制图形 (2) 单击 坐标系 按钮 (Command1), 将图片框的坐标系统设置为原点在中央,x 轴 [-10,10],y 轴 [-10,10], 并在图片框中画出该坐标系统示意图 (3) 单击 扇形 按钮 (Command2), 在图片框中画一个圆心在原点 半径为 5 圆周为红色 线宽为 2 内部为绿色 起始角为 π/6 及终止角为 5π/6 的扇形

267 第 9 章 对话框与菜单程序设计 Visual Basic 能够十分方便快捷地设计出标准的 Windows 界面, 这也是它的一大特色 事实上,Windows 环境下开发应用程序的一个主要任务就是设计出友好的人机交互界面来 Windows 应用程序通常提供两种人机交互工具 对话框和菜单 Visual Basic 提供了 3 种对话框的解决方案 : 系统预定义对话框 (InputBox 和 MsgBox) 用户自定义对话框和通用对话框控件 菜单提供了人机对话的接口, 以便用户选择应用系统的各种功能 ; 同时借助菜单, 有效地组织和控制应用程序各功能模块的运行 读者学习本章后, 应该做到 : (1) 掌握通用对话框控件的使用 ; (2) 掌握菜单编辑器的使用, 菜单的编程方法 ; (3) 掌握应用程序界面设计, 在应用程序设计中能灵活使用对话框及菜单 9.1 自定义对话框 创建用户自定义对话框, 一般有两种方法 : 一是用户根据应用程序的需要, 在一个普通窗体上, 使用标签 文本框 单选按钮 检查框和命令按钮等控件, 通过编写相关的程序代码来实现人机交互功能 ; 二是使用 Visual Basic 系统提供的 对话框 模板, 通过简单的修改便可创建一个适合自己程序的自定义对话框 由普通窗体创建自定义对话框 在 Visual Basic 中, 用户可以通过创建包含控件的窗体来自 256

268 Visual Basic 6.0 程序设计基础教程己设计对话框 实际上, 创建一个自定义对话框就是创建一个窗体, 读者可以将前面学习的设计窗体的方法直接应用到自定义对话框的设计过程中 但是, 作为一种特殊的窗体, 它的设计方法又有其独特性的一面, 这中间主要涉及到一些窗体对象的相关属性设置 对话框窗体与一般窗体在外观上是有区别的, 需要通过设置以下属性值来自定义窗体外观 1.BorderStyle 属性 BorderStyle 属性决定了窗体的边框样式, 在运行时是只读的 该属性决定了窗体的主要特征, 这些特征从外观上就能确定它是通用窗口还是对话框, 属性设置值及含义见第 1 章 节中的表 1-1 作为对话框的窗体, 必须将窗体的 BorderStyle 属性值设置为 3(VbFixedDoubleialog) 此时窗体包含控制菜单框和标题栏, 不包含最大化和最小化按钮, 不能改变窗体尺寸 2.ControlBox 属性该属性值为 True 时窗体显示控制菜单框, 为 False 时不显示 3.MaxButton MinButton 属性该属性值为 True 时表示窗体的最大化按钮或最小化按钮可用, 为 False 时表示窗体的最大化按钮或最小化按钮不可使用 例如, 图 9-1 是用户使用窗体设计的一个 设置服务器 的自定义对话框 其中窗体对象的 BorderStyle 属性设为 3(VbFixedDoubleialog), 并在窗体上放置了 4 个标鉴,4 个文本框和 2 个命令按钮 图 9-1 一个使用窗体设计的自定义对话框 使用对话框模板创建对话框 Visual Basic 6.0 提供了多种不同类型的 对话框 模板窗体, 通过 工程 菜单中的 添加窗体 命令, 即可打开 添加窗体 对话框 用户可以选择的对话框有 关于 对话框 对话框 登录对话框 日积月累 ODBC 登录及选项对话框等 10 类, 如图 9-2 所示 例如, 当用户选择 登录对话框, 即可创建一个如图 9-3 所示的登录对话框 在该登录窗体的模块中, 系统已有一段程序代码, 下面便是选择建立的 登录对话框 的程序代码 :

269 第 9 章 对话框与菜单程序设计 图 9-2 添加窗体 对话框图 9-3 登录对话框 Public LoginSucceeded As Boolean Private Sub cmdcancel_click() ' 设置全局变量为 false ' 不提示失败的登录 LoginSucceeded = False Me.Hide Private Sub cmdok_click() ' 检查正确的密码 If txtpassword = "password" Then ' 将代码放在这里传递 ' 成功到 calling 函数 Else LoginSucceeded = True Me.Hide ' 设置全局变量 MsgBox " 无效的密码, 请重试!",, " 登录 " txtpassword.setfocus SendKeys "{Home}+{End}" ' 将文本框内容全部选中 End If 从上面的程序代码, 不难看出, 用户只需要将口令 password 改为自己想用的口令, 将如果输入口令正确, 要调用的程序 ( 例如 :Call Mymain) 或启动的应用程序的主窗体 ( 如 Mainfrm.Show) 写在 If txtpassword = "password" Then 语句下面即可 程序中的 SendKeys 语句是将一个或多个按键消息发送到活动窗口, 就如同在键盘上进行输入一样 有关该语句的使用, 读者可参阅 Visual Basic 的系统帮助

270 Visual Basic 6.0 程序设计基础教程 显示与关闭自定义对话框 1. 显示自定义对话框可使用窗体对象的 Show 方法显示自定义对话框, 通过设置不同的参数可以显示两种不同类型的对话框 (1) 模式对话框模式对话框在焦点可以切换到其他窗体或对话框之前要求用户必须作出响应以关闭对话框, 如单击 确定 按钮 取消 按钮或者直接单击 关闭 按钮 一般来说, 显示重要信息的对话框不允许用户无视其存在, 因此需要被设置为模式对话框, 其显示方法为 : 窗体名. Show vbmodal( 其中 vbmodal 是系统常数, 值为 1) (2) 无模式对话框无模式对话框的焦点可以自由切换到其他窗体或对话框, 无需用户关闭当前对话框, 其显示方法为 : 窗体名. Show 2. 关闭自定义对话框可使用 Hide 方法或 UnLoad 语句来关闭自定义对话框, 其格式为 : Me.Hide 或窗体名.Hide UnLoad < 窗体名 > 这里的 Me 是一个关键字, 代表正在执行的地方提供引用具体实例, 一般指当前窗体 显示或关闭的操作会涉及到多重窗体编程, 有关的设计问题请参见 5.7 节 9.2 通用对话框 除可以设计用户对话框外,Visual Basic 还提供了一组基于 Windows 的通用对话框控件 (CommonDialogBox), 用户可以利用它在窗体上创建 6 种对话框, 分别为打开 (Open) 另 存为 (Save As) 颜色 (Color) 字体 (Font) 打印 (Printer) 和帮助 (Help) 对话框 通用对话框不是标准控件, 初始时不在工具箱中 它属于 VB 的 ActiveX 控件, 在使用 前需要将其添加到工具箱中 将通用对话框图标添加到工具箱的方法如下 : (1) 单击 工程 菜单的 部件 选项, 或者用鼠标右键单击工具箱, 在弹出的菜单中 选择 部件, 打开 部件 对话框 (2) 在 部件 对话框中, 选中 Microsoft Common Dialog Control 6.0 如图 9-4 所示 (3) 单击 确定 按钮即可将通用对话框控件添加到工具箱中 ( 在工具箱中以图标 表示 ) 把通用对话框添加到工具箱后, 就可以像使用标准控件一样把它添加到窗体上 缺省情

271 第 9 章 对话框与菜单程序设计 况下通用对话框的名称为 CommonDialog1 CommonDialog2, 等等 在程序的设计状态, 窗体上显示通用对话框图标如图 9-5 所示 图 9-4 部件 对话框图 9-5 窗体上的通用对话框图标 在程序运行时, 窗体上的通用对话框图标是看不到的, 在程序中通过对 Action 属性的设 置或调用 Show 方法来调出所需要的对话框 打开通用对话框 在运行阶段, 通过调用通用对话框的方法或将 Action 属性设置为相关值来打开它, 具体 设置见表 9-1 表 9-1 打开通用对话框的方法与 Action 属性设置 类 型 Action 属性 方 法 无对话框 0 打开 对话框 1 ShowOpen 另存为 对话框 2 ShowSave 颜色 对话框 3 ShowColor 字体 对话框 4 ShowFont 打印 对话框 5 ShowPrinter 帮助 对话框 6 ShowHelp 注意 : 通用对话框仅提供了一个用户和应用程序的信息交互界面, 具体功能的实 现还需编写相应的程序 通用对话框的属性页 在设计时, 可能通过属性窗口设置通用对话框的属性, 通常使用其属性页设置

272 Visual Basic 6.0 程序设计基础教程用鼠标右键单击窗体上的 CommonDialog 控件图标, 在弹出的快捷菜单中选择 属性 选项, 或在属性窗口中选择 ( 自定义 ), 再单击右侧的... 按钮, 就可以打开 属性页 对话框, 如图 9-6 所示 在 属性页 对话框中有 5 个选项卡, 用于对不同类型的对话框进行属性设置 例如, 要设置颜色对话框的属性, 需要选定 颜色 选项卡 图 9-6 属性页 对话框 打开 / 另存为 对话框 使用通用对话框控件的 ShowOpen 方法, 或将 Action 属性赋值为 1, 可以在运行时显示 打开 对话框, 如图 9-7 所示 ( 注 : 在不同操作系统中, 对话框界面可能有所不同 ) 使用通用对话框控件的 ShowSave 方法, 或将 Action 属性赋值为 2, 可以在运行时显示 另存为 对话框, 如图 9-8 所示 打开 对话框与 另存为 对话框为用户提供了一个标准的文件打开与保存的界面 因为这两种对话框具有许多共同的属性, 故放在一起介绍 图 9-7 打开 对话框图 9-8 另存为 对话框 1. 对话框标题 (Dialog Title) 字符串类型, 用于设置对话框的标题, 打开 与 另存为 对话框的缺省标题为 打开 与 另存为 当显示 颜色 字体 或 打印 对话框时,CommonDialog 控件忽略 DialogTitle 属性的设置

273 第 9 章 对话框与菜单程序设计 2.Filter 属性确定打开对话框中的 文件类型 或另存为对话框的 保存类型 列表框中显示的文件类型 Filter 属性设置的格式为 : 文件说明字符 类型描述 文件说明字符 类型描述例如 : CommonDialog1.Filter ="Word 文档 (*.doc) *.doc 文本文件 (*.txt) *.txt 所有文件 (*.*) *.*" 在文件类型列表框中显示 : Word 文档 (*.doc) 文本文件 (*.txt) 和 所有文件 (*.*) 三种类型 为管道符号, 它将描述文件类型的字符串表达式 ( 如 Word 文档 (*.doc) ) 与指定文件扩展名的字符串表达式 ( 如 *.doc ) 分隔开 3.FilterIndex 属性整型, 用于确定选择了何种文件类型, 缺省设置为 0, 系统取 Filter 属性设置中的第一项, 相当于 FilterIndex 属性值设置为 1, 在上例中, 如选择 Word 文档 (*.doc) 则可以不设置, 也可将 FilterIndex 属性值设为 1 4.InitDir 属性字符串类型, 用于确定初始化打开或保存的路径 例如 : CommonDialog1. InitDir ="D:\LCSFile" 如果不设置初始化路径或指定的路径不存在, 系统则默认为本应用程序文件所在的文件夹 5.DefaultExt 属性字符串类型, 用于确定保存文件的缺省扩展名 即如果输入文件名未指定扩展名, 则将以属性指定的字符串作为其扩展名 6.CancelError 属性逻辑型, 表示用户在与对话框进行信息交换时, 按下 取消 按钮时是否产生出错信息 当该属性设置为 True 时, 无论何时选取 取消 按钮, 都出现错误警告 ;Err 对象的 Number 属性值置为 (cdl Cancel) 当该属性设置为 False( 缺省 ) 时, 选择 取消 按钮, 没有错误警告 注意 : 上述属性若在程序中设置, 则必须都放在使用 Action 属性或 ShowOpen 和 ShowSave 方法调用 打开 或 另存为 对话框语句之前 否则其功能不能实现 7.FileName 属性字符串类型, 用于返回或设置用户要打开或保存的文件名 ( 含路径 ) 即程序运行中用户在通用对话框中选择或输入的文件就是保存在该属性中的, 关闭对话框后, 可用 FileName 属性得到文件所在的驱动器 文件夹和文件名

274 Visual Basic 6.0 程序设计基础教程 8.FileTitle 属性字符串类型, 用于返回或设置用户要打开或保存的文件名 ( 不含路径 ) 即在运行阶段, 用户选定的或在 文件名 文本框中输入的文件名 FileTitle 属性仅为该文件名, 而 FileName 属性则由文件名及其路径共同组成 例 9.1 设计一个简单的图片浏览程序, 可以加载显示图片, 也可保存图片 (1) 界面设计在窗体上添加一个图片框 Picture1, 用于显示图片 ;3 个命令按钮 Command1( 装载图片 ) Command2( 保存图片 ) Command3( 结束 ) 和 1 个通用对话框 (CommonDialog1) 程序设计界面如图 9-9 所示 图 9-9 打开 / 另存为 对话框示例 (2) 编写事件代码 ' 编写 Command1 单击事件, 显示 打开 文件对话框, 从中选择图片文件加载到图片框 Picture1 Private Sub Command1_Click() CommonDialog1.DialogTitle = " 打开图片文件 " CommonDialog1.InitDir = "c:\mypicture" CommonDialog1.Filter = " 所有文件 (*.*) *.* bmp 文件 *.bmp gif 文件 *.gif" CommonDialog1.FilterIndex = 3 件 CommonDialog1.FileName = "s1.gif" ' 先设置一个缺省文件名, 用户不选择就是该文 CommonDialog1.ShowOpen Picture1.Picture = LoadPicture(CommonDialog1.FileName) Private Sub Command2_Click() CommonDialog1.DialogTitle = " 图片另存为 " CommonDialog1.InitDir = "c:\mypicture" CommonDialog1.Filter = " 所有文件 (*.*) *.* bmp 文件 *.bmp gif 文件 *.gif" CommonDialog1.DefaultExt = "bmp" CommonDialog1.ShowSave ' 设置一个缺省扩展文件名 ' 打开另存为对话框

275 第 9 章 对话框与菜单程序设计 SavePicture Picture1.Picture, CommonDialog1.FileName Private Sub Command3_Click() End (3) 调试运行程序运行时, 单击 装载图片 按钮, 打开如图 9-10 所示的对话框, 从中选择图片文件并单击 打开 按钮, 则将图片加载到 Picture1 上, 如图 9-11 所示 图 9-10 程序运行时打开的对话框图 9-11 例 9.1 之运行结果 单击 保存图片 按钮, 打开如图 9-12 所示的对话框, 在文件名框中输入要保存的文件 名, 则将图片框中的图片以该文件名保存在磁盘中 颜色 对话框 使用通用对话框控件的 ShowColor 方法, 或将 Action 属性赋值为 3, 可显示 颜色 对 话框, 它为用户提供了一个标准的调色板界面, 如图 9-13 所示, 用户可以使用其中的基本颜 色, 也可以自己调色 当用户选中某一种颜色后, 该颜色值 ( 长整型 ) 赋给 Color 属性 图 9-12 例 9-1 之运行结果图 9-13 颜色 对话框 例 9.2 设计一个简单的画板程序, 可以根据选择的线型的粗细 颜色, 用鼠标的左键

276 Visual Basic 6.0 程序设计基础教程模拟笔在绘图区随意绘图, 程序运行效果如图 9-14 所示 (1) 界面设计, 如图 9-15 所示 在窗体上添加一个框架, 在框架上画出两个单选按钮用来选择画线粗细, 两个命令按钮, 用来设置画线颜色和清除图片框所画图形 ; 添加图片框, 将图片框 Picture1 设置为固定边框, 白色背景 ; 添加一个通用对话框控件用于显示颜色对话框, 名称为 cdlcolor 图 9-14 画图程序的运行效果 图 9-15 程序界面设计 (2) 程序代码如下 : Private Sub Command1_Click() ' 设置画笔颜色 cdlcolor.showcolor ' 或者 cdlcolor.action=3 Picture1.ForeColor = cdlcolor.color Private Sub Command2_Click() Picture1.Cls ' 清除 Private Sub Option1_Click(Index As Integer) If Option1(0).Value = True Then Picture1.DrawWidth = 1 Else Picture1.DrawWidth = 5 End If ' 选择画线宽度 ' 按鼠标确定画线开始坐标 Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Picture1.CurrentX = X Picture1.CurrentY = Y ' 移动鼠标画线或擦除画线

277 第 9 章 对话框与菜单程序设计 Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then ' 按左键画线 Picture1.Line -(X, Y) End If If Button = 2 Then ' 按右键擦除画线 Picture1.Line -(X, Y), Picture1.BackColor ' 使用背景颜色画线, 即擦除画线 End If 思考与讨论 : (1) 程序中 MouseDown 事件的功能是什么? 如果不写该事件过程, 程序运行情况如何? (2) 程序中画线能否改为 Pset 方法? 如果改为 Pset 方法,MouseDown 事件是否可以不需要编写代码 字体 对话框 运行时, 使用通用对话框控件的 ShowFont 方法, 或将 Action 属性赋值为 4, 可以显示 字体 对话框 在其中选定设置并关闭对话框, 读者可以通过使用以下属性得到所需要的设置对象的字体属性 FontName: 选定字体的名称 FontBold: 是否选定了粗体 FontItalic: 是否选定了斜体 FontStrikethru: 是否选定了水平删除线 FontUnderline: 是否选定了下划线 FontSize: 选定字体的大小 Color: 选定的颜色 字体 对话框为用户提供了一个标准的进行字体设置的界面, 如图 9-16 所示, 通过该对话框用户可以选择字体 字体样式 字体大小 字体效果以及字体颜色 图 9-16 字体 对话框 266 Flags 属性确定对话框中显示字体的类型, 在显示字体对话框前必须设置该属性, 否则会 266

278 Visual Basic 6.0 程序设计基础教程 发生不存在字体的错误 常用设置见表 9-2 使用 Or 运算符可以为一个对话框设置多个标志, 如 cdlcfscreenfonts Or cdlcfeffects 表 9-2 字体 对话框的 Flags 属性 系统常数 值 说 明 cdlcfscreenfonts &H1 使对话框只列出系统支持的屏幕字体 cdlcfprinterfonts &H2 使对话框只列出打印机支持的字体 CdlCFBoth &H3 使对话框列出可用的打印机和屏幕字体 CdlCFEffects &H100 指定对话框允许删除线 下划线以及颜色效果 其中, 要使用 FontStrikethru FontUnderline 和 Color 这三个属性, 必须先将通用对话框的 Flags 属性设置为 cdlcfeffects 或 256 例 9.3 字体 对话框示例 在文本框上显示文字, 利用 字体 对话框来设置所显示文字的字体 字型 大小及颜色等 程序运行时, 单击 选择字体 按钮, 打开 字体 对话框, 在其中选择设置, 文本框中显示设置后的效果, 如图 9-17 所示 图 9-17 程序运行情况 (1) 界面设计 在窗体上添加一个通用对话框 CommonDialog1 一个文本框 Text1 两个命令按钮 Command1 和 Command2, 并按表 9-3 设置对象的主要属性 表 9-3 各对象的主要属性设置 控 件 属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 字体设置 ") 文本框 1 Name(Text1) Multiline(True) ScrollBars(2) 命令按钮 1 Name(CmdFont) Caption(" 选择字体 ") 命令按钮 2 Name(CmdEnd) Caption(" 结束 ") 通用对话框 1 Name(ComDlg) 在 Text1 的属性窗口内设置 Text 属性, 输入若干行要在文本框内显示的文字 (2) 过程设计编写 Form_Load CmdFont 和 CmdEnd 的 Click 事件过程代码如下 :

279 第 9 章 对话框与菜单程序设计 Private Sub Form_Load() CmdFont.Caption = " 选择字体 " CmdEnd.Caption = " 结束 " ' 设置初始字体为宋体 ComDlg.FontName = " 宋体 " 'Flags 为 256+1, 使用屏幕字体 ; 出现颜色 效果等选项 ComDlg.Flags = 257 Private Sub CmdFont_Click() ComDlg.ShowFont ' 打开 字体 对话框 Text1.FontName = ComDlg.FontName Text1.FontSize = ComDlg.FontSize Text1.FontBold = ComDlg.FontBold Text1.FontItalic = ComDlg.FontItalic Text1.FontUnderline = ComDlg.FontUnderline Text1.FontStrikethru = ComDlg.FontStrikethru Text1.ForeColor = ComDlg.Color Private Sub CmdEnd_Click() End 其他对话框 除以上介绍的 4 种通用对话框外,Visual Basic 还提供了 打印 和 帮助 对话框 打印 对话框可以设置打印输出的方法, 如打印范围 打印份数以及当前安装的打印机信息等 帮助 对话框则通过使用 ShowHelp 方法调用 Windows 系统的帮助引擎 这两种对话框的使用方法与前面介绍的类似, 读者可以参考 VB 有关资料, 得到进一步的说明 9.3 菜单设计 菜单的类型 菜单是图形化界面一个必不可少的组成元素, 通过菜单对各种命令按功能进行分组, 使用户能够更加方便 直观地访问这些命令 Windows 环境下的应用程序一般为用户提供三种菜单 : 窗体控制菜单 下拉菜单与快捷菜单, 如图 9-18 为下拉菜单和快捷菜单及菜单项中的相关项目说明 在 VB 中, 每一个菜单项就是一个控件 与其他控件一样, 具有定义它的外观和行为的

280 Visual Basic 6.0 程序设计基础教程属性 在设计或运行时可设置 Caption 属性 Enabled 属性 Visible 属性和 Checked 属性等 菜单控件只能识别一个事件, 即 Click 事件, 当用鼠标或键盘选中某个菜单控件时, 将引发该事件 访问键 分隔条 快捷键 快捷菜单 图 9-18 下拉菜单和快捷菜单 菜单编辑器 Visual Basic6.0 没有菜单控件, 但提供了建立它的菜单编辑器 选择 工具 菜单中的 菜 单编辑器 选项, 可以进入菜单编辑器, 为窗体编辑菜单, 如图 9-19 所示 图 9-19 菜单编辑器 说明如下 (1) 标题 : 运行时各项菜单的字面解释, 即在菜单中显示的文本, 由用户自定义 (2) 名称 : 菜单名称, 用来惟一标识该菜单, 也是运行时单击该菜单项所执行的事件过程的名称 例如 : 标题为 打开文件 名称为 Fopen, 程序运行时单击菜单项 打开文件 所执行的事件过程为 Fopen_Click (3) 索引 : 如果建立菜单数组, 必须使用该属性 (4) 快捷键 : 在该下拉列表框中可以为调用事件过程确定快捷键, 缺省的表项是 None 快捷键将显示在菜单项后, 如 打开文件 Ctrl+O (5) 复选 : 设置下拉菜单项的 Checked 属性

281 第 9 章 对话框与菜单程序设计 当该属性值为 True 时, 在下拉菜单项前面显示一个复选标志 若某菜单项有复选标志, 再选时则无复选标志, 除在设计时设置该菜单项具有复选功能外, 还必须在相应事件过程中写入如下代码 菜单名.Checked= Not 菜单名.Checked (6) 有效 : 设置下拉菜单项的 Enabled 属性, 缺省值为 True 若要在程序运行时使某个菜单项不可选, 可设置其为 False (7) 可见 : 设置下拉菜单项的 Visible 属性, 缺省值为 True 若要在程序运行时使某个菜单项不可见, 可设置其为 False (8) 菜单项移动按钮左移 右移按钮可以使编辑器窗口选定的菜单项左边减少 增加 4 个点, 若某菜单项比它上 1 行的菜单项多 4 个点, 则该选项作为上 1 菜单项的子菜单 (VB 最多允许 6 级菜单 ) 上移按钮可以使编辑器窗口选定的菜单项移动到上 1 行菜单项之上, 下移按钮可以使其移动到下 1 行菜单项之下 (9) 下一个 按钮 : 单击该按钮, 光标从当前菜单项移到下一项 如果当前菜单项是最后一项, 则加入一个新的菜单项 (10) 插入 按钮 : 在当前选择的菜单项前插入一个新的菜单项 (11) 删除 按钮 : 删除当前选择的菜单项 在菜单设计过程中, 已经设计的菜单项及其上下级关系都会显示在菜单编辑器下端的列表框中, 读者可以非常直观地修改 调整有关的菜单项 下拉式菜单 下拉式菜单中, 一般有一个主菜单, 称为菜单栏 每个菜单栏包括一个或多个选择项, 称为菜单标题, 如 Visual Basic 6.0 集成开发环境中的文件 编辑 视图及工程等 当单击一个菜单标题时, 包含菜单项的列表 ( 即菜单 ) 被打开, 在列表项目中, 可以包含分隔条和子菜单标题 ( 其右边含有三角的菜单项 ) 等 当选择子菜单标题时又会 下拉 出下一级菜单项列表, 称为子菜单 VB 的菜单系统最多可达 6 级, 但在实际应用中一般不超过 3 层, 因为菜单层次过多会影响操作的方便性 在下拉式菜单中, 一般只需要对其最低级菜单项编写单击事件代码, 如果对一个有下级菜单的菜单项编写了单击事件, 则在执行下一级菜单时, 该菜单程序将先执行 例 9.4 建立下拉式菜单, 通过菜单来控制文本框中的文字的字体 颜色等 程序的运行情况如图 9-20 所示

282 Visual Basic 6.0 程序设计基础教程 图 9-20 程序运行情况 1. 界面设计在窗体上添加一个文本框 Text1, 用于显示文字信息 ; 添加通用对话框控件 Com mondialog1 当程序运行时, 选择颜色菜单, 打开 颜色 对话框, 设置标签的文字颜色和背景颜色 启动菜单编辑器, 按照表 9-4 设置菜单项, 建立下拉式菜单如图 9-20 所示 表 9-4 菜单项的设置 菜单标题 (Caption) 菜单名称 (Name) 索引值 说 明 字体 Font 主菜单项 1... 字体名称 FontName 子菜单项 宋体 FontN 0 子菜单项 111, 快捷键 Ctrl+S... 楷体 FontN 1 子菜单项 112, 快捷键 Ctrl+K... 黑体 FontN 2 子菜单项 113, 快捷键 Ctrl+H...- FF 子菜单项 12, 用作分隔条... 文本风格 FontStyle 子菜单项 粗体 (&B) Fstyle 0 子菜单项 131, 热键 B... 斜体 (&I) Fstyle 1 子菜单项 132, 热键 I... 下划线 (&U) Fstyle 2 子菜单项 133, 热键 U 颜色 Color 主菜单项 2... 文字颜色 Fcolor 子菜单项 背景颜色 Bcolor 子菜单项 22 结束 Ext 主菜单项 3 说明 : (1) 宋体 楷体及黑体等菜单项分别设置为菜单数组, 它们使用相同的菜单名称 ( 如 FontN), 采用不同的索引值来区分 ( 菜单数组必须输入索引值 ) (2) 分隔条的设置 分隔条是一个特殊的菜单项, 其标题以一个 - 号表示, 同时必须为它设置菜单名称 运行时将在所显示的上 下两个菜单项间出现 1 条直线 ( 分隔 ), 如本例中, 程序运行时将在字体名称和文本风格两个菜单项之间显示一条直线 (3) 快捷键和热键

283 第 9 章 对话框与菜单程序设计 快捷键是指与该菜单项相对应的功能键或组合键, 程序运行时, 按下快捷键, 其作用相当于鼠标单击对应的菜单项, 执行 Click 事件程序代码 所以, 为常用的菜单项设置对应的快捷键, 提供了一种快速操作下拉菜单的方法 设置快捷键的方法很简单, 只要在菜单编辑器中选中需要设置快捷键的菜单项, 然后在快捷键列表框中选择即可, 如本例中设置宋体的快捷键为 Ctrl+S 热键是为某个菜单项指定的字母键 程序运行时, 在显示出有关菜单项后, 按该字母键, 即选中对应的菜单项 设置热键的方法为 : 在菜单编辑器中, 输入菜单标题和 &, 再输入指定的字母即可 如设置 粗体 的热键为 B 图 9-21 菜单编辑器 2. 过程设计在菜单编辑器中建立菜单后, 需要为有关菜单项编写 Click 事件过程, 除分隔条以外的所有菜单项都可识别 Click 事件 根据本例题目要求, 编写事件过程如下 : Private Sub FontN_Click(Index As Integer) Select Case Index Case 0 ' 选中 宋体 Text1.FontName = " 宋体 " Case 1 ' 选中 楷体 Text1.FontName = " 楷体 _GB2312" Case 2 ' 选中 黑体 Text1.FontName = " 黑体 " End Select Private Sub FStyle_Click(Index As Integer) FStyle(Index).Checked = Not FStyle(Index).Checked Select Case Index Case 0 Text1.FontBold = FStyle(Index).Checked

284 Visual Basic 6.0 程序设计基础教程 Case 1 Text1.FontItalic = FStyle(Index).Checked Case 2 Text1.FontUnderline = FStyle(Index).Checked End Select Private Sub Bcolor_Click() CommonDialog1.ShowColor Text1.BackColor = CommonDialog1.Color Private Sub FColor_Click() ' 设置背景颜色 CommonDialog1.ShowColor ' 打开颜色对话框 Text1.ForeColor = CommonDialog1.Color ' 设置文字颜色 Private Sub Ext_Click() End 思考与讨论 : (1) 在 FStyle_Click 事件中的 FStyle(Index).Checked = Not FStyle(Index).Checked 功能是什么, 能否改为 FStyle(Index).Checked=True? (2) 如果将设置前景和背景颜色使用为菜单数组, 如何编写程序? 弹出式菜单 弹出式菜单是独立于菜单栏 显示在窗体或指定控件上的浮动菜单, 菜单的显示位置与鼠标当前位置有关 实现步骤如下 : 1. 在菜单编辑器中建立该菜单 2. 设置其顶层菜单项 ( 主菜单项 ) 的 Visible 属性为 False( 不可见 ) 3. 在窗体或控件的 MouseUp 或 MouseDown 事件中调用 PopupMenu 方法显示该菜单 PopupMenu 的使用方法如下 PopupMenu < 菜单名 >[,flags[,x[,y[,boldcommand]]]] 其中 : (1) 关键字 PopupMenu 可以前置窗体名称, 但不可前置其他控件名称 (2)< 菜单名 > 是指通过菜单编辑器设计的 至少有一个子菜单项的菜单名称 (Name) (3)Flags 参数为常数, 用来定义显示位置与行为, 其取值见表 9-5 表 9-5 Flags 参数的取值及含义 系统常量值说明 vbpopupmenuleftalign 0 缺省值, 指定的 x 位置作为弹出式菜单的左上角

285 第 9 章 对话框与菜单程序设计 vbpopupmenucenteralign 4 指定的 x 位置作为弹出式菜单的中心点 vbpopupmenurightalign 8 指定的 x 位置作为弹出式菜单的右上角 vbpopupmenuleftbutton 0 菜单命令只接受鼠标左键单击 vbpopupmenurightbutton 2 菜单命令可接受鼠标左键 右键单击 前面 3 个为位置常数, 后两个是行为常数 这两组常数可以相加或用 or 连接, 如 : vbpopupmenucenteralign or vbpopupmenurightbutton 或 6 ( 即 2+4) (4)Boldcommand 参数指定需要加粗显示的菜单项, 注意只能有一个菜单项加粗显示 9.4 应用举例 例 9.5 设计一个简单的 记事本 应用程序, 有 文件 编辑 格式 及 退出 四个一级菜单项 其中 : 文件菜单项包括 打开 另存为 和 退出 子菜单项 编辑菜单项包括 复制 剪切 和 粘贴 3 个子菜单项 格式菜单项包括 字体 对齐方式 2 个菜单项, 对齐方式 菜单项又包含 左对齐 右对齐 和 居中 3 个 3 级子菜单项 1. 界面设计在窗体上添加 1 个文本框 Text1, 用于编辑文字信息 ; 添加通用对话框控件 CommonDialog1, 其主要属性设置如表 9-6 所示 表 9-6 控件主要属性设置 控件属性 ( 属性值 ) 属性 ( 属性值 ) 属性 ( 属性值 ) 窗体 Name(Form1) Caption(" 记事本 ") 文本框 1 Name(Text1) Text("") MultiLine(True) ScrollBars(2) 通用对话框 1 Name(CmDg) 使用菜单编辑器, 按表 9-7 设计简易记事本的菜单, 如图 9-22 所示

286 Visual Basic 6.0 程序设计基础教程 图 9-22 计简易记事本的菜单编辑 表 9-7 各菜单项的设置 菜单标题 (Caption) 菜单名称 (Name) 索引值 说 明 文件 (&F) MnuFile 文件 菜单项 打开 (&O) MnuOpen 打开 菜单项 另存为 (&A) MnuSaveAs 另存为 菜单项 - M1 分隔符栏 退出 (&X) MnuExit 退出 菜单项 编辑 (&F) mnuedit 编辑 菜单项 复制 mnucopy ShortCut 属性为 Ctrl+C 剪切 mnucut ShortCut 属性为 Ctrl+X 粘贴 mnupaste ShortCut 属性为 Ctrl+V 格式 (&F) Fmat 格式 菜单项 字体. Font ShortCut 属性为 Ctrl+I 对齐方式 Almig 左对齐 Alm 0 ShortCut 属性为 Ctrl+L 右对齐 Alm 1 ShortCut 属性为 Ctrl+R 居中 Alm 2 ShortCut 属性为 Ctrl+M 退出 (&X) Exxt 退出 菜单项 程序界面设计如图 所示

287 第 9 章 对话框与菜单程序设计 图 9-23 文件菜单设计图 9-24 格式菜单项设计 2. 过程设计在菜单编辑器中建立菜单后, 需要为有关菜单项编写 Click 事件过程, 除分隔条以外的所有菜单项都可识别 Click 事件 根据本例题目要求, 编写事件过程如下 : ' 打开菜单项的单击事件过程 Private Sub mnuopen_click() ' 激活对话框前初始化设置相关属性, 激活对话框后将无法在代码中设置其属性 Dim InputData As String ' 保存文件中每行内容 CmDlog.FileName = "*.txt" ' 初始化文件名 CmDlog.InitDir = "C:\" ' 初始化路径 ' 设置文件类型列表框内容 CmDlog.Filter = " 文本文件 *.txt 所有文件 *.*" CmDlog.FilterIndex = 1 ' 设置默认文件类型 CmDlog.Action = 1 ' 激活 打开 对话框 Text1.Text = "" ' 清除文本框中原有内容 If CmDlog.FileTitle <> "" Then ' 选定文件后执行下列操作 Open CmDlog.FileName For Input As #1 ' 打开文件, 准备读文件 Do While Not EOF(1) Line Input #1, InputData ' 每次读一行 ' 将读出内容连接在文本框已有文本之后并回车换行 Text1.Text = Text1.Text + InputData + vbcrlf Loop Close #1 End If ' 另存为 菜单项的单击事件过程 Private Sub mnusaveas_click() On Error GoTo errcancel CmDlog.FileName = " 文本 1.txt" CmDlog.DefaultExt = "txt" ' 出错跳转至行标签 errlab ' 设置缺省文件名 ' 设置缺省扩展名

288 Visual Basic 6.0 程序设计基础教程 CmDlog.InitDir = "C:\" CmDlog.Filter = " 文本文件 *.txt 所有文件 *.*" CmDlog.FilterIndex = 1 CmDlog.CancelError = True ' 选取 取消 按钮时出错 CmDlog.ShowSave ' 激活 另存为 对话框 Open CmDlog.FileName For Output As #1 ' 打开文件 Print #1, Text1.Text Close #1 errlab: ' 行标签 Private Sub mnuexit_click() ' 退出菜单项的单击事件过程 End ' 以下过程用于判断是否已经选中文本 Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 And Text1.SelText <> "" Then ' 松开左键并选中文本 mnucopy.enabled = True ' 使 复制 菜单项有效 mnucut.enabled = True ' 使 剪切 菜单项有效 Else ' 未选中文本 mnucopy.enabled = False mnucut.enabled = False End If Private Sub mnucopy_click() ' 复制 菜单项的单击事件过程 Clipboard.Clear ' 清除剪贴板中的内容 Clipboard.SetText Text1.SelText ' 将选中的文本放到剪贴板中 mnucopy.enabled = False mnucut.enabled = False mnupaste.enabled = True Private Sub mnucut_click() ' 剪切 菜单项的单击事件过程 Clipboard.Clear Clipboard.SetText Text1.SelText Text1.SelText = "" ' 删除选中的文本 mnucopy.enabled = False mnucut.enabled = False mnupaste.enabled = True

289 第 9 章 对话框与菜单程序设计 Private Sub mnupaste_click() ' 将剪贴板中的文本插入到文本框焦点处, 或替换选中的文本 Text1.SelText = Clipboard.GetText Private Sub Alm_Click(Index As Integer) ' 设置对齐方式 Text1.Alignment = Index Private Sub font_click() ' 设置字体 ' 可将例 9.3 字体 设置的程序写在此处 Private Sub Exxxt_Click() End 思考与讨论 : (1) 本例题主要是介绍菜单程序设计方法, 程序中涉及通用对话框的使用 文件操作等内容, 有条件的读者可上机调试, 完善相关功能 (2) 程序中 Text1_MouseUp 过程的功能是什么? 如果没有该事件过程, 程序运行可能出现什么问题? (3) 程序中使用了系统 剪贴板 (Clipboard) 对象, 进行复制 剪贴及粘贴等操作, 关于 Clipboard 的使用, 请参照 VB 相关帮助 本章小结 程序在运行过程中, 一般总是需要输入数据 输出信息, 对话框为程序和用户的交互提供了有效的途径 对话框是一种特殊的窗体, 它的大小一般不可改变 用户可以利用窗体及一些标准控件自己定义对话框, 以满足各种需要 对于打开 保存 字体设置 颜色设置 打印及帮助这样的常规操作, 可利用系统提供的 CommonDialog 控件进行操作, 通用对话框在程序中使用 Show 方法与 Action 属性来显示相应的对话框, 但这些对话框仅用于返回信息, 不能真正实现文件打开 保存 字体设置 颜色设置或打印等操作, 要实现这些操作, 必须通过编程解决 在 Windows 环境中, 几乎所有的应用软件都提供菜单, 并通过它来实现各种操作 VB 中, 菜单编辑器 能够非常方便 高效且直观地建立菜单 菜单设计好以后, 需要为有关菜单项编写事件过程, 在 VB 中, 每个菜单项就是一个控件, 菜单控件能够识别的惟一事件是 Click 为了简化程序设计, 通常将同一层菜单的几个或全部菜单项设计成菜单数组, 如果使用菜单数组, 则在菜单编辑器中输入菜单时必须设置索引值 习题

290 Visual Basic 6.0 程序设计基础教程一 判断题 1. 用通用对话框控件显示 字体 对话框前, 必须先设置 Flags 属性, 否则将发生 不存在字体 的错误 2. 通用对话框的 Filename 属性返回的是一个输入或选取的文件名字符串 3. 在设计 Windows 应用程序时, 用户可以使用系统本身提供的某些对话框, 这些对话框可以直接从系统调入而不必由用户用 自定义 的方式进行设计 4. 在窗体上绘制 CommonDialog 控件时, 控件的大小 位置可由用户自己加以设定 5. 在消息框 (MsgBox) 中, Prompt ( 消息 ) 是必选项, 最大长度为 64 个字符 6.Menu 控件显示应用程序的自定义菜单, 每一个创建的菜单最多有 3 级子菜单 7. 菜单编辑器中的快捷键是指无须打开菜单就可以直接由键盘输入选择菜单项的按键 8. 当一个菜单项不可见时, 其后的菜单项就会往上填充留下来的空位 9.CommonDialog 控件就像 Timer 控件一样, 在运行时是看不见的 10. 设计菜单中每一个菜单项分别是一个控件, 每个控件都有自己的名字 二 选择题 1. 通常用 方法来显示自定义对话框 (A)Load (B)Unload (C)Hide (D)Show 2. 将 CommonDialog 通用对话框以 打开文件对话框 方式打开, 须选 方法 (A)ShowOpen (B)ShowColor (C)ShowFont (D)ShowSave 3. 将通用对话框类型设置为 另存为 对话框, 应修改 属性 (A)Filter (B)Font (C)Action (D)FileName 4. 用户可以通过设置菜单项的 属性的值为 False 来使该菜单项失效 (A)Hide (B)Visible (C)Enabled (D)Checked 5. 用户可以通过设置菜单项的 属性的值为 False 来使该菜单项不可见 (A)Hide (B)Visible (C)Enabled (D)Checked 6. 通用对话框可以通过对 属性的设定来过滤文件类型 (A)Action (B)FilterInde (C)Font (D)Filter 7. 输入对话框 (InputBox) 的返回值的类型是 (A) 字符串 (B) 浮点数 (C) 整数 (D) 长整数 8. 菜单编辑器中, 同层次的 设置为相同, 才可以设置索引值 (A)Caption (B)Name (C)Index (D)ShortCut 9. 每创建一个菜单, 它的下面最多可以有 级子菜单 (A)1 (B)3 (C)5 (D)6 10. 在设计菜单时, 为了创建分隔栏, 要在 中输入单连字符 (-) (A) 名称栏 (B) 标题栏 (C) 索引栏 (D) 显示区三 填空题

291 第 9 章 对话框与菜单程序设计 1. 菜单一般有 和 两种基本类型 2. 将通用对话框的类型设置为字体对话框可以使用 方法 3. 通用对话框控件可显示的常用对话框有 : 和 4. 如果工具箱中还没有 CommonDialog 控件, 则应从 菜单中选定, 并将 控件添加到工具箱中 5. 将控件 CommonDialog1 设置为颜色对话框, 可表示为 或 6. 在使用消息框时, 要给 MsgBox 函数提供 3 个参数, 它们是 和 7. 菜单项可以响应的事件过程为 8. 在设计菜单时, 可在 VB 主窗口的菜单栏中选择, 单击后从它的下拉菜单中 选择 菜单编辑器 9. 设计时, 在 VB 主窗口上只要选取一个没有子菜单的菜单项, 就会打开, 并 产生一个与这一菜单项相关的 事件过程 10. 设置菜单时, 同一层的 Name 设置为, 才可以设置索引值, 且索引值应设置 为 的连续整数, 但不一定从 0 开始 四 编程题 1. 编写 Command1 的 Click 事件过程 : 调用 打开文件对话框 ( 通过控件 CommonDialog1) 选择文件, 将所选的文件名追加到列表框控件 List1 中 2. 设计一个运行效果如图 9-25 所示的程序 包含 1 个文本框 (Text1) 和 5 个分别为 打 开 (cmdopen) 另存为 (cmdsave) 颜色 (cmdcolor) 字体 (cmdfont) 和 结束 (cmdend) 的命令按钮 当用户单击 打开 按钮时就弹出打开对话框, 当用户选择一文本 文件时, 便可将该文件内容读入到文本框 ; 当单击 另存为 按钮时就打开另存为对话框, 用户输入文件名后, 便可以新的文件名保存文本框的内容 ; 当用户单击 颜色 按钮时, 打 开颜色对话框, 按用户选择的颜色设置文本框中的字体颜色 ; 当用户单击 字体 按钮时, 打开字体对话框, 按用户选择的字体 字号及字体样式设置文本框中的字体格式 图 9-25 程序运行效果 实验 1. 给例 9.5 一个简单记事本程序的 编辑 菜单增加 查找 和 替换 菜单项, 并编

292 Visual Basic 6.0 程序设计基础教程 写程序代码, 使它们具有实际的查找替换功能, 界面如图 9-26 所示 要求 : 图 9-26 记事本窗口新的 编辑 菜单 (1) 执行 查找 菜单命令和 替换 菜单命令, 会弹出如图 9-27 所示的自定义的 查找和替换 对话框 (2) 第一次单击 查找下一处 按钮将从头查找并选中找到的第一个符合条件的文本, 再次单击 查找下一处 按钮将继续查找下一个符合条件的文本并选中该文本 图 9-27 查找和替换 对话框 (3) 单击 替换 按钮将当前找到的文本替换为指定内容 (4) 单击 全部替换 按钮将所有符合条件的文本替换为指定内容 2. 设计一个画图程序, 程序运行情况如图 9-28 所示, 各菜单项的属性设置如表 9-8 所示 要求所有图形用一个形状控件 (Shape1) 实现, 填充颜色用 颜色 对话框 (CommonDialog1) 实现 图 9-28 画图程序的界面设计 表 9-8 画图程序的各级菜单设置 菜单分类 菜单标题 菜单名称 菜单分类 菜单标题 菜单名称 主菜单 1 基本图形 (&P) Picture 主菜单 2 填充方式 (&T) FillStyle 一级子菜单 正方形 Sqr 一级子菜单 水平线 ShP 一级子菜单 长方形 Rec 一级子菜单 竖直线 ShZh 一级子菜单 椭圆 Oval 一级子菜单 斜线 XieX

293 第 9 章 对话框与菜单程序设计 一级子菜单 圆 Circle 一级子菜单 水平交叉 ShPJ 一级子菜单 圆角长方形 Rrec 一级子菜单 斜交叉 XJ 一级子菜单 圆角正方形 RSqr 主菜单 3 填充颜色 (&C) FillColor 主菜单 4 退出 (&E) Exit

294 第 10 章 数据库编程基础 数据库技术是信息社会的基础技术之一,Visual Basic 向用户提供了一个简单易用的数据库开发平台 用户可以使用 Visual Basic 设计出友好的数据库存取界面, 开发出功能强大的数据库应用程序 本章将向读者介绍数据库的基本概念, 以及 Visual Basic 提供的数据库管理的基本解决方案, 并给出了一个简易的 学生成绩管理系统, 以使读者对 Visual Basic 的数据库编程方法有一个总体认识 读者学习本章后, 应该做到 : (1) 了解数据库 ( 重点是关系数据库 ) 的基本概念 (2) 熟悉使用可视化数据管理器 VisData 建立和维护数据库的方法 (3) 熟悉 VB 进行数据访问的基本方式, 掌握 Data 控件 ADO 控件和 DataGrid 控件的基本用法 (4) 了解在 VB 中使用 SQL 语句的基本方式 10.1 数据库基础 数据库的基本概念 数据库技术是应数据管理任务的需要而产生的 在日常生活和工作中, 人们经常需要对数据进行分类 组织 编码 存储 检索和维护, 这就是数据管理 例如, 在学生成绩管理中, 需要对学生的学号 姓名以及各门课的成绩加以登记 汇总 存档 分类和检索, 当有学生插班或退学时, 还要对其档案进行更新或删除 283

295 Visual Basic 6.0 程序设计基础教程下面介绍一些数据库的基本概念 1. 数据库所谓数据库 (Database, 简称 DB) 就是长期存放在计算机内, 以一定组织方式动态存储的 相互关联且可共享的数据集合, 它不仅包括数据本身, 还包括相关数据之间的联系 数据库最大特点是通过联系减少了不必要的数据冗余 同时, 不同用户可以使用同一数据库中自己所需的子集, 从而实现数据共享 2. 数据库管理系统数据库管理系统 (DataBase Management System, 简称 DBMS) 是帮助人们处理大量信息, 实现管理现代化 科学化的强有力的工具 程序员使用数据库管理数据, 就是通过 DBMS 完成的, 无需自己维护文件 ( 这是与使用文件管理数据的显著区别 ), 从而减轻了程序员管理数据的负担, 大大提高了编程效率 目前比较流行的 DBMS 有 Oracle Sysbase Informix 以及 MS SQL Server 等, 它们属于大中型 DBMS 在 Windows 环境下,Visual Foxpro 和 Microsoft Access 是应用较为广泛的小型 DBMS, 本章将以 Microsoft Access 为主进行介绍 3. 数据库系统一个完整的数据库系统 (Database System, 简称 DBS) 由数据库 数据库管理系统 数据库应用系统 数据库管理员 (Database Administrator, 简称 DBA) 以及用户组成 数据库系统与计算机系统的关系如图 10-1 所示 用户应用系统 DBMS OS 硬件 图 10-1 数据库与计算机系统的关系 关系数据库 根据数据模型, 即实现数据结构化所采用的联系方式, 数据库可以分为层次数据库 网状数据库和关系数据库 关系数据库是目前最流行的商业数据库系统, 本章所讨论的数据库也是关系数据库 下面结合图 10-2 介绍关系数据库的有关概念

296 表第 10 章 数据库编程基础 主键 字段名 学号 姓名 数学 英语 计算机 张三 李四 记录字段 字段值 图 10-2 关系的结构 1. 关系 ( 表 ) 在关系数据库中, 数据以关系的形式出现, 可以把关系理解成一张二维表 (Table) 一个关系数据库可以由一张或多张表组成, 每张表都有一个名称, 即关系名 2. 记录 ( 行 ) 每张二维表均由若干行和列构成, 其中每一行称为一条记录 (Record), 记录是一组数据项 ( 字段值 ) 的集合, 表中不允许出现完全相同的记录, 但记录出现的先后次序可以任意 3. 字段 ( 列 ) 二维表中的每一列称为一个字段 (Field), 每一列均有一个名字, 称为字段名, 各字段名互不相同 列出现的顺序也可以是任意的, 但同一列中的数据类型必须相同 4. 主键在数据库中最常用的操作是检索信息, 为了提高检索效率, 常将关系数据库中的某个字段或某些字段的组合定义为主键 (Primary Key) 每条记录的主键值都是惟一的, 这就保证了可以通过主键惟一标识一条记录 5. 索引为了提高数据库的访问效率, 表中的记录应该按照一定顺序排列, 如学生成绩表应按学号排序 但数据库经常要进行更新, 如果每次更新都要对表重新排序, 则太浪费时间 为此, 通常建立一个较小的表 索引表, 该表中只含有索引字段和记录号 通过索引表可以快速确定要访问的记录的位置 数据库应用程序的体系结构 如图 10-3 所示, 一个数据库应用程序的体系结构由用户界面 数据库引擎和数据库三部分组成 其中, 数据库引擎位于应用程序与物理数据库文件之间, 是一种管理数据如何被存储和检索的软件系统 Visual Basic 使用 Microsoft Access 的数据库引擎 Jet Jet 主要用于连接

297 Visual Basic 6.0 程序设计基础教程 一些小型数据库, 如 Access dbase FoxPro 以及 Paradox 等 此外,Jet 还提供了功能强大 的 面向对象的 DAO(Data Access Objects) 编程接口 用户界面 数据库引擎 数据库 图 10-3 数据库应用程序的体系结构 一个数据库应用程序的基本工作流程为 : 用户通过用户界面向数据库引擎发出服务请 求, 再由数据库引擎向数据库发出请求, 并将所需的结果返回给应用程序 10.2 数据库的建立与管理 建立数据库 Visual Basic 既可使用其他应用程序 ( 如 Oracle Access Excel dbase 和 FoxPro 等 ) 建立的数据库, 也可以通过可视化数据管理器 VisData 直接建立和维护多种类型的数据库 在 Visual Basic 环境下, 执行 外接程序 菜单中的 可视化数据管理器 命令, 即可打开如图 10-4 所示的 可视化数据管理器 窗口 图 10-4 可视化数据管理器 窗口 通过前面的学习知道一个数据库由一张或多张表组成, 所有数据分别存放在不同的表中, 建立数据库实际上就是建立构成数据库的表, 下面以图 10-2 所示的学生成绩表为例说明如何建立数据表 1. 确定表结构首先应给数据表取一个名字, 即表名 表名是表的惟一标识, 建立表后可以通过表名访

298 第 10 章 数据库编程基础 问表中数据 确定表结构主要是确定表中各字段的名称 类型和长度 共享数据是使用数据库进行数据管理的一大特色, 在设计表结构时也应以提高共享 减少冗余为目标 例如, 在学生成绩管理中除了需要了解学生各门功课的成绩外, 总分和平均分也是使用者经常关心的两个数据 可以将总分和平均分也作为表中两个字段, 但这样做一方面会增加数据存储空间, 另一方面也会给数据库的维护工作带来一些麻烦 ( 假设用户改变了某一门功课的成绩, 他必须同时改变总分和平均分两个字段的值 ) 仔细分析一下就会发现总分和平均分完全可以通过各门功课的成绩计算出来, 因此在设计表结构时无需将总分和平均分也作为表中两个字段, 只需在程序中编码自动计算出总分和平均分即可 注意, 同一个数据表中不能有同名字段 字段类型共有 11 种, 分别是逻辑型 (Boolean) 字节型 (Byte) 整型 (Integer) 长整型 (Long) 货币型 (Currency) 单精度型 (Single) 双精度型 (Double) 日期时间型 (Date/Time) 文本型 (Text) 二进制型 (Binary) 以及备注型 (Memo) 字段长度指该字段可以存放数据的长度 ( 除 Text 类型外, 其他类型字段的长度都是由系统指定的 ) 学生成绩表的结构如表 10-1 所示 表 10-1 学生成绩表的结构 字段名字段类型字段长度 学号 Text 7 姓名 Text 10 数学 英语 计算机 Single Single Single 注意 : 表名与字段名可以使用汉字, 也可以用英文或汉语拼音, 汉字可读性强, 但在书写查询命令时不方便, 用户可根据具体情况确定 2. 建立数据表建立上述数据表的步骤如下 : (1) 在 可视化数据管理器 窗口中执行 文件 菜单中的 新建 命令 ( 假设选择 Microsoft Access, 版本 7.0 MDB) 后, 弹出如图 10-5 所示的对话框 (2) 在对话框中选择数据库文件保存的位置, 并输入文件名后 ( 保存类型只能是 MDB) 单击 保存 按钮, 将打开如图 10-6 所示的建立数据表窗口 (3) 右键单击数据库窗口, 在弹出的菜单中选择 新建表 命令, 打开如图 10-7 所示的 表结构 对话框 (4) 在 表结构 对话框中输入表名后, 单击 添加字段 按钮, 在弹出的如图 10-8 所示的 添加字段 对话框中输入字段名, 选择字段类型 (Text 类型字段还需输入字段大小 ) 重复此过程直至添加完所有字段后, 单击 关闭 按钮

299 Visual Basic 6.0 程序设计基础教程 图 10-5 输入数据库文件名 图 10-6 建立数据表窗口 图 10-7 表结构 对话框 图 10-8 添加字段 对话框

300 第 10 章 数据库编程基础 (5) 单击 表结构 对话框的 生成表 按钮, 至此数据表建立完毕 注意 : 此时的数据表是一个空表, 只有结构, 没有数据, 数据库的数据需在数据表建立完成后另行输入 3. 建立索引单击 表结构 对话框的 添加索引 按钮, 在弹出的如图 10-9 所示的对话框中输入索引名称, 选择索引字段后, 单击 确定 按钮即完成了索引的建立过程 图 10-9 添加索引 对话框 数据表建立完毕后, 可视化数据管理器 的 数据库 窗口如图 所示 可单击表名左边的 + 号或 - 号展开或折叠相应的信息, 右键单击表名后, 在弹出的菜单中选择 设计 命令可重新打开 表结构 对话框, 对数据表的字段进行修改 添加和删除等操作, 例如增加一个字段 班级 图 数据库 窗口 管理数据库 利用 可视化数据管理器 可以进行的数据库基本操作包括添加记录 编辑记录和删除

301 Visual Basic 6.0 程序设计基础教程记录等 在进行数据库操作之前, 首先应保证此数据库已经打开 如果数据库已关闭, 可执行 文件 菜单中的 打开数据库 命令将其重新打开 右键单击 数据库窗口 中的相应表名, 执行快捷菜单中的 打开 命令后, 即可打开如图 所示的数据表窗口 图 数据表窗口 下面主要介绍添加记录 编辑记录和删除记录三种数据库的基本操作 1. 添加记录单击 添加 按钮, 在弹出的对话框中输入各字段的值后, 单击 更新 按钮 重复此过程输入其他记录 2. 编辑记录如果要修改某条记录中的某个字段值, 应先通过滚动条将该记录定位为当前记录, 然后单击 编辑 按钮, 在弹出的对话框中输入新的字段值后, 单击 更新 按钮 3. 删除记录通过滚动条将要删除的记录定位为当前记录, 然后单击 删除 按钮, 在弹出的对话框中单击 是 按钮即可 10.3 数据访问控件 Data 控件 1. 功能数据控件 (Data) 提供了一种方便地访问数据库中数据的方法, 使用数据控件无需编写代码就可以对 Visual Basic 所支持的各种类型的数据库执行大部分数据访问操作 数据控件在工具箱中的图标为 数据控件本身不能显示和直接修改记录, 只能在与数据控件相关联的数据约束控件中显

302 第 10 章 数据库编程基础 示各个记录 它只相当于一个记录指针, 可以通过单击其左右两边的箭头按钮移动这个指针来选择当前记录, 数据约束控件会自动显示来自当前记录或其旁边的一个记录集合中的一个或多个字段的数据 可以作数据约束控件的标准控件有以下 8 种 : 文本框 标签 图片框 图像框 检查框 列表框 组合框和 OLE 控件 将数据控件与数据约束控件建立约束关系的过程称作 绑定 (Bounding), 被绑定的控件 ( 数据约束控件 ) 提供了对数据库中特定数据的访问功能 被绑定的控件的 DataSource 属性指定一个合法的数据源,DataField 属性指定一个在数据源所创建的 Recordset 对象中合法的字段名称 这些属性一起说明哪些数据出现在该被绑定的控件中 如果修改了被绑定的控件中的数据, 只要移动记录指针, 就会将修改后的数据自动写入数据库 注意 : 数据控件只能访问数据库, 修改表中数据, 不能建立新表和索引, 也不能改变表结构, 要完成此类操作需使用上节介绍的 可视化数据管理器 或其他数据库管理系统软件 2. 属性 (1)Connect 属性用于指定数据库的类型, 其值为一字符串, 默认为 Microsoft Access 的 MDB 文件 (2)DatabaseName 属性用于返回或设置数据控件的数据源的名称及位置 (3)RecordsetType 属性用于返回或设置一个值, 指出记录集合的类型 其中 0 为表 (Table) 类型,1 为动态集 (Dynaset) 类型,2 为快照 (Snapshot) 类型 (4)RecordSource 属性指定通过窗体上的被绑定的控件访问的记录的来源, 可以是数据库中的一个存在的表 一个存在的查询 (QueryDef) 的名称或一条返回记录的 SQL 语句 (5)ReadOnly 属性返回或设置一个逻辑值, 用于指定基本的记录集中的数据是否可以修改 (6)BOFAction 属性与 EOFAction 属性用于指示在 BOF 或 EOF 属性为 True 时 Data 控件进行什么操作 具体设置如表 10-2 所示 表 10-2 BOFAction 属性与 EOFAction 属性的设置 属性系统常量值含义 BOFAction vbbofactionmovefirst 0 默认设置, 使第一个记录为当前记录 vbbofactionbof 1 在第一个记录上触发 Data 控件的 Validate 事件 vbeofactionmovelast 0 默认设置, 保持最后一个记录为当前记录 EOFAction vbeofactioneof 1 在最后一个记录上触发 Data 控件的 Validate 事件 vbeofactionaddnew 2 向记录集添加空记录, 可以编辑该记录, 移动当前记录的指针, 则该记录被自动追加到记录集中

303 Visual Basic 6.0 程序设计基础教程 3. 方法 (1)Refresh 方法可以在数据控件上使用 Refresh 方法来打开或重新打开数据库 ( 如果 DatabaseName ReadOnly 或 Connect 属性的设置值发生改变 ) 在多用户环境中, 由于其他用户可以对数据进行修改, 因此常使用 Refresh 方法重新显示数据, 以保证用户看到的是最新数据 (2)UpdateControls 方法此方法用于从数据控件的 Recordset 对象中读取当前记录, 并将数据显示在相关约束控件上 在多用户环境中, 其他用户可以更新数据库的当前记录, 但相应控件中的值不会自动更新, 可以调用此方法将当前记录的值在约束控件中显示出来 另外, 当改变约束控件中的数值但又想取消对数据的修改时, 可通过 UpdateControls 方法实现 (3)UpdateRecord 方法当约束控件的内容改变时, 如果不移动记录指针, 则数据库中的值不会改变, 可通过调用 UpdateRecord 方法来确认对记录的修改, 将约束控件中的数据强制写入数据库中 4. 事件 (1)Reposition 事件当一条记录成为当前记录时触发该事件 无论何时只要用户单击 Data 控件上某个按钮进行记录间的移动, 或者使用了该 Data 控件的记录集对象的某个 Move 方法 Find 方法或任何其他改变当前记录属性的方法, 在每条记录成为当前记录后, 均会发生 Reposition 事件 (2)Validate 事件在一条不同的记录成为当前记录, 或调用该 Data 控件的记录集对象的 Update 方法 Delete 方法和 Close 方法以及卸载窗体之前触发该事件 该事件过程的基本语法格式如下 : Private Sub Data 控件名 _Validate (action As Integer, save As Integer) 其中 Action 参数是一个整型数, 用以判断是何种操作触发了 Validate 事件, 也可以在 Validate 事件过程中重新给它赋值, 从而使得在事件结束后执行新的操作 Action 参数的具体设置见表 10-3 Save 参数是一个逻辑值, 用以判断与该 Data 控件 绑定 的控件中的内容是否被修改过 如果 Validate 事件过程结束时,Save 参数为 True 则保存所做修改, 为 False 则忽略所做修改 表 10-3 Validate 事件的 Action 参数 值 系统常量 作 用 0 vbdataactioncancel 取消对数据控件的操作 1 vbdataactionmovefirst MoveFirst 方法 2 vbdataactionmoveprevious MovePrevious 方法 3 vbdataactionmovenext MoveNext 方法 4 vbdataactionmovelast MoveLast 方法 5 vbdataactionaddnew AddNew 方法 6 vbdataactionupdate Update 方法

304 第 10 章 数据库编程基础 续表 值 系统常量 作 用 7 vbdataactiondelete Delete 方法 8 vbdataactionfind Find 方法 9 vbdataactionbookmark 设置 BookMark 属性 10 vbdataactionclose Close 方法 11 vbdataactionunload 卸载窗体 5. 记录集 Recordset 对象 Visual Basic 6.0 可以使用 Microsoft Jet 3.6 数据库引擎提供的 Recordset 对象来检索和显示数据库记录, 也可以使用 ODBC 以及 ADO 与 OLE DB 提供的 Recordset 对象连接与访问数据库的记录 一个 Recordset 对象代表一个数据库表里的记录, 或运行一次查询所得的记录的结果 在 Data 控件中可用 3 类 Recordset 对象, 即 Table( 表类型 ) Dynaset( 动态类型 ) 和 Snapshot( 快照类型 ), 默认为 Dynaset 类型 表类型 : 一个记录集合, 代表能用来添加 更新或删除记录的单个数据库表 动态类型 : 一个记录的集合动态, 代表一个数据库表或包含从一个或多个表取出的字段的查询结果 可在 Dynaset 类型的记录集中添加 更新或删除记录, 并且任何改变都将反映在基本表上 快照类型 : 一个记录集合的静态副本, 可用于寻找数据或生成报告 一个快照类型的 Recordset 能包含从同一个数据库中的一个或多个表里取出的字段, 但字段不能更改 动态类型和快照类型的记录集都存储在本地内存中 如果不需要应用程序从多个表中选择字段以及操作一个非 ODBC 源, 那么表类型的 Recordset 在速度与内存占用方面及本地 TEMP 磁盘空间方面可能是最有效的 使用什么记录集关键取决于要完成的任务 表类型的记录集已建立了索引, 适合快速定位与排序, 但内存开销太大 动态集类型的记录集适合更新数据, 但其搜索速度不及表类型 快照类型的记录集内存开销最小, 适合显示只读数据 使用 Recordset 对象的属性与方法的一般格式为 : 数据控件名. Recordset. 属性 / 方法下面列出了 Recordset 对象的一些常用属性和方法 (1)AbsolutionPosition 属性只读属性, 返回当前记录指针的值 如果当前记录为第一条记录, 则该属性值为 0 (2)Bof 属性与 Eof 属性 Bof 属性为 True 时表示记录指针当前位置位于首记录之前,Eof 属性为 True 时表示记录指针当前位置位于末记录之后 (3)Bookmark 属性该属性用于重新定位记录集的指针位置 (4)Nomatch 属性在记录集中进行查找时, 如果找到相匹配的记录, 则该属性值为 False, 否则为 True

305 Visual Basic 6.0 程序设计基础教程 (5)RecordCount 属性表示记录集中现存记录的个数 (6)Move 方法通过 MoveFirst MoveLast MoveNext 和 MovePrevious 方法可以移动记录指针到指定 Recordset 对象中的第一个 最后一个 下一个或上一个记录并使该记录成为当前记录 还可通过 Move n 的方法移动 Recordset 对象中当前记录的位置 如果参数 n 大于零, 则当前记录位置将向前移动 ( 向记录集的末尾 ) 如果 n 小于零, 则当前记录位置向后移动 ( 向记录集的开始 ) (7)Find 方法通过 FindFirst FindLast FindNext 和 FindPrevious 方法可以搜索 Recordset 中满足指定条件的第一个 最后一个 下一个或上一个记录 如果找到符合条件的记录, 则该记录成为当前记录, 否则当前位置将设置在记录集的末尾 Find 方法的语法格式为 数据控件. 记录集.Find 方法条件, 其中 条件 为指定字段值与常量关系的字符串表达式, 如 Data1.Recordset.FindFirst" 姓名 =' 张三 '" (8)Seek 方法通过 Seek 方法可以在表类型的记录集中从头开始搜索满足指定条件的第一个记录, 并使该记录成为当前记录 Seek 方法的语法格式为 数据控件. 表类型记录集.Seek 比较类型, 值 1, 值 2, 其中 比较类型 可以为 = >= > <= 和 <, 如 Data1.Recordset. Seek"="," 张三 " (9)AddNew 方法向数据库中添加记录的步骤如下 : 1 调用 AddNew 方法, 打开一个空白记录 2 通过相关约束控件给各字段赋值 3 单击数据控件上的箭头按钮, 移动记录指针, 或调用 UpdateRecord 方法确定所做添加 (10)Delete 方法删除数据库中记录的步骤如下 : 1 将要删除的记录定位为当前记录 2 调用 Delete 方法 3 移动记录指针, 确定所做删除操作 (11)Edit 方法编辑数据库中记录的步骤如下 : 1 将要修改的记录定位为当前记录 2 调用 Edit 方法 3 通过相关约束控件修改各字段值 4 移动记录指针, 确定所做编辑操作 (12)Close 方法用于关闭指定的数据库 记录集并释放分配的资源

306 第 10 章 数据库编程基础 ADO 控件 1. 概述 ADO(ActiveX Data Objects) 控件属于 ActiveX 控件, 使用前需在 Visual Basic 环境下执行 工程 菜单的 部件 命令, 打开 部件 对话框后选择 Miscrosoft ADO Data Control 6.0 (OLEDB) 控件, 将其添加到工具箱中 它在工具箱中的图标为 ADO 控件与 Data 控件的用法相似, 同样需要经过连接数据库和 绑定 两步操作 ADO 控件与 Data 控件的属性大多相同, 但它通过 ConnectionString 属性建立与数据源的连接信息, 具体的设置方法将在下面详细介绍 任何具有 DataSource 属性的控件都可以与 ADO 控件 绑定, 此外还可以将 DataList DataCombo 和 DataGrid 等 ActiveX 控件与 ADO 控件 绑定 如果要将上述 ActiveX 控件与 ADO 控件 绑定, 应通过在 部件 对话框中选择 Miscrosoft DataList Controls 6.0(OLEDB) 和 Miscrosoft DataGrid Control 6.0(OLEDB) 控件, 将其添加到工具箱中再使用 ADO 控件提供的 远程数据访问 (RDS) 功能, 能够通过一个来回的传输将数据从服务器移动到客户端应用程序或 Web 页中, 然后在客户端对数据进行操作, 最后将更新数据返回服务器, 从而支持建立客户机 / 服务器和基于 Web 的应用程序 本章并未涉及 RDS 方面的内容, 有兴趣的读者可以参阅其他资料 2. 使用 ADO Data 控件访问数据库 (1) 设置 ConnectionString 属性, 连接到数据源 ConnectionString 属性包含一系列由分号分隔的 参数 = 值 语句组成的字符串, 用来建立连接到指定数据源的详细信息 ADO 控件支持 ConnectionString 属性的四个参数, 具体说明见表 10-4 表 10-4 ConnectionString 属性的参数说明 参 数 说 明 Provider 指定用来连接的提供者名称 File Name 指定包含预先设置连接信息的特定提供者的文件名称 ( 例如, 持久数据源对象 ) Remote Provider 指定打开客户端连接时使用的提供者名称 ( 仅限于 Remote Data Service) Remote Server 指定打开客户端连接时使用的服务器的路径名称 ( 仅限于 Remote Data Service) ConnectionString 属性的具体设置过程如下 : 1 将 ADO 控件添加到窗体后, 在属性窗口设置其 ConnectionString 属性, 打开如图 所示的对话框 选择 使用连接字符串 的方式连接数据源, 单击 生成 按钮 2 在如图 所示的 数据链接属性 对话框的 提供者 选项卡中, 选择希望连接 到的数据, 一般为 Microsoft Jet OLE DB Provider, 单击 下一步 按钮 3 在如图 所示的 数据链接属性 对话框的 连接 选项卡中, 选择要连接的数 据库文件, 输入登录数据库的信息 采用默认设置 单击 测试连接 按钮, 成功后确定返

307 Visual Basic 6.0 程序设计基础教程 回 类似于 Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source= 数据 库文件名 ( 含路径 ) 图 ConnectionString 属性页 图 数据链接属性 对话框 图 连接 选项卡

308 第 10 章 数据库编程基础 (2) 设置 RecordSource 属性, 指定访问数据源的命令 在属性窗口中设置 ADO 控件的 RecordSource 属性, 在如图 所示的对话框中选择 访问数据源的命令类型 (CommandType 属性 ), 具体说明见表 10-5 图 记录源 属性页 表 10-5 CommandType 属性设置 值 系统常量 说 明 1 adcmdtext 通过一条文本命令 ( 如一条 SQL 语句 ) 访问记录源 2 adcmdtable 通过一张表的名称访问记录源 4 adcmdstoredproc 通过一个已经定义的存储过程名称访问记录源 8 adcmdunknown 通过一条未知类型的命令访问记录源 (3) 在窗体上添加一个数据约束控件, 将其 DataSource 属性设置为 ADO 控件名, 实现 与 ADO Data 控件的 绑定, 并将 DataField 属性设置为一个可用字段名 DataGrid 控件 DataGrid 控件也是一种数据约束控件, 但它只能与 ADO 控件绑定, 不能使用 Data 控件 提供的数据源 如图 所示,DataGrid 控件将所绑定的 ADO 控件的 Recordset 对象中的 记录和字段以网格的形式显示出来, 每一行为一条记录, 每一列为一个字段 图 DataGrid 控件 DataGrid 控件属于 ActiveX 控件, 使用前需执行 工程 菜单中的 部件 命令, 选择

309 Visual Basic 6.0 程序设计基础教程 Miscrosoft DataGrid Control 6.0(OLEDB) 控件, 将其添加到工具箱中, 该控件的图标为 DataGrid 控件的使用比较简单, 在属性窗口中把 DataSource 属性设置为 ADO 控件的名 字后, 不用编写代码即可在网格中显示 ADO 控件的 Recordset 对象中的记录和字段 在网格 左端有一个箭头, 它实际上是一个记录指针, 所指的记录为当前记录 可以通过单击每一行 左端的按钮来移动记录指针, 也可通过网格中的滚动条来显示每个记录的内容 在运行时, 将鼠标指针放到在行间或列间的网格线上并拖动鼠标能够改变行高和列宽 10.4 结构化查询语言 SQL 简介 通过前面几节的学习, 读者应该对使用 Visual Basic 进行数据库编程的方法有了一个初步认识 : 可以使用 可视化数据管理器 来建立数据库并对其进行简单的维护, 可以通过数据控件及相关的数据约束控件来浏览数据库中的记录并进行有关操作 除了上述方法外, Visual Basic 还可通过结构化查询语言 (Structured Query Language,SQL) 对数据库中的数据进行操作 本节将对 SQL 及其在 Visual Basic 中的应用做一个简单介绍 SQL 概述 SQL 是关系数据库的标准语言, 是一种综合的 通用的 功能强大且简单易学的语言, 它具有以下特点 1. 综合统一 SQL 集数据定义 (Data Define) 数据查询(Data Query) 数据操纵 (Data Manipulation) 和数据控制 (Data Control) 功能于一体, 可以十分方便地实现对数据库的各种操作, 包括数据库的建立 维护 修改 查询及排序等 2. 非过程化传统语言大多是面向过程的, 即用户需在程序中指明解决问题的详细步骤 SQL 是高度非过程化的语言, 使用 SQL 进行数据库操作, 用户只需提出 做什么, 而无需说明 怎么做, 这就大大减轻了用户的负担 3. 面向集合 SQL 采用面向集合的操作方式, 即无论是查询操作, 还是插入 删除或更新操作, 其操作的对象与结果都是一个记录的集合 4. 两种执行方式 SQL 既是一种自含式语言, 又是一种嵌入式语言 它既可独立地采用联机交互的方式对数据库进行操作 ( 在 可视化数据管理器 的 SQL 语句 窗口中可直接执行 SQL 语句 ), 也可以嵌入到高级语言程序中 SQL 以同一种语法格式提供了两种不同的操作方式, 极大地

310 第 10 章 数据库编程基础 方便了用户的使用 SQL 的查询语句 在 Visual Basic 中 SQL 可以实现以下功能 : (1) 从一个或多个数据库的一个或多个表中获取数据 (2) 对记录进行插入 删除或更新操作 (3) 对表中数据进行统计, 如求和 计数或求平均等 (4) 建立 修改或删除数据库中的表 (5) 建立或删除数据库中表的索引 建立数据库的目的在于查询数据, 因此数据查询是数据库的核心操作 本节只重点介绍 SQL 的查询语句 SELECT, 其他 SQL 语句的用法, 请读者参考相关资料 SELECT 语句可以看作是记录集的定义语句, 它从一个或多个表中获取指定字段, 生成一个较小的记录集 下面通过一组对前面建立的学生成绩数据库的查询操作来学习 SELECT 语句的基本用法 (1) 选取表中部分列 例如查询学生成绩表中的英语和计算机成绩 SELECT 英语, 计算机 FROM score (2) 选取表中所有列 例如查询学生成绩表中的所有信息 SELECT * FROM score (3)WHERE 子句 例如查询数学成绩不及格的学生信息 SELECT * FROM score WHERE 数学 <60 (4) 复合条件 例如查询数学和英语成绩均不及格的学生信息 SELECT * FROM score WHERE 数学 <60 AND 英语 <60 (5)ORDER BY 子句 例如查询学生成绩表中所有数学成绩及格的学生信息, 并将查询结果按数学成绩降序排列 (ASC 表示升序,DESC 表示降序 ) SELECT * FROM score WHERE 数学 >=60 ORDER BY 数学 DESC (6) 统计信息 例如查询数学成绩不及格的人数 数学平均分及最高分 SELECT COUNT(*)AS 人数 FROM score WHERE 数学 <60 SELECT AVG( 数学 )AS 平均分,MAX( 数学 )AS 最高分 FROM score (7)GROUP BY 子句 例如查询男生与女生的数学平均分 SELECT 性别,AVG( 数学 )AS 平均分 FROM score GROUP BY 性别 (8)HAVING 子句 例如查询数学成绩不及格的人数大于 10 人的班级和相应人数 SELECT 班级,COUNT(*)AS 人数 FROM score WHERE 数学 <60 GROUP BY 班级 HAVING COUNT(*)>10 (9) 多表查询 例如查询学生的学号 姓名和籍贯 ( 假设有一个 student 表, 其中包含了学生的学号 籍贯等信息 ) SELECT score. 学号,score. 姓名,score. 数学,student. 籍贯 FROM score, student WHERE score. 学号 = student. 学号如前所述, 数据控件的 RecordSource 属性除了可以设置成表名外, 还可以设置为一条 SQL

311 Visual Basic 6.0 程序设计基础教程 语句, 格式如下 : 数据控件名.RecordSource="SQL 语句 " 10.5 一个简易的学生成绩管理系统 本节将围绕一个简易的 学生成绩管理系统 为读者介绍一下使用 Visual Basic 开发数 据库应用程序的一般思路, 同时对前面几节所学内容加以总结 系统分析 数据库应用系统是一个信息管理系统 (Management Information System,MIS), 其核心是数据库, 系统设计以提高数据共享程度 降低数据冗余度以及提高数据查询效率为主要目标 数据库应用系统的开发应该遵循软件工程的开发步骤 : 分析 设计 编码和测试 开发的第一步是需求分析, 一方面分析整个系统需要哪些数据, 另一方面还要分析系统应具备哪些功能, 这一步直接决定将来设计出的数据库以及在此基础上开发的应用程序的适用性 以 学生成绩管理系统 为例, 它需要获得学号 姓名 班级和相关课程的成绩等数据, 应具备浏览 输入 修改 删除 查找及排序等功能 总的来说, 设计一个数据库应用系统主要包括数据库设计和程序设计两大部分内容 关系数据库有一套规范化的理论来帮助用户优化自己的数据库设计, 限于篇幅本书不再展开讨论, 有兴趣的读者可参阅相关资料 现直接使用前面通过 可视化数据管理器 建立的学生成绩数据库 score.mdb 设计实现 1. 登录模块 为确保系统信息安全性, 只有授权用户方可使用本系统 每个用户只有 3 次登录机会,3 次均未能输入正确的用户名和密码, 系统将强行退出 界面如图 所示, 代码如下 : 图 登录窗口 Const username As String = "wei" Const password As String = "welcome" ' 初始化登录窗体 frmwelcome ' 定义窗体级常量表示用户名 ' 定义窗体级常量表示密码

312 第 10 章 数据库编程基础 Private Sub Form_Load() frmwelcome.caption = " 登录 " imgwelcome.picture=loadpicture("e:\welcome.jpg") imgwelcome.stretch = True lblusername.caption = " 用户名 (&U)" lblpassword.caption = " 密码 (&P)" txtusername.text = "" txtpassword.text = "" txtusername.tabindex = 0 txtpassword.tabindex = 1 txtpassword.passwordchar = "*" cmdok.caption = " 确定 " cmdcancel.caption = " 取消 " cmdok.default = True cmdcancel.cancel = True ' 确定 按钮的单击事件过程 Private Sub cmdok_click() Dim i As Integer Static n As Integer ' 静态变量 n 用于统计登录次数 If txtusername.text = username And txtpassword.text = password Then frmmain.show Unload frmwelcome Else n = n + 1 If n < 3 Then i = MsgBox(" 用户名或密码错误, 请重新输入!", vbcritical + _ vbretrycancel + vbdefaultbutton1, " 登录失败 ") If i = vbretry Then txtusername.text = "" txtpassword.text = "" txtusername.setfocus Else End End If Else MsgBox " 三次错误, 请退出!", vbokonly + vbexclamation, " 登录失败 " End End If

313 Visual Basic 6.0 程序设计基础教程 End If ' 取消 按钮的单击事件过程 Private Sub cmdcancel_click() txtusername.text = "" txtpassword.text = "" txtusername.setfocus 2. 主控模块进入如图 所示的系统主界面后, 系统自动打开学生成绩数据库, 学号 姓名 班级 数学 英语 和 计算机 6 个字段分别绑定到相应文本框, 总分 和 平均分 2 个文本框的内容根据 数学 英语 和 计算机 文本框内容的变化而变化 通过单击 首记录 上一条 下一条 和 尾记录 按钮可以浏览数据库, 但无法修改记录内容 通过选择相关菜单命令可以执行相应操作 排序 菜单包括 按学号 按姓名 按数学成绩 按英语成绩 按计算机成绩 按总分 和 按平均分 6 个子菜单 其中执行 输入 和 修改 命令后, 首记录 和 尾记录 按钮隐藏, 上一条 和 下一条 按钮变为 确定 和 取消 按钮, 界面如图 所示 图 主界面 图 输入与修改界面 代码如下 : Public sql As String ' 定义全局变量 sql 表示排序方式 ' 初始化主窗体 frmmain Private Sub Form_Load() frmmain.caption = " 学生成绩管理系统 " ' 设置数据控件 datscore 相关属性 datscore.recordsettype = vbrstypedynaset datscore.databasename = App.Path + "\score.mdb" datscore.recordsource = "score" datscore.visible = False ' 绑定相关文本框

314 第 10 章 数据库编程基础 txtid.datafield = " 学号 " txtname.datafield = " 姓名 " txtclass.datafield = " 班级 " txtmaths.datafield = " 数学 " txtenglish.datafield = " 英语 " txtcomputer.datafield = " 计算机 " ' 锁定各文本框 txtid.locked = True txtname.locked = True txtclass.locked = True txtmaths.locked = True txtenglish.locked = True txtcomputer.locked = True txtsum.locked = True txtave.locked = True lblid.caption = " 学号 " lblname.caption = " 姓名 " lblclass.caption = " 班级 " lblmaths.caption = " 数学 " lblenglish.caption = " 英语 " lblcomputer.caption = " 计算机 " lblsum.caption = " 总分 " lblave.caption = " 平均分 " cmdfirst.caption = " 首记录 " cmdprevious.caption = " 上一条 " cmdnext.caption = " 下一条 " cmdlast.caption = " 尾记录 " sql="" ' 首记录 按钮的单击事件过程 Private Sub cmdfirst_click() On Error Resume Next ' 出错继续执行下一条语句 datscore.recordset.movefirst ' 尾记录 按钮的单击事件过程 Private Sub cmdlast_click() On Error Resume Next datscore.recordset.movelast

315 Visual Basic 6.0 程序设计基础教程 ' 下一条 按钮与 取消 按钮的单击事件过程 Private Sub cmdnext_click() On Error Resume Next Select Case cmdnext.caption Case " 下一条 " datscore.recordset.movenext If datscore.recordset.eof Then datscore.recordset.movelast Case " 取消 " datscore.updatecontrols datscore.recordset.movelast cmdfirst.visible = True cmdlast.visible = True cmdprevious.caption = " 上一条 " cmdnext.caption = " 下一条 " End Select ' 上一条 按钮与 确定 按钮的单击事件过程 Private Sub cmdprevious_click() On Error Resume Next Select Case cmdprevious.caption Case " 上一条 " datscore.recordset.moveprevious If datscore.recordset.bof Then datscore.recordset.movefirst Case " 确定 " datscore.recordset.update datscore.recordset.movelast cmdfirst.visible = True cmdlast.visible = True cmdfirst.caption = " 首记录 " cmdprevious.caption = " 上一条 " cmdnext.caption = " 下一条 " cmdlast.caption = " 尾记录 " End Select ' 处理记录指针移动, 使查询窗体 frmsearch 排序窗体 frmsort 中的文本框内容与 ' 主窗体中相应文本框的内容变化同步 Private Sub datscore_reposition() frmsearch.txtid.text = txtid.text frmsearch.txtname.text = txtname.text

316 第 10 章 数据库编程基础 frmsearch.txtclass.text = txtclass.text frmsearch.txtmaths.text = txtmaths.text frmsearch.txtenglish.text = txtenglish.text frmsearch.txtcomputer.text = txtcomputer.text frmsearch.txtsum.text = txtsum.text frmsearch.txtave.text = txtave.text ' 检查数据的有效性 Private Sub datscore_validate(action As Integer, Save As Integer) If (Len(Trim(txtID.Text)) = 0 And Action = vbdataactionupdate) Then MsgBox " 学号不能为空值, 请重新输入!", vbcritical + vbokonly, " 错误 " Action = vbdataactioncancel txtid.setfocus ElseIf Save And cmdprevious.caption <> " 确定 " Then Save = False End If ' 根据 计算机 文本框内容的变化重新计算总分和平均分 Private Sub txtcomputer_change() txtsum.text = Str(Val(txtMaths.Text)+ Val(txtEnglish.Text)_ + Val(txtComputer.Text)) txtave.text = Str(Val(txtSum.Text) / 3) ' 根据 英语 文本框内容的变化重新计算总分和平均分 Private Sub txtenglish_change() txtsum.text = Str(Val(txtMaths.Text) + Val(txtEnglish.Text)_ + Val(txtComputer.Text)) txtave.text = Str(Val(txtSum.Text) / 3) ' 根据 数学 文本框内容的变化重新计算总分和平均分 Private Sub txtmaths_change() txtsum.text = Str(Val(txtMaths.Text)+ Val(txtEnglish.Text)_ + Val(txtComputer.Text)) txtave.text = Str(Val(txtSum.Text) / 3) ' 卸载主窗体 frmmain Private Sub Form_Unload(Cancel As Integer) End

317 Visual Basic 6.0 程序设计基础教程 ' 输入记录 Private Sub mnuinsert_click() datscore.recordset.addnew cmdfirst.visible = False cmdlast.visible = False cmdprevious.caption = " 确定 " cmdnext.caption = " 取消 " txtid.locked = False txtname.locked = False txtclass.locked = False txtmaths.locked = False txtenglish.locked = False txtcomputer.locked = False txtid.setfocus ' 删除记录 Private Sub mnudelete_click() On Error Resume Next Dim i As Integer i = MsgBox(" 确实要删除当前记录吗?", vbokcancel+vbexclamation+ _ vbdefaultbutton1, " 删除 ") If i = vbok Then datscore.recordset.delete datscore.recordset.movenext If datscore.recordset.eof Then datscore.recordset.movelast End If End If ' 修改记录 Private Sub mnuedit_click() Dim i As Integer i = MsgBox(" 确实要修改当前记录吗?", vbokcancel+vbexclamation+ _ vbdefaultbutton1, " 修改 ") If i = vbok Then datscore.recordset.edit cmdfirst.visible = False cmdlast.visible = False cmdprevious.caption = " 确定 "

318 第 10 章 数据库编程基础 cmdnext.caption = " 取消 " txtid.locked = False txtname.locked = False txtclass.locked = False txtmaths.locked = False txtenglish.locked = False txtcomputer.locked = False txtid.setfocus End If ' 查找记录 Private Sub mnusearch_click() MsgBox " 请在文本框中输入查询条件 " +Chr(13)+Chr(10)+" 例如 :>=60 _ <>' 张三 ' 等 ", vbokonly + vbinformation, " 查询 " frmmain.hide ' 隐藏主窗体 frmsearch.show ' 显示查询窗体 ' 排序记录 Private Sub mnusortby_click(index As Integer) Dim SortBy As String, field As String SortBy = mnusortby(index).caption field = " 学号, 姓名, 班级, 数学, 英语, 计算机, 数学 + 英语 + 计算机 as 总分, _ ( 数学 + 英语 + 计算机 )/3 as 平均分 " Select Case SortBy Case " 按学号 " sql = "select " & field & " from score order by 学号 asc" Case " 按姓名 " sql = "select " & field & " from score order by 姓名 asc" Case " 按数学成绩 " sql = "select " & field & " from score order by 数学 asc" Case " 按英语成绩 " sql = "select " & field & " from score order by 英语 asc" Case " 按计算机成绩 " sql = "select " & field & " from score order by 计算机 asc" Case " 按总分 " sql = "select " & field & " from score order by 数学 + _ 英语 + 计算机 asc" Case " 按平均分 " sql = "select " & field & " from score order by ( 数学 _

319 Visual Basic 6.0 程序设计基础教程 + 英语 + 计算机 )/3 asc" End Select frmsort.show frmmain.hide ' 退出系统 Private Sub mnuexit_click() Dim i As Integer i = MsgBox(" 确实要退出本系统?", vbyesno + vbinformation + _ vbdefaultbutton1, " 退出 ") If i = vbyes Then End ' 帮助信息 Private Sub mnuhelp_click() MsgBox " 欢迎使用学生成绩管理系统!", vbokonly + vbinformation, " 帮助 " 3. 查询模块在如图 所示的查询窗体的各文本框中输入查询条件, 学号 班级 和 姓名 条件由关系运算符 (> >= < <= = 以及 <>) 和用单引号括起来的字符串组成, 例如 :=' ' 数学 英语 计算机 总分 和 平均分 条件则由关系运算符和数值组成, 例如 : >60 代码如下: 图 查询窗体 Dim c$ ' 定义窗体级变量 c 表示查询条件 ' 初始化查询窗体 frmsearch Private Sub Form_Load() frmsearch.caption = " 查询 " lblid.caption = " 学号 " lblname.caption = " 姓名 " lblclass.caption = " 班级 " lblmaths.caption = " 数学 " lblenglish.caption = " 英语 "

320 第 10 章 数据库编程基础 lblcomputer.caption = " 计算机 " lblsum.caption = " 总分 " lblave.caption = " 平均分 " txtid.text = "" txtname.text = "" txtclass.text = "" txtmaths.text = "" txtenglish.text = "" txtcomputer.text = "" txtsum.text = "" txtave.text = "" txtid.tabindex = 0 cmdfirst.visible = False cmdprevious.caption = " 确定 " cmdnext.caption = " 取消 " cmdlast.visible = False c = "" ' 卸载查询窗体 frmsearch Private Sub Form_Unload(Cancel As Integer) frmmain.show ' 首记录 按钮的单击事件过程 Private Sub cmdfirst_click() frmmain.datscore.recordset.findfirst c ' 尾记录 按钮的单击事件过程 Private Sub cmdlast_click() frmmain.datscore.recordset.findlast c ' 下一条 按钮与 取消 按钮的单击事件过程 Private Sub cmdnext_click() Select Case cmdnext.caption Case " 下一条 " frmmain.datscore.recordset.findnext c Case " 取消 " Form_Load End Select

321 Visual Basic 6.0 程序设计基础教程 ' 上一条 按钮与 确定 按钮的单击事件过程 Private Sub cmdprevious_click() On Error GoTo err Dim s(1 To 8) As String, i As Integer Select Case cmdprevious.caption Case " 上一条 " frmmain.datscore.recordset.findprevious c Case " 确定 " If txtid.text <> "" Then s(1) = lblid.caption & txtid.text If txtname.text <> "" Then s(2) = lblname.caption & txtname.text If txtclass.text <> "" Then s(3) =lblclass.caption & txtclass.text If txtmaths.text <> "" Then s(4) =lblmaths.caption & txtmaths.text If txtenglish.text<> "" Then s(5)=lblenglish.caption &_ txtenglish.text If txtcomputer.text <> "" Then s(6) =lblcomputer.caption &_ txtcomputer.text If txtsum.text <> "" Then s(7) = " 数学 + 英语 + 计算机 " & txtsum.text If txtave.text <> "" Then s(8) = "( 数学 + 英语 + 计算机 )/3" & txtave.text For i = 1 To 8 If c <> "" And s(i) <> "" Then c = s(i) + " and " + c ElseIf c = "" And s(i) <> "" Then c = s(i) End If Next i frmmain.datscore.recordset.findfirst c If frmmain.datscore.recordset.nomatch Then MsgBox " 无此记录!", vbcritical + vbokonly, " 错误 " Form_Load Else cmdfirst.visible = True cmdprevious.caption = " 上一条 " cmdnext.caption = " 下一条 " cmdlast.visible = True End If

322 第 10 章 数据库编程基础 End Select Exit Sub err: MsgBox " 条件输入错误, 请在文本框中重新输入查询条件 " + Chr(13)+ Chr(10) _ + " 例如 :>=60 <>' 张三 ' 等 ", vbokonly + vbcritical, " 错误 " Form_Load 4. 排序模块该模块根据执行的菜单命令选择记录排序的方式, 用户可通过滚动条按排序后的顺序浏览记录, 界面如图 所示 本窗体中使用了 ADO 控件 adosort 和 DataGrid 控件 DataGrid1, 按照 节介绍的方法将 ADO 控件与 score.mdb 数据库连接, 并在属性窗口中将 DataGrid1 的 DataSource 属性设置为 adosort 代码如下: 图 排序窗口 ' 初始化排序窗体 frmsort Private Sub Form_Load() frmsort.caption = " 排序 " adosort.visible = False adosort.commandtype = adcmdtext adosort.recordsource = frmmain.sql adosort.refresh ' 卸载排序窗体 frmsort Private Sub Form_Unload(Cancel As Integer) frmmain.show adosort.recordset.close 本章小结 数据库的最大特点是通过联系减少了不必要的数据冗余 同时, 不同用户可以使用同一

323 Visual Basic 6.0 程序设计基础教程数据库中自己所需的子集, 从而实现了数据共享 一个完整的数据库系统除了包括可以共享的数据库 ( 后台数据库 ) 外, 还包括用于处理数据的数据库应用系统 ( 前台应用程序 ) Visual Basic 为开发数据库前台应用程序提供了专门的控件, 如 Data 控件和 ADO 控件 Data 控件和 ADO 控件只相当于一个记录指针, 可以选择当前记录, 但本身并不能显示和修改当前记录 只有通过将数据约束控件与 Data 控件或 ADO 控件 绑定 (Bounding) 后, 才能在数据约束控件中自动显示当前记录的相关字段值 Data 控件和 ADO 控件可以访问的记录构成一个记录集对象 Recordset,Visual Basic 对数据库中记录的访问是通过 Recordset 对象实现的, 主要是使用 Recordset 对象的相关属性与方法 习题 一 填空题 1.DB 是 的简称,DBMS 是 的简称 2. 按数据的组织方式不同, 数据库可以分为 3 种类型, 即 数据库 数据库和 数据库 3. 一个数据库可以有 个表, 表中的 称为记录, 表中的 称为字段 4.Visual Basic 允许对 3 种类型的记录集进行访问, 即 和 以 方式打开的表或由查询返回的数据是只读的 5.SQL 语句 Select*From 学生基本信息 Where 性别 = " 男 " 的功能是 : 6. 从 工资 表中查询所有 性别 为 女 的职工的 姓名 和 应发工资, 相应的 Select 语句为 : 7. 某 学生成绩 表包括 学号 姓名 和 成绩 字段, 要将学号为 姓名为 张颖 且成绩为 88 的学生信息插入 学生成绩 表中, 相应的 Insert 语句为 : 8. 删除 学生成绩 表中 成绩 字段值小于 60 分的记录, 相应的 Delete 语句为 : 9. 要设置 Data 控件连接的数据库的名称, 需要设置其 属性 要设置 Data 控件连接的数据库类型, 需要设置其 属性 10. 要设置记录集的当前记录的序号位置, 需通过 属性 例如, 要定位于在由 Datal 控件所确定的记录集的第 5 条记录, 应使用语句 : 11. 记录集的 属性用于指示 Recordset 对象中记录的总数 12. 在由数据控件 Datal 所确定的记录集中, 将当前记录的 姓名 字段值改成 王军, 应使用语句 : 13. 在由数据控件 Datal 所确定的记录集中, 要将名称为 XM 的索引设置为记录集的当前索引, 应使用语句 :

324 第 10 章 数据库编程基础 14. 在由数据控件 Datal 所确定的记录集中, 要将当前记录从第 8 条移到第 2 条, 应使用语句 : 15. 在由数据控件 Datal 所确定的记录集中, 查找 姓名 字段值为 王颖 的第一条记录, 应使用语句 : 16. 要使数据绑定控件能够显示数据库记录集中的数据, 必须首先在设计时或在运行时设置这些控件的两个属性, 即使用 属性设置数据源, 使用 属性设置要连接的数据源字段的名称 二 选择题 1. 以下说法错误的是 (A) 一个表可以构成一个数据库 (B) 多个表可以构成一个数据库 (C) 一个表的每一条记录中的各数据项具有相同的类型 (D) 同一个字段的数据具有相同的类型 2. 以下关于索引的说法, 错误的是 (A) 一个表可以建立一个到多个索引 (B) 每个表至少要建立一个索引 (C) 索引字段可以是多个字段的组合 (D) 利用索引可以加快查找速度 3.Microsoft Access 数据库文件的扩展名是 (A).dbf (B).Acc (C).mdb (D).db 4.SQL 语句 Select 编号, 姓名, 部门 From 职工 Where 部门 =" 信电系 ", 所查询的表名称是 (A) 所有表 (B) 职工 (C) 信电系 (D) 编号, 姓名, 部门 5. 语句 Select*From 学生基本 Where 性别 = 男 中的 * 号表示 (A) 所有表 (B) 所有指定条件的记录 (C) 所有记录 (D) 指定表中的所有字段 6. 当 BOF 属性为 True 时, 表示 当 EOF 属性为 True 时, 表示 (A) 当前记录位置位于 Recordset 对象的第一条记录 (B) 当前记录位置位于 Recordset 对象的第一条记录之前 (C) 当前记录位置位于 Recordset 对象的最后一条记录 (D) 当前记录位置位于 Recordset 对象的最后一条记录之后 7. 当使用 Seek 方法或 Find 方法进行查找时, 可以根据记录集的 属性判断是否找到了匹配的记录 (A)Match (B)NoMath (C)Found (D)Nofound 8. 以下说法正确的是 (A) 使用 Data 控件可以直接显示数据库中的数据 (B) 使用数据绑定控件可以直接访问数据库中的数据 (C) 使用 Data 控件可以对数据库中的数据进行操作, 却不能显示数据库中的数据 (D)Data 控件只有通过数据绑定控件才可以访问数据库中的数据

325 Visual Basic 6.0 程序设计基础教程 实验 1. 使用可视化数据库管理器建立一个 Access 数据库 Mydb.mdb, 其中含表 Student, 其结构见表 10-1 程序设计要求 : (1) 设计一个窗体, 编写程序能够对 Mydb.mdb 数据库中 Student 表进行编辑 添加和删除等操作 ; (2) 设计一个窗体, 编写程序浏览学生基本信息, 查询某指定学生考试成绩 2. 在 Visual Basic 或 Access 环境下建立一个 Zg.mdb 数据库, 并在库中建立一个 职工情况.dbf 表 其表如表 10-6 所示 表 10-6 职工情况表 编 号 姓 名 出生年月 性 别 职 称 婚 否 备 注 张江 女 讲师 T 王锦 男 副教授 T 李华 男 讲师 F 请编写一个 Visual Basic 应用程序, 实现对 Access 环境下建立的 Zg.mdb 中 职工情 况.dbf 表的记录的浏览 增加和删除操作

326 附录 1 ASCII 字符集 ASCII 码字符 ASCII 码字符 ASCII 码字符 ASCII 码字符 0 (Null) 32 空格 96 ` 1?? 33! 65 A 97 a 2?? 34 " 66 B 98 b 3?? 35 # 67 C 99 c 4?? 36 $ 68 D 100 d 5?? 37 % 69 E 101 e 6?? 38 & 70 F 102 f 7 (beep) 39 ' 71 G 103 g 8 ( 退格 ) 40 ( 72 H 104 h 9 (TAB) 41 ) 73 I 105 i 10 ( 换行 ) 42 * 74 J 106 j 11?? K 107 k 12?? 44, 76 L 108 l 13 ( 回车 ) M 109 m 14?? N 110 n 15?? 47 / 79 O 111 o 16?? P 112 p 17?? Q 113 q 18?? R 114 r 19?? S 115 s 20?? T 116 t 21?? U 117 u 22?? V 118 v 23?? W 119 w 24?? X 120 x 25?? Y 121 y 26?? 58 : 90 Z 122 z 27?? 59 ; 91 [ 123 { 28?? 60 < 92 \ ?? 61 = 93 ] 125 } 30?? 62 > 94 ^ 126 ~ 31?? 63? 95 _ 127?? 表中 0~31 为控制字符, 它们并没有特定的图形显示, 因此在表中用?? 表示 315

327 附录 2 常用内部函数 Visual Basic 提供了上百种内部函数 ( 库函 ), 按其功能和用途, 可分为 : 数学函数 字符串函数 转换函数 测试函数 日期时间函数和格式输出函数等 本附录列出一些常用的函数, 供读者查询使用 表中函数的参数含义是 :N 表示数值类型 ( 包括 Integer Single Double), C 表示字符串,V 表示变量,E 表示表达式,Array 表示数组名,List 表示多个数列表 一 数学函数 数学函数用于各种数学运算, 包括三角函数 求平方根 绝对值 对数及指数函数等, 它们与数学中的定义相同 函 数 名 功 能 返回值类型 实 例 结 果 Abs(N) 取绝对值 与参数 N 相同 Abs(-5) 5 Atn(N) 反正切函数 Double Atn(1) Cos(N) 余弦函数 Double Cos(0) 1 Exp(N) E 为底的指数函数 Double Exp(1) Log(N) 以 e 为底的自然对数 Double Log(2) Rnd([N]) 产生 [0,1) 之间随机函数 Double Rnd [0,1) 之间随机数 Sgn(N) 符号函数 Integer Sgn(-2.8) -1 Sin(N) 正弦函数 Double Sin(0) 0 Sqr(N) 平方根 Double Sqr(9) 3 Tan(N) 正切函数 Double Tan(0) 0 说明 : 在三角函数中的自变量以弧度为单位 二 转换函数 转换函数用于类型或者形式的转换, 包括整型 实型和字符串类型之间以及数值与 ASCII 字符之间的转换 函数名 功 能 返回值类型 实 例 结 果 Asc(C) 字符转换成 ASCII 码值 Integer Asc("0") 48 Val(C) 数字字符串转换成数值 Double Val("125") 125# Str$(N) 数值转换为字符串 String Str$(125) "125" 316

328 附录 2 常用内部函数 续表 函数名 功 能 返回值类型 实 例 结 果 Chr$(N) ASCII 码值转换成字符 String Chr$(65) "A" Fix(N) 截断取整 Integer Fix(-9.6) -9 Int(N) 正数取整同 Fix, 负数取不大于 N Int(-9.6) -10 Integer 的最大整数 Int(9.6) 9 Cint(N) 将一数值按四舍五入取整 Integer Cint (9.6) 10 Lcase$(C) 大写字母转换为小写字母 String Lcase$("ABC12") "abc12" Ucase$(C) 小写字母转换成大写字母 String Ucase$("abc12") "ABC12" Hex[$](N) 十进制转换成十六进制 String Hex$(76) "4C " Oct[$](N) 十进制转换成八进制 String Oct$(76) "114 " 三 字符串函数 Visual Basic 系统提供了丰富的字符串处理函数, 给编程中的字符处理带来极大的方便 ( 表中举例的字符串变量 X$= "ABCDEFG",Y$= " XY ") 函 数 名 功 能 举 例 结 果 Left$(C,N) 取出字符串左边的 n 个字符 Left$(X$,3) "ABC" Right$(C,N) 取出字符串右边 n 个字符 Right$(X$,3) "EFG" Mid$(C,N1[,N2]) 自字符串 C 中第 N1 个字符开始向右 Mid$(X$,3,3) "CDE" 取 N2 个字符 Mid$(X$,3) "CDEFG" Len(C) 字符串长度 Len(X$) 7 Ltrim$(C) 去掉字符串左边的空格 Ltrim$(Y$) "XY " Rtrim$(C) 去掉字符串右边的空格 Rtrim$(Y$) " XY" Trim$(C) 去掉字符串左右两边空格 Trim$(Y$) "XY" Space$(N) 产生 N 个空格字符串 Space$(5) " " Spc(N) 与 Print # 语句或 Print 方法一起使用, 对输出进行定位 Print "XY";Spc(2), "AB " XY AB InStr([N1,]C1,C2,[M]) 在 C1 中从第 N 个字符开始找 C2, InStr(X$,"CDE") 3 省略 N 时从头开始找, 返回第一次 InStr(4,X$,"CDE") 0 找到 C2 的开始位置, 找不到返回 0 StrComp(C1,C2, [M]) 以 分别表示字符串 C1< = 或 > 字符串 C2 StrComp("ab","AB") StrComp("AB","AB") 1 0 String$(N,C N1) 返回由 C 中首字符或 Ascii 值 N1 对 String$(5, "ABC") " AAAAA" 应的字符组成的 N 个相同的字符串 String$(5,65) " AAAAA" StrReverse(c) 将字符串取反 StrReverse(X$) " GFEDCBA"

329 Visual Basic 6.0 程序设计基础教程 四 时期 时间函数 函 数 名 功 能 类型 举 例 结 果 Date[$][()] 返回系统日期 Date Date Year(C N) 返回公元年号 Integer Year(date) 2005 Month(C N) 返回月代号 (1~12) Integer Month(date) 2 Day(C N) 返回日期代号 (1~31) Integer Day(date) 22 Now 返回系统日期和时间 Date Now :31:37 Time[$][0] 返回系统时间 Date Time 5:32:26 Hour(D) Minute(D) Second(D) Timer[()] WeekDay(C N) 将指定的时间转换为小时数返回给定时间小时后面的分钟数返回给定时间分钟后面的秒数返回从午夜开始到现在经过的秒数返回星期代号 (1~7), 星期日为 1, 星期一为 2 Integer Hour(Time) 5 Integer Minute(Time) 32 Integer Second(Time) 26 Single Timer Integer WeekDay(date) 6 DateSerial( 年, 月, 日 ) 返回指定的日期型数据 Date DateSerial(5,3,5) DateValue(C) 同上, 但自变量为字符串 Date DateValue("5,3,5") 说明 : 表中举例是以时期为 , 时间为 5:32:26 的数据为基准 五 格式输出函数 格式输出函数即 Format 函数, 是用来将要输出的数据, 按指定的格式输出 其返回值是字符串 Format 函数使用格式如下 : Format (expression,fmt) 1. 数值数据格式化数值格式化是将数值表达式的值按如表所列 格式字符串 指定的格式返回 常用数值格式化字符及举例格式字符意义举例结果 0 显示一数字, 若此位置没有数字则补 0 Format (2, "00.00")

330 附录 2 常用内部函数 格式字符意义举例结果 # 显示一数字, 若此位置没有数字则不显示 Format (2, "##.##") 2. % 数字乘以 100 并在右边加上 % 号 Format (0.7, "0%") 70%. 小数点 Format (2.568, "##.##") 2.57, 千位的分隔符 Format (3568, "##,##") 3, $ ( ) 这些字出现在 fmt 里将原样打出 Format (2.568, "$(##.##)") $(2.57) 说明 : 对于字符 0 与 #, 若要显示的数值表达式的整数部分位数多于格式字符串的位数, 按实际 数值返回 ; 若小数部分的位数多于格式字符串的位数, 按四舍五入返回 2. 日期和时间数据格式化 Format 函数对日期和时间数据格式化, 是将日期和时间数据按指定的字符串格式返回 设日期为 2005 年 4 月 16 日, 时间是 22 时 41 分 29 秒, 常用日期和时间数据格式字符串及含 义如下表所示 常用日期和时间数据格式字符串及含义 说明 : 上表中结果栏是函数 Format(Date, " 格式字符 ") 的结果, 其中 格式字符 是对应表中第一列的格 式字符串 格式字符意义结果 M/d/yy 按月 / 日 / 年格式输出 4/16/05 d-mmmm-yy 按日 - 月份全名 - 年格式输出 16-April-05 d-mmmm 按日 - 月份全名格式输出 16-April mmmm-yy 按月份全名 - 年格式输出 April-05 Hh:mm AM/PM 按小时 : 分 AM 或 PM 格式输出 10:41 PM h:mm:ss a/p 按小时 : 分 : 秒 a 或 p 格式输出 10:41:29 p h:mm 按小时 (0-23): 分格式输出 22:41 h:mm:ss 按小时 (0-23): 分 : 秒格式输出 22:41:29 m/d/yy h:mm 按月 / 日 / 年小时 (0-23): 分格式输出 4/16/05 22:41 3. 字符串数据格式化 字符串数据格式化是将字符串表达式的值按下表所示 格式字符串 指定的格式返回 字符串的格式字符及举例 格式字符意义举例结果 < 将字符串数据转换为小写 Format("THIS", "<") " this " > 将字符串数据转换为大写 Format("this ", ">") " THIS & 实际字符位数小于格式字符串的位数, 则字符串前加空格 实际字符位数小于格式字符串的位数, 字符串前不加空格 续表 Format("THIS ", "@@@@@@") " THIS" Format("THIS ", "&&&&&&") " THIS"

331 Visual Basic 6.0 程序设计基础教程 六 其他函数 1. 测试函数 函 数 名 功 能 返回值类型 Eof(N) 测试文件指针是否到达文件结束标志 Boolean IsArray(V) 检查变量是否为数组 Boolean Iff(E,E1,E2) 计算 E1,E2 的值, 再计算 E 的值 若 E 为 True, 返回 E1 的值 ; 否则, 返回 E2 的值 由表达式 E1 或 E2 的类型决定 IsNull(E) 测试表达式是否不包含任何有效数据 (Null) Boolean IsNumeric(E) 测试表达式的运算结果是否为数值类型 Boolean VarType(v/e) 返回表示给定变量或表达式的子类型的整型数据 Integer 2. 与文件操作有关的函数 函 数 名 功 能 返回值类型 FileDateTime(C) 返回指定文件被创建或最后修改的日期和时间 Date FileLen(C) 返回指定文件的长度, 单位是字节 Long FreeFile[(N)] 返回下一个可供 Open 语句使用的文件号 Integer Input(N1,N2) 从已打开的指定文件 ( 文件号为 N2) 中返回 N1 个字符 String LoadPicture([C]) 将图形载入到窗体 图片控件或影像控件的 Picture 属性 Long Loc(N) 返回一个长整数, 表示指定已打开的文件中当前读 / 写位置 Long LoF(N) 返回一个表示用 Open 语句打开的文件的大小, 该大小以字节 为单位 Long Seek(N) 返回下一个要写或读的位置 Long Shell(C) 3. 其他函数 执行一个应用程序, 如执行成功返回这个程序的任务 ID, 不成 功返回 0 Double 函数名功能返回值类型 Array(List) 返回一个包含 Variant 的数组 CurDir([C]) 返回当前的路径 String InputBox[$](C1 [,C2..]) 打开一输入对话框, 等待用户输入正文或按下按钮, 并返 回包含文本框中内容的字符串 String

332 附录 2 常用内部函数 函数名功能返回值类型 Lbound(Array,[n]) 返回一个指定数组维可用的最小下标 Long 续表 MsgBox() 打开一显示消息的对话框, 等待用户单击按钮, 并返回一 个整数值 单击不同的按钮, 返回不同的值 Integer QBColor(N) 返回一个 Long, 用来表示所对应颜色值的 RGB 颜色码 Long RGB(N1,N2,N3) 返回一个 Long, 用来表示一个 RGB 颜色值 Long Ubound(Array,[n]) 返回一个指定数组维可用的最大上标 Long

333 附录 3 Visual Basic 程序设计实验 CAI 系统简介 目前大多数院校的 Visual Basic 程序设计教学, 一般由教师根据教材挑选一些习题或例题, 作为学生的上机实验内容, 或者选用与教材配套的实验指导书, 学生按照指导书的实验题进行操作 这种教学方式存在以下不足 首先由于教材是黑白和静止的文字或图片, 故教材实验题目的设计便受到很大的局限 其次由于计算机技术发展很快, 教学内容及实验内容都不断更新, 但是文字教材很难做到即时更新, 而且更新的成本较高 第三, 由于实验教材的内容与教学内容及进度常常出现不一致, 致使学生上机实验目的性不强, 任务不够明确, 教师对学生实验操作内容的控制性差 第四, 由于一个教师往往是指导几十个学生同时上机, 学生遇到问题得不到及时解决 为克服上述不足, 编者结合多年从事 Visual Basic 程序设计教学的经验, 研究开发了通过 任务驱动 的 Visual Basic 实验 CAI 教学系统 该系统的题库系统及帮助系统采用全开放 Word 文档, 教师可以根据自己的教学内容和教学进度, 十分方便地增加或删除实验内容 ( 教师版 ), 使教学内容与实验内容紧密结合 在实验教学中, 学生每次上机实验的内容应是在教师事先有目的地设定好的实验任务驱动下, 为完成任务进行的实验操作, 这样学生的实验目的性强, 有利于培养学生的计算机实际操作能力 由于学生在实验操作过程中, 可以通过该系统的关联帮助, 较快地获取编程思路 参考程序及程序运行情况等, 所以这套系统可以大大减轻教师指导实验的劳动强度, 提高实验效果 学生每次上机操作的结果可以通过局域网络将作业提交到教师指定的服务器的文件夹中, 教师可设定交作业密码和密码有效日期, 教师删除该密码或密码到期后, 学生就不能再提交作业, 由此控制学生交作业期限 采用本系统, 教师还可以设计一批研究性实验课题, 提出明确的要求和最终达到的目的, 在对应的帮助文件中给出难点提示及必要的说明, 让学生自己去操作完成 一 系统各主要功能简介 本系统包括大学 Visual Basic 程序设计 课程中全部教学的实践内容 :VB 简单应用程序的设计 数据类型 常量 变量及表达式程序设计 顺序结构程序设计 选择结构程序设计 循环结构程序设计 数组的应用 子过程与函数过程 过程和变量的作用域 常用控件与系统对象 文件操作 对话框与菜单程序设计 图形操作 键盘和鼠标事件 数据库编程基础 多文档界面与工具栏设计 程序调试和出错处理及综合实验等 程序的进入用户界面如图 1 所示 当学生输入学号 ( 注 : 学号是教师给的学生上机的惟一标识 ), 按回车键或单击 确定 322

334 附录 3 Visual Basic 程序设计实验 CAI 系统简介 按钮, 即进入程序的主控模块, 如图 2 所示 单击主界面上的 实验 -X 菜单, 弹出选择实验内容的下拉菜单, 如图 3 所示 当选择某一实验内容后便可进入实验模块 如选择 实验四循环结构程序设计, 就会出现有关循环结构程序设计的一系列实验题目和操作实例, 界面如图 4 所示 图 1 程序用户主界面图 2 主界面 图 3 选择实验内容 图 4 循环结构程序设计实验界面 操作实例 菜单提供的是有关循环结构程序设计的上机操作实例 这些题目可以作为 学生上机练习借鉴的例子 第一题至第五题, 是为学生设计的有关循环结构程序设计的上机 练习题 例如, 当选择第三题, 就出现了如图 5 所示的具体题目, 在这里不仅给学生明确了学习 任务, 而且为学生提供了有关此题的在线 帮助 比如在第三题下, 单击 帮助 菜单, 就 会出现为学生完成此题提供的帮助信息, 有 思路分析 参考程序 及 运行情况 等, 如图 5 所示 图 6 是关于第三题的思路分析 这一功能可以很好地缓解在实际上机教学中, 经常出现

335 Visual Basic 6.0 程序设计基础教程的许多同学同时有疑难, 老师指导不过来的情况 图 7 是单击帮助菜单的 参考程序 按钮后出现的界面 这个界面的设置是为了实现在上机教学工作中, 先要让学生动脑筋, 独立做题, 确实做不出, 经过教师同意, 由教师输入一个动态口令, 将会打开如图 8 所示的有关该题的参考程序 图 5 循环结构程序设计第三题及帮助菜单 图 6 思路分析 的帮助界面 任务 图 7 请求帮助对话框图 8 参考程序 在帮助功能里还可以方便 适时地布置一些针对不同学生对象 不同阶段的研究性学习 单击图 5 所示的返回菜单, 即可回到主界面, 如图 1 所示, 单击主界面的 测验题 菜 单, 即进入测验模块, 如图 9 所示 测验模块是为了让学生进一步提高自己的编程水平而设计的, 其题型有目前计算机等级 考试上机测试中常采用的程序设计和程序调试两种题型 当学生完成作业, 单击 交作业 菜单, 即可打开如图 10 所示的学生作业维护窗口, 在该窗口学生可以将操作结果提交给任课老师, 同时可以维护以前提交的作业 这样学生可 以将没操作完成的实验任务保存到服务器上, 再利用课余时间将上次没能做的作业下载下来, 324

336 附录 3 Visual Basic 程序设计实验 CAI 系统简介 待修改完成后重新上传 由于必须使用密码, 因此学生只能操作自己的作业 图 9 测验模块界面 图 10 学生作业维护窗口 通过 工具 / 教师作业管理 菜单, 可打开教师作业管理窗口, 如图 11 所示 教师通过 该窗口检查 管理学生作业 同时也可将批改后的学生作业上传到学生的作业文件夹, 以便 学生阅读, 实现教师对学生实验操作的网上指导 图 11 教师作业管理窗口

VB程序设计教程

VB程序设计教程 高 等 学 校 教 材 Visual Basic 程 序 设 计 教 程 魏 东 平 郑 立 垠 梁 玉 环 石 油 大 学 出 版 社 内 容 提 要 本 书 是 按 高 等 学 校 计 算 机 程 序 设 计 课 程 教 学 大 纲 编 写 的 大 学 教 材, 主 要 包 括 VB 基 础 知 识 常 用 程 序 结 构 和 算 法 Windows 用 户 界 面 设 计 基 础 文 件 处

More information

Microsoft PowerPoint - OPVB1基本VB.ppt

Microsoft PowerPoint - OPVB1基本VB.ppt 大 綱 0.VB 能 做 什 麼? CH1 VB 基 本 認 識 1.VB 歷 史 與 版 本 2.VB 環 境 簡 介 3. 即 時 運 算 視 窗 1 0.VB 能 做 什 麼? Visual Basic =>VB=> 程 式 設 計 語 言 => 設 計 程 式 設 計 你 想 要 的 功 能 的 程 式 自 動 化 資 料 庫 計 算 模 擬 遊 戲 網 路 監 控 實 驗 輔 助 自 動

More information

2

2 1 2 1-1 Visual Basic 3 1-2 3/8-3/21 3/22-4/4 4/5-4/18 4/19-5/2 5/3-5/16 5/17-5/30 5/31-6/13 6/14-6/27 6/28-7/11 7/12-7/25 7/26-8/8 8/9-8/22 8/25-9/5 9/6-9/19 9/20-10/3 10/4-10/17 10/18-10/31 11/15-11/28

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 第 3 章窗体 本章重点 : 窗体的结构 窗体的属性 事件 方法 多窗体 MDI 窗体 窗体 (Form) 是一个存放控件的窗口容器, 是一个可以包含其他对象的对象 在程序运行时, 窗体成为用户与应用程序进行交互操作的界面 在 Visual Basic 中, 窗体使用灵活, 既可以同时显示程序中的所有窗体, 也可以按程序的需要显示或隐藏某些窗体 3.1 窗体的结构 本书采用如下符号规约来描述 Visual

More information

Microsoft Word Visual_Basic程序设计上机实践教程正文.doc

Microsoft Word Visual_Basic程序设计上机实践教程正文.doc 实验 3 顺序和分支结构程序设计 实验目的 1. 掌握顺序结构的程序设计思想 2. 掌握命令按钮 (CommandButton) 标签 (Label) 文本框 (TextBox) 编辑框 (EditBox) 等常用控件的使用方法 3. 了解并掌握对话框函数 MessageBox() 的含义与用法 4. 了解和熟悉线条控件 形状控件的画法以及主要属性的用法 实验内容 1. 顺序结构 实训 3-1 编写一应用程序,

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

MVB-1001.DOC

MVB-1001.DOC 20 1.5 10 15 20 25 80 100 CSF 1. 2. 0105 3. 4. 5. 30% 1.5 0.75 1. Visual Basic Visual Basic (A) Visual Basic Enterprise Edition (B) Visual Basic Script Edition (C) Visual Basic Learning Edition (D) Visual

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

Microsoft Word - VB全文.doc

Microsoft Word - VB全文.doc 实验 5 顺序结构 一 实验目的 1. 熟悉常用的输入和输出的方法 2. 掌握 InputBox 函数和 MsgBox 函数的用法 3. 掌握编写顺序结构程序的一般步骤 二 实验内容 1. 设计一个计算圆面积的程序 要求 : 利用 InputBox 函数输入圆的半径, 利用 MsgBox 显示最后的计算结果 2. 设计一个简单的水果商店结算程序 要求 : 利用文本框输入香蕉 梨子 苹果三类水果的单价和重量,

More information

穨文件1

穨文件1 2-1 Access 2000 Visual Basic Access 2000 97 Office Visual Basic Visual Basic Visual Basic VBA Visual Basic Visual Basic 2-1-1 Visual Basic Access Visual Basic ( ) 2-1 2-1 Visual Basic 2-1 Microsoft Access

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

内容简介本书是 Visual Basic 程序设计 ( 曲宏山 饶拱维主编, 科学出版社 ) 或其他同类 Visual Basic 程序设计教材配套使用的上机实验指导用书, 是编者多年教学和软件开发实践经验的总结 全书共 14 个实验, 在每个实验前都列出了相关章节的知识点, 以方便读者对所学内容加

内容简介本书是 Visual Basic 程序设计 ( 曲宏山 饶拱维主编, 科学出版社 ) 或其他同类 Visual Basic 程序设计教材配套使用的上机实验指导用书, 是编者多年教学和软件开发实践经验的总结 全书共 14 个实验, 在每个实验前都列出了相关章节的知识点, 以方便读者对所学内容加 普通高等教育 十二五 重点规划教材公共课系列普通高等教育 十二五 规划教材 Visual Basic 程序设计上机指导 曲宏山饶拱维主编 张帆杨贵茂王楠副主编 北京 内容简介本书是 Visual Basic 程序设计 ( 曲宏山 饶拱维主编, 科学出版社 ) 或其他同类 Visual Basic 程序设计教材配套使用的上机实验指导用书, 是编者多年教学和软件开发实践经验的总结 全书共 14 个实验,

More information

Microsoft Word - 小心翼翼的二十一點N.doc

Microsoft Word - 小心翼翼的二十一點N.doc 投 稿 類 別 : 資 訊 類 篇 名 : 小 心 翼 翼 的 二 十 一 點 作 者 : 陳 鈺 文 國 立 瑞 芳 高 級 工 業 職 業 學 校 資 訊 二 李 伯 謙 國 立 瑞 芳 高 級 工 業 職 業 學 校 資 訊 二 胡 家 媛 國 立 瑞 芳 高 級 工 業 職 業 學 校 資 訊 二 指 導 老 師 : 周 曉 玲 老 師 陳 思 亮 主 任 壹 前 言 一 研 究 動 機 平

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

VB控件教程大全

VB控件教程大全 Datagrid DataGrid1.Columns.Remove(0) ' 0 DataGrid1.Columns.Add(0).Caption= ' DataGrod1.Columns(0).DataField= Name ' Adodc1.Refresh DataGrid BackColor Font DataGrid CellPadding HTML CellSpacing HTML Width

More information

四川省普通高等学校

四川省普通高等学校 四 川 省 普 通 高 等 学 校 计 算 机 应 用 知 识 和 能 力 等 级 考 试 考 试 大 纲 (2013 年 试 行 版 ) 四 川 省 教 育 厅 计 算 机 等 级 考 试 中 心 2013 年 1 月 目 录 一 级 考 试 大 纲 1 二 级 考 试 大 纲 6 程 序 设 计 公 共 基 础 知 识 6 BASIC 语 言 程 序 设 计 (Visual Basic) 9

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

Microsoft Word - CX1000-HMI_程序开发_PLC通讯 用 VB.Net 开发 CX1000 的 HMI 第二部分和 TwinCAT PLC 通讯 一 TwinCAT 动态库 TwinCAT.Ads.dll The TwinCAT.Ads.dll 是一个.NET 类库, 它提供和 ADS 设备通讯的类 如果 TwinCAT PLC 运行在 IPC 上, 则需要添加的类库是路径 \TwinCAT\ADS Api\.NET\v1.1.4322 下的 TwinCAT.Ads.dll

More information

Microsoft Word - 2-4-1_2 課本1225_OK_0222修.doc

Microsoft Word - 2-4-1_2 課本1225_OK_0222修.doc 第 七 課 玩 積 木 學 程 式 學 習 目 標 1. 學 生 能 夠 說 出 程 式 中 的 指 令 還 要 轉 換 成 電 腦 可 以 了 解 的 命 令 才 能 指 揮 電 腦 工 作 2. 學 生 能 夠 說 出 程 式 語 言 的 發 展 愈 高 階, 愈 像 人 類 的 自 然 語 言 3. 學 生 能 夠 分 辨 程 式 語 言 的 不 同 用 途 4. 學 生 能 夠 說 出 個

More information

PowerPoint Template

PowerPoint Template 窗体 P15 常用控件 菜单设计 多窗体界面设计 P19 P30 P32 属性 方法 事件 属性名 Name( 名称 ) Caption Height Width Left Top BackColor ForeColor Enabled Visible Font Moveable Picture 描述所创建窗体的名称窗体的标题, 即窗体标题栏上显示的内容窗体的高度窗体的宽度窗体的左边界距容器坐标系纵轴的距离窗体上边界距容器坐标系横轴的距离返回或设置窗体中文本和图形的背景色返回或设置窗体中文本和图形的前景色决定窗体是否活动决定窗体在程序运行时是否可见用于设置窗体中文本的外观,

More information

Microsoft Word - 13院21号.doc

Microsoft Word - 13院21号.doc 川 教 考 院 2013 21 号 四 川 省 教 育 考 试 院 关 于 全 国 计 算 机 等 级 考 试 体 系 调 整 的 通 知 各 NCRE 考 点 : 为 进 一 步 适 应 新 时 期 计 算 机 应 用 技 术 的 发 展 和 人 才 市 场 需 求 的 变 化, 确 保 全 国 计 算 机 等 级 考 试 ( 以 下 简 称 NCRE) 健 康 持 续 发 展, 教 育 部 考

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操

本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操 计 算 机 基 础 部 程 序 设 计 类 课 程 介 绍 1. Java 语 言 程 序 设 计 Java 简 介 Java 是 一 种 开 放 的 可 以 撰 写 跨 平 台 应 用 程 序 的 面 向 对 象 的 程 序 设 计 语 言 Java 技 术 具 有 卓 越 的 通 用 性 高 效 性 平 台 移 植 性 和 安 全 性, 广 泛 应 用 于 PC 数 据 中 心 科 学 超 级

More information

内容简介本书以 Visual Basic 6.0 中文版为背景, 详细介绍了 Visual Basic 程序设计的基本知识 基本语法 编程方法和常用算法, 同时将可视化界面设计与程序设计语言有机地结合, 通过内容丰富的实例较系统地介绍了使用 Visual Basic 开发 Windows 应用程序的

内容简介本书以 Visual Basic 6.0 中文版为背景, 详细介绍了 Visual Basic 程序设计的基本知识 基本语法 编程方法和常用算法, 同时将可视化界面设计与程序设计语言有机地结合, 通过内容丰富的实例较系统地介绍了使用 Visual Basic 开发 Windows 应用程序的 普通高等教育 十二五 规划教材 Visual Basic 语言程序设计教程 周冰邓娟刘芳主编 石义良李欣 刘永真副主编 北 京 科学出版社职教技术出版中心 www.aboo 内容简介本书以 Visual Basic 6.0 中文版为背景, 详细介绍了 Visual Basic 程序设计的基本知识 基本语法 编程方法和常用算法, 同时将可视化界面设计与程序设计语言有机地结合, 通过内容丰富的实例较系统地介绍了使用

More information

内容简介本书是以 Visual Basic 6.0 中文版为编程环境编写的高等学校计算机课程教材, 主要介绍了 VB 的基本概念 常用对象的属性 事件和方法 数据类型与表达式 程序的基本控制结构 数组 过程 用户界面设计 键盘 鼠标事件与绘图 文件和数据库应用等知识 本书内容由浅入深 循序渐进 注重

内容简介本书是以 Visual Basic 6.0 中文版为编程环境编写的高等学校计算机课程教材, 主要介绍了 VB 的基本概念 常用对象的属性 事件和方法 数据类型与表达式 程序的基本控制结构 数组 过程 用户界面设计 键盘 鼠标事件与绘图 文件和数据库应用等知识 本书内容由浅入深 循序渐进 注重 普通高等教育 十二五 重点规划教材计算机基础教育系列 中国科学院教材建设专家委员会 十二五 规划教材 Visual Basic 程序设计教程 肖峰张燕妮主编 科学出版社职教技术出版中心 www.aboo 北 京 内容简介本书是以 Visual Basic 6.0 中文版为编程环境编写的高等学校计算机课程教材, 主要介绍了 VB 的基本概念 常用对象的属性 事件和方法 数据类型与表达式 程序的基本控制结构

More information

普通高等教育 十二五 规划教材公共课系列 高级语言程序设计 Visual Basic 刘立群刘哲 邹丽娜主编 刘冰周颖王伟王占军副主编 郑尚志梁宝华参 编 周进钱进参编 北京 科学出版社职教技术出版中心 www.aboo 内容简介本书是为了适应 Visual Basic 程序设计课程教学需要而编写的, 知识点全面完整, 涵盖了全国计算机等级考试二级考试大纲要求 全书共分 13 章, 从认识 Visual

More information

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f 27 1 Vol.27 No.1 CEMENTED CARBIDE 2010 2 Feb.2010!"!!!!"!!!!"!" doi:10.3969/j.issn.1003-7292.2010.01.011 OPC 1 1 2 1 (1., 412008; 2., 518052), OPC, WinCC VB,,, OPC ; ;VB ;WinCC Application of OPC Technology

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

吉林大学学报 工学版 244 第 4 卷 复杂 鉴于本文篇幅所限 具体公式可详见参考文 献 7 每帧的动力学方程建立及其解算方法如图 3 所示 图4 滚转角速度与输入量 η 随时间的变化波形 Fig 4 Waveform of roll rate and input η with time changing 图5 Fig 5 滚转角随时间的变化波形 Waveform of roll angle with

More information

1. 要退出 Do---Loop 循环, 可使用的语句是 ( ) 语句 A. Exit B. Exit For C. Exit Do D. End Do 5. 有程序代码如下 : Text1. Text=" 欢迎学习 VB!" 则 T e x t 1, Text, 和 " 欢迎学习 VB!" 分别代

1. 要退出 Do---Loop 循环, 可使用的语句是 ( ) 语句 A. Exit B. Exit For C. Exit Do D. End Do 5. 有程序代码如下 : Text1. Text= 欢迎学习 VB! 则 T e x t 1, Text, 和  欢迎学习 VB! 分别代 试卷代号 : 2 2 3 1 中央广播电视大学 2 0 1 2-2 0 1 3 学年度第二学期 " 开放专科 " 期末考试 Visual Basic 程序设计试题 2013 年 7 月 注意事项 一 将你的学号 姓名及分校 { 工作站 ) 名称填写在答题纸的规定栏内 考试结束后, 把试卷和答题纸放在桌上 试卷和答题纸均不得带出考场 监考人收完考卷和答题纸后才可离开考场 二 仔细读懂题目的说明, 并按题目要求答题

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章流程控制和数组 3.1 实验目的 (1) 熟练掌握控制台应用程序的代码编写和调试, 以及运行方法 (2) 掌握选择结构的一般语法格式和应用 (3) 掌握 switch 语句的用法 (4) 掌握选择结构的嵌套的用法, 能灵活使用选择结构解决实际问题 (5) 掌握 while 循环语句的一般语法格式 (6) 掌握 for 循环语句的一般语法格式 (7) 掌握循环嵌套的语法格式 (8) 掌握一维数组的定义

More information

FPGAs in Next Generation Wireless Networks WPChinese

FPGAs in Next Generation Wireless Networks WPChinese FPGA 2010 3 Lattice Semiconductor 5555 Northeast Moore Ct. Hillsboro, Oregon 97124 USA Telephone: (503) 268-8000 www.latticesemi.com 1 FPGAs in Next Generation Wireless Networks GSM GSM-EDGE 384kbps CDMA2000

More information

! " # " " $ % " " # # " $ " # " #! " $ "!" # "# # #! &$! ( % "!!! )$ % " (!!!! *$ ( % " (!!!! +$ % " #! $!, $ $ $ $ $ $ $, $ $ "--. %/ % $ %% " $ "--/

!  #   $ %   # #  $  #  #!  $ ! # # # #! &$! ( % !!! )$ %  (!!!! *$ ( %  (!!!! +$ %  #! $!, $ $ $ $ $ $ $, $ $ --. %/ % $ %%  $ --/ "##$ "% "##& " "##( )$ "##%! ) "##$ * "##( "##$ "##(!!!!!!!!! ! " # " " $ % " " # # " $ " # " #! " $ "!" # "# # #! &$! ( % "!!! )$ % " (!!!! *$ ( % " (!!!! +$ % " #! $!, $ $ $ $ $ $ $, $ $ "--. %/ % $

More information

教学输入与学习者的语言输出 温晓虹 本文从三个方面探讨了语言的输入与输出的关系 首先从理论研究的角度讨 论了从语言输入到语言输出的习得过程 实验研究表明 输入的语言素材必须被学习者所接收 即使接收了的内容也并不会自动进入中介语的体系 而是需要进一步对输入语言进行 分解 归类等分析性与综合性的处理 在语言 内化 的基础上 学习者的中介语系统才能 够不断地得到重新组合 趋于目的语 另外 学习者在语言输出前和输出时需要调节

More information

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344> 1. 請 問 誰 提 出 積 體 電 路 (IC) 上 可 容 納 的 電 晶 體 數 目, 約 每 隔 24 個 月 (1975 年 更 改 為 18 個 月 ) 便 會 增 加 一 倍, 效 能 也 將 提 升 一 倍, 也 揭 示 了 資 訊 科 技 進 步 的 速 度? (A) 英 特 爾 (Intel) 公 司 創 始 人 戈 登. 摩 爾 (Gordon Moore) (B) 微 軟 (Microsoft)

More information

untitled

untitled 說 參 例 邏 邏 1. 說 2. 數 數 3. 8 4. 理念 李 龍老 立 1. 理 料 2. 理 料 3. 數 料 4. 流 邏 念 5. 良 6. 讀 行 行 7. 行 例 來 邏 1. 說 說 識 量 2. 說 理 類 3. 數 數 念 4. 令 5. 良 6. 流 邏 念 7. 說 邏 理 力 1. 2. 3. 4. 5. 列 念 1 參 1. ( Visual Basic 例 ) (1)

More information

untitled

untitled 21 Visual FoxPro Visual FoxPro 6.0 11 Visual FoxPro Visual FoxPro CIP Visual FoxPro 2004 21 ISBN 7-03-014834-7 V Visual FoxPro TP311.138 CIP 2004 143035 16 100717 http://www.sciencep.com * 2004 12 7871092

More information

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech - OfficeCoder 1 2 3 4 1,2,3,4 xingjiarong@mail.sdu.edu.cn 1 xuchongyang@mail.sdu.edu.cn 2 sun.mc@outlook.com 3 luoyuanhang@mail.sdu.edu.cn 4 Abstract. Microsoft Word 2013 Word 2013 Office Keywords:,, HTML5,

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

内容简介本书是与 Visual Basic 程序设计教程 相配套的实践教程 本书包括了与主教材各章节内容对应的上机实践及自测习题 上机实践部分内容丰富, 步骤清晰, 注重基本知识与实际案例相结合, 可操作性强 自测习题部分知识涵盖范围广, 有助于学生对知识理解和掌握 本书可作为高等院校非计算机专业学

内容简介本书是与 Visual Basic 程序设计教程 相配套的实践教程 本书包括了与主教材各章节内容对应的上机实践及自测习题 上机实践部分内容丰富, 步骤清晰, 注重基本知识与实际案例相结合, 可操作性强 自测习题部分知识涵盖范围广, 有助于学生对知识理解和掌握 本书可作为高等院校非计算机专业学 普通高等教育 十二五 重点规划教材计算机基础教育系列 中国科学院教材建设专家委员会 十二五 规划教材 Visual Basic 程序设计实践教程 肖峰季晓玉主编 科学出版社职教技术出版中心 www.aboo 北 京 内容简介本书是与 Visual Basic 程序设计教程 相配套的实践教程 本书包括了与主教材各章节内容对应的上机实践及自测习题 上机实践部分内容丰富, 步骤清晰, 注重基本知识与实际案例相结合,

More information

3 Driver do Microsoft Access (*.mdb) hisdata IFIX 1.4

3 Driver do Microsoft Access (*.mdb) hisdata IFIX 1.4 IFix3.5 ACCESS ACCESS hisdata D:\Dynamics\SampleSystem\HistoricalData ODBC DSN hisdata 1 ODBC 1.1 2 1.2 3 Driver do Microsoft Access (*.mdb) 1.3 4 hisdata IFIX 1.4 1.4 5 Access 1.5 6 ODBC ifix3.5 1.6 1.6

More information

PowerPoint Presentation

PowerPoint Presentation Visual Basic 2005 學 習 範 本 第 7 章 陣 列 的 活 用 7-1 陣 列 當 我 們 需 要 處 理 資 料 時, 都 使 用 變 數 來 存 放 資 料 因 為 一 個 變 數 只 能 代 表 一 個 資 料, 若 需 要 處 理 100 位 同 學 的 成 績 時, 便 要 使 用 100 個 不 同 的 變 數 名 稱, 這 不 但 會 增 加 變 數 名 稱 命 名

More information

高 职 计 算 机 类 优 秀 教 材 书 目 * 序 号 书 号 (ISBN) 书 名 作 者 定 价 出 版 / 印 刷 日 期 ** 配 套 资 源 页 码 计 算 机 基 础 课 1 978-7-111-30658-0 计 算 机 应 用 基 础 刘 升 贵 29.00 2012 年 8 月

高 职 计 算 机 类 优 秀 教 材 书 目 * 序 号 书 号 (ISBN) 书 名 作 者 定 价 出 版 / 印 刷 日 期 ** 配 套 资 源 页 码 计 算 机 基 础 课 1 978-7-111-30658-0 计 算 机 应 用 基 础 刘 升 贵 29.00 2012 年 8 月 高 职 计 算 机 类 优 秀 教 材 书 目 * 序 号 书 号 (ISBN) 书 名 作 者 定 价 出 版 / 印 刷 日 期 ** 配 套 资 源 页 码 计 算 机 基 础 课 1 978-7-111-30658-0 计 算 机 应 用 基 础 刘 升 贵 29.00 2012 年 8 月 电 子 教 案 P1 2 978-7-111-27081-2 计 算 机 应 用 基 础 ( 第 2

More information

Microsoft Word - 扉页.doc

Microsoft Word - 扉页.doc 21 世纪全国应用型本科计算机系列实用规划教材 Visual Basic 程序设计 主编闵联营董华松副主编任占营刘全参编张惠宋雅娟李艳勤黄源李会芳 Dreamweaver MX 2004 内容简介 Visual Basic 作为程序设计的入门语言, 具有易学易懂的特点 Windows 是当今主流操作系统, 而 Visual Basic 作为一种支持可视化程序设计的语言, 也是开发 Windows 应用程序最简单易学的语言之一

More information

4. 有程序代码如下 : Text!' Text= "Visual Basic" 则 Te xtl ~ Te xt, 和 " V i s ua l Basi c " 分别代表 ( ) A. 对象, 值, 属性 B. 对象, 方法, 属性 C. 对象, 属性, 值专 D. 属性, 对象, 值 5. 要

4. 有程序代码如下 : Text!' Text= Visual Basic 则 Te xtl ~ Te xt, 和  V i s ua l Basi c  分别代表 ( ) A. 对象, 值, 属性 B. 对象, 方法, 属性 C. 对象, 属性, 值专 D. 属性, 对象, 值 5. 要 试卷代号 : 2 2 3 1 中央广播电视大学 2 0 1 3-20 1 4 学年度第一学期 " 开放专科 " 期末考试 Visual Basic 程序设计 试题 2014 年 1 月 注意事项 一 将你的学号 姓名及分校 { 工作站 } 名称填写在答题纸的规定栏内 考试结束后, 把试卷和答题纸放在桌上 试卷和答题纸均不得带出考场 监考人收完考卷和答题纸后才可离开考场 二 仔细读懂题目的说明, 并按题目要求答题

More information

X713_CS_Book.book

X713_CS_Book.book / / /USB ) ; ; C D ; ; B B 1 >> 2 3 B 1 ( > > ) 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 GSM GPS ( ) 手机已连接到 GSM 网络 指示条越多, 接收质量越好 GPS 2 ...........................4.............................. 4 Micro SD (

More information

ThreeDtunnel.doc

ThreeDtunnel.doc (12) 1 1. Visual Basic Private Sub LoadDatabase() Dim strip As String Dim straccount As String Dim strpassword As String Dim strdatabase As String Dim strtable As String Dim strsql As String Dim strtemp1

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1 Chapter 01 Photoshop CS6 的基本操作 本章内容 1.1 Photoshop 的应用领域 1.6 控制面板的显示与隐藏 1.2 位图和矢量图的特性 1.7 新建 打开与保存文件 1.3 像素和分辨率的关系 1.8 图像的缩放 1.4 色彩模式 1.9 屏幕显示模式 1.5 Photoshop CS6 界面 1.10 计算机图形图像常用的色彩模式 Photoshop CS6 艺术设计案例教程

More information

水晶分析师

水晶分析师 大数据时代的挑战 产品定位 体系架构 功能特点 大数据处理平台 行业大数据应用 IT 基础设施 数据源 Hadoop Yarn 终端 统一管理和监控中心(Deploy,Configure,monitor,Manage) Master Servers TRS CRYSTAL MPP Flat Files Applications&DBs ETL&DI Products 技术指标 1 TRS

More information

TC35短信发送程序设计

TC35短信发送程序设计 http://www.dragonsoft.net.cn/down/project/tc35_sms.rar TC35 AT /down/book/tc35_at.pdf TC35/TC35i GSM Modem TC35 GSM POS COM SIM DOWN COM E, vbcr AT VB6.0 1)C# http://www.yesky.com/softchannel/72342380468109312/20040523/1800310.shtml,

More information

SMM667.mps

SMM667.mps 第 章 设 计 简 单 程 序 本 章 是 学 习 VB 程 序 设 计 的 入 门 篇, 其 中 涉 及 的 几 个 常 用 控 件 和 基 本 语 句 是 后 续 章 节 中 反 复 使 用 的 基 础 内 容 学 习 目 标 瞯 了 解 顺 序 程 序 结 构 瞯 熟 悉 用 户 界 面 的 设 计 和 简 单 代 码 设 计 瞯 掌 握 赋 值 语 句 和 InputBox MsgBox Print

More information

序 软 件 工 程 思 想 林 锐 序 软 件 工 程 思 想 讲 述 软 件 开 发 和 做 程 序 员 的 道 理, 视 野 独 特, 构 思 新 颖, 内 容 风 趣, 不 落 窠 臼, 令 人 耳 目 一 新 堪 称 难 得, 以 至 回 味 无 穷 作 者 从 事 了 八 年 的 软 件 开 发 工 作, 在 他 的 博 士 学 位 论 文 完 成 之 际 写 下 了 这 本 心 之 所 感

More information

多層次傳銷與獎金系統

多層次傳銷與獎金系統 醒 吾 技 術 學 院 資 訊 管 理 系 ( 五 專 部 ) 九 十 六 學 年 度 畢 業 專 題 多 層 次 傳 銷 與 獎 金 系 統 組 員 : 921506122 游 濬 瑋 921506126 陳 彥 宇 921506139 林 龍 華 921506144 陳 昶 志 921506149 楊 璧 如 指 導 老 師 : 汪 淵 老 師 中 華 民 國 九 十 七 年 一 月 十 一 醒

More information

"Hi" "Visual Basic 6.0" ""( 空字符串 ) 3. 货币 (Currency) 第 3 章数据类型及其运算 35 货币数据类型是为计算货币而设置的数据类型 在内存中用 8 个字节 (64 位 ) 存储, 精 确到小数点后 4 位 ( 小数点前 15 位 ), 在小数点后第 4

Hi Visual Basic 6.0 ( 空字符串 ) 3. 货币 (Currency) 第 3 章数据类型及其运算 35 货币数据类型是为计算货币而设置的数据类型 在内存中用 8 个字节 (64 位 ) 存储, 精 确到小数点后 4 位 ( 小数点前 15 位 ), 在小数点后第 4 第 3 章数据类型及其运算 本章主要介绍构成 Visual Basic 应用程序的基本元素, 包括数据类型 常量 变量 内部 函数 运算符和表达式等 3.1 数据类型 在各种程序设计语言中, 数据类型的规定和处理方法是各不相同的 VB 不但提供了丰富的标准数据类型, 还可以有用户自定义所需的数据类型 基本数据类型主要有数值型和字符串型, 此外还提供了字节 货币 对象 日期 布尔和变体数据类型 基本数据类型

More information

工程项目进度管理 西北工业大学管理学院 黄柯鑫博士 甘特图 A B C D E F G 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 甘特图的优点 : 直观明了 ( 图形化概要 ); 简单易懂 ( 易于理解 ); 应用广泛 ( 技术通用 ) 甘特图的缺点 : 不能清晰表示活动间的逻辑关系 WBS 责任分配矩阵 ( 负责〇审批

More information

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作 * 夏传玲 : 本文简要回顾了国内外定性研究在最近 多年的发展概况, 总结 了定性研究的六个发展趋势和分析策略上的三种流派 在上述两种背景下, 本文探讨了计算机辅助的定性分析给定性研究带来的机遇和挑战, 特别是它和手工操作对比时的优势和劣势, 以及应用这种定性分析技术所可能面临的困难 : 定性研究定性分析 文化差异,, (, ),,,, ( - ) ( - ) ( - ) ( - ) ( - ) (

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

2010年3月计算机等级考试四级网络工程师笔试

2010年3月计算机等级考试四级网络工程师笔试 计 算 机 二 级 VB 经 典 预 测 题 下 列 各 题 A) B) C) D) 四 个 选 项 中, 只 有 一 个 选 项 是 正 确 的 请 将 正 确 选 项 填 涂 在 答 题 卡 相 应 位 置 上, 答 在 试 卷 上 不 得 分 (1) 下 列 叙 述 中 正 确 的 是 ( ) A) 循 环 队 列 是 队 列 的 一 种 链 式 存 储 结 构 B) 循 环 队 列 是 队

More information

2017創形パンフ表1_表4

2017創形パンフ表1_表4 2017 SCHOOL GUIDE BOOK 2017 SOKEI ACADEMY OF FINE ART & DESIGN 关于创形美术学校? 创形美术学校是培育专业艺术家的摇篮 大家知道 : 用普通的教育课程来培育专业的艺术家是件困难的事 在我们创形, 从老师到办公人员, 大家全体都是专业的艺术家 在美术界, 设计界当中取得卓越成绩的艺术家们将为大家面对面地传授心得 我们重视的并不是通过指定的教学说明书来指导大家,

More information

劳动保护与医疗保健 第 二 章 止标志共 23 个 劳 动 安 全 技 术 22 2 警告标志 由于三角形引人注目 故用作 警告 标志 警告人们注意可能发生的多种危险 三角的背景使用黄色 三角图形和三角内的图像均用黑色描 绘 黄色是有警告含义的颜色 在对比色黑色的衬托下 绘成的 警告标志 就更引人注目 3 指令标志 在圆形内配上指令含义的颜色 蓝 色 并用白色绘制必须执行的图形符号 构成 指令标志

More information

长 安 大 学 硕 士 学 位 论 文 基 于 数 据 仓 库 和 数 据 挖 掘 的 行 为 分 析 研 究 姓 名 : 杨 雅 薇 申 请 学 位 级 别 : 硕 士 专 业 : 计 算 机 软 件 与 理 论 指 导 教 师 : 张 卫 钢 20100530 长安大学硕士学位论文 3 1 3系统架构设计 行为分析数据仓库的应用模型由四部分组成 如图3 3所示

More information

Microsoft Word - QTP测试Flex.doc

Microsoft Word - QTP测试Flex.doc TIB 自动化测试工作室 http://www.cnblogs.com/testware 使用 QTP 进行 Flex 自动化测试 自动化测试工具与 Flex 应用程序之间是通过代理 (Agent) 来交互的, 如图所示 : 这也就是为什么后面在使用 QTP 进行 Flex 自动化测试之前要先安装 Flex 插件 配置和编译 Flex 程序的原因 前提条件 在使用 QTP 进行 Flex 4 的测试之前,

More information

? (1) (2) (3) (IS) IS 650 信息技术教程 ( 第 7 版 )

? (1) (2) (3) (IS) IS 650 信息技术教程 ( 第 7 版 ) 第 章系统分析和编程 10.1 6 6 10.2 5 5 10.3? 10.4? 10.5 OOP? 10.6? Tandem DMV IBM Tandem 3000 Tandem 60 DMV IBM Tandem DMV IBM 10 4400 10.1 6 6? ? 10.1.1 10.1.2 3 3 (1) (2) (3) (IS) IS 650 信息技术教程 ( 第 7 版 ) CART

More information

数据结构

数据结构 信息管理与信息系统专业 第 3 章变量与表达式 任课教师 : 吕雅丽 本章内容 3.1 C# 基本数据类型 3.2 常量与变量 3.3 创建并使用枚举类型 3.4 运算符与表达式类型 3.5 运算符的优先级与结合性 2 3.1 C# 基本数据类型 3.1.1 数值类型 1. 整数类型 整数类型又有有符号整数与无符号整数 有符号整数可以带正负号, 无符号整数不需带正负号, 默认为正数 有符号整数包括

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

旅游科学

旅游科学 旅 游 科 学 王春雷 会展专业人才培养模式是一个院校对于会展办学的整体设计 因而需要进行系统性的构建 但目前这方面的研究成果不多 更缺乏实证性的研究 本 文基于文献综述的发现和会展专业的特点 从理论上构建了一个项目驱动型会展 专业人才培养模式的基本框架 进而以上海师范大学会展经济与管理专业为例 侧重从教育理念 培养目标 培养过程 培养制度和培养评价等方面进行了实证研究 项目驱动型 会展专业 人才培养模式

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

没有幻灯片标题

没有幻灯片标题 第 2 章 C 语言的基本数据类型与表达 式 2. 1 C 语言的语法基础 2. 2 C 语言的基本数据类型 2. 3 常量和变量 2. 4 运算符与表达式 2. 5 数据类型转换 用 第 2 章 C 语言的基本数据类型与表达 2.1 C 语言的语法基础 2. 1. 1 C 语言字符集 式 C 语言的基本符号可分 4 个类, 归纳如下 : (1) 英文字母 : 大小写各 26 个, 共计 52 个

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

<443A5CD3AACFFACEC4BCFE5CCDBCCAE9D0C5CFA25C2B2B2BCEB4CCE1BDBB5C D385C E4E4554B3CCD0F2C9E8BCC6CAB5D1B5BDCCB3CC5C574A30312E646F63>

<443A5CD3AACFFACEC4BCFE5CCDBCCAE9D0C5CFA25C2B2B2BCEB4CCE1BDBB5C D385C E4E4554B3CCD0F2C9E8BCC6CAB5D1B5BDCCB3CC5C574A30312E646F63> 第 1 章 本章将介绍 VB.NET 语言的相关概念, 包括 VB.NET 的发展历程,VB.NET 的特点, VB.NET 集成开发环境的搭建, 使读者对 Visual Studio 2013 和 SQL Server 2005 的安装有宏观的认识和了解 ; 最后通过一个简单的例题使读者对 VB.NET 语法和应用程序的创建有一个感性的认识 1.1 VB.NET 语言简介 VB.NET 是计算机中实现网络功能的一种编程语言,

More information

Microsoft Word - 第5章.doc

Microsoft Word - 第5章.doc 过程和函数就是在程序中可以被重复使用的代码 当应用程序比较复杂时, 开发人员可能需要在程序中多处使用相同的代码 在 Visual Basic 应用程序开发中, 重要任务之一就是创建可重复使用的代码 通过学习本章, 读者可以熟练掌握过程和函数的定义及使用方法 5.1 过程 过程就是在应用程序可以被多次重复使用的代码段 使用过程具有以下优点 : 复杂任务分解成多个简单代码段 ; 易于读写, 具有较强的可读性和可维护性

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

Microsoft PowerPoint - 面向对象编程若干思考.ppt [兼容模式]

Microsoft PowerPoint - 面向对象编程若干思考.ppt [兼容模式] 面向对象编程若干思考 面向对象编程教学中重点与难点 黎升洪 2011.01 面向对象的系统观 基于面向对象的系统观认为, 一个系统是由若干对象和这些对象间的交互构造而成 面向对象系统观反映了基于面向对象的方法如何构造软件系统 OO 教学中的问题 对象非常多每个对象 属性非常多方法 ( 事件 ) 非常多 容易迷失在细节中 只见树木, 不见森林 面向对象编程分层 初级阶段 中级阶段 高级阶段 (1) 初级阶段

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 第 5 章循环结构程序设计 一 实验目的 (1) 掌握 For 语句的使用 (2) 掌握 Do While/Until Loop 与 Do Loop While/Until 两种循环语句的使用 (3) 加深理解循环的概念, 掌握循环的规则及其执行过程 (4) 掌握多重循环的规则和程序设计方法 (5) 学会如何控制循环条件, 防止死循环或不循环 二 相关知识在指定条件下多次重复执行一组相同的语句可以通过循环来实现

More information

专注于做最好的嵌入式计算机系统供应商

专注于做最好的嵌入式计算机系统供应商 专注于做最好的嵌入式计算机系统供应商 基于 ARMSYS2440/2410 开发应用程序 (EVC&VS2005) Rev 1.0 2008 年 3 月 24 日 杭州立宇泰电子有限公司 HangZhou LiYuTai Elec.Co.,Ltd 开发应用程序的过程一般分两步, 第一步在 PC 机开发环境下设计和编译应用程序, 第二步将它下载到 目标系统, 也就是我们的 ARMSYS2440 平台上运行

More information

01

01 ZEBRA 技术白皮书 条码编码 101 相关知识介绍 引言 20 70 数据 80 20 90 (JIT) AIAG EIA HIBCC HAZMAT 条码的优势提高数据准确性 99% 85% / / 提升效率 / 2 Zebra Technologies 保持一致性 ID 改进库存和资产管理 成本 / 效益分析 ID ID ID (ERP) RFID Zebra Technologies 3 ID

More information

幻灯片 1

幻灯片 1 第一类换元法 ( 凑微分法 ) 学习指导 复习 : 凑微分 部分常用的凑微分 : () n d d( (4) d d( ); (5) d d(ln ); n n (6) e d d( e ); () d d( b); ); () d d( ); (7) sin d d (cos ) 常见凑微分公式 ); ( ) ( ) ( b d b f d b f ); ( ) ( ) ( n n n n d f

More information

RUN_PC連載_10_.doc

RUN_PC連載_10_.doc PowerBuilder 8 (10) Jaguar CTS ASP Jaguar CTS PowerDynamo Jaguar CTS Microsoft ASP (Active Server Pages) ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar Server ASP

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 描述 JSP 表达式语言的语法 认识使用 JSP 表达式的优点 在 JSP 中使用表达式语言 表达式语言简介 5 1 EL 为表达式语言 由两个组开发 JSP 标准标签库专家组 JSP 2.0 专家组 JSP 表达式语言的语法 ${EL Expression} JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 表达式语言简介

More information

重勘信息的哲学含义 ¼ ½ ¾ ¼ ½ ¾

重勘信息的哲学含义 ¼ ½ ¾ ¼ ½ ¾ 重勘信息的哲学含义 肖 峰 信息不能以任何方式归结为物质 它既不是物质内在既成的东西 也不是纯粹的自然现象 更不是可以离开主体而独立存在的纯客观现象或无处不在的普遍现象 哲学含义上的信息是一种非物质的存在 是主体对对象的感知 辨识和建构 也是生命控制系统尤其是神经系统的一种机能 信息与 意义 关联 是一种属人的认识现象 不存在所谓的 本体论信息 而只存在认识论意义上的信息 信息的哲学含义应与信息的日常用法具有连续性

More information

第13章 SQL Server提供的应用程序接口

第13章 SQL Server提供的应用程序接口 第 13 部分 SQL Server 提供的应用程序接口 学习要点 : 通过 ODBC 连接 SQL Server 通过 ADO 对象连接 SQL Server 通过 JDBC 连接 SQL Server 13.1 ODBC 与 SQL Server 13.1.1 ODBC 的概述 开放式数据库连接 (Open Database Connectivity, ODBC) 是数据库服务器的一个标准协议,

More information

CH01.indd

CH01.indd 3D ios Android Windows 10 App Apple icloud Google Wi-Fi 4G 1 ( 3D ) 2 3 4 5 CPU / / 2 6 App UNIX OS X Windows Linux (ios Android Windows 8/8.1/10 BlackBerry OS) 7 ( ZigBee UWB) (IEEE 802.11/a/b/g/n/ad/ac

More information

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

More information

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63> 基于 WINCE 平台 C# 编程要点之一 本文主要介绍在基于 Windows CE 平台的英创嵌入式主板下进行 C#(Microsoft Visual Stdio.Net 2005) 应用程序开发时会常常用到的一些功能函数以及开发方法, 这些方法适用于英创采用 WinCE 平台的所有型号嵌入式主板, 包括 EM9000 EM9260 EM9160 等 本文要点包括 : 文件的删除和复制 如何获取存取设备的空间大小

More information

epub 61-2

epub 61-2 2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +

More information

5. 要在窗体上显示 " 欢迎您! ", 使用的语句是 ( ) A.Form.caption=" 欢迎您! " C. Form1. print" 欢迎合! " B. Forml. caption= " 欢迎您!" D.Form.print " 欢迎您!" 6. 关于语句行, 下列说法正确的是 ( A

5. 要在窗体上显示  欢迎您! , 使用的语句是 ( ) A.Form.caption= 欢迎您!  C. Form1. print 欢迎合!  B. Forml. caption=  欢迎您! D.Form.print  欢迎您! 6. 关于语句行, 下列说法正确的是 ( A 试卷代号 : 2 2 3 1 中央广播电视大学 2 0 11 2012 学年度第二学期 " 开放专科 " 期末考试 Visual Basic 程序设计 试题 2012 年 7 月 注意事项 一 将你的学号 姓名及分校 { 工作站 ) 名称填写在答题纸的规定栏内 考试 结束后, 把试卷和答题纸放在桌上 试卷和答题纸均不得带出考场 监考人收完 考卷和答题纸后才可离开考场 二 仔细读懂题目的说明, 并按题目要求答题

More information

Linux服务器构建与运维管理

Linux服务器构建与运维管理 1 Linux 服务器构建与运维管理 第 2 章 :Linux 基本命令 阮晓龙 13938213680 / rxl@hactcm.edu.cn http://linux.xg.hactcm.edu.cn http://www.51xueweb.cn 河南中医药大学管理科学与工程学科 2018.3 2 提纲 目录与文件的操作 mkdir touch mv cp rm rmdir file tree

More information

TD

TD *TD-000212-05* 20- 应用实例 4 本例显示的是使用两个亚低 音扬声器和多个顶箱的双声 道 立体声 设置 除了各声道都增加了一个顶 箱外 也可以增加更多的顶 箱 本例和例 3 的情况一 致 声道 2 或 右声道 声道 1 或 左声道 要接到更多的顶箱 将最后 一个顶箱的全幅线路输出接 头处的线缆接到下一个顶箱 的全幅线路输入接头 在不 降低信号质量的情况下 最

More information

第三节 软件测试的过程与策略

第三节 软件测试的过程与策略 ...1...4...9...17...25...29...34...40...46...55...65...73 1 2 3 4 5 6 7 8 9 10 11 1 12 13 1 ABCD 2 A B C D 3 ABCD 4 A1/2 B1/3 C1/4 D2/3 5 % A20 B30 C40 D50 6 A B C D 7 A B C D / 8 A B C D 9 A B C D 10

More information

Microsoft Word - 102119003.htm

Microsoft Word - 102119003.htm 102 年 度 11900 電 腦 軟 體 設 計 丙 級 技 術 士 技 能 檢 定 學 科 測 試 試 題 本 試 卷 有 選 擇 題 80 題, 每 題 1.25 分, 皆 為 單 選 選 擇 題, 測 試 時 間 為 100 分 鐘, 請 在 答 案 卡 上 作 答, 答 錯 不 倒 扣 ; 未 作 答 者, 不 予 計 分 准 考 證 號 碼 : 姓 名 : 選 擇 題 : 1. (4)

More information

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab 第 1 章 C 语言基础与顺序结构 学习目标 1. 掌握 C 语言程序的结构 2. 合理选用数据类型 3. 掌握算术运算符和赋值运算符 4. 掌握控制数据的输入 输出方法 5. 掌握顺序结构以及顺序结构的流程 6. 掌握 Visual C++ 6.0 集成环境的使用方法 7. 掌握转换大小写字母的方法 8. 掌握产生随机整数的方法 计算机由硬件系统和软件系统组成, 其中硬件是物质基础, 而软件是计算机的灵魂

More information

4.C ( 详细解析见视频课程 绝对值 01 约 21 分 15 秒处 ) 5.E ( 详细解析见视频课程 绝对值 01 约 32 分 05 秒处 ) 6.D ( 详细解析见视频课程 绝对值 02 约 4 分 28 秒处 ) 7.C ( 详细解析见视频课程 绝对值 02 约 14 分 05 秒处 )

4.C ( 详细解析见视频课程 绝对值 01 约 21 分 15 秒处 ) 5.E ( 详细解析见视频课程 绝对值 01 约 32 分 05 秒处 ) 6.D ( 详细解析见视频课程 绝对值 02 约 4 分 28 秒处 ) 7.C ( 详细解析见视频课程 绝对值 02 约 14 分 05 秒处 ) [ 说明 ] 1. 以下所指教材是指朱杰老师的 管理类联考综合能力数学套路化攻略 2. 该文档中所标答案和参见的教材答案, 与视频有冲突的, 以视频答案为准! 基础篇 第 1 章 数 1.2.1 整数例题答案 : 1. A ( 详细解析见教材 P7 例 2) 2. D ( 详细解析见视频课程 数的性质 约 10 分 53 秒处 ) 3. C ( 详细解析见教材 P7 例 3) 4.E ( 详细解析见视频课程

More information

第8章 JavaScript对象层次与事件处理

第8章  JavaScript对象层次与事件处理 第 8 章 JavaScript 对象层次与事件处理 JavaScript 是一种面向对象的语言, 在 JavaScript 中的对象都是有层次的, 在本章里将会介绍 JavaScript 的对象层次和 JavaScript 的事件处理方式 8.1 JavaScript 的对象层次 JavaScript 中的对象很多, 这些对象并不都是独立存在的, 而是有着层次结构 对象可以依照层次来进行调用 8.1.1

More information

科学计算的语言-FORTRAN95

科学计算的语言-FORTRAN95 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

序号

序号 简 介 创 立 于 1984 年 5 月, 植 根 于 闻 名 遐 尔 的 高 等 学 府, 得 古 越 文 化 悠 久 历 史 之 厚 蕴, 承 浙 大 几 代 学 人 求 是 创 新 之 精 神, 通 过 28 年 发 展, 已 成 长 为 一 个 具 有 图 书 期 刊 数 字 电 子 音 像 的 全 方 位 立 体 化 出 版 功 能 的, 集 理 工 农 医 和 人 文 社 科 多 学 科

More information