Microsoft Word - 扉页.doc



Similar documents
说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基


评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

I


《C语言基础入门》课程教学大纲

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和


0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

修改版-操作手册.doc

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

课程类 别

中 中 中 中 部 中 岗 位 条 件 历 其 它 历 史 师 地 理 师 生 物 师 体 与 健 康 师 从 事 中 历 史 工 从 事 中 地 理 工 从 事 中 生 物 工 从 事 中 体 与 健 康 工 2. 课 程 与 论 ( 历 史 ); 2. 科 ( 历 史 )

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

Microsoft Word - 文件汇编.doc

深圳市新亚电子制程股份有限公司

2006年顺德区高中阶段学校招生录取分数线

一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决

一 从 分 封 制 到 郡 县 制 一 从 打 虎 亭 汉 墓 说 起

第 一 批 本 科 文 科 代 码 学 校 投 档 线 校 线 差 最 低 排 位 投 档 线 校 线 差 最 低 排 位 投 档 线 校 线 差 最 低 排 位 控 制 分 数 线 北 京 大 学

Microsoft Word - 第3章.doc

中 国 软 科 学 年 第 期!!!


2014年中央财经大学研究生招生录取工作简报

新, 各 地 各 部 门 ( 单 位 ) 各 文 化 事 业 单 位 要 高 度 重 视, 切 实 加 强 领 导, 精 心 组 织 实 施 要 根 据 事 业 单 位 岗 位 设 置 管 理 的 规 定 和 要 求, 在 深 入 调 查 研 究 广 泛 听 取 意 见 的 基 础 上, 研 究 提

21 业 余 制 -- 高 起 专 (12 级 ) 75 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 江 西 化 校 工 科 22 业 余 制 -- 高 起 专 (12 级 ) 70 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 吉

<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

收 入 支 出 项 目 2016 年 预 算 项 目 2016 年 预 算 预 算 01 表 单 位 : 万 元 ( 保 留 两 位 小 数 ) 一 公 共 财 政 预 算 拨 款 一 人 员 经 费 一 般 财 力 人 员 支 出 成 品

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

简 报 要 点 ESI 共 有 22 个 学 科 门 类, 江 苏 高 校 目 前 只 有 16 个 学 科 门 类 进 入 了 世 界 1%, 分 别 是 一 般 社 会 科 学 临 床 医 学 农 业 科 学 分 子 生 物 学 和 遗 传 学 动 植 物 科 学 化 学 地 球 科 学 工 程

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

伊 犁 师 范 学 院 611 语 言 学 概 论 全 套 考 研 资 料 <2016 年 最 新 考 研 资 料 > 2-2 语 言 学 纲 要 笔 记, 由 考 取 本 校 本 专 业 高 分 研 究 生 总 结 而 来, 重 点 突 出, 借 助 此 笔 记 可 以 大 大 提 高 复 习 效

学 年 第 二 学 期 集 中 考 试 安 排 (18 周 ) 考 试 日 期 :6 月 27 日 星 期 一 8:10-9:50 第 二 公 共 教 学 楼 A 区 A 高 等 数 学 ( 理 二 2) 复 材 材 料 科 学 与 工 程

一 开 放 性 的 政 策 与 法 规 二 两 岸 共 同 的 文 化 传 承 三 两 岸 高 校 各 自 具 有 专 业 优 势 远 见 杂 志 年 月 日

浙 江 海 洋 学 院 417 普 通 生 态 学 与 鱼 类 学 全 套 考 研 资 料 <2016 年 最 新 考 研 资 料 > 2-2 基 础 生 态 学 笔 记, 此 笔 记 为 高 分 研 究 生 复 习 所 用, 借 助 此 笔 记 可 以 大 大 提 高 复 习 效 率, 把 握 报

珠江钢琴股东大会

资 料 来 源 延 边 中 级 人 民 法 院 小 野 和 子 指 出 年 实 施 婚 姻 法 后 的 年 间 中 国 有 万 人 因 婚 姻 问 题 自 杀 或 被 杀 离 婚 自 由 对 社 会 和 家 庭 稳 定 带 来 了 很 大 的 影 响 因 婚 姻 问 题 刑 事 案 件 频 发 已

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

随着执业中医师资格考试制度的不断完善,本着为我校中医学专业认证服务的目的,本文通过对我校中医类毕业生参加2012年和2013年的中医执业医师考试成绩及通过率、掌握率进行分析,并与全国的平均水平进行差异比较分析,以此了解我校执业中医师考试的现状,进而反映我校中医类课程总体教学水平,发现考核知识模块教学中存在的不足,反馈给相关学院和教学管理部门,以此提高教学和管理水平。

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

公 开 刊 物 须 有 国 内 统 一 刊 (CN), 发 表 文 章 的 刊 物 需 要 在 国 家 新 闻 出 版 广 电 总 局 ( 办 事 服 务 便 民 查 询 新 闻 出 版 机 构 查 询 ) 上 能 够 查 到 刊 凡 在 有 中 国 标 准 书 公 开

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审

抗 日 战 争 研 究! 年 第 期 # # # # #!!!!!!!! #!!

世华财讯模拟操作手册

 编号:

ETF、分级基金规模、份额变化统计

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

教师上报成绩流程图

内外网.frx


内外网.frx

抗 日 战 争 研 究 年 第 期

工 程 勘 察 资 质 标 准 根 据 建 设 工 程 勘 察 设 计 管 理 条 例 和 建 设 工 程 勘 察 设 计 资 质 管 理 规 定, 制 定 本 标 准 一 总 则 ( 一 ) 本 标 准 包 括 工 程 勘 察 相 应 专 业 类 型 主 要 专 业 技 术 人 员 配 备 技 术

002 电 子 科 学 与 工 程 学 院 拟 招 生 150 人 联 系 人 : 周 老 师, 电 话 物 理 电 子 学 电 路 分 析 电 磁 场 理 论 01 电 磁 物 理 与 微 波 电 子 学 02 光 子 学 与 光 电 技 术 03 微 纳

Microsoft Word - 第7章 图表反转形态.doc

untitled

第1篇 道路桥梁工程技术核心专业课程标准及学习绩效考评体系

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

<4D F736F F D2033D4C2C6DAD4D3D6BEA3A8B6A8B8E5CEC4BCFEA3A92E646F63>

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

一、中央新闻单位驻地方机构批复保留名单 (一)保留的报纸驻地方机构名单

市 水 务 局 ( 海 洋 局 ) 上 海 市 水 务 局 ( 上 海 市 海 洋 局 ) 市 水 务 局 ( 海 洋 局 ) 上 海 市 水 务 局 ( 上 海 市 海 洋 局 ) 市 文 广 影 视 局 文 物 保 护 管 理

定 位 和 描 述 : 程 序 设 计 / 办 公 软 件 高 级 应 用 级 考 核 内 容 包 括 计 算 机 语 言 与 基 础 程 序 设 计 能 力, 要 求 参 试 者 掌 握 一 门 计 算 机 语 言, 可 选 类 别 有 高 级 语 言 程 序 设 计 类 数 据 库 编 程 类

第 期 王 日 根 徐 士 林 与 清 初 福 建 汀 漳 道 的 社 会 治 理

江 苏 瑞 峰 建 设 集 团 有 限 公 有 限 公 江 苏 鲁 工 建 设 工 程 有 限 公 江 苏 溧 鸿 建 设 有 限 公 江 苏 明 创 科 技 园 发 展 有 限 公 公 公 有 限 公 江 苏 茂 盛 建 设 有 限 公 江 苏 鼎 洪 建 工 有 限 公 富 强 机 电 安 装

境 外 上 市 外 资 股 股 东 持 有 股 份 总 数 (H 股 ) 489,157,907 3 出 席 会 议 的 股 东 所 持 有 表 决 权 股 份 数 占 公 司 有 表 决 权 股 份 总 数 的 其 中 :A 股 股 东 持 股 占 股 份 总 数 的

岗 位 专 业 14 信 息 与 统 计 学 院 专 任 教 师 1 数 学 类 ( 金 融 数 学 研 究 方 向 优 先 ) 1 研 究 生 学 历 博 士 学 位 15 信 息 与 统 计 学 院 专 任 教 师 2 统 计 学 类 16 信 息 与 统 计 学 院 专 任 教 师 3 计 算

郭 双 林 前 后 甲 寅 派 考 & # # # # # # # # # # # # # # # # # # # # ( # # # # # ) ) # # # # # # # # # # # # # # # & 陈 子 展 最 近 三 十 年 中 国 文 学 史 # 上 海 古 籍 出 版 社

物 流 从 业 人 员 职 业 能 力 等 级 证 书 分 为 四 个 级 别, 分 别 为 初 级 助 理 级 中 级 和 高 级 ; 采 购 从 业 人 员 职 业 能 力 等 级 证 书 分 为 三 个 级 别, 分 别 为 中 级 高 级 和 注 册 级 请 各 有 关 单 位 按 照 通


103 历 史 文 化 学 院 沈 艳 历 史 教 学 论 0602 中 国 史 01 历 史 文 献 学 02 专 门 史 03 中 国 古 代 史 04 中 国 近 现 代 史 英 语 历 史 学 基 础 01 历 史 文 献 学 02 中 国

附 件 : 上 海 市 建 筑 施 工 企 业 施 工 现 场 项 目 管 理 机 构 关 键 岗 位 人 员 配 备 指 南 二 一 四 年 九 月 十 一 日 2

全国教师资格认定管理信息系统

附件1:

三门峡市质量技术监督局清单公示

导 数 和 微 分 的 概 念 导 数 的 几 何 意 义 和 物 理 意 义 函 数 的 可 导 性 与 连 续 性 之 间 的 关 系 平 面 曲 线 的 切 线 和 法 线 导 数 和 微 分 的 四 则 运 算 基 本 初 等 函 数 的 导 数 复 合 函 数 反 函 数 隐 函 数 以

市 环 保 局 科 技 标 准 处 市 环 保 局 科 技 标 准 处 市 环 保 局 科 技 标 准 处


三武一宗灭佛研究

GONGZUO JUJIAO 宝 山 区 领 军 人 才 名 单 宝 山 区 第 七 批 拔 尖 人 才 名 单 2

现 场 会 议 时 间 为 :2016 年 5 月 19 日 网 络 投 票 时 间 为 :2016 年 5 月 18 日 年 5 月 19 日 其 中 通 过 深 圳 证 券 交 易 所 交 易 系 统 进 行 网 络 投 票 的 时 间 为 2016 年 5 月 19 日 9:30-

Transcription:

21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 Visual Basic 程 序 设 计 主 编 闵 联 营 董 华 松 副 主 编 任 占 营 刘 全 参 编 张 惠 宋 雅 娟 李 艳 勤 黄 源 李 会 芳 Dreamweaver MX 2004

内 容 简 介 Visual Basic 作 为 程 序 设 计 的 入 门 语 言, 具 有 易 学 易 懂 的 特 点 Windows 是 当 今 主 流 操 作 系 统, 而 Visual Basic 作 为 一 种 支 持 可 视 化 程 序 设 计 的 语 言, 也 是 开 发 Windows 应 用 程 序 最 简 单 易 学 的 语 言 之 一 本 书 是 一 本 全 面 系 统 地 介 绍 Visual Basic 程 序 设 计 的 教 程 全 书 共 分 11 章, 介 绍 了 Visual Basic 程 序 开 发 环 境 数 据 类 型 和 表 达 式 常 用 内 部 函 数 程 序 控 制 结 构 常 用 控 件 数 组 过 程 键 盘 和 鼠 标 事 件 过 程 菜 单 与 对 话 框 程 序 设 计 图 形 程 序 设 计 文 件 处 理 和 数 据 库 程 序 设 计 等 内 容 本 书 在 编 排 上 由 简 及 繁 由 浅 入 深 和 循 序 渐 进, 力 求 通 俗 易 懂 简 捷 实 用 全 书 内 容 全 面, 实 例 丰 富 书 中 所 有 例 题 均 在 Visual Basic 6.0 上 运 行 通 过 本 书 可 以 作 为 高 等 院 校 非 计 算 机 专 业 计 算 机 程 序 设 计 课 程 的 教 材 和 计 算 机 专 业 可 视 化 程 序 设 计 教 材, 也 可 以 作 为 全 国 计 算 机 等 级 考 试 ( 二 级 Visual Basic) 的 培 训 教 材 和 参 考 书, 还 可 供 各 类 程 序 设 计 培 训 班 学 员 和 Visual Basic 语 言 自 学 者 参 考 市 版 权 局 著 作 权 合 同 登 记 号 图 字 :01-2003-8586 号 图 书 在 版 编 目 (CIP) 数 据 Visual Basic 程 序 设 计 / 闵 联 营, 董 华 松 主 编. 北 京 : 北 京 大 学 出 版 社,2006.1 (21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 ) ISBN 7-301-10503-7 Ⅰ.V Ⅱ.1 闵 2 董 Ⅲ. BASIC 语 言 程 序 设 计 高 等 学 校 教 材 Ⅳ. TP312 中 国 版 本 图 书 馆 CIP 数 据 核 字 (2006) 第 003438 号 书 名 :Visual Basic 程 序 设 计 著 作 责 任 者 : 闵 联 营 董 华 松 主 编 责 任 编 辑 : 周 欢 标 准 书 号 :ISBN 7-301-10503-7/TP 0876 出 版 者 : 北 京 大 学 出 版 社 地 址 : 北 京 市 海 淀 区 成 府 路 205 号 100871 网 址 :http://cbs.pku.edu.cn http://www.pup6.com 电 话 : 邮 购 部 62752015 发 行 部 62750672 编 辑 部 62750667 邮 购 部 62752015 电 子 信 箱 :pup_6@163.com 排 版 者 : 北 京 东 方 人 华 北 大 彩 印 中 心 电 话 :62754190 印 刷 者 : 发 行 者 : 北 京 大 学 出 版 社 经 销 者 : 新 华 书 店 787 毫 米 1092 毫 米 16 开 本 16 印 张 384 千 字 2006 年 1 月 第 1 版 2006 年 1 月 第 1 次 印 刷 定 价 :22.00 元

21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 联 合 编 写 学 校 名 单 ( 按 拼 音 顺 序 排 名 ) 1 安 徽 财 经 大 学 2 安 徽 工 业 大 学 3 安 阳 师 范 学 院 4 北 华 大 学 5 北 京 化 工 大 学 6 北 京 建 筑 工 程 学 院 7 北 京 理 工 大 学 8 渤 海 大 学 9 长 春 大 学 10 长 春 工 业 大 学 11 长 春 理 工 大 学 12 长 春 税 务 学 院 13 滁 州 学 院 14 楚 雄 师 范 学 院 15 东 北 电 力 大 学 16 福 建 工 程 学 院 17 福 建 师 范 大 学 18 广 西 财 经 学 院 19 桂 林 工 学 院 20 哈 尔 滨 理 工 大 学 21 海 南 大 学 22 韩 山 师 范 学 院 23 杭 州 师 范 学 院 24 合 肥 工 业 大 学 25 合 肥 学 院 26 河 北 经 贸 大 学 27 河 南 科 技 学 院 28 黑 龙 江 八 一 农 垦 大 学 29 黑 龙 江 科 技 学 院 30 湖 南 大 学 31 湖 北 经 济 学 院 32 孝 感 学 院 33 湖 州 师 范 学 院 34 华 北 科 技 学 院 35 华 南 师 范 大 学 36 华 中 农 业 大 学 37 华 中 师 范 大 学 38 华 北 水 利 水 电 学 院 39 淮 北 煤 炭 师 范 学 院 40 黄 石 理 工 学 院 41 吉 林 农 业 大 学 42 集 美 大 学 43 江 汉 大 学 44 江 苏 科 技 大 学

45 内 蒙 古 大 学 46 南 昌 工 程 学 院 47 南 京 航 空 航 天 大 学 48 南 开 大 学 49 南 阳 理 工 学 院 50 宁 波 工 程 学 院 51 平 顶 山 学 院 52 青 岛 理 工 大 学 53 青 岛 科 技 大 学 54 青 海 民 族 学 院 55 曲 阜 师 范 大 学 56 山 西 大 学 57 山 西 广 播 电 视 大 学 58 陕 西 理 工 学 院 59 上 海 第 二 工 业 大 学 60 上 海 海 事 大 学 61 沈 阳 大 学 62 沈 阳 化 工 学 院 63 石 家 庄 铁 道 学 院 64 苏 州 大 学 65 台 州 学 院 66 太 原 理 工 大 学 67 太 原 师 范 学 院 68 唐 山 师 范 学 院 69 同 济 大 学 70 皖 西 学 院 71 武 汉 大 学 72 武 汉 科 技 学 院 73 武 汉 理 工 大 学 74 武 夷 学 院 75 忻 州 师 范 学 院 76 新 疆 石 油 学 院 77 许 昌 学 院 78 玉 溪 师 范 学 院 79 浙 江 工 业 大 学 之 江 学 院 80 衢 州 广 播 电 视 大 学 81 中 国 农 业 大 学 82 中 国 石 油 大 学

本 系 列 教 材 编 写 目 的 和 教 学 服 务 21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 在 全 国 的 各 位 编 写 老 师 的 共 同 辛 勤 努 力 下, 在 编 委 会 主 任 刘 瑞 挺 教 授 和 其 他 编 审 委 员 会 成 员 的 悉 心 指 导 下, 经 过 北 京 大 学 出 版 社 第 六 事 业 部 各 位 编 辑 的 刻 苦 努 力, 终 于 与 师 生 们 见 面 了 教 材 编 写 目 的 目 前, 我 国 高 等 教 育 正 迎 来 一 个 前 所 未 有 的 发 展 机 遇 期 高 等 教 育 的 发 展 已 进 入 到 一 个 新 的 阶 段 高 等 本 科 院 校 也 逐 渐 演 变 成 研 究 型 学 术 型 和 应 用 型 就 业 型 两 类 作 为 知 识 传 承 载 体 的 教 材, 在 高 等 院 校 的 发 展 过 程 中 起 着 至 关 重 要 的 作 用 但 目 前 教 材 建 设 却 远 远 滞 后 于 应 用 型 人 才 培 养 的 步 伐, 许 多 院 校 一 直 沿 用 偏 重 于 研 究 型 的 教 材, 应 用 型 教 材 比 较 缺 乏, 这 势 必 影 响 应 用 型 人 才 的 培 养 为 顺 应 高 等 教 育 普 及 化 迅 速 发 展 的 趋 势, 配 合 高 等 院 校 的 教 学 改 革 和 教 材 建 设, 坚 持 因 材 施 教 的 教 学 原 则, 注 重 理 论 联 系 实 际, 全 面 促 进 高 等 院 校 教 材 建 设, 进 一 步 提 高 我 国 高 校 教 材 的 质 量, 北 京 大 学 出 版 社 大 力 推 出 高 校 应 用 型 本 科 各 专 业 相 关 教 材 本 系 列 教 材 不 仅 讲 解 基 础 理 论 技 术, 更 突 出 工 程 实 际 应 用, 注 重 技 术 与 应 用 的 结 合 本 套 计 算 机 系 列 教 材 的 编 写 思 想 主 要 如 下 : (1) 要 符 合 学 校 学 科 的 计 算 机 课 程 设 置 要 求 以 高 等 教 育 的 培 养 目 标 为 依 据, 注 重 教 材 的 科 学 性 实 用 性 通 用 性, 尽 量 满 足 同 类 专 业 院 校 的 需 求 (2) 要 定 位 明 确 要 准 确 定 位 教 材 在 人 才 培 养 过 程 中 的 地 位 和 作 用, 正 确 处 理 系 列 教 材 与 系 列 课 程 读 者 层 次 的 关 系, 面 向 就 业, 突 出 应 用 (3) 合 理 选 材 和 编 排 教 材 内 容 应 处 理 好 传 统 内 容 与 现 代 内 容 的 关 系, 大 力 补 充 新 知 识 新 技 术 新 工 艺 新 成 果 根 据 教 学 内 容 学 时 教 学 大 纲 的 要 求, 制 定 模 块 化 编 写 体 例, 突 出 重 点 难 点 (4) 体 现 建 设 立 体 化 精 品 教 材 的 宗 旨 提 倡 为 主 干 课 程 配 套 电 子 教 案 学 习 指 导 习 题 解 答 课 程 设 计 毕 业 设 计 等 教 学 配 套 用 书 教 学 服 务 1. 提 供 教 学 资 源 下 载 本 系 列 大 部 分 教 材 中 涉 及 到 的 实 例 ( 习 题 ) 的 原 始 图 片 和 其 他 素 材 或 者 是 源 代 码 原 始 数 据 等 文 件, 都 可 以 在 相 关 网 站 上 下 载 每 本 教 材 都 配 有 PPT 电 子 教 案, 老 师 可 随 时 在 网 络 上 下 载 并 可 修 改 为 适 合 自 己 教 学 的 PPT 2. 提 供 多 媒 体 课 件 和 教 师 培 训 针 对 某 些 重 点 课 程, 我 们 配 套 有 相 应 的 多 媒 体 课 件, 对 大 批 量 使 用 本 套 教 材 的 学 校, 我 们 会 免 费 提 供 多 媒 体 课 件 另 外, 我 们 还 将 免 费 提 供 教 师 培 训 名 额, 不 定 期 组 织 老 师 进 行 培 训 3. 欢 迎 互 动 欢 迎 使 用 本 系 列 教 材 的 老 师 和 同 学 提 出 意 见 和 建 议, 有 建 设 性 的 将 给 予 奖 励 ; 同 时 有 教 材 或 者 专 著 出 版 要 求 的 老 师, 请 与 我 们 联 系 北 京 大 学 出 版 社 第 六 事 业 部 (http://www.pup6.com)

信 息 技 术 的 应 用 化 教 育 ( 代 丛 书 序 ) 刘 瑞 挺 / 文 北 京 大 学 出 版 社 第 六 事 业 部 组 编 了 一 套 21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 为 了 做 好 这 项 工 作, 他 们 制 订 了 详 细 的 编 写 目 的 丛 书 特 色 内 容 要 求 和 风 格 规 范 在 内 容 上 强 调 面 向 应 用 任 务 驱 动 注 重 实 例 分 析 培 养 能 力 ; 在 风 格 上 力 求 文 字 精 练 脉 络 清 晰 图 表 丰 富 版 式 明 快 一 组 编 过 程 2004 年 10 月, 该 部 开 始 策 划 教 材 丛 书, 派 出 编 辑 分 别 深 入 各 地 高 校, 了 解 教 学 第 一 线 的 情 况, 物 色 合 适 的 作 者 2005 年 4 月 16 日 在 北 京 大 学 召 开 了 21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 研 讨 会 来 自 全 国 73 所 院 校 的 102 位 教 师 汇 聚 一 堂, 共 同 商 讨 应 用 型 本 科 计 算 机 系 列 教 材 建 设 的 思 路, 并 对 规 划 选 题 进 行 了 分 工 2005 年 7 月 21 日 在 青 岛 又 召 开 了 21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 审 纲 会 编 审 委 员 会 成 员 和 46 个 选 题 的 主 编 参 编, 共 100 多 位 教 师 参 加 了 会 议 审 稿 会 分 专 业 基 础 课 软 件 开 发 与 软 件 工 程 硬 件 与 网 络 技 术 计 算 机 应 用 技 术 等 小 组 对 大 纲 及 部 分 稿 件 进 行 了 审 定, 力 争 使 这 套 规 划 教 材 成 为 切 合 当 前 教 学 需 要 的 高 质 量 的 精 品 教 材 二 转 变 观 念 为 了 搞 好 这 套 教 材, 要 转 变 一 些 重 要 的 观 念 首 先, 需 要 转 变 的 观 念 就 是 大 学 及 其 培 养 人 才 的 定 位 大 学 并 不 都 是 研 究 型 的, 每 个 大 学 生 不 一 定 都 当 科 学 家 事 实 上, 大 多 数 学 校 应 该 是 应 用 型 的, 大 学 生 将 直 接 进 入 社 会 基 层 生 产 一 线 服 务 前 沿, 成 为 各 行 各 业 的 实 践 者 和 带 头 人 其 次, 应 该 转 变 的 观 念 就 是 教 材 建 设 的 思 路 许 多 人 偏 爱 于 研 究 型 的 教 材, 即 使 写 应 用 型 教 材, 也 多 半 是 对 前 者 进 行 删 繁 就 简 避 虚 就 实, 这 样 还 不 能 产 生 真 正 应 用 型 的 教 材 因 此, 以 学 科 为 中 心 追 求 雄 厚 理 论 基 础 的 传 统 应 该 被 以 应 用 为 导 向 追 求 熟 练 实 践 技 能 的 思 路 所 取 代 第 三, 必 须 转 变 对 计 算 机 技 术 的 认 识 20 年 前, 有 人 把 计 算 机 技 术 理 解 为 BASIC 编 程 ;10 年 前, 有 人 把 Windows 95 和 Word 称 为 计 算 机 文 化 ; 今 天, 中 小 学 陆 续 开 出 信 息 技 术 课, 有 人 对 此 怀 疑 观 望, 其 实 它 意 义 深 远 以 计 算 机 为 核 心 的 信 息 技 术, 今 后 20 年 的 发 展 主 题 将 是 在 各 个 领 域 的 应 用 普 及 大 学 计 算 机 应 用 型 本 科 的 教 材 建 设 应 该 面 向 信 息 技 术 的 深 入 应 用, 而 不 是 相 反, 因 为 信 息 时 代 已 经 不 是 遥 远 的 未 来 三 信 息 技 能 以 计 算 机 为 核 心 的 信 息 技 术, 从 一 开 始 就 与 应 用 紧 密 结 合 例 如,ENIAC 用 于 弹 道 计 算,ARPANET 用 于 资 源 共 享 以 及 核 战 争 时 的 可 靠 通 信 即 使 是 非 常 抽 象 的 图 灵 机 模 型, 也

II 与 第 二 次 世 界 大 战 时 图 灵 博 士 破 译 纳 粹 密 码 的 工 作 相 关 今 天 的 信 息 技 术 有 三 个 重 要 的 特 点 : 第 一, 信 息 技 术 是 计 算 机 与 通 信 技 术 融 合 的 辉 煌 成 果 长 期 以 来, 计 算 机 技 术 和 通 信 技 术 并 行 不 悖 地 独 立 发 展 20 世 纪 后 半 叶, 两 者 相 互 渗 透, 产 生 了 程 控 电 话 数 据 通 信 网 络 技 术 高 清 晰 电 视, 世 界 各 国 构 建 了 全 球 的 宽 带 的 网 站 密 布 的 信 息 高 速 公 路, 出 现 了 无 处 不 在 的 手 机 通 信 和 移 动 办 公 系 统 随 身 听 数 码 摄 录 相 机 家 庭 影 院 智 能 控 制 系 统, 还 有 越 来 越 多 的 嵌 入 式 系 统 人 们 的 工 作 方 式 和 生 活 方 式 都 发 生 了 质 的 飞 跃 第 二, 信 息 技 术 与 各 行 各 业 紧 密 结 合 我 国 的 职 业 门 类 有 : 农 林 牧 渔 交 通 运 输 生 化 与 制 药 地 矿 与 测 绘 材 料 与 能 源 土 建 水 利 制 造 电 气 信 息 环 保 与 安 全 轻 纺 与 食 品 财 经 医 药 卫 生 旅 游 公 共 事 业 文 化 教 育 艺 术 设 计 传 媒 公 安 法 律, 这 些 门 类 都 需 要 信 息 技 术 第 三, 在 发 展 初 期, 以 计 算 机 为 核 心 的 信 息 技 术 是 一 项 专 门 技 术, 只 有 专 家 才 需 要 它 才 能 掌 握 它, 在 专 家 与 平 民 之 间 有 很 深 的 信 息 鸿 沟 今 天, 信 息 技 术 已 经 不 再 是 只 有 专 家 才 需 要 才 能 掌 握 的 专 门 技 能, 而 是 普 通 人 都 需 要 也 都 能 掌 握 的 基 本 信 息 技 能 但 是, 信 息 鸿 沟 也 迁 移 到 普 通 人 之 间 具 有 信 息 优 势 的 学 生 能 良 性 循 环, 强 者 更 强 有 了 这 样 广 阔 的 应 用 信 息 背 景, 再 造 计 算 机 应 用 型 本 科 的 课 程 体 系 就 有 了 基 础 四 能 力 结 构 关 于 应 用 型 计 算 机 人 才 的 能 力 结 构, 我 们 不 用 宫 殿 模 型, 而 用 雄 鹰 模 型 前 者 是 建 筑 学 模 型, 适 合 描 述 学 科 ; 后 者 是 生 物 学 模 型, 适 合 描 述 人 才 雄 鹰 模 型 包 括 主 体 两 翼 头 部 尾 部 等, 它 有 可 成 长 性 首 先, 数 据 是 信 息 技 术 的 主 体, 数 据 技 术 是 基 本 功 通 常, 数 据 包 括 文 字 公 式 表 格 图 形 图 像 动 画 声 音 视 频 等 等 因 此, 你 不 仅 要 会 录 入 文 章 绘 制 图 表, 还 应 该 会 采 集 音 乐 编 辑 视 频 大 家 面 对 的 是 多 媒 体 数 据, 应 该 能 收 集 它 整 理 它, 数 据 经 过 整 理 就 成 为 有 用 的 信 息 其 次, 信 息 技 术 的 两 翼 是 数 据 库 技 术 和 网 络 技 术 为 了 管 理 好 使 用 好 数 据, 就 必 然 用 到 数 据 库 技 术, 数 据 库 技 术 是 一 切 信 息 管 理 的 基 石 为 了 分 享 数 据 和 信 息, 就 需 要 网 络 技 术 有 了 上 述 数 据 主 体 技 术 和 两 个 翅 膀, 你 应 该 可 以 起 飞 了 但 是 能 飞 多 高, 能 飞 多 远, 还 应 该 有 编 程 技 术 智 能 技 术 安 全 技 术 的 支 持 这 相 当 于 头 尾 各 部 分 的 作 用 编 程 将 使 大 家 的 信 息 技 能 游 刃 有 余 人 工 智 能 使 你 飞 得 更 远, 安 全 技 术 能 使 你 飞 得 更 稳 有 人 可 能 会 责 难 我 们, 难 道 大 学 本 科 生 还 需 要 学 习 办 公 软 件 的 技 能 吗? 他 们 认 为 这 是 让 人 笑 掉 大 牙 的 事 其 实, 办 公 软 件 是 最 重 要 的 提 高 生 产 效 率 的 应 用 软 件, 很 容 易 使 用, 但 各 人 使 用 效 率 的 高 低 则 十 分 悬 殊 我 们 设 想, 今 后 大 学 生 在 入 学 前 先 学 会 计 算 机 的 基 本 操 作, 我 们 再 开 一 门 高 级 办 公 技 术 的 课, 通 过 严 格 的 行 业 及 个 人 行 为 规 范, 对 学 生 进 行 应 用 化 训 练, 养 成 正 确 的 职 业 习 惯 将 来 工 作 时 能 提 高 效 率 改 善 质 量 降 低 成 本 这 决 不 是 贻 笑 大 方 的 事

III 五 初 步 规 划 应 用 型 本 科 教 材 的 规 划 是 一 个 长 期 的 战 略 任 务, 不 是 短 期 的 战 术 行 为 因 此, 目 前 的 规 划 教 材 不 可 能 一 步 到 位, 还 会 保 留 一 些 传 统 的 基 础 课 例 如, 数 字 电 路 与 逻 辑 设 计 微 机 原 理 及 接 口 技 术 单 片 机 原 理 及 应 用 等 即 使 是 纯 硬 件 专 业 的 学 生, 如 何 学 这 些 传 统 硬 件 课 都 值 得 商 榷, 更 何 况 公 共 基 础 课 我 们 将 分 门 别 类 逐 步 建 设 好 应 用 型 本 科 的 重 点 课 程 和 教 材 : (1) 基 础 类 教 材 : 信 息 技 术 导 论, 计 算 机 应 用 基 础, 高 级 办 公 技 术, 数 据 与 操 作, 密 码 与 安 全, 实 用 数 据 结 构, 实 用 离 散 数 学 ; (2) 数 据 库 类 教 材 : 数 据 库 原 理 与 应 用, 信 息 系 统 集 成, 数 据 采 掘 与 知 识 发 现 ; (3) 网 络 类 教 材 : 计 算 机 网 络, 因 特 网 技 术, 网 络 管 理 与 安 全, 网 站 与 网 页 设 计 ; (4) 编 程 类 教 材 : 面 向 对 象 程 序 设 计,C++ 程 序 设 计,Java 程 序 设 计 ; (5) 提 高 类 教 材 : 软 件 工 程 原 理 及 应 用, 人 工 智 能 原 理 及 应 用 新 教 材 要 体 现 教 育 观 念 的 转 变, 系 统 地 研 究 普 通 高 校 教 学 改 革 的 需 求, 优 先 开 发 其 中 教 学 急 需 改 革 方 案 明 确 适 用 范 围 较 广 的 教 材 注 重 规 划 教 材 的 科 学 性 实 用 性 易 学 性, 尽 量 满 足 同 类 专 业 院 校 的 需 求 教 材 内 容 应 处 理 好 传 统 与 现 代 的 关 系, 补 充 新 知 识 新 技 术 新 工 艺 新 成 果 我 相 信 北 京 大 学 出 版 社 在 全 国 各 地 高 校 教 师 的 积 极 支 持 下, 精 心 设 计, 严 格 把 关, 一 定 能 够 建 设 一 批 符 合 应 用 型 人 才 培 养 目 标 的 适 应 计 算 机 应 用 型 人 才 培 养 模 式 的 系 列 精 品 教 材, 而 且 能 建 设 一 体 化 设 计 多 种 媒 体 有 机 结 合 的 立 体 化 教 材, 为 各 门 课 程 配 套 电 子 教 案 学 习 指 导 习 题 解 答 课 程 设 计 等 辅 导 资 料 让 我 们 共 同 努 力 吧! 刘 瑞 挺 教 授 曾 任 中 国 计 算 机 学 会 教 育 培 训 委 员 会 副 主 任 教 育 部 理 科 计 算 机 科 学 教 学 指 导 委 员 会 委 员 全 国 计 算 机 等 级 考 试 委 员 会 委 员 目 前 担 任 的 社 会 职 务 有 : 全 国 高 等 院 校 计 算 机 基 础 教 育 研 究 会 副 会 长 全 国 计 算 机 应 用 技 术 证 书 考 试 委 员 会 副 主 任 北 京 市 计 算 机 教 育 培 训 中 心 副 理 事 长

21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 专 家 编 审 委 员 会 ( 按 姓 氏 笔 画 排 名 ) 主 任 刘 瑞 挺 副 主 任 胡 昌 振 段 禅 伦 崔 广 才 谢 红 薇 委 员 叶 俊 民 杨 璐 陈 天 煌 范 冰 冰 陈 仲 民 胡 明 秦 锋 龚 声 蓉

21 世 纪 全 国 应 用 型 本 科 计 算 机 系 列 实 用 规 划 教 材 分 系 列 专 家 编 审 委 员 会 名 单 ( 按 姓 氏 笔 画 排 名 ) 计 算 机 应 用 技 术 主 任 胡 昌 振 副 主 任 杨 璐 龚 声 蓉 委 员 云 敏 马 秀 峰 李 明 肖 淑 芬 周 松 林 杨 长 生 钟 声 赵 忠 孝 高 巍 软 件 开 发 与 软 件 工 程 主 任 谢 红 薇 副 主 任 叶 俊 民 陈 天 煌 委 员 王 建 国 孙 辉 吕 海 莲 李 福 亮 何 朝 阳 张 世 明 陈 佛 敏 贺 华 赵 绪 辉 徐 庆 生 徐 辉 硬 件 与 网 络 技 术 主 任 崔 广 才 副 主 任 范 冰 冰 胡 明 委 员 龙 冬 云 冯 嘉 礼 曲 朝 阳 汤 惟 张 有 谊 董 春 游 程 小 辉 专 业 基 础 课 主 任 段 禅 伦 副 主 任 陈 仲 民 秦 锋 委 员 王 昆 仑 王 虹 仇 汶 田 敬 军 刘 克 成 朴 春 慧 吴 晓 光 苏 守 宝 陈 付 贵 昝 风 彪 谭 水 木 魏 仕 民

前 言 Visual Basic 是 近 年 来 得 到 迅 速 推 广 和 应 用 的 一 种 可 视 化 的 计 算 机 高 级 编 程 语 言, 它 适 于 在 Windows 平 台 上 开 发 应 用 程 序 Visual Basic 因 其 功 能 强 大 容 易 掌 握, 受 到 广 大 初 学 者 和 程 序 开 发 人 员 的 喜 爱 目 前 不 少 高 校 开 设 了 Visual Basic 程 序 设 计 课 程, 许 多 学 生 通 过 短 短 的 数 十 小 时 的 学 习, 就 能 用 它 编 写 一 些 相 对 简 单 的 Visual Basic 应 用 程 序, 为 今 后 的 深 入 应 用 打 下 很 好 的 基 础 事 实 表 明,Visual Basic 作 为 大 学 生 ( 尤 其 是 非 计 算 机 专 业 的 大 学 生 ) 学 习 程 序 设 计 的 第 一 种 语 言 是 比 较 合 适 的 为 此, 我 们 在 近 几 年 教 学 实 践 的 基 础 上 编 写 了 这 本 书 本 书 介 绍 了 Visual Basic 程 序 设 计 的 基 础 知 识, 主 要 包 括 界 面 设 计 和 程 序 代 码 的 设 计 全 书 共 分 11 章 第 1 章 是 Visual Basic 的 概 述, 介 绍 Visual Basic 的 集 成 开 发 环 境 Visual Basic 开 发 应 用 程 序 的 一 般 开 发 过 程 等 内 容 ; 第 2 章 介 绍 Visual Basic 程 序 基 本 的 语 法 单 位 和 语 法 规 则, 包 括 Visual Basic 的 数 据 类 型 常 量 和 变 量 运 算 符 和 表 达 式 常 用 内 部 函 数 等 ; 第 3 章 主 要 讨 论 Visual Basic 组 成 程 序 流 程 控 制 的 三 种 基 本 结 构 及 相 关 语 句 ; 第 4 章 集 中 地 介 绍 Visual Basic 工 具 箱 中 的 常 用 控 件 的 基 本 属 性 和 方 法 ; 第 5 章 讨 论 数 组 的 定 义 和 使 用 方 法 ; 第 6 章 介 绍 过 程 的 有 关 概 念 和 使 用 方 法 ; 第 7 章 具 体 探 讨 键 盘 和 鼠 标 事 件 过 程 ; 第 8 章 介 绍 如 何 使 用 Visual Basic 提 供 的 菜 单 技 术 工 具 栏 技 术 对 话 框 技 术 多 重 文 档 技 术 设 计 应 用 程 序 界 面 ; 第 9 章 介 绍 Visual Basic 基 本 的 图 形 处 理 技 术 ; 第 10 章 介 绍 Visual Basic 对 数 据 文 件 的 组 织 处 理 方 法, 以 及 用 于 文 件 操 作 的 有 关 控 件 ; 第 11 章 介 绍 数 据 库 的 初 步 概 念 以 及 Visual Basic 中 对 数 据 库 进 行 处 理 的 基 本 方 法 本 书 针 对 初 学 者 的 特 点, 在 体 系 结 构 和 内 容 上 注 意 了 由 简 及 繁 由 浅 入 深 循 序 渐 进 深 入 浅 出 以 及 理 论 与 实 践 密 切 结 合 全 书 内 容 全 面, 实 例 丰 富 书 中 所 有 例 题 均 在 Visual Basic 6.0 上 运 行 通 过 本 书 由 武 汉 理 工 大 学 闵 联 营 老 师 和 中 国 石 油 大 学 董 华 松 老 师 主 编 第 1 2 章 由 江 汉 大 学 刘 全 老 师 编 写, 第 3 8 章 由 董 华 松 老 师 编 写, 第 4 5 章 由 浙 江 工 业 大 学 之 江 学 院 张 惠 老 师 编 写, 第 6 7 和 9 章 由 闵 联 营 老 师 编 写, 第 10 和 11 章 分 别 由 长 春 大 学 宋 雅 娟 老 师 和 华 北 科 技 学 院 任 占 营 老 师 编 写 最 后 由 闵 联 营 老 师 统 编 全 书 由 于 作 者 水 平 有 限, 书 中 难 免 有 不 足 之 处, 恳 请 读 者 批 评 指 正 编 者 2005 年 9 月

目 录 第 1 章 Visual Basic 概 述... 1 1.1 Visual Basic 的 特 点 和 版 本... 1 1.1.1 Visual Basic 的 特 点... 1 1.1.2 Visual Basic 6.0 版 本 简 介... 2 1.2 Visual Basic 的 启 动 与 退 出... 3 1.3 Visual Basic 的 集 成 开 发 环 境... 4 1.3.1 标 题 栏... 5 1.3.2 菜 单 栏... 5 1.3.3 工 具 栏... 6 1.3.4 工 具 箱... 7 1.3.5 窗 口... 8 1.4 可 视 化 编 程 的 基 本 概 念... 10 1.4.1 对 象... 10 1.4.2 属 性... 10 1.4.3 事 件... 11 1.4.4 方 法... 11 1.5 创 建 窗 体... 12 1.5.1 窗 体 的 属 性... 12 1.5.2 窗 体 的 方 法... 14 1.5.3 窗 体 的 事 件... 15 1.6 用 Visual Basic 开 发 应 用 程 序... 15 1.6.1 用 Visual Basic 开 发 应 用 程 序 的 一 般 步 骤... 15 1.6.2 编 写 一 个 简 单 的 Visual Basic 应 用 程 序... 17 1.7 小 结... 18 1.8 习 题... 19 第 2 章 Visual Basic 程 序 设 计 基 础... 21 2.1 数 据 类 型... 21 2.1.1 数 值 型 数 据... 21 2.1.2 字 符 串 型 数 据... 22 2.1.3 布 尔 型 数 据... 22 2.1.4 日 期 型 数 据... 22 2.1.5 对 象 型 数 据... 22 2.1.6 可 变 类 型 数 据... 23 2.2 常 量 和 变 量... 23 2.2.1 常 量... 23 2.2.2 变 量... 24 2.3 运 算 符 与 表 达 式... 26 2.3.1 算 术 运 算 符 与 算 术 表 达 式... 26 2.3.2 字 符 串 运 算 符 与 字 符 串 表 达 式... 27 2.3.3 关 系 运 算 符 与 关 系 表 达 式... 28 2.3.4 逻 辑 运 算 符 与 逻 辑 表 达 式... 28 2.3.5 表 达 式 的 运 算 顺 序... 29 2.4 小 结... 30 2.5 习 题... 30 第 3 章 Visual Basic 程 序 控 制 结 构... 32 3.1 顺 序 结 构... 32 3.1.1 赋 值 语 句... 32 3.1.2 数 据 输 入 和 输 出... 33 3.1.3 注 释 暂 停 与 程 序 结 束 语 句... 35 3.1.4 应 用 举 例... 36 3.2 选 择 结 构... 36 3.2.1 单 行 结 构 条 件 语 句... 37 3.2.2 块 结 构 条 件 语 句... 38 3.2.3 多 分 支 选 择 语 句... 40 3.2.4 应 用 举 例... 42 3.3 循 环 结 构... 43 3.3.1 For Next 循 环 结 构... 43 3.3.2 Do Loop 循 环 结 构... 45 3.3.3 While Wend 循 环 结 构... 48 3.3.4 循 环 的 嵌 套... 49 3.3.5 应 用 举 例... 50 3.4 小 结... 51 3.5 习 题... 53

VIII Visual Basic 程 序 设 计 第 4 章 Visual Basic 常 用 内 部 控 件... 56 4.1 概 述... 56 4.2 命 令 按 钮... 57 4.2.1 命 令 按 钮 的 常 用 属 性... 57 4.2.2 命 令 按 钮 的 常 用 事 件... 58 4.3 文 本 控 件... 59 4.3.1 标 签... 59 4.3.2 文 本 框... 60 4.4 单 选 按 钮 复 选 框 和 框 架... 63 4.4.1 单 选 按 钮... 63 4.4.2 复 选 框... 65 4.4.3 框 架... 67 4.5 列 表 框 和 组 合 框... 68 4.5.1 列 表 框... 68 4.5.2 组 合 框... 72 4.6 图 像 框 和 图 片 框... 74 4.6.1 图 片 框... 74 4.6.2 图 像 框... 76 4.7 滚 动 条... 77 4.7.1 滚 动 条 的 常 用 属 性... 77 4.7.2 滚 动 条 的 常 用 事 件... 78 4.8 定 时 器... 79 4.9 小 结... 80 4.10 习 题... 81 第 5 章 数 组... 85 5.1 数 组 的 基 本 概 念... 85 5.1.1 数 组 与 数 组 元 素... 85 5.1.2 数 组 的 维 数... 85 5.2 数 组 的 定 义... 86 5.2.1 静 态 数 组 的 定 义... 86 5.2.2 动 态 数 组 的 定 义... 86 5.3 数 组 的 基 本 操 作... 87 5.3.1 数 组 元 素 的 输 入 与 输 出... 87 5.3.2 数 组 元 素 的 复 制... 89 5.3.3 保 留 动 态 数 组 的 内 容... 90 5.4 数 组 应 用 举 例... 91 5.5 控 件 数 组... 94 5.5.1 控 件 数 组 的 建 立... 94 5.5.2 控 件 数 组 的 使 用... 95 5.6 小 结... 97 5.7 习 题... 98 第 6 章 过 程... 102 6.1 过 程 的 定 义... 102 6.1.1 Sub 过 程... 102 6.1.2 Function 过 程... 104 6.2 过 程 的 调 用... 105 6.2.1 调 用 Sub 事 件 过 程... 106 6.2.2 调 用 Sub 通 用 过 程... 106 6.2.3 调 用 Function 过 程... 107 6.3 参 数 的 传 递... 108 6.3.1 形 参 和 实 参... 108 6.3.2 参 数 按 值 传 递 和 按 地 址 传 递... 109 6.3.3 数 组 参 数... 110 6.3.4 可 选 参 数 与 可 变 参 数... 112 6.3.5 对 象 参 数... 113 6.4 递 归 过 程... 114 6.5 变 量 的 作 用 域 与 生 存 期... 117 6.5.1 变 量 的 作 用 域... 117 6.5.2 变 量 的 生 存 期... 120 6.6 小 结... 121 6.7 习 题... 122 第 7 章 鼠 标 和 键 盘 事 件 过 程... 126 7.1 鼠 标... 126 7.1.1 鼠 标 事 件... 126 7.1.2 鼠 标 光 标 形 状... 128 7.2 键 盘... 129 7.2.1 KeyDown 和 KeyUP 事 件... 129 7.2.2 KeyPress 事 件... 130 7.3 拖 放... 132 7.3.1 与 拖 放 有 关 的 属 性 事 件 和 方 法... 132 7.3.2 OLE 拖 放... 135 7.4 小 结... 137 7.5 习 题... 137 VIII

目 录 IX 第 8 章 界 面 设 计...142 8.1 菜 单 的 设 计...142 8.1.1 下 拉 式 菜 单...142 8.1.2 弹 出 式 菜 单...144 8.1.3 菜 单 事 件 与 菜 单 命 令...145 8.2 对 话 框 的 设 计...147 8.2.1 自 定 义 对 话 框...147 8.2.2 通 用 对 话 框...148 8.2.3 通 用 对 话 框 控 件 的 使 用...153 8.3 状 态 栏 的 设 计...154 8.4 工 具 栏 的 设 计...157 8.4.1 使 用 手 工 方 式 制 作 工 具 栏...157 8.4.2 使 用 工 具 栏 控 件 制 作 工 具 栏...158 8.4.3 文 档 编 辑 器 的 实 现...161 8.5 多 文 档 界 面 设 计...164 8.5.1 多 文 档 界 面 (MDI)...164 8.5.2 建 立 多 文 档 界 面...165 8.5.3 创 建 MDI 应 用 程 序 的 菜 单...166 8.6 Visual Basic 的 工 程 结 构...167 8.7 小 结...167 8.8 习 题...168 第 9 章 Visual Basic 图 形 设 计...171 9.1 图 形 设 计 基 础...171 9.1.1 坐 标 系 统...171 9.1.2 颜 色...173 9.2 图 形 控 件...176 9.2.1 Shape 控 件...176 9.2.2 Line 控 件...177 9.3 绘 图 方 法...178 9.3.1 画 点 方 法...178 9.3.2 画 直 线 矩 形 方 法 (Line)...180 9.3.3 画 圆 方 法 (Circle)...181 9.3.4 PaintPicture 方 法...183 9.4 与 绘 图 有 关 的 常 用 属 性 和 事 件...185 9.4.1 清 除 图 形 方 法...185 9.4.2 线 宽 属 性 和 线 型 属 性...185 9.4.3 填 充 颜 色 属 性 和 填 充 样 式 属 性... 185 9.4.4 自 动 重 画 属 性... 186 9.4.5 Paint 事 件... 187 9.5 小 结... 188 9.6 习 题... 189 第 10 章 文 件... 191 10.1 文 件 的 基 本 概 念... 191 10.1.1 文 件 的 类 型... 191 10.1.2 文 件 访 问 函 数 和 语 句... 191 10.2 顺 序 文 件... 192 10.2.1 顺 序 文 件 的 打 开 与 关 闭... 192 10.2.2 顺 序 文 件 的 读 写... 193 10.3 随 机 文 件... 195 10.3.1 定 义 数 据 类 型 和 变 量 声 明... 195 10.3.2 随 机 文 件 的 打 开 与 关 闭... 195 10.3.3 随 机 文 件 的 读 写 操 作... 196 10.4 文 件 系 统 控 件... 196 10.4.1 驱 动 器 列 表 框 控 件... 196 10.4.2 目 录 列 表 框 控 件... 197 10.4.3 文 件 列 表 框 控 件... 198 10.5 文 件 系 统 对 象 模 型... 200 10.5.1 文 件 系 统 对 象 模 型 概 述... 200 10.5.2 管 理 驱 动 器... 201 10.5.3 管 理 文 件 夹... 202 10.5.4 管 理 文 件... 203 10.6 文 件 应 用 举 例... 205 10.7 小 结... 207 10.8 习 题... 207 第 11 章 数 据 库 程 序 设 计... 209 11.1 数 据 库 和 SQL 语 言 基 础... 209 11.1.1 数 据 库 简 介... 209 11.1.2 结 构 化 查 询 语 言... 210 11.2 可 视 化 数 据 管 理 器... 212 11.2.1 启 动 可 视 化 数 据 管 理 器... 212 11.2.2 新 建 数 据 库... 213 11.2.3 打 开 数 据 库... 214 IX

X Visual Basic 程 序 设 计 11.2.4 添 加 数 据 表...214 11.2.5 数 据 的 增 加 删 除 和 修 改...218 11.2.6 数 据 的 查 询...219 11.2.7 数 据 窗 体 设 计 器...221 11.3 数 据 控 件 和 数 据 绑 定 控 件...221 11.3.1 数 据 控 件...222 11.3.2 Recordset 对 象 的 属 性 和 方 法...222 11.3.3 数 据 绑 定 控 件...223 11.4 使 用 ADO 访 问 数 据... 225 11.4.1 ADO 对 象 模 型... 225 11.4.2 ADODC 控 件... 226 11.5 应 用 示 例... 229 11.6 小 结... 232 11.7 习 题... 232 参 考 答 案... 234 参 考 文 献... 239 X

第 1 章 Visual Basic 概 述 教 学 提 示 :Visual Basic 语 言 是 Microsoft Windows 操 作 系 统 环 境 下 的 程 序 开 发 工 具, 是 以 BASIC 语 言 为 基 础 以 事 件 驱 动 作 为 运 行 机 制 的 可 视 化 程 序 设 计 语 言 迄 今 为 止, Visual Basic 经 历 了 几 次 升 级, 它 的 功 能 也 日 益 强 大 和 完 善 1998 年 Microsoft 公 司 又 推 出 了 Visual Basic 6.0 版 本, 本 书 就 是 以 Visual Basic 6.0 为 背 景, 详 细 介 绍 利 用 Visual Basic 进 行 程 序 设 计 的 方 法 教 学 要 求 : 通 过 本 章 的 学 习, 了 解 Visual Basic 的 特 点, 熟 悉 Visual Basic 的 集 成 开 发 环 境, 掌 握 建 立 一 个 Visual Basic 应 用 程 序 的 方 法 1.1 Visual Basic 的 特 点 和 版 本 1.1.1 Visual Basic 的 特 点 Visual Basic 是 一 种 面 向 对 象 的 程 序 设 计 语 言, 与 传 统 的 程 序 设 计 语 言 相 比,Visual Basic 不 仅 简 单 易 学, 而 且 功 能 比 较 强 大, 在 许 多 方 面 有 了 重 大 的 改 进 和 突 破 在 这 里 将 介 绍 Visual Basic 的 几 个 最 基 本 的 特 点 1. 可 视 化 用 传 统 的 高 级 语 言 编 写 程 序 时, 对 界 面 的 设 计 和 算 法 的 实 现, 常 常 需 要 编 写 大 量 的 代 码 来 完 成 并 且 只 有 在 该 程 序 运 行 时, 才 能 看 到 用 户 的 界 面 效 果, 如 果 不 满 意, 又 需 要 回 到 设 计 阶 段 重 新 设 计, 这 样 的 程 序 调 试 方 式 影 响 了 编 程 效 率 然 而,Visual Basic 则 不 一 样, 它 为 用 户 编 写 应 用 程 序 提 供 了 可 视 化 的 集 成 开 发 环 境, 使 用 户 不 需 要 编 写 大 量 代 码 去 描 述 界 面 元 素 的 外 观 和 位 置, 只 要 把 系 统 预 先 建 立 的 元 素 对 象 放 在 窗 口 中, 并 对 该 元 素 的 属 性 进 行 设 置, 就 可 以 快 速 地 构 造 出 美 观 实 用 的 用 户 界 面 即 运 行 后 的 实 际 效 果 与 预 先 画 出 的 界 面 是 一 样 的 因 此, 用 户 可 以 方 便 地 设 计 美 观 友 好 的 界 面, 这 样 就 大 大 简 化 了 界 面 设 计, 同 时 也 提 高 了 编 程 效 率 2. 事 件 驱 动 传 统 的 编 程 方 式 是 面 向 过 程 的, 设 计 人 员 必 须 将 要 处 理 的 事 物 编 写 出 一 个 完 整 的 程 序, 计 算 机 按 照 程 序 的 流 程 运 行, 直 到 程 序 的 结 束 语 句 为 止 在 这 种 编 程 方 式 下, 程 序 设 计 人 员 必 须 十 分 周 全 地 考 虑 程 序 运 行 过 程 中 的 每 一 个 细 节, 否 则 稍 有 不 慎 就 有 可 能 造 成 不 可 预 见 的 错 误 然 而 Visual Basic 改 变 了 这 种 编 程 方 式, 它 采 用 面 向 对 象 的 程 序 设 计 方 法, 即 通 过 事 件 来 执 行 对 象 的 操 作 每 一 个 对 象 都 能 响 应 多 个 不 同 的 事 件 每 个 事 件 都 能 驱 动 一 段

2 Visual Basic 程 序 设 计 程 序 代 码 例 如, 命 令 按 钮 是 一 个 对 象, 当 用 户 单 击 该 按 钮 时, 将 产 生 一 个 单 击 事 件, 而 在 产 生 该 事 件 时, 将 执 行 一 段 设 计 人 员 预 先 设 计 好 的 程 序, 用 来 实 现 指 定 的 功 能 用 Visual Basic 设 计 大 型 应 用 程 序 时, 不 必 建 立 具 有 统 一 控 制 的 包 罗 万 象 的 大 程 序, 只 需 要 编 写 若 干 个 微 小 的 子 程 序, 即 事 件 过 程 这 些 过 程 分 别 面 向 不 同 的 对 象 由 用 户 操 作 引 发 某 个 事 件 来 驱 动 完 成 某 种 特 定 的 功 能, 或 由 来 自 系 统 的 消 息 触 发 来 执 行 指 定 的 操 作, 这 样 使 得 程 序 编 制 工 作 变 得 相 对 简 单, 提 高 了 编 程 效 率 3. 交 互 式 传 统 高 级 语 言 编 程 一 般 都 要 经 过 3 个 步 骤, 即 编 码 编 译 和 测 试 代 码, 其 中 每 一 步 还 需 要 调 用 专 门 的 处 理 程 序, 而 Visual Basic 与 传 统 的 高 级 语 言 不 同, 它 将 这 3 个 步 骤 的 操 作 都 集 中 在 它 的 集 成 开 发 环 境 内 统 一 处 理, 使 得 3 个 步 骤 之 间 不 再 有 明 显 的 界 限, 大 大 方 便 了 设 计 人 员 的 使 用 在 大 多 数 语 言 中, 如 果 设 计 人 员 在 编 写 代 码 时 发 生 错 误, 则 只 有 在 该 程 序 编 译 时, 错 误 才 会 被 编 译 器 捕 获, 此 时 设 计 人 员 必 须 查 找 并 改 正 错 误, 然 后 再 一 次 进 行 编 译, 对 于 每 一 个 发 现 的 错 误 都 要 重 复 这 样 的 过 程 而 Visual Basic 则 不 同, 它 采 用 交 互 式 的 在 线 检 测 方 式, 即 在 设 计 人 员 输 入 代 码 时, 便 对 其 进 行 解 释, 即 时 捕 获 并 突 出 显 示 其 语 法 或 拼 写 错 误, 使 设 计 人 员 能 及 时 发 现 错 误 并 改 正 错 误 4. 可 扩 充 性 Visual Basic 是 一 种 高 度 可 扩 充 的 语 言, 它 为 用 户 提 供 了 多 种 途 径 来 扩 充 其 功 能, 主 要 表 现 为 支 持 其 他 软 件 开 发 商 为 扩 充 其 功 能 而 开 发 的 外 部 控 件, 只 要 这 些 外 部 控 件 的 文 件 扩 展 名 为.ocx 就 可 以 加 入 到 Visual Basic 系 统 中, 以 扩 充 其 功 能 Visual Basic 还 提 供 了 OLE (Object Linking and Embedding, 对 象 的 链 接 与 嵌 入 ) 功 能 利 用 这 一 功 能 在 Visual Basic 的 应 用 程 序 中, 可 以 使 用 其 他 Windows 应 用 程 序 对 象 的 某 些 功 能, 例 如, 用 户 在 建 立 一 个 Visual Basic 应 用 程 序 时, 可 以 使 用 Microsoft Excel 建 立 一 个 计 算 表 格 另 外 Visual Basic 还 支 持 动 态 交 换 和 动 态 链 接 技 术, 通 过 动 态 数 据 交 换 (DDE) 的 编 程 技 术,Visual Basic 开 发 的 应 用 程 序 能 与 其 他 Windows 应 用 程 序 之 间 建 立 数 据 通 信, 通 过 动 态 链 接 库 技 术, 在 Visual Basic 程 序 中 可 方 便 地 调 用 用 C 语 言 或 汇 编 语 言 编 写 的 函 数, 也 可 调 用 Windows 的 应 用 程 序 接 口 (API) 函 数, 利 用 这 些 API 函 数, 可 大 大 增 强 Visual Basic 的 编 程 能 力, 并 可 实 现 一 些 用 Visual Basic 语 言 本 身 不 能 实 现 的 一 些 特 殊 功 能 1.1.2 Visual Basic 6.0 版 本 简 介 在 Visual Basic 6.0 中 提 供 了 3 种 版 本, 即 学 习 版 专 业 版 和 企 业 版 这 3 种 不 同 的 版 本 分 别 可 以 满 足 不 同 的 设 计 人 员 对 开 发 的 需 要, 用 户 可 以 根 据 需 要 选 择 不 同 的 版 本 1. 学 习 版 Visual Basic 6.0 的 基 础 版 本, 该 版 本 主 要 是 为 初 学 者 开 发 的, 用 它 可 以 开 发 基 于 Windows 9x/NT 的 应 用 程 序, 该 版 本 包 含 所 有 内 部 控 件 2

第 1 章 Visual Basic 概 述 3 2. 专 业 版 主 要 是 为 专 业 人 员 创 建 基 于 客 户 机 / 服 务 器 应 用 程 序 而 设 计 的, 该 版 本 包 括 学 习 版 的 全 部 功 能 以 及 ActiveX 控 件 Internet 控 件 Crystal Report Writer 控 件 等 开 发 工 具 3. 企 业 版 该 版 本 的 用 户 主 要 是 专 业 软 件 开 发 人 员, 包 括 了 专 业 版 的 全 部 功 能, 同 时 具 有 自 动 化 管 理 数 据 库 管 理 工 具 和 Microsoft Visual Source soft 面 向 工 程 版 的 控 制 系 统 等 该 版 本 主 要 用 于 创 建 更 高 级 的 分 布 式 高 性 能 的 客 户 机 / 服 务 器 或 Internet 上 的 应 用 程 序 1.2 Visual Basic 的 启 动 与 退 出 Visual Basic 作 为 Visual Studio 6.0 套 装 软 件 中 的 成 员, 可 以 和 Visual Studio 6.0 一 起 安 装, 也 可 以 单 独 安 装, 单 独 安 装 的 Visual Basic 6.0 中 文 版 包 括 4 张 光 盘, 其 中 2 张 为 MSDN ( 联 机 帮 助 ) 1. 启 动 Visual Basic 6.0 Visual Basic 6.0 的 启 动 方 式 主 要 有 4 种 (1) 单 击 Windows 桌 面 左 下 角 的 开 始 按 钮, 执 行 开 始 程 序 Visual Basic 6.0 菜 单 操 作 (2) 建 立 启 动 Visual Basic 6.0 的 快 捷 方 式, 通 过 快 捷 方 式 图 标 启 动 Visual Basic 6.0 (3) 使 用 开 始 菜 单 中 的 运 行 命 令, 在 打 开 栏 内 输 入 C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE, 单 击 确 定 按 钮, 即 可 启 动 Visual Basic 6.0 在 成 功 启 动 Visual Basic 6.0 之 后, 屏 幕 上 会 显 示 一 个 新 建 工 程 对 话 框, 如 图 1.1 所 示 图 1.1 新 建 工 程 对 话 框 3

4 Visual Basic 程 序 设 计 新 建 工 程 对 话 框 中 有 3 个 标 签, 单 击 它 们 可 打 开 相 应 的 选 项 卡 1 新 建 选 项 卡 : 创 建 新 的 Visual Basic 6.0 应 用 程 序 工 程 该 选 项 卡 中 有 若 干 个 工 程 类 型, 在 这 里 对 这 几 种 类 型 进 行 说 明 标 准 EXE: 用 来 创 建 一 个 标 准 的 EXE 文 件 ActiveX EXE: 用 来 创 建 一 个 ActiveX 可 执 行 文 件 ActiveX DLL: 用 于 创 建 一 个 与 ActiveX EXE 功 能 相 同 的 DLL 文 件 ActiveX 控 件 : 用 来 创 建 一 个 ActiveX 控 件 Visual Basic 应 用 程 序 向 导 : 用 于 帮 助 用 户 建 立 应 用 程 序 框 架, 使 用 户 可 以 快 速 建 立 一 个 具 有 基 本 功 能 的 应 用 程 序 数 据 工 程 : 用 于 建 立 一 个 数 据 工 程 IIS 应 用 程 序 :IIS 应 用 程 序 是 一 种 Visual Basic 应 用 程 序, 它 组 合 了 HTML 技 术 和 动 态 的 基 于 浏 览 器 的 应 用 程 序 的 编 译 Visual Basic 代 码 技 术 IIS 应 用 程 序 位 于 Web 服 务 器 上, 从 浏 览 器 接 收 请 求, 并 运 行 与 请 求 相 关 的 代 码, 然 后 向 浏 览 器 发 出 响 应 请 求 外 接 程 序 : 用 于 建 立 自 定 义 的 Visual Basic 的 IDE 外 接 程 序 ActiveX 文 档 EXE 和 ActiveX 文 档 DLL:ActiveX 文 档 相 当 于 可 以 在 支 持 超 链 接 环 境 下 运 行 的 Visual Basic 程 序 DHTML 应 用 程 序 : 与 IIS 应 用 程 序 相 似, 只 是 在 客 户 端 的 浏 览 器 上, 解 释 与 响 应 浏 览 器 上 终 端 的 用 户 操 作 Visual Basic 企 业 版 控 件 : 该 选 择 不 是 用 来 建 立 应 用 程 序, 而 是 用 来 在 工 具 箱 中 加 入 企 业 版 控 件 图 标 2 现 存 选 项 卡 : 选 择 和 打 开 现 有 的 工 程, 继 续 进 行 编 辑 修 改 和 调 试 3 最 新 选 项 卡 : 列 出 最 近 使 用 过 的 工 程 如 果 不 希 望 Visual Basic 每 次 启 动 时 都 出 现 该 对 话 框, 可 以 选 择 该 对 话 框 下 方 的 不 再 显 示 这 个 对 话 框 复 选 框, 在 这 种 情 况 下, 集 成 开 发 环 境 每 次 启 动 时, 会 自 动 创 建 一 个 类 型 为 标 准 EXE 的 工 程 2. Visual Basic 的 退 出 退 出 Visual Basic 的 方 法 主 要 有 3 种 (1) 在 Visual Basic 窗 口 中, 选 择 文 件 菜 单 中 的 退 出 命 令 (2) 通 过 组 合 键 Alt+Q 或 Alt+F4 也 可 退 出 Visual Basic 集 成 环 境 (3) 单 击 Visual Basic 窗 口 右 上 角 的 关 闭 按 钮 无 论 采 用 何 种 方 式 退 出 Visual Basic, 系 统 都 会 在 退 出 集 成 开 发 环 境 时, 检 查 目 前 打 开 的 工 程 是 否 被 修 改 如 果 用 户 对 工 程 做 了 修 改, 则 系 统 会 提 示 用 户 保 存 其 最 新 版 本 1.3 Visual Basic 的 集 成 开 发 环 境 和 大 多 数 开 发 工 具 一 样,Visual Basic 也 提 供 了 一 个 集 成 开 发 环 境, 在 这 样 一 个 工 作 平 台 4

第 1 章 Visual Basic 概 述 5 上, 用 户 可 以 完 成 应 用 程 序 的 设 计 编 辑 编 译 及 调 试 等 工 作, 因 此, 熟 练 掌 握 Visual Basic 集 成 开 发 环 境 是 学 习 Visual Basic 的 第 一 步 如 前 所 述,Visual Basic 被 启 动 后, 用 户 在 对 话 框 中 选 择 一 个 要 建 立 的 工 程 类 型, 单 击 打 开 按 钮, 就 进 入 了 Visual Basic 的 集 成 开 发 环 境 ( 如 图 1.2 所 示 ) 下 面 的 Visual Basic 集 成 开 发 环 境 界 面 是 由 以 下 几 部 分 构 成 的 标 题 栏 工 具 栏 菜 单 栏 工 具 箱 工 程 资 源 管 理 窗 口 窗 体 设 计 器 属 性 窗 口 窗 体 布 局 窗 口 图 1.2 Visual Basic 集 成 开 发 环 境 1.3.1 标 题 栏 标 题 栏 是 Visual Basic 集 成 环 境 窗 口 顶 部 的 水 平 条, 在 标 题 栏 中 显 示 了 当 前 操 作 的 工 程 名 称 以 及 Visual Basic 的 工 作 模 式, 在 Visual Basic 中 有 3 种 工 作 模 式 (1) 设 计 模 式 : 在 该 模 式 下 可 进 行 用 户 界 面 的 设 计 和 代 码 的 编 写 进 入 设 计 模 式 时, 在 标 题 栏 中 显 示 设 计 字 样 (2) 运 行 模 式 : 在 该 模 式 下 可 运 行 Visual Basic 应 用 程 序, 但 不 可 编 辑 代 码, 也 不 可 编 辑 界 面 进 入 运 行 模 式 时, 在 标 题 栏 中 显 示 运 行 字 样 (3) 中 断 模 式 : 在 该 模 式 下 可 暂 时 中 断 应 用 程 序 的 执 行, 而 且 可 编 辑 代 码, 但 不 可 编 辑 用 户 界 面 进 入 中 断 模 式 时, 在 标 题 栏 中 显 示 break 字 样 在 标 题 栏 中 除 了 显 示 工 程 的 名 称 和 工 作 模 式 之 外, 在 标 题 栏 的 最 左 端 还 有 窗 口 控 制 菜 单 框, 在 标 题 栏 的 最 右 边 还 有 最 大 化 按 钮 最 小 化 按 钮 和 关 闭 按 钮 1.3.2 菜 单 栏 Visual Basic 集 成 环 境 窗 口 的 第 二 行 就 是 菜 单 栏, 使 用 菜 单 栏 中 的 菜 单 就 可 以 访 问 Visual Basic 中 的 所 有 功 能 在 菜 单 栏 上 共 有 13 个 菜 单 ( 即 文 件 编 辑 视 图 工 程 格 式 调 试 运 行 查 询 图 表 工 具 外 接 程 序 窗 口 和 帮 助 ), 每 个 菜 单 的 功 能 如 表 1-1 所 示 5

6 Visual Basic 程 序 设 计 表 1-1 Visual Basic 菜 单 的 功 能 一 览 表 菜 单 名 功 能 文 件 编 辑 视 图 工 程 格 式 调 试 运 行 查 询 图 表 工 具 外 接 程 序 窗 口 帮 助 包 括 文 件 的 打 开 删 除 保 存 和 加 入 窗 体 以 及 生 成 执 行 文 件 等 功 能 提 供 各 种 编 辑 功 能 提 供 显 示 或 隐 藏 各 种 视 图 包 括 将 窗 体 模 块 加 入 当 前 工 程 等 功 能 对 界 面 设 计 的 辅 助 控 制, 如 控 件 对 齐 方 式 间 距 的 设 置 等 提 供 对 程 序 代 码 进 行 调 试 的 各 种 方 法 执 行 中 断 和 停 止 程 序 实 现 与 数 据 库 有 关 的 查 询 实 现 与 图 表 有 关 的 操 作 主 要 包 括 三 方 面 的 功 能 : 对 集 成 开 发 环 境 进 行 定 制 向 程 序 代 码 中 添 加 过 程 激 活 应 用 程 序 的 菜 单 编 辑 器 主 要 包 括 两 方 面 的 功 能 :Visual Basic 环 境 下 的 数 据 库 管 理 器 外 部 程 序 管 理 器 设 置 Visual Basic 子 窗 口 在 主 窗 口 中 的 排 列 方 式 提 供 Visual Basic 的 联 机 帮 助 1.3.3 工 具 栏 工 具 栏 提 供 了 在 编 辑 环 境 下 快 速 访 问 常 用 命 令 的 方 法, 当 光 标 指 向 工 具 栏 上 的 按 钮 时, 会 显 示 工 具 按 钮 的 名 称 及 功 能, 单 击 工 具 栏 上 的 按 钮, 将 执 行 该 按 钮 所 对 应 的 功 能 Visual Basic 6.0 中 提 供 了 4 种 工 具 栏 : 标 准 工 具 栏 调 试 工 具 栏 编 辑 工 具 栏 和 窗 体 编 辑 器 工 具 栏 启 动 Visual Basic 后, 系 统 默 认 主 窗 口 中 只 显 示 标 准 工 具 栏, 其 他 工 具 栏 可 以 通 过 视 图 菜 单 中 的 工 具 栏 命 令 打 开 和 关 闭 图 1.3 所 示 的 是 标 准 工 具 栏, 它 列 出 了 Visual Basic 应 用 程 序 中 最 常 用 的 命 令 图 1.3 标 准 工 具 栏 图 1.4 所 示 的 是 调 试 工 具 栏, 它 用 于 调 试 程 序, 主 要 功 能 包 括 程 序 的 运 行 暂 停 和 停 止 等 可 以 通 过 视 图 菜 单 中 的 工 具 栏 命 令 打 开 和 关 闭 图 1.4 调 试 工 具 栏 6

第 1 章 Visual Basic 概 述 7 图 1.5 所 示 的 是 编 辑 工 具 栏, 它 用 于 对 用 户 编 写 的 程 序 或 用 户 建 立 的 各 种 对 象 进 行 编 辑 工 作 可 以 通 过 视 图 菜 单 中 的 工 具 栏 命 令 打 开 和 关 闭 图 1.5 编 辑 工 具 栏 图 1.6 所 示 的 窗 体 编 辑 器 工 具 栏, 它 用 于 对 控 件 的 大 小 对 齐 方 式 等 的 设 置 可 以 通 过 视 图 菜 单 中 的 工 具 栏 命 令 打 开 和 关 闭 图 1.6 窗 体 编 辑 器 工 具 栏 1.3.4 工 具 箱 控 件 是 构 成 Visual Basic 应 用 程 序 和 用 户 界 面 的 基 本 组 成 部 分 工 具 箱 中 列 出 了 Visual Basic 的 常 用 控 件, 不 同 的 图 标 代 表 不 同 的 控 件 类 型, 因 此, 可 以 说 工 具 箱 是 控 件 的 选 用 区 将 控 件 放 置 到 窗 体 的 表 面 有 两 种 操 作 方 法 : 一 种 是 先 单 击 控 件 工 具 箱 上 的 某 个 控 件, 然 后 使 用 鼠 标 拖 动 的 方 法 将 该 控 件 在 窗 体 表 面 上 画 出 来 ; 另 一 种 是 双 击 控 件 工 具 箱 上 的 某 一 个 控 件, 该 控 件 对 象 就 会 自 动 出 现 在 窗 体 中 央, 其 大 小 是 默 认 的 图 1.7 列 出 了 所 有 Visual Basic 内 部 控 件 需 要 说 明 的 是, 图 中 左 上 角 的 箭 头 不 是 控 件, 单 击 它 可 以 把 鼠 标 指 针 由 其 他 形 状 变 为 箭 头 形 状 图 1.7 Visual Basic 的 工 具 箱 工 具 箱 中 除 了 有 Visual Basic 内 部 控 件, 还 可 以 添 加 Active 控 件 ( 又 称 为 外 部 控 件 ), 向 工 具 箱 中 添 加 控 件 的 步 骤 如 下 (1) 将 鼠 标 指 向 控 件 窗 口 的 任 意 位 置, 单 击 右 键, 显 示 快 捷 菜 单, 然 后 单 击 部 件 选 项, 此 时, 屏 幕 上 显 示 如 图 1.8 所 示 的 部 件 对 话 框, 在 列 表 框 中 显 示 出 可 以 使 用 的 外 部 控 件 列 表 (2) 选 中 需 要 添 加 到 工 具 箱 的 控 件, 然 后 单 击 确 定 按 钮, 选 定 的 控 件 就 会 出 现 在 工 具 箱 中 7

8 Visual Basic 程 序 设 计 图 1.8 部 件 对 话 框 1.3.5 窗 口 除 了 图 1.2 所 示 的 Visual Basic 集 成 开 发 环 境 窗 口 以 外,Visual Basic 还 有 一 些 其 他 的 窗 口, 它 们 分 别 是 窗 体 设 计 器 窗 口 工 程 资 源 管 理 器 窗 口 属 性 窗 口 代 码 编 辑 器 窗 口 窗 体 布 局 窗 口 和 立 即 窗 口 1. 窗 体 设 计 器 窗 口 窗 体 设 计 器 窗 口 简 称 窗 体 (Form), 它 是 Visual Basic 最 基 本 的 对 象, 提 供 与 用 户 交 互 的 窗 口, 每 当 Visual Basic 启 动 时, 系 统 会 打 开 一 个 窗 体, 默 认 名 称 为 Form1, 用 户 也 可 以 通 过 属 性 窗 口 的 Name( 名 称 ) 属 性 设 置 来 改 变 窗 体 名 称 如 果 应 用 程 序 需 要 多 个 窗 体, 可 以 选 择 工 程 添 加 窗 体 菜 单 创 建 新 窗 体 在 程 序 设 计 时, 程 序 员 可 根 据 程 序 界 面 的 要 求, 从 工 具 箱 中 选 择 所 需 要 的 内 部 控 件, 并 在 窗 体 中 画 出 来, 以 形 成 程 序 运 行 时 的 用 户 界 面 窗 口 2. 工 程 资 源 管 理 窗 口 在 Visual Basic 集 成 开 发 环 境 窗 口 右 侧 的 第 一 个 窗 口 就 是 工 程 资 源 管 理 窗 口, 在 这 个 窗 口 中, 包 含 有 建 立 应 用 程 序 所 需 要 的 文 件 清 单, 在 工 程 资 源 管 理 窗 口 中 的 文 件 可 以 分 为 以 下 几 类 (1) 工 程 文 件 和 工 程 组 文 件 ( 文 件 的 扩 展 名 为.vbp 和.vbg) 工 程 是 一 个 用 来 建 立 保 存 和 管 理 应 用 程 序 中 的 各 种 相 关 信 息 的 管 理 系 统, 同 时 也 是 应 用 程 序 的 集 合 体, 每 个 工 程 对 应 一 个 工 程 文 件, 它 的 扩 展 名 为.vbp 当 一 个 程 序 包 括 两 个 以 上 的 工 程 时, 这 些 工 程 就 构 成 了 一 个 工 程 组, 工 程 组 的 扩 展 名 为.vbg 使 用 文 件 菜 单 中 的 新 建 工 程 命 令 可 以 建 立 一 个 工 程, 使 用 打 开 工 程 命 令 可 以 打 开 一 个 已 有 的 工 程, 而 使 用 添 加 工 程 命 令 则 可 以 添 加 一 个 工 程 8

第 1 章 Visual Basic 概 述 9 (2) 窗 体 文 件 ( 文 件 的 扩 展 名 为.frm) 每 一 个 窗 体 对 应 一 个 窗 体 文 件, 窗 体 及 其 控 件 和 其 他 信 息 都 存 放 在 该 窗 体 文 件 中, 一 个 应 用 程 序 可 以 有 多 个 窗 体 ( 最 多 可 达 255 个 ), 它 的 扩 展 名 为.frm 执 行 工 程 菜 单 中 的 添 加 窗 体 命 令 可 以 添 加 一 个 窗 体, 而 执 行 工 程 菜 单 中 的 移 除 form 命 令 可 以 删 除 当 前 窗 体 (3) 标 准 模 块 文 件 ( 文 件 的 扩 展 名 为.bas) 标 准 模 块 文 件 是 纯 代 码 文 件, 由 程 序 代 码 组 成, 主 要 用 来 声 明 全 局 变 量 和 定 义 一 些 通 用 的 过 程 它 不 属 于 任 何 窗 体, 可 以 被 不 同 的 窗 体 程 序 调 用 标 准 模 块 通 过 工 程 菜 单 中 的 添 加 模 块 命 令 建 立 (4) 类 模 块 文 件 ( 文 件 的 扩 展 名 为.cls) 类 模 块 用 来 定 义 和 保 存 用 户 根 据 程 序 设 计 的 需 要 建 立 的 类 代 码, 每 一 类 都 用 一 个 文 件 保 存, 它 的 文 件 扩 展 名 为.cls 通 过 工 程 菜 单 中 的 添 加 类 模 块 命 令 可 以 建 立 类 模 块 (5) 资 源 文 件 ( 文 件 的 扩 展 名 为.res) 资 源 文 件 是 纯 代 码 文 件, 其 中 可 以 存 放 文 本 图 片 声 音 等 多 种 资 源 文 件 除 以 上 几 类 文 件 以 外, 在 工 程 资 源 管 理 窗 口 的 顶 部 还 有 3 个 按 钮 查 看 代 码 按 钮 : 用 来 显 示 相 应 文 件 的 代 码 查 看 对 象 按 钮 : 用 来 显 示 相 应 的 窗 体 切 换 文 件 夹 按 钮 : 用 来 显 示 各 类 文 件 所 在 的 文 件 夹 3. 属 性 窗 口 属 性 窗 口 用 于 设 定 对 象 的 属 性, 通 过 视 图 菜 单 中 的 属 性 窗 口 命 令, 即 可 打 开 属 性 窗 口 该 窗 口 由 对 象 选 择 框 属 性 显 示 排 列 方 式 属 性 列 表 框 及 当 前 属 性 的 解 释 框 4 部 分 组 成 (1) 对 象 选 择 框 位 于 属 性 窗 口 的 上 方, 在 这 一 栏 的 右 侧 有 一 个 下 拉 按 钮, 单 击 它 便 会 显 示 对 象 列 表 在 对 象 列 表 中 选 择 一 个 对 象, 该 对 象 的 属 性 就 会 显 示 在 下 方 的 属 性 列 表 框 中 (2) 属 性 显 示 排 列 方 式 它 有 两 个 标 签 : 按 字 母 序 和 按 分 类 序, 因 此 可 以 按 字 母 方 式 排 列 对 象 属 性 和 按 对 象 属 性 分 类 排 列 对 象 属 性 (3) 属 性 列 表 框 位 于 属 性 窗 口 的 中 间, 分 为 左 右 两 栏, 左 边 显 示 的 是 属 性 的 名 称, 右 边 显 示 的 是 属 性 值 设 置 属 性 值 可 以 使 用 以 下 3 种 方 法 通 过 键 盘 直 接 输 入 属 性 值 单 击 属 性 值 右 边 的 下 拉 箭 头, 在 列 出 的 选 项 中 选 择 单 击 属 性 值 右 边 的 选 择 按 钮, 打 开 一 个 对 话 框 来 设 置 属 性 (4) 属 性 解 释 框 位 于 属 性 窗 口 的 底 部, 每 选 中 一 种 对 象 属 性, 在 其 下 方 的 属 性 解 释 框 中 就 会 显 示 该 属 性 的 名 称 及 功 能 9

10 Visual Basic 程 序 设 计 4. 代 码 编 辑 窗 口 用 来 输 入 应 用 程 序 代 码 的 编 辑 器, 应 用 程 序 的 每 个 窗 体 或 代 码 模 块 都 有 一 个 单 独 的 代 码 编 辑 窗 口 用 户 可 通 过 工 程 资 源 管 理 窗 口 自 由 地 在 窗 体 设 计 窗 口 或 代 码 编 辑 窗 口 之 间 进 行 切 换, 双 击 某 一 个 对 象 也 可 进 入 代 码 编 辑 窗 口 如 图 1.9 所 示 的 是 代 码 编 辑 窗 口 图 1.9 代 码 编 辑 窗 口 5. 窗 体 布 局 窗 口 在 窗 体 布 局 窗 口 中 可 以 使 用 表 示 屏 幕 小 图 像 来 布 置 应 用 程 序 中 各 窗 体 的 位 置, 设 计 时 可 以 使 用 鼠 标 把 窗 体 拖 动 到 一 个 新 的 位 置, 运 行 时 窗 体 就 会 定 位 到 新 位 置 上 6. 立 即 窗 口 立 即 窗 口 是 为 调 试 应 用 程 序 提 供 的, 用 户 可 以 直 接 在 该 窗 口 中 利 用 Print 方 法 显 示 表 达 式 的 值 1.4 可 视 化 编 程 的 基 本 概 念 1.4.1 对 象 对 象 (Object) 是 代 码 和 数 据 的 集 合, 也 是 对 具 有 某 些 相 同 特 性 的 具 体 事 物 的 抽 象, 对 象 在 现 实 生 活 中 是 很 常 见 的, 比 如 人 电 话 等 都 是 对 象 在 Visual Basic 中 对 象 分 为 两 类, 一 类 是 由 系 统 设 计 好 的, 称 为 预 定 义 对 象, 用 户 可 以 直 接 使 用 或 对 其 进 行 操 作, 比 如 窗 体 及 各 种 内 部 控 件 等 都 是 Visual Basic 预 定 义 对 象 ; 另 一 类 由 用 户 定 义 的, 称 为 用 户 对 象, 程 序 员 可 以 定 义 和 建 立 用 户 对 象 从 可 视 化 编 程 的 角 度 来 看, 对 象 是 一 个 具 有 某 种 属 性 和 方 法 并 能 响 应 外 部 事 件 的 实 体 一 个 对 象 建 立 以 后, 操 作 就 是 通 过 与 对 象 有 关 的 属 性 事 件 和 方 法 来 描 述 的 1.4.2 属 性 对 象 的 属 性 用 来 表 示 对 象 的 状 态 以 及 控 制 对 象 的 外 观 和 行 为 可 以 通 过 改 变 对 象 的 属 性 值 来 改 变 对 象 的 特 征 比 如 可 以 改 变 对 象 的 颜 色 大 小 属 性 来 改 变 该 对 象 的 外 观 特 征 10

对 象 的 属 性 有 两 个 基 本 特 点 第 1 章 Visual Basic 概 述 11 不 同 的 对 象 有 不 同 的 属 性, 比 如, 标 签 控 件 具 有 标 题 属 性, 而 文 本 框 控 件 则 不 具 备 这 个 属 性 同 一 个 对 象 有 多 个 不 同 的 属 性, 比 如 命 令 按 钮, 它 不 仅 具 有 Caption( 标 题 ) 属 性, 还 具 有 其 他 的 属 性, 如 Name( 名 称 ) Color( 颜 色 ) Visible( 可 见 性 ) 等 对 象 的 属 性 可 通 过 以 下 两 种 方 法 设 置 (1) 在 程 序 设 计 阶 段, 可 通 过 属 性 窗 口 设 置 对 象 的 属 性 值 (2) 在 程 序 运 行 阶 段, 由 程 序 代 码 设 置 对 象 的 属 性 值, 其 格 式 为 : [< 对 象 名 >.]< 属 性 名 >=< 属 性 值 > 例 如 : 要 将 一 个 名 为 Command1 的 命 令 按 钮 的 Caption 属 性 值 设 置 为 取 消, 则 可 用 以 下 语 句 : Command1.Caption=" 取 消 " 其 中 Command1 为 对 象 名,Caption 为 属 性, 字 符 串 取 消 就 是 设 定 的 属 性 值 在 Visual Basic 中 大 部 分 属 性 在 设 计 和 运 行 时 都 可 设 置, 但 也 有 少 部 分 属 性 只 能 在 设 计 阶 段 或 者 运 行 阶 段 才 能 设 置 1.4.3 事 件 对 象 的 事 件 是 指 由 系 统 预 先 设 置 好 的, 能 够 被 对 象 所 识 别 和 响 应 的 动 作 比 如 Click( 单 击 ) 事 件 KeyPress( 键 盘 按 下 ) 事 件 及 Load( 装 入 ) 事 件 等 在 这 些 事 件 中, 有 的 事 件 是 由 用 户 操 作 引 发 的, 如 用 户 单 击 某 一 个 窗 体, 将 产 生 窗 体 的 单 击 事 件 ; 有 的 事 件 是 由 系 统 的 消 息 触 发 的, 如 某 一 个 窗 体 装 入 时, 它 将 自 动 产 生 该 窗 体 的 Load 事 件 为 了 响 应 某 个 事 件 以 完 成 某 个 功 能, 设 计 人 员 必 须 针 对 这 个 事 件 编 制 一 段 程 序 代 码, 这 样 的 一 段 程 序 代 码 就 称 为 事 件 过 程 在 Visual Basic 中 系 统 会 自 动 给 出 事 件 过 程 的 结 构, 作 为 设 计 人 员 只 需 要 将 程 序 代 码 放 入 事 件 过 程 中 事 件 过 程 的 一 般 格 式 如 下 : Private Sub 对 象 名 _ 事 件 名 () 事 件 过 程 程 序 代 码 其 中, 对 象 名 指 的 是 该 对 象 的 Name( 名 称 ) 属 性, 事 件 名 是 由 Visual Basic 预 先 定 义 好 的 赋 给 该 对 象 的 事 件 1.4.4 方 法 对 象 的 方 法 是 对 象 要 执 行 的 动 作 每 种 方 法 可 使 对 象 完 成 某 个 特 定 的 功 能 如 窗 体 对 象 的 Print( 打 印 ) 方 法 Cls( 清 除 ) 方 法 等 同 一 个 对 象 有 多 种 方 法, 不 同 的 对 象 有 不 同 的 方 法, 并 且 其 方 法 只 能 在 编 程 中 调 用 它 的 调 用 格 式 为 : [< 对 象 名 >.] 方 法 名 [( 参 数 )] 11

12 Visual Basic 程 序 设 计 如 :Forml.Print " 欢 迎 您!" 其 中,Forml 为 窗 体 对 象 名,Print 就 是 Forml 对 象 的 方 法 名, 此 方 法 的 功 能 是 在 窗 体 Forml 中 显 示 欢 迎 您! 1.5 创 建 窗 体 窗 体 像 一 块 画 布, 它 是 所 有 控 件 的 容 器 在 设 计 程 序 时, 窗 体 是 程 序 设 计 人 员 的 工 作 平 台 ; 在 程 序 运 行 阶 段, 窗 体 则 是 用 户 界 面 的 窗 口 窗 体 是 Visual Basic 中 的 一 个 重 要 对 象, 具 有 自 己 的 属 性 事 件 和 方 法 1.5.1 窗 体 的 属 性 1. Name 属 性 Name( 名 称 ) 属 性 用 来 定 义 窗 体 的 名 称, 每 个 窗 体 都 必 须 有 一 个 Name 属 性, 以 便 在 代 码 中 用 这 个 名 称 引 用 窗 体, 它 与 对 象 的 标 题 (Caption) 属 性 不 一 样 在 工 程 中 添 加 第 一 个 窗 体 对 象 时, 系 统 会 给 窗 体 Name 属 性 的 值 自 动 赋 一 个 默 认 名 称 :Forml 而 以 后 在 同 一 个 工 程 中 添 加 其 他 的 窗 体 时, 它 的 默 认 名 称 则 在 后 面 的 数 字 逐 次 加 1 来 表 示, 如 Form2 Form3 为 了 提 高 程 序 的 可 维 护 性, 便 于 识 别 窗 体 的 功 能, 一 般 给 窗 体 对 象 名 设 置 一 个 有 实 际 意 义 的 名 称, 并 建 议 以 frm 为 前 缀 需 要 用 户 注 意 的 是 :Name 属 性 是 只 读 属 性, 即 只 能 在 属 性 窗 口 中 设 置, 不 能 在 程 序 代 码 中 设 置 2. Caption 属 性 Caption( 标 题 ) 属 性 用 来 定 义 窗 体 的 标 题 栏 上 的 文 字, 默 认 值 与 默 认 的 对 象 名 相 同, 该 属 性 既 可 在 属 性 窗 口 中 设 置, 也 可 以 在 程 序 代 码 中 设 置, 在 代 码 中 设 置 该 属 性 的 语 法 格 式 如 下 : [< 窗 体 名 称 >.] Caption [= 字 符 串 ] 如 :Form1.Caption=" 登 录 用 户 " 3. BackColor 和 ForeColor 属 性 BackColor( 背 景 颜 色 ) 属 性 用 来 设 置 窗 体 的 背 景 颜 色, 而 ForeColor( 前 景 颜 色 ) 属 性 则 用 来 设 置 窗 体 的 前 景 颜 色 每 种 颜 色 是 用 一 个 十 六 进 制 常 量 来 表 示 的 在 程 序 设 计 阶 段, 一 般 不 用 颜 色 常 量 来 设 置, 而 是 通 过 调 色 板 直 观 地 设 置 其 操 作 方 法 为 : 在 属 性 窗 口 中, 用 鼠 标 双 击 BackColor 或 ForeColor 属 性, 从 弹 出 的 调 色 板 中 单 击 调 色 板 中 的 某 个 色 块, 即 可 把 这 种 颜 色 设 置 为 窗 体 的 背 景 色 或 前 景 色 4. BorderStyle 属 性 该 属 性 用 来 确 定 窗 体 的 边 框 样 式, 取 值 为 0~5 之 间 的 整 数, 如 表 1-2 所 示 12

第 1 章 Visual Basic 概 述 13 表 1-2 Borderstyle 属 性 值 的 设 置 属 性 值 功 能 0 None 1 Fixedsingle 2 Sizable 3 FixedDialog 4 FixedToolWindow 5 SizableToolWindow 无 边 框 窗 体, 它 不 含 控 制 菜 单 框 标 题 栏 及 窗 体 控 制 按 钮 固 定 单 边 框 窗 体, 运 行 时 不 能 改 变 窗 体 的 大 小 标 准 窗 体 形 式, 该 窗 体 具 有 Windows 标 准 窗 体 形 式 固 定 对 话 框 窗 体 形 式, 窗 体 的 大 小 不 能 改 变 固 定 工 具 窗 体 形 式, 只 有 一 个 关 闭 按 钮, 并 且 窗 体 的 大 小 不 能 改 变 可 变 大 小 工 具 窗 体 形 式, 只 有 一 个 关 闭 按 钮, 并 且 窗 体 的 大 小 能 改 变 BorderStyle 属 性 是 只 读 属 性, 即 只 能 在 属 性 窗 口 设 置, 不 能 在 程 序 运 行 期 间 通 过 代 码 设 置 5. Enabled 属 性 该 属 性 决 定 窗 口 对 象 是 否 有 效, 其 默 认 值 为 True 该 属 性 的 值 为 True 时, 表 示 允 许 用 户 操 作 窗 口, 并 对 操 作 做 出 响 应 ; 该 属 性 的 值 为 False 时, 表 示 禁 止 用 户 操 作 窗 体, 即 窗 体 呈 灰 色 用 代 码 设 置 该 属 性 时, 一 般 格 式 为 : [< 对 象 名 >.]Enabled [=Boolean] 6. Visible 属 性 该 属 性 决 定 对 象 是 否 可 见, 其 默 认 值 为 True 该 属 性 的 值 为 True 时, 程 序 运 行 时 窗 体 可 见 ; 该 属 性 的 值 为 False 时, 程 序 运 行 时 该 窗 体 隐 藏, 即 不 可 见 用 代 码 设 置 该 属 性 的 一 般 格 式 为 : [< 对 象 名 >.]Visible [=Boolean] 7. Windowstate 属 性 该 属 性 决 定 窗 体 的 当 前 状 态 是 还 原 最 小 化 还 是 最 大 化 其 属 性 取 值 如 表 1-3 所 示 用 代 码 设 置 该 属 性 时, 一 般 格 式 为 : [< 对 象 名 >.] Windowstate [= 设 置 值 ] 表 1-3 Windowstate 属 性 值 的 设 置 属 性 值 功 能 0 Normal 1 Minmized 2 Maxmized 默 认 值, 运 行 时 的 大 小 与 设 计 相 同 最 小 化 状 态, 显 示 一 个 示 意 图 标 最 大 化 状 态, 窗 体 充 满 整 个 屏 幕 8. MaxButton 和 MinButton 属 性 这 两 个 属 性 分 别 决 定 窗 体 标 题 栏 上 的 最 大 化 与 最 小 化 按 钮 是 否 可 用, 它 们 的 系 统 默 认 值 为 True 当 其 值 为 True 时 可 用, 其 值 为 False 时 不 可 用 并 且 这 两 个 属 性 只 有 在 运 行 期 间 起 作 用 在 设 计 阶 段 这 两 个 属 性 的 设 置 不 起 作 用 13

14 Visual Basic 程 序 设 计 另 外 MaxButton 和 MinButton 属 性 只 能 在 属 性 窗 口 中 设 置, 不 能 在 程 序 运 行 期 间 用 代 码 设 置 9. Left 和 Top 属 性 Left 属 性 的 值 决 定 了 窗 体 外 框 的 左 边 缘 与 屏 幕 显 示 区 左 边 缘 之 间 的 距 离 Top 属 性 的 值 决 定 了 窗 体 外 框 上 边 缘 与 屏 幕 显 示 区 上 边 缘 之 间 的 距 离 这 两 个 属 性 主 要 用 来 控 制 窗 体 的 位 置, 其 默 认 单 位 为 twip 用 代 码 设 置 该 属 性 的 一 般 格 式 为 : [< 对 象 名 >.]Top[= 数 值 ] [< 对 象 名 >.]Left[= 数 值 ] 10. Width 和 Height 属 性 Width 属 性 的 值 决 定 窗 体 的 宽 度,Height 属 性 值 决 定 窗 体 的 高 度, 它 们 的 默 认 单 位 为 twip 用 代 码 设 置 它 们 的 属 性 的 格 式 如 下 : [< 对 象 名 >.] Height[= 数 值 ] [< 对 象 名 >.] Width[= 数 值 ] 11. Font 属 性 该 属 性 用 来 设 置 窗 体 上 的 字 体 的 格 式 大 小 及 字 体 等 12. Picture 属 性 该 属 性 用 于 在 窗 体 中 显 示 一 个 图 形 窗 体 的 Picture 属 性 一 般 只 在 设 计 阶 段 通 过 属 性 窗 口 设 置 其 操 作 方 法 是 在 属 性 窗 口 选 择 该 属 性, 单 击 其 右 端 的 按 钮, 在 弹 出 的 加 载 图 片 对 话 框 中 选 择 一 个 图 形 文 件, 该 图 片 即 可 显 示 在 窗 体 上, 该 属 性 可 以 显 示 扩 展 名 为 bmp wmf gif ico jpg 等 多 种 格 式 的 图 形 文 件 1.5.2 窗 体 的 方 法 1. Cls 方 法 Cls 方 法 用 来 清 除 由 Print 方 法 在 窗 体 或 图 片 框 中 显 示 的 文 本 或 者 使 用 绘 图 方 法 在 窗 体 或 图 片 框 中 显 示 的 图 形 其 语 法 为 : [< 窗 体 名 >.]Cls 需 要 说 明 的 是, 在 设 计 时 在 窗 体 中 使 用 Picture 属 性 设 置 的 背 景 图 形 不 受 Cls 方 法 的 影 响 2. Print 方 法 Print 方 法 用 于 在 窗 口 中 显 示 信 息 其 语 法 为 : [< 窗 体 名 >.]Print[< 表 达 式 列 表 >1, ] 其 中, 表 达 式 列 表 是 一 个 或 几 个 表 达 式, 可 以 是 数 值 表 达 式 或 字 符 串 表 达 式 如 果 是 数 值 表 达 式, 则 输 出 表 达 式 的 值 ; 如 果 是 字 符 串 表 达 式, 则 原 样 输 出 ; 如 果 省 略 表 达 式 列 表, 则 输 出 一 个 空 行 14

第 1 章 Visual Basic 概 述 15 3. Show 方 法 Show 方 法 用 于 显 示 窗 体 如 果 窗 体 被 遮 住, 通 过 调 用 Show 方 法 可 以 将 其 移 到 屏 幕 的 顶 端 其 语 法 为 : [< 窗 体 名 >.]Show[Style] 其 中, 参 数 style 为 0 时, 窗 体 是 无 模 式 的 ;style 为 1 时, 窗 体 是 有 模 式 的 当 用 Show 方 法 显 示 无 模 式 窗 体 时, 在 Show 方 法 之 后 遇 到 的 代 码 将 要 执 行 ; 而 当 用 Show 方 法 显 示 有 模 式 窗 体 时, 其 后 的 代 码 要 到 该 窗 体 被 隐 藏 或 卸 载 时 才 能 被 执 行 4. Hide 方 法 Hide 方 法 用 于 隐 藏 窗 体, 其 语 法 为 : [< 窗 体 名 >.]Hide 窗 体 隐 藏 后, 窗 体 不 可 见, 但 未 从 内 存 中 清 除 1.5.3 窗 体 的 事 件 事 件 的 作 用 在 于 能 够 对 用 户 的 行 为 做 出 响 应, 与 窗 体 有 关 的 事 件 较 多, 在 这 里 仅 对 最 常 用 的 几 个 事 件 进 行 介 绍 1. Click( 单 击 ) 事 件 程 序 运 行 后, 当 鼠 标 在 窗 口 内 的 某 一 个 位 置 单 击 时, 触 发 该 事 件 2. Load( 装 入 ) 事 件 Load 事 件 是 在 窗 体 被 装 载 时, 由 系 统 触 发 通 常 可 以 在 Load 事 件 过 程 中 编 写 窗 体 启 动 代 码, 用 来 对 窗 体 或 窗 体 内 的 控 件 进 行 初 始 化 3. Activate( 活 动 ) 和 Deactivate( 非 活 动 ) 事 件 当 一 个 窗 体 变 为 活 动 窗 体 时 触 发 Activate 事 件, 而 在 一 个 窗 体 变 为 非 活 动 窗 口 前 触 发 Deactivate 事 件 1.6 用 Visual Basic 开 发 应 用 程 序 1.6.1 用 Visual Basic 开 发 应 用 程 序 的 一 般 步 骤 Visual Basic 的 最 大 的 特 点 就 是 在 Visual Basic 环 境 下, 可 以 以 最 快 的 速 度 和 效 率 开 发 具 有 良 好 用 户 界 面 的 应 用 程 序 用 Visual Basic 开 发 应 用 程 序 的 一 般 步 骤 如 下 1. 创 建 一 个 新 的 工 程 单 击 文 件 菜 单 中 的 新 建 工 程 命 令 后, 将 弹 出 一 个 新 建 工 程 对 话 框, 单 击 该 对 话 框 中 的 标 准 EXE 图 标, 然 后 单 击 确 定 按 钮, 用 户 就 建 立 了 一 个 默 认 名 称 为 工 15

16 Visual Basic 程 序 设 计 程 1 的 工 程, 在 此 工 程 中 会 有 一 个 默 认 名 为 Form1 的 窗 体 2. 在 Visual Basic 应 用 程 序 界 面 上 添 加 控 件 用 Visual Basic 开 发 环 境 编 写 应 用 程 序, 编 程 人 员 不 需 要 编 写 大 量 的 代 码 来 描 述 用 户 界 面 的 外 观 和 位 置, 只 需 要 根 据 应 用 需 要 在 窗 体 上 添 加 控 件 在 这 个 过 程 中, 必 须 掌 握 添 加 选 择 控 件 的 基 本 操 作 (1) 向 窗 体 中 添 加 控 件 向 窗 体 中 添 加 控 件 的 方 法 通 常 有 两 种 方 法 1: 1 双 击 工 具 箱 中 要 使 用 的 控 件, 该 控 件 就 会 出 现 在 窗 体 的 正 中 央 2 将 控 件 移 到 适 当 位 置 并 调 整 其 大 小 方 法 2: 1 用 鼠 标 单 击 所 需 控 件 2 移 动 鼠 标 到 窗 体 上 适 当 的 位 置, 此 时 光 标 变 为 十 字 形, 然 后 拖 动 鼠 标, 即 可 以 在 窗 体 上 画 出 一 个 控 件 (2) 对 多 个 控 件 的 选 择 对 多 个 控 件 进 行 操 作 前, 必 须 选 择 需 要 操 作 的 控 件, 选 择 控 件 通 常 有 两 种 方 法 方 法 1: 按 住 Shift 键 不 松 开, 再 用 鼠 标 单 击 每 一 个 要 选 择 的 控 件 方 法 2: 用 鼠 标 在 窗 体 上 拖 出 一 个 虚 框, 被 框 中 的 控 件 被 选 中 此 外, 为 了 创 建 整 齐 美 观 的 用 户 界 面, 往 往 需 要 窗 体 中 同 类 控 件 的 大 小 相 等, 间 距 相 同, 可 以 选 择 这 些 控 件, 然 后 使 用 格 式 菜 单 中 的 各 种 命 令 实 现 上 述 要 求, 注 意 所 有 的 对 齐 都 是 以 基 准 控 件 为 对 齐 基 准 来 进 行 的 3. 设 置 窗 体 和 控 件 的 属 性 建 立 界 面 以 后, 可 以 根 据 应 用 的 需 要 对 窗 体 及 每 个 控 件 设 置 属 性 4. 编 写 事 件 驱 动 代 码 事 件 驱 动 程 序 是 Visual Basic 应 用 程 序 的 核 心 部 分, 编 写 事 件 驱 动 过 程 的 步 骤 如 下 (1) 在 窗 体 设 计 界 面 中 选 中 某 个 控 件, 然 后 双 击, 即 进 入 代 码 窗 口 (2) 在 代 码 窗 口 中, 有 两 个 下 拉 列 表 框, 左 边 的 为 对 象 列 表 框, 右 边 的 为 过 程 列 表 框 (3) 用 户 根 据 需 要 在 对 象 列 表 框 中 选 择 对 象, 在 过 程 列 表 框 中, 选 择 该 对 象 的 事 件 (4) 在 代 码 编 辑 窗 口 的 事 件 过 程 中, 编 写 事 件 代 码 5. 程 序 的 调 试 与 运 行 运 行 程 序 有 3 种 方 式 (1) 单 击 工 具 栏 上 的 启 动 按 钮, 可 运 行 程 序 (2) 单 击 运 行 菜 单 中 的 启 动 命 令 (3) 按 F5 键 程 序 的 逻 辑 比 较 复 杂 时, 通 常 不 能 保 证 所 编 写 的 程 序 运 行 时 不 出 现 错 误, 而 需 要 反 复 多 次 的 调 试 用 户 可 以 按 F8 键 或 使 用 调 试 菜 单 下 的 逐 语 句 命 令, 进 入 程 序 的 调 试 16

第 1 章 Visual Basic 概 述 17 模 式, 在 该 模 式 下, 可 以 将 代 码 单 行 运 行, 分 析 出 现 的 问 题, 进 而 解 决 问 题 6. 保 存 在 窗 体 和 代 码 设 计 好 以 后, 为 了 防 止 出 现 死 机 等 故 障 而 造 成 的 应 用 程 序 的 丢 失, 需 要 及 时 对 应 用 程 序 进 行 保 存 保 存 窗 体 文 件 及 其 他 Visual Basic 文 件 的 步 骤 如 下 (1) 单 击 文 件 菜 单 中 的 保 存 工 程 命 令, 打 开 文 件 另 存 为 对 话 框 (2) 在 文 件 另 存 为 对 话 框 中, 指 定 保 存 文 件 的 目 录 及 窗 体 文 件 名, 单 击 保 存 按 钮 (3) 最 后 在 工 程 另 存 为 对 话 框 中, 指 定 保 存 工 程 文 件 的 目 录 及 工 程 名, 单 击 保 存 按 钮 1.6.2 编 写 一 个 简 单 的 Visual Basic 应 用 程 序 下 面 将 通 过 一 个 例 子 来 说 明 如 何 在 Visual Basic 环 境 下 设 计 一 个 应 用 程 序 例 1.1 设 计 一 个 Visual Basic 应 用 程 序, 在 用 户 界 面 上 单 击 显 示 按 钮 后, 窗 体 上 显 示 Visual Basic 欢 迎 您, 单 击 退 出 按 钮 时, 结 束 整 个 应 用 程 序, 其 步 骤 如 下 1. 新 建 工 程 选 择 文 件 菜 单 的 新 建 工 程 命 令, 在 弹 出 的 新 建 工 程 对 话 框 中 选 中 标 准 EXE 图 标, 然 后 单 击 确 定 按 钮, 建 立 一 个 默 认 名 称 为 工 程 1 的 工 程, 在 此 工 程 中 有 一 个 默 认 名 为 Form1 的 窗 体 2. 在 窗 体 Form1 中 添 加 控 件 单 击 工 具 箱 中 的 命 令 按 钮 图 标, 鼠 标 指 针 变 成 +, 在 窗 体 中 拖 动 鼠 标 指 针 至 合 适 的 位 置, 画 出 一 个 命 令 按 钮 Command1, 用 同 样 的 方 法 画 出 命 令 按 钮 Command2 再 单 击 工 具 箱 中 的 标 签 图 标, 鼠 标 指 针 变 成 +, 在 窗 体 中 拖 动 鼠 标 指 针 至 合 适 的 位 置, 画 出 一 个 标 签 Label1 此 时 界 面 如 图 1.10 所 示 图 1.10 例 1.1 的 设 计 界 面 17

18 Visual Basic 程 序 设 计 3. 设 置 控 件 的 属 性 对 象 建 立 好 后, 可 通 过 属 性 窗 口 为 其 设 置 属 性, 各 个 对 象 属 性 值 的 设 置 如 表 1-4 所 示 表 1-4 对 象 的 属 性 设 置 对 象 属 性 设 置 值 Command1 Caption 显 示 Command2 Caption 退 出 Label1 4. 编 写 事 件 代 码 Caption Visible Alignment Visual Basic 欢 迎 您 Flase 2-center 首 先 双 击 显 示 按 钮, 自 动 出 现 代 码 编 辑 窗 口, 在 Command1_Click( ) 过 程 中 编 写 下 列 事 件 过 程 Prirate Sub Command1_click( ) Lable.Visible =True End sub 用 同 样 的 方 法, 双 击 退 出 按 钮, 在 Command2_Click( ) 过 程 中 加 入 语 句 End 5. 运 行 程 序 选 择 运 行 菜 单 下 的 启 动 命 令, 即 可 运 行 在 用 户 界 面 下, 单 击 显 示 按 钮, 将 显 示 Visual Basic 欢 迎 您, 单 击 退 出 按 钮, 退 出 应 用 程 序 6. 保 存 工 程 首 先 选 择 文 件 菜 单 中 的 保 存 工 程 命 令, 在 打 开 的 文 件 另 存 为 对 话 框 中, 选 择 保 存 窗 体 文 件 的 路 径 及 窗 体 文 件 名 form1 以 后, 单 击 保 存 按 钮, 窗 体 文 件 就 被 保 存 了 然 后 在 弹 出 的 工 程 另 存 为 对 话 框 中, 选 择 保 存 工 程 的 路 径 及 工 程 名, 单 击 保 存 按 钮 保 存 工 程 1.7 小 结 Visual Basic 是 Microsoft 公 司 1991 年 推 出 的, 它 提 供 了 开 发 Microsoft Windows 应 用 程 序 的 最 迅 速 最 简 捷 的 方 法 它 不 但 是 专 业 人 员 得 心 应 手 的 开 发 工 具, 而 且 易 于 被 非 专 业 人 员 掌 握 使 用 本 章 主 要 介 绍 了 Visual Basic 的 主 要 特 点 和 集 成 开 发 环 境, 可 视 化 编 程 的 基 本 概 念, 窗 体 的 有 关 属 性 事 件 和 方 法 以 及 开 发 Visual Basic 应 用 程 序 的 一 般 步 骤 等 内 容 18

第 1 章 Visual Basic 概 述 19 Visual Basic 提 供 了 一 个 集 成 开 发 环 境, 在 这 样 一 个 工 作 平 台 上, 用 户 可 以 完 成 应 用 程 序 的 设 计 编 辑 编 译 及 调 试 等 工 作 Visual Basic 6.0 的 集 成 开 发 环 境 与 Windows 环 境 下 的 许 多 应 用 程 序 相 似, 同 样 有 标 题 栏 菜 单 栏 和 工 具 栏 等, 除 此 之 外, 它 还 有 工 具 箱 窗 体 设 计 器 窗 口 资 源 管 理 器 窗 口 属 性 窗 口 窗 体 布 局 窗 口 和 立 即 窗 口 等 使 用 Visual Basic 开 发 应 用 程 序 的 一 般 步 骤 为 : 创 建 一 个 新 的 工 程 在 Visual Basic 应 用 程 序 界 面 上 添 加 控 件 设 置 窗 体 和 控 件 的 属 性 编 写 事 件 驱 动 代 码 调 试 与 运 行 程 序 保 存 工 程 1.8 习 题 一 选 择 题 1. 在 下 列 选 择 项 中,( ) 不 是 Visual Basic 可 能 的 状 态 A) 设 计 状 态 B) 运 行 状 态 C) 工 程 状 态 D) 中 断 状 态 2. 在 程 序 设 计 中, 通 过 ( ) 窗 口 可 以 设 置 窗 体 或 控 件 的 属 性 A) 窗 体 布 局 窗 口 B) 属 性 窗 口 C) 代 码 窗 口 D) 窗 体 设 计 窗 口 3. 窗 体 Form1 的 名 称 属 性 值 为 Myform, 它 的 Load 事 件 过 程 名 是 ( ) A) Form1_Load( ) B) Form_Load( ) C) Me_Load D) Myform_Load( ) 4. 与 C 程 序 设 计 语 言 相 比,Visual Basic 最 突 出 的 特 点 是 ( ) A) 结 构 化 程 序 设 计 B) 程 序 开 发 环 境 C) 事 件 驱 动 编 程 机 制 D) 程 序 调 试 技 术 5. 要 改 变 一 个 窗 体 的 标 题 内 容, 需 重 新 设 置 的 窗 体 属 性 是 ( ) A) Name B) Caption C) Borderstyle D) Enable 6. 启 动 Visual Basic 时, 在 新 建 的 EXE 工 程 中, 不 会 在 工 具 箱 中 出 现 的 控 件 是 ( ) A) 命 令 按 钮 B) ActiveX 控 件 C) 标 签 框 D) 文 本 框 7. 下 列 叙 述 中 正 确 的 是 ( ) A) 只 有 窗 体 才 是 Visual Basic 的 对 象 B) 只 有 控 件 才 是 Visual Basic 的 对 象 C) 窗 体 和 控 件 都 不 是 Visual Basic 的 对 象 D) 窗 体 和 控 件 都 是 Visual Basic 的 对 象 8. 打 开 便 携 式 电 脑, 其 中 电 脑 便 携 式 打 开 依 次 是 下 面 的 哪 一 项? ( ) A) 对 象 属 性 方 法 B) 属 性 对 象 方 法 C) 属 性 方 法 对 象 D) 对 象 方 法 属 性 二 填 空 题 1. 工 程 文 件 的 扩 展 名 是, 窗 体 文 件 的 扩 展 名 是, 标 准 模 块 文 件 的 扩 展 名 是 2. 可 以 通 过 菜 单 中 的 命 令 退 出 Visual Basic 19

20 Visual Basic 程 序 设 计 3. 程 序 运 行 后, 当 单 击 窗 体 本 身 ( 不 是 窗 体 上 的 控 件 ) 时, 将 触 发 窗 体 的 事 件 4. 在 窗 口 中 可 以 查 看 工 程 的 文 件 结 构 5. 若 要 改 变 窗 体 运 行 时 在 窗 口 中 的 位 置, 可 在 窗 口 中 设 置 三 编 程 题 编 写 一 个 应 用 程 序 要 求 设 置 窗 体 的 标 题 是 第 一 个 Visual Basic 程 序, 程 序 执 行 时, 单 击 窗 体, 在 窗 体 中 显 示 以 下 红 色 文 字 : 这 是 我 编 写 的 第 一 个 Visual Basic 应 用 程 序 20

第 2 章 Visual Basic 程 序 设 计 基 础 教 学 提 示 : 要 使 用 Visual Basic 编 写 程 序, 就 必 须 掌 握 Visual Basic 程 序 设 计 语 言 的 语 法 规 则 本 章 将 主 要 介 绍 Visual Basic 的 基 本 数 据 类 型 常 量 变 量 运 算 符 和 表 达 式, 以 及 Visual Basic 的 常 用 内 部 函 数, 包 括 数 学 函 数 字 符 串 函 数 转 换 函 数 日 期 与 时 间 函 数 等 内 容 教 学 目 标 : 掌 握 Visual Basic 的 基 本 数 据 类 型 常 量 变 量 运 算 符 和 表 达 式 以 及 Visual Basic 的 常 用 内 部 函 数 的 使 用 方 法 2.1 数 据 类 型 数 据 是 程 序 的 必 要 组 成 部 分, 也 是 程 序 处 理 的 对 象, 为 了 合 理 地 组 织 数 据,Visual Basic 将 数 据 分 成 不 同 的 数 据 类 型, 每 种 数 据 类 型 占 用 的 存 储 空 间 不 同, 能 表 示 数 值 的 范 围 也 不 同, 用 户 在 设 计 程 序 时, 应 该 根 据 应 用 的 需 要, 选 择 合 适 的 数 据 类 型 描 述 数 据 并 组 织 程 序 Visual Basic 提 供 了 系 统 定 义 的 数 据 类 型, 即 基 本 数 据 类 型, 同 时 也 允 许 用 户 根 据 应 用 的 需 要 定 义 自 己 的 数 据 类 型, 即 用 户 自 定 义 数 据 类 型, 在 这 里 仅 介 绍 基 本 数 据 类 型, 它 们 主 要 是 数 值 型 字 符 串 型 逻 辑 型 日 期 型 可 变 类 型 和 对 象 型 等 2.1.1 数 值 型 数 据 数 值 型 数 据 可 分 为 以 下 几 类 1. integer( 整 型 ) 整 型 数 是 不 带 小 数 点 和 指 数 符 号 的 数, 每 个 整 型 数 据 占 用 2 个 字 节 (16 位 ) 的 存 储 空 间, 其 类 型 声 明 符 为 %, 其 取 值 范 围 为 -32768~32768 之 间 的 整 数 2. long( 长 整 型 ) 长 整 型 数 也 是 不 带 小 数 点 和 指 数 符 号 的 数, 每 个 长 整 型 的 数 据 占 用 4 个 字 节 (32 位 ) 的 存 储 空 间, 其 类 型 声 明 符 为 &, 其 取 值 范 围 为 -2147483648~2147483647 之 间 的 整 数 3. single( 单 精 度 浮 点 型 ) 单 精 度 浮 点 型 数 是 带 小 数 的 数 值, 通 常 以 指 数 形 式 ( 科 学 记 数 法 ) 来 表 示, 以 E 或 e 表 示 指 数 部 分 每 个 单 精 度 浮 点 型 数 据 占 4 个 字 节 的 存 储 空 间, 可 以 精 确 到 7 位, 其 正 数 的 取 值 范 围 为 1.401298E-45~3.402823E+38, 其 负 数 的 取 值 范 围 为 -3.402823E+38~- 1.401298E-45, 其 类 型 声 明 符 为!

22 Visual Basic 程 序 设 计 4. double( 双 精 度 浮 点 型 ) 双 精 度 浮 点 型 数 也 是 带 有 小 数 的 数 值, 通 常 也 以 指 数 形 式 ( 科 学 记 数 法 ) 表 示, 以 D 或 d 表 示 指 数 部 分, 双 精 度 浮 点 型 数 占 8 个 字 节 的 存 储 空 间, 可 以 精 确 到 15~16 位, 其 正 数 的 取 值 范 围 为 4.94065645841247E-324~1.79769313486232E+308, 其 负 数 的 取 值 范 围 为 -1.79769313486232E+308~-4.94065645841247E-324, 其 类 型 声 明 符 为 # 5. currency( 货 币 型 ) 货 币 类 型 是 为 计 算 货 币 而 设 置 的 数 据 类 型, 它 也 是 一 种 固 定 小 数 点 位 置 的 数 据 类 型, 占 用 8 个 字 节 的 存 储 空 间, 其 小 数 点 左 边 有 15 位 数 字, 右 边 有 4 位 数 字, 其 取 值 范 围 为 - 922337203685477.5808~922337203685477.5807, 其 类 型 声 明 符 为 @ 6. byte( 字 节 型 ) 字 节 型 数 据 用 于 存 储 二 进 制 数 据, 占 用 1 个 字 节 的 存 储 空 间, 其 取 值 范 围 为 0~255 2.1.2 字 符 串 型 数 据 字 符 串 类 型 数 据 (string) 用 来 定 义 一 个 字 符 序 列, 由 ASCII 字 符 组 成, 包 括 标 准 的 ASCII 字 符 和 扩 展 ASCII 字 符, 其 类 型 声 明 符 为 $ 在 Visual Basic 中, 字 符 串 必 须 放 在 双 引 号 内, 其 中 长 度 为 空 的 字 符 串 称 为 空 串, 例 如 ABC ( 空 串 ) 字 符 串 型 数 据 分 为 两 种 一 种 为 变 长 字 符 串, 它 能 够 包 含 字 符 的 个 数 是 可 变 的, 随 着 对 字 符 串 变 量 赋 予 新 值, 它 的 长 度 随 之 发 生 变 化, 所 占 用 的 存 储 空 间 是 该 字 符 串 长 度 再 加 上 10 个 字 节 另 一 种 为 定 长 字 符 串, 即 在 程 序 运 行 中 始 终 保 持 其 长 度 不 变 的 字 符 串, 其 中 每 个 字 符 占 用 一 个 字 节 的 存 储 空 间, 因 此 定 长 字 符 串 所 占 用 的 存 储 空 间 就 是 该 字 符 串 的 长 度 例 如, 声 明 一 个 长 度 为 5 的 定 长 字 符 串 变 量 A 的 方 法 如 下 : DIM A as string*5 2.1.3 布 尔 型 数 据 布 尔 型 数 据 (boolean) 是 一 个 逻 辑 值, 它 占 用 2 个 字 节 的 存 储 空 间, 只 能 取 两 个 值, 即 true( 真 ) 和 false( 假 ) 2.1.4 日 期 型 数 据 日 期 型 数 据 (date) 用 来 表 示 日 期, 它 占 用 8 个 字 节 的 存 储 空 间, 可 以 表 示 的 日 期 范 围 从 公 元 100 年 1 月 1 日 到 9999 年 12 月 31 日, 而 表 示 的 时 间 可 以 从 0 00 00 到 23 59 59 表 示 日 期 的 数 据 必 须 以 # 括 起 来, 给 日 期 类 型 变 量 赋 值 的 基 本 形 式 为 : Date time = #5/12/2001 1:20 PM # 2.1.5 对 象 型 数 据 对 象 型 数 据 (object) 用 来 表 示 图 形 或 OLE 对 象 或 其 他 对 象, 它 占 用 4 个 字 节 的 存 储 空 间 22

第 2 章 Visual Basic 程 序 设 计 基 础 23 2.1.6 可 变 类 型 数 据 可 变 类 型 数 据 (Variant) 是 一 种 通 用 的 可 变 的 数 据 类 型, 除 了 定 长 字 符 串 和 自 定 义 类 型 以 外, 它 可 以 用 来 表 示 任 何 类 型 的 数 据 Visual Basic 可 根 据 变 量 当 前 的 内 容, 处 理 声 明 为 可 变 类 型 变 量 和 默 认 声 明 的 变 量, 可 变 类 型 变 量 还 可 以 在 同 一 程 序 运 行 期 间 放 置 不 同 类 型 的 数 据, 系 统 会 自 动 完 成 必 要 的 转 换 例 如 : Dim MyVariant as Variant ' 如 果 不 声 明 My Variant 变 量, 下 面 的 变 量 也 是 可 变 类 型 My Variant="25" ' 存 入 字 符 串 25, 变 量 MyVariant 为 字 符 串 类 型 的 数 据 My Variant=My Variant-10 ' 在 进 行 数 值 运 算 时, 系 统 自 动 将 MyVariant 转 换 成 数 值 类 型 的 数 据, 进 行 运 算, 并 以 数 值 型 的 数 据 存 储 2.2 常 量 和 变 量 变 量 和 常 量 是 Visual Basic 程 序 中 最 基 本 的 数 据 元 素, 程 序 中 的 数 据 大 多 是 以 变 量 和 常 量 的 形 式 出 现 的 可 以 说 常 量 和 变 量 是 程 序 中 都 存 在 的 基 本 量 但 是 在 不 同 的 语 言 中, 它 们 的 表 现 形 式 是 不 同 的 掌 握 变 量 和 常 量 的 表 达 方 法 是 Visual Basic 语 言 编 程 的 基 础 所 谓 常 量 是 指 在 程 序 执 行 期 间, 其 值 是 不 能 发 生 变 化 的 数 据 ; 而 变 量 的 值 是 可 以 变 化 的, 它 代 表 计 算 机 内 存 中 指 定 的 存 储 单 元 2.2.1 常 量 常 量 是 指 在 程 序 执 行 期 间 它 的 值 不 会 发 生 变 化 的 数 据, 在 Visual Basic 中 常 量 分 为 两 种, 一 种 是 文 字 常 量, 另 一 种 则 是 符 号 常 量 1. 文 字 常 量 文 字 常 量 分 为 数 值 常 量 字 符 串 常 量 逻 辑 型 常 量 和 日 期 型 常 量 等 (1) 数 值 常 量 数 值 常 量 又 分 为 整 型 常 量 长 整 型 常 量 浮 点 型 常 量 和 货 币 型 常 量 等 整 型 和 长 整 型 常 量 在 Visual Basic 中 可 以 使 用 十 进 制 八 进 制 和 十 六 进 制 来 表 示 整 型 和 长 整 型 常 量, 十 进 制 数 值 的 表 示 方 法 与 人 们 日 常 的 表 示 方 法 相 同, 例 如 :235 如 果 在 数 字 的 开 头 加 上 前 缀 &O( 字 母 O), 则 所 表 示 的 是 八 进 制 数 值, 例 如 :&O315 如 果 在 数 字 的 开 头 加 上 前 缀 &H, 则 表 示 的 是 十 六 进 制 数 值, 例 如 :&H418 需 要 说 明 以 下 两 点 1 如 果 所 表 示 的 数 值 大 小 没 有 超 过 整 型 数 据 的 范 围 (-32768~32768) 时, 系 统 会 认 为 它 是 整 型 数, 在 内 存 中 以 2 个 字 节 存 放 它, 如 果 所 表 示 的 数 值 大 小 超 过 了 整 型 数 据 范 围, 则 系 统 认 为 它 是 长 整 型 数, 以 4 个 字 节 存 放 它 2 用 户 还 可 以 根 据 需 要 来 设 置 某 一 个 数 据 为 长 整 型 数, 其 方 法 是 在 某 一 个 整 型 常 量 的 后 面 加 上 类 型 声 明 符 &, 则 该 整 型 数 被 设 置 为 长 整 型 数, 它 们 数 值 是 相 同 的, 但 占 用 23

24 Visual Basic 程 序 设 计 内 存 不 一 样, 即 整 型 常 量 占 用 2 个 字 节, 而 长 整 型 数 则 占 用 4 个 字 节 浮 点 数 常 量 浮 点 数 常 量 可 分 为 单 精 度 浮 点 数 和 双 精 度 浮 点 数, 浮 点 数 由 尾 数 指 数 符 号 和 指 数 3 部 分 组 成, 用 me±n 或 md±n 来 表 示 其 中 m 为 尾 数, 它 用 实 数 表 示, 指 数 符 号 是 E( 表 示 单 精 度 ) 或 D( 表 示 双 精 度 ),n 为 指 数, 它 必 须 是 整 数 指 数 符 号 E 或 D 的 含 义 是 m 乘 上 10 的 幂 次, 例 如 : 3.145E+3 表 示 的 数 值 分 别 为 3145 货 币 型 常 量 货 币 型 常 量 是 指 货 币 类 型 数 据 的 常 量 表 示 形 式 (2) 字 符 串 型 常 量 所 谓 字 符 串 型 常 量 是 指 用 双 引 号 括 起 来 的 一 串 字 符 ( 也 可 以 为 汉 字 ), 如 : Visual Basic ab56 1234 等 (3) 逻 辑 型 常 量 逻 辑 型 常 量 很 简 单, 只 有 两 个 值, 即 True 和 False (4) 日 期 型 常 量 日 期 型 常 量 是 指 用 # 号 括 起 来 的 一 串 日 期, 它 可 以 表 示 日 期 数 据, 其 格 式 为 : # mm-dd-yy # 2. 符 号 常 量 所 谓 符 号 常 量 是 用 一 个 被 定 义 的 标 识 符 代 替 数 值 和 字 符 串 定 义 符 号 常 量 的 一 般 格 式 为 : const 新 常 量 名 = 表 达 式 [, 新 常 量 名 = 表 达 式 ] 其 中 符 号 常 量 名 必 须 符 合 Visual Basic 标 识 符 的 定 义 方 式, 表 达 式 可 以 由 文 字 常 量 算 术 表 达 式 及 逻 辑 运 算 符 组 成, 也 可 以 直 接 是 字 符 串, 但 不 能 使 用 字 符 串 连 接 运 算 符 变 量 及 用 户 定 义 的 函 数 或 内 部 函 数 例 如 : const A1=3.14 const B1=2*A1 const C1="abcd" ' 定 义 了 一 个 单 精 度 常 量 ' 定 义 了 一 个 单 精 度 常 量 ' 定 义 了 一 个 字 符 串 型 常 量 2.2.2 变 量 几 乎 所 有 编 程 语 言 都 要 用 到 变 量, 变 量 的 实 质 是 指 在 程 序 运 行 过 程 中, 其 值 可 以 改 变 的 量 一 个 变 量 应 该 有 一 个 名 字, 即 变 量 名, 在 内 存 中 占 据 一 定 的 存 储 单 元 在 该 存 储 单 元 中 存 放 变 量 的 值 称 为 变 量 值 为 了 通 知 计 算 机 为 变 量 留 出 所 需 要 的 空 间, 就 需 要 对 变 量 的 类 型 进 行 说 明, 这 一 过 程 称 为 声 明, 除 了 对 变 量 进 行 命 名 和 类 型 说 明 以 外, 还 必 须 规 定 该 变 量 的 使 用 范 围 在 Visual Basic 中, 变 量 的 有 效 范 围 是 不 同 的, 按 照 其 使 用 范 围 可 以 将 变 量 分 为 局 部 变 24

第 2 章 Visual Basic 程 序 设 计 基 础 25 量 窗 体 级 变 量 过 程 级 变 量 及 全 局 变 量, 下 面 将 分 别 介 绍 变 量 的 命 名 规 则 及 变 量 的 声 明 等 内 容 1. 变 量 的 命 名 规 则 在 Visual Basic 中, 给 变 量 命 名 时 应 遵 循 以 下 规 则 (1) 变 量 名 只 能 由 字 母 数 字 和 下 划 线 组 成 (2) 变 量 名 的 第 一 个 字 符 必 须 是 英 文 字 母 (3) 变 量 名 的 有 效 长 度 为 255 个 字 符, 而 且 名 字 的 有 效 字 符 为 前 40 个, 后 面 的 字 符 只 为 了 增 加 易 读 性, 对 于 区 分 不 同 的 变 量 无 效 4 不 能 使 用 Visual Basic 保 留 字 作 为 变 量 名, 但 可 以 把 保 留 字 嵌 入 变 量 名 中, 例 如, 不 能 将 变 量 命 名 为 DIM( 因 为 DIM 是 Visual Basic 中 的 保 留 字 ), 但 可 以 命 令 为 MYDIMS 在 Visual Basic 中, 变 量 名 过 程 名 符 号 常 量 名 记 录 类 型 名 和 元 素 名 等 都 遵 循 上 述 规 则 在 Visual Basic 中, 不 区 分 变 量 名 中 字 母 的 大 小 写,abc ABC abc 指 的 是 同 一 个 名 字, 为 了 便 于 阅 读, 建 议 每 个 变 量 名 开 头 的 第 一 个 字 母 用 大 写, 例 如, 可 以 将 某 一 个 变 量 名 定 义 为 Abc 2. 变 量 的 声 明 在 Visual Basic 中, 变 量 需 要 声 明, 声 明 的 过 程 就 是 通 知 系 统 准 备 使 用 哪 些 变 量, 该 变 量 需 要 多 大 的 存 储 空 间, 以 便 系 统 将 其 存 储 到 计 算 机 的 内 存 中 变 量 的 声 明 有 两 种, 即 显 式 声 明 和 隐 式 声 明 显 式 声 明 是 用 相 应 的 语 法 声 明 变 量, 声 明 的 变 量 具 有 所 声 明 的 数 据 类 型 ; 隐 式 声 明 是 不 经 声 明 直 接 使 用 变 量, 变 量 自 动 具 有 Variant 类 型 (1) 变 量 的 显 示 声 明 在 变 量 的 显 示 声 明 中 又 分 为 以 下 几 种 方 式 1 用 DIM 语 句 声 明 变 量 DIM 语 句 用 于 在 模 块 窗 体 的 过 程 ( 子 程 序 ) 中 声 明 变 量, 其 声 明 变 量 的 格 式 为 : DIM 变 量 1 AS 数 据 类 型 [, 变 量 2 AS 数 据 类 型 ] [, ] 例 如 : DIM MY2 as string DIM MY1 as integer,m3 as string 2 用 static 语 句 声 明 变 量 static 语 句 用 于 在 过 程 中 说 明 静 态 变 量, 其 一 般 格 式 为 : static 变 量 名 as 类 型 名 例 如 : static A as integer 用 static 语 句 声 明 的 变 量 称 为 静 态 变 量 静 态 变 量 的 特 点 是 第 一 次 执 行 某 个 过 程 时, 系 统 为 变 量 分 配 了 一 个 存 储 单 元, 当 退 出 这 个 过 程, 存 储 单 元 的 值 将 保 留, 下 次 再 调 用 此 过 25

26 Visual Basic 程 序 设 计 程 时, 该 变 量 的 初 值 就 是 上 次 被 保 留 的 值 例 如 : private sub command1_dick( ) static M1 AS integer print M1 M1 = M1 + 2 当 用 户 单 击 Command1 命 令 按 钮 时, 该 事 件 过 程 被 调 用, 此 时 系 统 对 M1 赋 予 默 认 值 0, 然 后 打 印 M1 的 值 0, 接 着 执 行 语 句 M1=M1+2,M1 值 为 2 由 于 变 量 M1 是 静 态 变 量, 其 值 将 保 留 下 来, 当 再 次 单 击 Command1 按 钮 时, 该 事 件 过 程 又 被 调 用, 变 量 M1 的 初 始 值 不 再 为 0, 而 是 上 次 保 留 的 M1 的 值, 即 M1 为 2 3 用 Public 语 句 声 明 变 量 用 Public 声 明 的 变 量 为 全 局 变 量, 该 变 量 的 作 用 范 围 是 所 有 模 块 的 所 有 过 程, 声 明 全 局 变 量 的 一 般 格 式 为 : Public 变 量 名 AS 类 型 名 例 如 : Public A AS integer (2) 变 量 的 隐 性 声 明 变 量 的 隐 性 声 明 方 法 有 以 下 两 种 1 在 Visual Basic 的 程 序 代 码 中 不 对 变 量 进 行 声 明 而 直 接 引 用, 则 此 变 量 默 认 的 数 据 类 型 为 Variant 2 可 以 省 略 声 明 语 句, 而 在 变 量 名 的 尾 部 加 上 变 量 类 型 说 明 符 来 使 变 量 被 隐 性 声 明 为 某 种 类 型 的 变 量 例 如 : A%=300 2.3 运 算 符 与 表 达 式 在 程 序 设 计 语 言 中 用 不 同 的 符 号 描 述 不 同 的 运 算 形 式, 这 些 符 号 称 为 运 算 符, 而 运 算 的 对 象 就 称 为 操 作 数, 由 运 算 符 将 操 作 数 接 起 来 的 合 法 的 式 子 构 成 了 表 达 式 例 如 :A+5 3*5*6 等 都 是 表 达 式, 单 个 变 量 式 常 量 也 可 以 看 成 是 简 单 的 表 达 式 Visual Basic 提 供 了 丰 富 的 运 算 符 和 表 达 式 这 些 运 算 符 和 表 达 式 包 括 算 术 运 算 符 和 算 术 表 达 式 字 符 串 运 算 符 和 字 符 串 表 达 式 关 系 运 算 符 和 关 系 表 达 式 逻 辑 运 算 符 和 逻 辑 表 达 式 等 2.3.1 算 术 运 算 符 与 算 术 表 达 式 26 1. 算 术 运 算 符 算 术 运 算 符 是 常 用 的 运 算 符, 用 来 执 行 简 单 的 算 术 运 算,Visual Basic 提 供 了 8 个 算 术 运 算 符, 表 2-1 按 优 先 级 列 出 了 这 些 算 术 运 算 符

第 2 章 Visual Basic 程 序 设 计 基 础 27 表 2-1 Visual Basic 的 算 术 运 算 符 运 算 符 含 义 优 先 级 ^ 乘 方 1 - 取 负 2 * 乘 3 / 除 3 \ 整 除 4 Mod 取 模 5 + 加 6 - 减 6 说 明 : (1) 指 数 运 算 指 数 运 算 用 来 计 算 求 方 和 方 根, 其 运 算 符 为 ^, 例 如 :3^2 表 示 为 3 的 平 方 当 指 数 是 一 个 表 达 式 时, 必 须 加 上 括 号, 例 如 :X 的 Y+Z 次 方, 必 须 写 成 X^(Y+Z) (2) 浮 点 数 除 法 与 整 数 除 法 浮 点 数 除 法 运 算 符 ( / ) 执 行 标 准 除 法 操 作, 其 结 果 为 浮 点 数 例 如 :5/4 的 值 为 1.25 整 数 除 法 运 算 符 ( \ ) 执 行 整 除 运 算, 运 算 结 果 为 整 型 数 整 除 的 操 作 数 一 般 是 整 型 值, 当 操 作 数 带 有 小 数 时, 首 先 被 四 舍 五 入 为 整 型 数 或 长 整 型 数, 然 后 进 行 整 除 运 算, 其 运 行 结 果 只 截 取 整 数 部 分, 小 数 部 分 不 做 四 舍 五 入 处 理 例 如 :8\3 的 结 果 为 2,24.6\2.8 的 结 果 为 8 (3) 取 模 运 算 取 模 运 算 符 Mod 用 来 求 余 数, 其 结 果 为 第 一 操 作 数 除 以 第 二 个 操 作 数 所 得 的 余 数, 当 操 作 数 带 有 小 数 时, 首 先 被 四 舍 五 入 为 整 型 数, 然 后 求 余 数 例 如 :8 Mod 5 的 结 果 为 3, 24.6 Mod 2.8 的 结 果 为 1 2. 算 术 表 达 式 算 术 表 达 式 又 叫 数 值 型 表 达 式, 它 由 算 术 运 算 符 数 值 型 常 量 和 变 量 函 数 和 圆 括 号 组 成, 它 的 运 算 结 果 是 一 个 数 值 例 如 : 3 3+5.6 5+sin(x) 2.3.2 字 符 串 运 算 符 与 字 符 串 表 达 式 字 符 串 运 算 符 有 两 个, 即 & 和 +, 其 功 能 都 是 将 两 个 字 符 串 连 接 起 来 但 由 于 + 运 算 符 还 有 做 加 法 的 含 义, 容 易 造 成 混 乱, 所 以 做 字 符 串 连 接 运 算 时 最 好 还 是 使 用 & 运 算 符 例 如 : 27

28 Visual Basic 程 序 设 计 A1="BCDE" A2="FGHI" A3=A1+A2 'A3 的 值 为 "BCDEFGHI" 或 A3=A1&A2 'A3 的 值 也 为 "BCDEFGHI" 字 符 串 表 达 式 由 字 符 串 变 量 常 量 函 数 和 运 算 符 组 成 2.3.3 关 系 运 算 符 与 关 系 表 达 式 1. 关 系 运 算 符 关 系 运 算 符 也 称 为 比 较 运 算 符, 用 来 对 两 个 表 达 式 的 值 进 行 比 较, 比 较 的 结 果 是 一 个 逻 辑 值, 即 真 (True) 或 假 (False) Visual Basic 把 任 何 非 0 的 值 都 看 成 是 真, 但 一 般 以 -1 表 示,0 则 表 示 假, 关 系 运 算 符 既 可 以 进 行 数 值 比 较 也 可 以 进 行 字 符 串 的 比 较 Visual Basic 提 供 了 6 个 关 系 运 算 符, 如 表 2-2 所 示 表 2-2 Visual Basic 的 关 系 运 算 符 关 系 运 算 符 含 义 关 系 运 算 符 含 义 > 大 于 < 小 于 >= 大 于 等 于 <= 小 于 等 于 = 等 于 <> 不 等 于 2. 关 系 表 达 式 关 系 表 达 式 是 由 关 系 运 算 符 将 两 个 数 值 表 达 式 或 两 个 字 符 串 表 达 式 连 接 起 来 的 式 子 关 系 表 达 式 的 值 是 一 个 布 尔 类 型 的 值, 只 有 True 或 False 两 个 取 值 下 面 是 合 法 的 关 系 表 达 式 5=3+2 表 达 式 的 值 为 真 5<2 表 达 式 的 值 为 假 2.3.4 逻 辑 运 算 符 与 逻 辑 表 达 式 1. 逻 辑 运 算 符 逻 辑 运 算 符 用 于 对 两 个 表 达 式 进 行 逻 辑 运 算, 结 果 是 逻 辑 值 True 或 False Visual Basic 提 供 的 逻 辑 运 算 符 有 6 种, 如 表 2-3 所 示 表 2-3 Visual Basic 的 逻 辑 运 算 符 逻 辑 运 算 符 含 义 优 先 级 逻 辑 运 算 符 含 义 优 先 级 Not 逻 辑 非 1 Xor 逻 辑 异 或 4 And 逻 辑 与 2 Eqv 逻 辑 等 于 5 Or 逻 辑 或 3 Imp 逻 辑 蕴 含 6 28

第 2 章 Visual Basic 程 序 设 计 基 础 29 如 果 用 A 和 B 分 别 代 表 任 意 两 个 操 作 数, 而 用 T 代 表 逻 辑 真, 用 F 代 表 逻 辑 假, 则 各 种 逻 辑 运 算 符 的 运 算 结 果 如 表 2-4 所 示 表 2-4 各 种 逻 辑 运 算 符 的 运 算 结 果 操 作 数 A F F T T 操 作 数 B F T F T Not A T T F F A And B F F F T A Or B F T T T A Xor B F T T F A Eqv B T F F T A Imp B T T F T 2. 逻 辑 表 达 式 用 逻 辑 运 算 符 连 接 两 个 或 多 个 逻 辑 量 组 成 的 式 子 称 为 逻 辑 表 达 式, 该 表 达 式 的 返 回 值 只 有 两 种 可 能, 即 真 (True) 和 假 (False) 例 如, 下 面 都 是 合 法 的 逻 辑 表 达 式 : Not(2>8) (3>8)And(7<3= 其 结 果 为 True 其 结 果 为 False 2.3.5 表 达 式 的 运 算 顺 序 前 面 提 到 的 所 有 类 型 以 运 算 符 都 有 运 算 优 先 级 的 问 题, 在 一 个 表 达 式 中 可 以 包 含 不 同 类 型 的 运 算 符 和 函 数, 每 一 种 运 算 都 有 执 行 的 先 后 顺 序, 当 不 同 类 型 的 运 算 符 出 现 在 同 一 个 表 达 式 中 时, 计 算 机 按 一 定 的 顺 序 对 表 达 式 求 值, 其 一 般 顺 序 如 下 (1) 首 先 进 行 函 数 运 算, 其 优 先 级 最 高 (2) 其 次 进 行 算 术 运 算, 其 次 序 按 算 术 运 算 符 的 优 先 级 由 高 到 低 依 次 为 取 负 *, \ Mod +,- (3) 最 后 进 行 逻 辑 运 算, 其 次 序 按 逻 辑 运 算 符 的 优 先 级 由 高 到 低 依 次 为 Not And Or Xor Eqv Imp 需 要 注 意 两 点 (1) 在 同 一 个 表 达 式 中 所 有 同 一 级 运 算 都 按 从 左 到 右 的 顺 序 进 行 (2) 括 号 可 以 改 变 运 算 的 优 先 顺 序, 括 号 内 的 运 算 必 须 先 执 行 例 如, 下 列 表 达 式 中 运 算 的 优 先 顺 序 为 : 7/sin(z*x)>3 or(x*3) (-5)+8<600 5 2 1 7 9 1 4 3 6 8 29

30 Visual Basic 程 序 设 计 2.4 小 结 不 同 类 型 的 数 据 有 不 同 的 操 作 方 式 和 不 同 的 取 值 范 围 Visual Basic 提 供 了 系 统 定 义 的 基 本 数 据 类 型, 也 允 许 用 户 根 据 应 用 的 需 要 定 义 自 己 的 数 据 类 型 Visual Basic 基 本 数 据 类 型 主 要 有 数 值 型 字 符 串 型 逻 辑 型 日 期 型 可 变 类 型 及 对 象 型 等 常 量 是 指 在 程 序 执 行 期 间 它 的 值 不 会 发 生 变 化 的 一 些 数 据, 在 Visual Basic 中 常 量 分 为 文 字 常 量 和 符 号 常 量 两 种 变 量 是 指 在 程 序 运 行 过 程 中, 其 值 可 以 改 变 的 量 一 个 变 量 应 该 有 一 个 名 字, 称 为 变 量 名 变 量 在 内 存 中 占 据 一 定 的 存 储 单 元, 在 该 存 储 单 元 中 存 放 变 量 的 值 称 为 变 量 值 运 算 符 表 示 程 序 设 计 语 言 中 对 数 据 的 最 基 本 操 作 被 运 算 的 对 象 称 为 运 算 量 或 操 作 数 表 达 式 是 程 序 设 计 语 言 中 的 基 本 语 法 单 位, 它 表 达 一 种 求 值 规 则, 通 常 由 常 量 变 量 函 数 运 算 符 及 括 号 组 成 Visual Basic 提 供 了 丰 富 的 运 算 符 和 表 达 式 这 些 运 算 符 和 表 达 式 包 括 算 术 运 算 符 和 算 术 表 达 式 字 符 串 运 算 符 和 字 符 串 表 达 式 关 系 运 算 符 和 关 系 表 达 式 逻 辑 运 算 符 和 逻 辑 表 达 式 等 Visual Basic 为 用 户 预 定 义 了 一 批 内 部 函 数, 它 可 分 为 数 学 函 数 字 符 串 函 数 日 期 时 间 函 数 和 随 机 函 数 等 2.5 习 题 一 选 择 题 1. 下 列 可 作 为 Visual Basic 变 量 名 的 是 ( ) A) VB123 B) 8P8 C) DIM D) X\Y 2. 下 列 变 量 中,( ) 是 整 型 A) MY% B) MY# C) MY$ D) MY! 3. 下 列 ( ) 数 据 类 型 的 变 量 不 能 存 放 负 值 A) long, Single B) Byte,Single C) Integer, Double D) Date, long 4. 下 列 符 号 常 量 的 声 明 中 ( ) 是 不 合 法 的 A) Const PI AS integer=100 B) Const PI AS Double=3.1415 C) Const PI AS Single=Log(2) D) Const X = "623" 5. 设 a=3,b=10, 则 下 列 表 达 式 的 值 为 真 的 是 ( ) A) A>=B AND b>10 B) (a>b) OR (b>0) C) (a<0) EQV (b>0) D) (-3+5>a) AND (b>0) 6. 设 a=2,b=3,c=4,d=5, 则 表 达 式 NOT a<=c OR 4*c=b^2 AND b< >a+c 的 值 是 ( ) A) -1 B) 1 C) True D) False 30

第 2 章 Visual Basic 程 序 设 计 基 础 31 7. 可 以 同 时 删 除 字 符 串 两 边 空 白 字 符 的 函 数 是 ( ) A) Trim B) Ltrim C) Rtrim D) Space 8. 函 数 Int(Rnd*99+1) 产 生 随 机 整 数 的 范 围 是 ( ) A) [1,99] B) [1,99] C) [1,100] D) [1,100] 二 填 空 题 1. 表 达 式 (8-(7*9-13)\5/2)^2) 的 值 是 2. 在 Visual Basic 中, 字 符 串 常 量 要 用 号 括 起 来, 日 期 型 常 量 要 用 括 起 来 3. 执 行 下 列 语 句 后, 输 出 的 结 果 是 和 as="abcdefghi" Print Ucase(as) Print Mid (as, 2.4) 4. 表 达 式 Ucase(Mid "abcd", 2, 3 ) + "123" 的 值 是 31

第 3 章 Visual Basic 程 序 控 制 结 构 教 学 提 示 : 一 般 的 计 算 机 程 序 总 是 由 若 干 条 语 句 组 成 的 从 执 行 方 式 上 看, 从 第 一 条 语 句 到 最 后 一 条 语 句 完 全 按 顺 序 执 行, 是 简 单 的 顺 序 结 构 ; 若 在 程 序 执 行 过 程 中, 根 据 用 户 的 输 入 或 中 间 结 果 有 选 择 地 执 行 若 干 不 同 的 任 务 则 为 选 择 结 构 ; 如 果 在 程 序 的 某 处, 需 要 根 据 某 项 条 件 重 复 地 执 行 某 项 任 务 若 干 次, 直 到 满 足 或 不 满 足 某 个 条 件 为 止, 这 就 构 成 了 循 环 结 构 顺 序 选 择 和 循 环 结 构 是 程 序 流 程 控 制 的 3 个 基 本 结 构 本 章 主 要 讨 论 Visual Basic 中 组 成 程 序 流 程 控 制 的 结 构 和 相 关 语 句 教 学 要 求 : 掌 握 顺 序 结 构 选 择 结 构 和 循 环 结 构 的 相 关 控 制 语 句 的 语 法 格 式 和 使 用 方 法, 具 有 使 用 这 3 种 基 本 结 构 进 行 程 序 设 计 的 能 力 3.1 顺 序 结 构 1966 年,Bohra 和 Jacopin 提 出 了 结 构 化 算 法 的 3 种 基 本 结 构 : 顺 序 结 构 选 择 结 构 和 循 环 结 构 目 前 已 经 得 到 证 明, 无 论 多 么 复 杂 的 程 序, 都 是 由 上 述 3 种 基 本 结 构 中 的 一 种 或 多 种 的 组 合 构 成 的 顺 序 结 构 是 按 照 程 序 段 书 写 的 顺 序 执 行 的 语 句 结 构 例 如, 有 如 图 3.1 所 示 的 语 句, 则 要 先 执 行 语 句 A, 然 后 才 执 行 语 句 B, 两 者 是 顺 序 执 行 的 关 系 语 句 A 语 句 B 图 3.1 顺 序 结 构 顺 序 结 构 是 一 种 最 基 本 的 结 构, 表 明 事 情 发 生 的 先 后 顺 序 比 如 在 日 常 生 活 中, 总 是 先 给 水 壶 加 水, 然 后 才 能 烧 水 在 编 写 程 序 时, 这 种 先 后 次 序 尤 其 重 要 3.1.1 赋 值 语 句 赋 值 语 句 是 程 序 设 计 中 最 常 用 的 语 句 之 一, 在 程 序 中, 需 要 大 量 的 变 量 存 储 程 序 中 用 到 的 数 据, 所 以 对 变 量 进 行 赋 值 的 赋 值 语 句 也 会 在 程 序 中 大 量 出 现 赋 值 语 句 将 表 达 式 的 值 赋 给 变 量 或 对 象 的 属 性 赋 值 语 句 包 括 两 种 一 种 是 用 来 对 一 般 的 变 量 进 行 赋 值 的 赋 值 语 句, 此 语 句 用 关 键 字

第 3 章 Visual Basic 程 序 控 制 结 构 33 Let 描 述 ; 另 一 种 是 用 来 对 对 象 型 的 变 量 进 行 赋 值 的 赋 值 语 句, 用 关 键 字 Set 描 述 赋 值 语 句 的 语 法 格 式 为 : [Let] 变 量 或 属 性 = 表 达 式 Set 变 量 名 = 表 达 式 第 一 条 语 句 中 的 Let 是 可 选 项, 它 在 Basic 语 言 的 早 期 版 本 的 赋 值 语 句 中 被 要 求 使 用, 在 Visual Basic 程 序 的 赋 值 语 句 中 通 常 被 省 略 表 达 式 可 以 是 任 何 数 值 型 或 字 符 串 变 量 常 量 或 表 达 式 第 二 条 语 句 的 Set 关 键 字 是 必 需 的 在 使 用 赋 值 语 句 时, 需 要 注 意 数 据 类 型 的 匹 配 问 题 若 将 变 量 声 明 为 数 值 型 的, 如 整 型 浮 点 型 等, 那 么 就 不 能 将 字 符 串 表 达 式 的 值 赋 给 该 变 量 同 样, 若 将 变 量 声 明 为 字 符 串 型 的, 那 么 就 不 能 将 数 值 型 的 值 赋 给 该 变 量 比 如, 下 面 的 语 句 就 会 产 生 错 误 : Dim a As Integer a="student" 当 表 达 式 的 类 型 与 变 量 的 类 型 不 一 致 时, 强 制 转 换 成 左 边 的 精 度 Dim a as Integer, b as Double a = 10 / 3 'a 中 的 结 果 为 3 b = 10 \ 3 'b 中 的 结 果 为 3.0 在 进 行 变 量 赋 值 时, 布 尔 型 和 日 期 型 都 被 看 作 是 数 值 型 的 定 义 为 Variant 类 型 的 变 量 不 存 在 类 型 匹 配 的 问 题 例 如, 以 下 语 句 可 以 正 常 执 行 : Dim a a="hello!" a=100 3.1.2 数 据 输 入 和 输 出 1. 用 输 入 框 (InputBox) 输 入 数 据 InputBox 函 数 用 于 打 开 一 个 对 话 框, 等 待 用 户 输 入 或 选 择 一 个 按 钮 若 用 户 单 击 确 定 按 钮 或 按 下 回 车 键, 则 返 回 用 户 在 文 本 框 中 输 入 的 内 容 具 体 格 式 为 : InputBox ( 提 示 [, 标 题 ][, 默 认 ][,x 坐 标 位 置 ][,y 坐 标 位 置 ]) 其 中 : 提 示 为 一 个 字 符 串 表 达 式, 作 为 对 话 框 中 的 提 示 信 息, 不 能 省 略 若 要 多 行 显 示, 则 必 须 在 每 行 行 末 加 入 回 车 (chr(10)) 和 换 行 (chr(13)) 控 制 符 标 题 为 一 个 字 符 串 表 达 式, 在 对 话 框 的 标 题 区 显 示 若 省 略, 则 将 应 用 程 序 名 放 入 标 题 栏 默 认 值 为 一 个 字 符 串 表 达 式, 提 供 给 用 户 的 默 认 输 入 内 容 x 坐 标 位 置 和 y 坐 标 位 置 为 整 型 表 达 式, 它 们 确 定 对 话 框 左 上 角 在 屏 幕 上 的 位 置, 屏 幕 左 上 角 为 原 点, 单 位 为 缇 (Twip) 下 面 举 例 说 明 InputBox 函 数 的 使 用 例 如, 以 下 语 句 让 用 户 输 入 学 生 的 成 绩 : Str1=InputBox(" 请 输 入 学 生 人 数 :"," 学 生 成 绩 管 理 ","60") 33

34 Visual Basic 程 序 设 计 此 语 句 产 生 的 对 话 框 的 提 示 信 息 为 请 输 入 学 生 人 数 :, 标 题 栏 为 学 生 成 绩 管 理, 文 本 框 内 的 默 认 值 为 60 执 行 此 语 句 显 示 的 对 话 框 如 图 3.2 所 示 图 3.2 InputBox 函 数 示 例 当 用 户 输 入 信 息 后, 若 单 击 确 定 按 钮, 则 输 入 信 息 将 被 赋 给 变 量 Str1, 若 用 户 单 击 取 消 按 钮, 那 么 Str1 的 值 为 无 论 用 户 输 入 什 么 类 型 的 信 息, 该 函 数 只 能 将 它 作 为 字 符 串 返 回, 因 此, 如 果 用 户 想 要 取 得 其 他 类 型 的 信 息, 要 进 行 数 据 类 型 转 换 2. 用 Print 方 法 输 出 数 据 Print 方 法 的 语 法 格 式 为 : Object.Print [outputlist] 其 中 : Object 的 取 值 可 以 为 某 个 窗 体 的 名 字 或 Debug 若 为 窗 体 的 名 字 则 在 窗 体 上 输 出, 否 则 在 立 即 窗 口 中 输 出 Outputlist 参 数 表 示 要 打 印 的 表 达 式 或 表 达 式 列 表, 若 省 略 则 打 印 一 空 白 行 它 具 有 以 下 语 法 格 式 : { Spc(n) Tab(n) } Expession charpos 其 Outputlist 各 部 分 的 说 明 如 表 3-1 所 示 表 3-1 Print 方 法 的 参 数 说 明 参 数 说 明 Spc(n) Tab(n) Expession charpos 可 选 项 在 输 出 中 插 入 空 白 字 符,n 为 要 插 入 的 空 白 字 符 个 数 可 选 项 将 插 入 点 定 位 在 绝 对 列 号 上,n 表 示 列 号 若 无 参 数 则 将 插 入 点 定 位 在 下 一 个 打 印 区 的 起 始 位 置 可 选 项 要 输 出 的 数 值 或 字 符 串 表 达 式 可 选 项 指 定 下 一 个 字 符 的 插 入 点, 使 用 分 号 (;) 将 插 入 点 定 位 在 上 一 个 被 显 示 的 字 符 之 后 若 省 略, 则 在 下 一 行 打 印 下 一 字 符 下 面 是 一 个 使 用 Print 语 句 的 例 子 Private Sub Form_Click() Print "12345678901234567890" Print Tab(5); "5"; Tab(10-2); "8", " ' 注 意 这 里 10-2> 当 前 位 置 5, 故 同 行 显 示 " Print Tab(5); "5"; Tab(10-6); "4"; Tab(20-15); "5"; " ' 注 意 这 里 10-6< 当 前 位 置 5, 故 换 行 显 示 ;20-15> 当 前 位 置 4, 故 同 行 显 示 " 34

第 3 章 Visual Basic 程 序 控 制 结 构 35 程 序 执 行 结 果 如 图 3.3 所 示 3. 用 消 息 框 (MsgBox) 输 出 数 据 图 3.3 Print 语 句 示 例 Msgbox 函 数 用 于 在 对 话 框 中 显 示 消 息, 并 等 待 用 户 做 出 判 断 它 的 语 法 格 式 为 : 变 量 = MsgBox( 提 示 [, 按 钮 ][, 标 题 ]) 其 中 : 提 示 参 数 是 向 用 户 显 示 的 信 息 按 钮 参 数 为 一 个 整 型 表 达 式, 决 定 对 话 框 中 的 按 钮 的 数 目 和 类 型, 以 及 对 话 框 上 的 图 标 类 型 按 钮 一 般 取 值 为 是 否 确 定 取 消 等 标 题 参 数 给 出 对 话 框 的 标 题 按 钮 和 标 题 两 个 参 数 是 可 选 的 Msgbox 函 数 还 有 一 些 其 他 参 数, 但 它 们 不 常 用, 在 此 不 做 介 绍 例 如, 在 用 户 关 闭 窗 体 之 前, 要 询 问 用 户 的 意 见, 显 示 询 问 对 话 框, 可 使 用 下 面 的 语 句 : Private Sub Form_QueryUnload(Cancel As Integer,UnloadMode As Integer) 'vbcance vbquestion 和 vbokcancel 为 系 统 常 量 Dim result as VbMsgBoxResult 'VbMsgBoxResult 为 一 数 据 类 型 result =MsgBox(" 确 定 要 退 出?",vbQuestion+vbOKCancel," 确 认 退 出 ") 程 序 执 行 结 果 如 图 3.4 所 示 图 3.4 Msgbox 函 数 示 例 3.1.3 注 释 暂 停 与 程 序 结 束 语 句 1. 注 释 语 句 注 释 是 在 程 序 中 加 入 一 些 评 注, 往 往 起 着 提 供 编 写 程 序 的 日 期 编 写 人 解 释 程 序 代 码 的 作 用, 其 根 本 目 的 是 为 程 序 的 阅 读 和 修 改 提 供 信 息, 提 高 程 序 的 可 读 性 和 可 维 护 性 注 释 的 方 法 有 两 种 : 使 用 Rem 关 键 字 或 撇 号 (') 二 者 的 用 法 基 本 相 同, 在 一 行 中 撇 号 (') 或 Rem 关 键 字 后 面 的 内 容 为 注 释 内 容 它 们 之 间 的 区 别 在 于 使 用 Rem 关 键 字 时, 必 须 使 用 冒 号 (:) 将 其 与 前 面 的 语 句 隔 开 例 如 : 35

36 Visual Basic 程 序 设 计 Dim sum As Integer sum = 1 : Rem 给 Sum 赋 初 值 Print sum 可 以 用 一 个 撇 号 (') 来 代 替 Rem 关 键 字 若 使 用 撇 号, 则 所 要 注 释 的 语 句 行 不 必 加 冒 号 上 例 中 的 语 句 可 以 写 为 sum = 1 ' 给 Sum 赋 初 值 2. 暂 停 (Stop) 语 句 Stop 语 句 用 来 暂 停 程 序 的 执 行, 是 一 种 以 编 程 方 式 设 置 断 点 的 替 代 方 法 当 调 试 器 遇 到 Stop 语 句 时, 它 将 中 断 程 序 的 执 行 ( 进 入 中 断 模 式 ) 不 同 于 End 语 句,Stop 语 句 不 重 置 变 量 或 返 回 设 计 模 式 它 可 以 从 调 试 菜 单 中 选 择 继 续 命 令 继 续 运 行 应 用 程 序 其 一 般 格 式 如 下 : Stop 3. 结 束 (End) 语 句 End 语 句 用 于 结 束 一 段 程 序 的 运 行, 可 以 放 在 任 何 事 件 过 程 中, 其 一 般 格 式 如 下 : End 3.1.4 应 用 举 例 顺 序 结 构 是 最 简 单 的 一 种 结 构, 不 需 要 任 何 控 制 语 句, 只 需 按 照 一 定 的 次 序 编 写 即 可 下 面 就 通 过 一 个 例 子 说 明 顺 序 结 构 程 序 的 设 计 方 法 例 3.1 由 用 户 输 入 学 生 的 数 学 语 文 和 英 语 成 绩, 然 后 求 出 总 成 绩 和 平 均 成 绩, 并 显 示 在 窗 体 上 在 编 写 程 序 之 前, 首 先 要 分 析 有 多 少 元 素 要 输 入, 需 要 定 义 多 少 个 变 量, 然 后 才 开 始 程 序 设 计 Private Sub Form_Click() Dim a As Integer, b As Integer, c As Integer Dim avg As Single, total As Single a = InputBox(" 请 输 入 数 学 成 绩 :") b = InputBox(" 请 输 入 语 文 成 绩 :") c = InputBox(" 请 输 入 英 语 成 绩 :") avg = (a + b + c) / 3 total = a + b + c Print " 总 成 绩 为 :"; total Print " 平 均 成 绩 为 :"; avg 3.2 选 择 结 构 在 日 常 生 活 中, 经 常 会 按 照 一 定 的 条 件 做 出 相 应 的 决 定, 在 程 序 中 同 样 如 此 选 择 结 36

第 3 章 Visual Basic 程 序 控 制 结 构 37 构 是 结 构 化 程 序 设 计 的 基 本 结 构 之 一, 它 是 根 据 一 定 的 条 件 来 决 定 执 行 何 种 操 作 一 般 来 说, 选 择 是 二 支 的, 即 条 件 非 真 即 假, 在 执 行 选 择 结 构 时 按 照 指 定 的 条 件 进 行 判 断, 然 后 选 择 其 中 一 组 语 句 执 行 比 如, 判 断 是 否 要 上 体 育 课, 如 果 下 雨 则 不 上, 否 则 照 常 上 课 有 些 情 况 下, 可 供 选 择 的 结 果 可 能 多 于 两 种, 此 时 程 序 就 有 多 种 可 能 流 向, 这 种 结 构 称 为 多 分 支 选 择 结 构 比 如 根 据 用 户 输 入 的 百 分 制 成 绩 给 出 其 等 级 评 价, 如 果 是 60 分 以 下 则 为 不 及 格 ; 若 是 60~69 分, 则 为 及 格 ; 若 是 70~79 分, 则 为 中 等 3.2.1 单 行 结 构 条 件 语 句 1. If Then 语 句 If Then 语 句 的 语 法 格 式 如 下 : If < 条 件 表 达 式 > Then < 语 句 > 其 中, 条 件 表 达 式 通 常 为 比 较 运 算 表 达 式, 但 它 也 可 以 是 任 何 计 算 数 值 的 表 达 式 如 条 件 表 达 式 是 变 量, 则 变 量 的 值 必 须 是 True( 数 值 0) 或 False( 非 零 值 ), 例 如 : If Flag=True Then 也 可 以 省 略 =True, 让 Visual Basic 自 动 检 查 变 量 Visible 的 值 是 True 还 是 False, 例 如 : If Flag Then 同 理, 语 句 If Flag =False Then 也 可 以 写 成 If NOT Flag Then If Then 语 句 的 执 行 过 程 如 图 3.5 所 示 条 件 表 达 式 真 假 语 句 图 3.5 If Then 语 句 的 执 行 过 程 需 要 注 意 的 是, 在 If Then 结 构 中,Then 后 面 的 语 句 必 须 与 If 和 Then 写 在 同 一 行 上 ; 若 要 使 用 该 结 构 执 行 多 条 语 句, 这 些 语 句 必 须 书 写 在 同 一 行 上, 并 且 用 冒 号 分 隔 下 面 举 例 说 明 If Then 语 句 的 使 用 方 法 Sub Form_Click() Dim Temp As Single Temp = Val(InputBox(" 输 入 当 前 气 温?")) ' 如 果 气 温 低 于 5 度, 弹 出 消 息 对 话 框, 提 示 气 温 过 低 If Temp <5 Then MsgBox " 气 温 过 低 " 37

38 Visual Basic 程 序 设 计 3.2.2 块 结 构 条 件 语 句 Visual Basic 提 供 的 块 结 构 条 件 语 句 主 要 有 以 下 两 种 : If Then End If If Then Else 下 面 就 来 具 体 介 绍 它 们 的 使 用 方 法 1. If Then End If 语 句 If Then End If 语 句 的 语 法 格 式 如 下 : If < 条 件 表 达 式 > Then < 程 序 段 > End If 该 语 句 的 执 行 过 程 是 若 条 件 表 达 式 为 True( 非 零 ), 则 执 行 Then 与 End If 之 间 的 程 序 段, 否 则 执 行 End If 后 的 下 一 条 语 句 其 执 行 过 程 如 图 3.6 所 示 条 件 表 达 式 真 假 程 序 段 图 3.6 If Then End If 语 句 的 执 行 过 程 例 如, 已 知 两 个 数 a 和 b, 找 出 其 中 较 大 的 一 个, 使 得 a 大 于 b 具 体 实 现 如 下 : If a<b Then t=a : a=b : b=t End If 例 3.2 火 车 站 行 李 费 的 收 费 标 准 是 50kg 以 内 ( 包 括 50kg) 以 50kg 计, 超 过 部 分 0.50 元 /kg 编 写 程 序, 要 求 根 据 输 入 的 任 意 重 量, 计 算 出 应 付 的 行 李 费 当 重 量 在 50kg 以 内 时, 收 费 是 固 定 的, 如 果 超 出 50kg, 则 超 出 部 分 要 根 据 重 量 收 费 具 体 实 现 如 下 : Private Sub Form_Click() Dim weight as single,pay as single weight= Val(InputBox(" 请 输 入 行 李 的 重 量 :")) pay = 50* 0.2 If weight > 50 Then pay =(w - 50)* 0.5 + pay 38

End If Print " 行 李 费 一 共 为 ";pay 2. If Then Else 语 句 第 3 章 Visual Basic 程 序 控 制 结 构 39 If Then Else 语 句 使 得 用 户 的 程 序 具 有 判 断 的 能 力, 其 语 法 格 式 如 下 : If < 条 件 表 达 式 > Then < 程 序 段 1> Else < 程 序 段 2> End If 该 语 句 首 先 判 断 条 件, 若 条 件 表 达 式 为 True, 则 执 行 程 序 段 1; 否 则, 则 执 行 程 序 段 2 其 执 行 过 程 如 图 3.7 所 示 条 件 表 达 式 真 假 程 序 段 1 程 序 段 2 图 3.7 If Then Else 语 句 的 执 行 过 程 下 面 举 例 说 明 该 语 句 的 用 法 例 3.3 输 入 三 角 形 3 条 边 的 长 度, 然 后 判 断 是 否 能 够 组 成 一 个 三 角 形, 若 可 以 则 计 算 三 角 形 的 面 积, 并 显 示 在 窗 体 上 ; 否 则 提 示 输 入 的 长 度 不 合 格 请 重 新 输 入 在 窗 体 的 单 击 事 件 中 添 加 如 下 代 码 : Private Sub Form_Click() Dim a As Integer, b As Integer, c As Integer Dim s As Single a = Val(InputBox(" 请 输 入 三 角 形 第 一 条 边 的 长 度 :", " 求 三 角 形 的 面 积 ")) b = Val(InputBox(" 请 输 入 三 角 形 第 二 条 边 的 长 度 :", " 求 三 角 形 的 面 积 ")) c = Val(InputBox(" 请 输 入 三 角 形 第 三 条 边 的 长 度 :", " 求 三 角 形 的 面 积 ")) If a + b < c Or b + c < a Or a + c < b Then MsgBox " 输 入 的 边 长 不 能 组 成 三 角 形!" Else s = Sqr((a + b) ^ 2 + (b + c) ^ 2 + (a + c) ^ 2) Print " 三 角 形 的 面 积 为 :", s End If 39

40 Visual Basic 程 序 设 计 3.2.3 多 分 支 选 择 语 句 Visual Basic 提 供 的 多 分 支 选 择 语 句 有 如 下 两 种 If Then ElseIf Select Case 下 面 就 来 具 体 介 绍 它 们 的 使 用 方 法 1. If Then ElseIf 语 句 If Then ElseIf 语 句 的 一 般 格 式 如 下 : If < 条 件 表 达 式 1> Then < 程 序 段 1> ElseIf < 条 件 表 达 式 2> Then < 程 序 段 2> ElseIf < 条 件 表 达 式 n> Then < 程 序 段 n> [Else 默 认 程 序 段 ] End If 该 语 句 首 先 判 断 条 件 表 达 式 1, 若 为 True, 则 执 行 程 序 段 1; 否 则 检 查 条 件 表 达 式 2 是 否 为 True, 如 为 True, 则 执 行 程 序 段 2; 若 条 件 表 达 式 2 为 False, 则 判 断 条 件 表 达 式 3 是 否 为 True, 如 为 True, 则 执 行 程 序 段 3, 依 次 类 推, 直 到 条 件 表 达 式 n, 若 条 件 表 达 式 n 也 为 False, 这 时 若 存 在 [Else 默 认 程 序 段 ], 则 执 行 默 认 程 序 段, 否 则 跳 到 End If 的 下 一 条 语 句 执 行 (n>=2) 其 执 行 过 程 如 图 3.8 所 示 表 达 式 1 假 表 达 式 1 假 真 真 表 达 式 n 假 真 程 序 段 1 程 序 段 2 程 序 段 n 默 认 程 序 段 图 3.8 If Then ElseIf 语 句 的 执 行 过 程 40

第 3 章 Visual Basic 程 序 控 制 结 构 41 要 注 意 的 是, 不 管 有 几 个 ElseIf 子 句, 程 序 执 行 完 一 个 语 句 块 后, 其 余 ElseIf 子 句 不 再 执 行 当 多 个 ElseIf 子 句 中 的 条 件 都 成 立 时, 只 执 行 第 一 个 条 件 成 立 的 子 句 中 的 语 句 块 因 此, 在 使 用 ElseIf 语 句 时, 要 特 别 注 意 各 判 断 条 件 的 前 后 次 序 例 3.4 利 用 If Then Else 语 句 编 写 求 下 列 函 数 的 值 的 程 序 1 x x < 1 y= (1 x)(2 x) 1 x 2 (2 x) x > 2 根 据 题 意, 在 窗 体 上 添 加 一 个 命 令 按 钮 和 标 签 控 件 具 体 实 现 如 下 : Private Sub Form_Click() Dim x As Double, y As Double x = Val(InputBox(" 请 输 入 x 的 值 :") If (x < 1) Then y = 1 - x ElseIf (x >= 1 And x <= 2) Then y = (1 - x) * (2 - x) Else y = -(2 - x) End If Print "y=";y 2. Select Case 语 句 多 分 支 选 择 结 构 虽 然 可 以 用 If Then Else 来 实 现, 但 是 判 断 的 层 次 比 较 多 时, 会 导 致 程 序 可 读 性 差, 不 易 维 护 这 种 情 况 下, 可 以 改 用 分 情 况 选 择 语 句 Select Case 语 句 Select Case 语 句 的 语 法 格 式 如 下 : Select Case < 测 试 表 达 式 > Case 表 达 式 列 表 1 程 序 段 1 [Case 表 达 式 列 表 2 程 序 段 2] [Case Else 默 认 程 序 段 ] End Select 其 中 : 测 试 表 达 式 可 以 是 一 个 字 符 串 或 数 学 表 达 式 表 达 式 列 表 内 容 为 常 量, 必 须 与 测 试 表 达 式 的 类 型 相 同, 可 以 是 以 下 形 式 之 一 (1) 一 组 枚 举 表 达 式, 用 逗 号 分 隔, 例 如 : Case 2, 4, 6, 8 41

42 Visual Basic 程 序 设 计 (2) 表 达 式 1 To 表 达 式 2, 较 小 的 数 值 必 须 显 示 在 To 之 前, 例 如 : Case -7 To 7 Case "a" To "abc" (3) Is < 关 系 运 算 符 > < 常 量 >, 例 如 : Case Is <5, Is>50 (4) 以 上 表 达 式 的 组 合, 例 如 : Case 2, 4, Is<-5 Select Case 语 句 首 先 处 理 一 个 测 试 表 达 式, 并 只 计 算 一 次 然 后 将 表 达 式 的 值 与 结 构 中 的 每 个 Case 的 值 进 行 比 较, 若 相 等, 就 执 行 与 该 Case 相 关 联 的 程 序 段, 若 都 不 相 等 则 执 行 Case Else 后 的 默 认 程 序 段 或 执 行 Select Case 语 句 的 下 一 条 语 句 ( 省 略 Case Else 情 况 下 ) Case Else 虽 然 是 可 选 的, 但 是 最 好 使 用, 以 防 遗 漏 测 试 数 据 下 面 给 出 了 一 个 使 用 Select Case 语 句 的 实 例, 读 者 可 根 据 它 加 深 对 Select Case 语 句 的 使 用 的 理 解 Private Sub Form_Click() Dim Age As Integer Age = Val(InputBox$(" 请 输 入 年 龄 ")) ' 输 入 数 值 Select Case Age ' 根 据 不 同 的 年 龄 范 围 输 出 不 同 的 内 容 Case 1 To 12 MsgBox " 您 是 一 个 儿 童 " Case 13 To 19 MsgBox " 您 是 一 个 少 年 " Case Is > 19,Is<150 MsgBox " 您 是 一 个 成 人 " Case Else MsgBox " 您 的 年 龄 超 出 了 范 围!!" End Select 3.2.4 应 用 举 例 例 3.5 设 计 一 个 登 录 程 序, 当 用 户 输 入 的 口 令 正 确 时, 显 示 已 成 功 进 入 本 系 统, 否 则, 显 示 口 令 错! 请 重 新 输 入 如 果 连 续 3 次 输 入 了 口 令 仍 不 正 确, 则 提 示 您 无 权 使 用 本 系 统 分 析 : 假 设 使 用 一 个 文 本 框 Text1 来 接 收 口 令, 运 行 时 用 户 输 入 完 口 令 并 按 回 车 键 后 系 统 才 对 输 入 的 口 令 进 行 检 查, 因 此 本 例 使 用 了 Text1 的 KeyPress 事 件 当 焦 点 位 于 文 本 框 内, 按 下 键 盘 上 任 一 键 后 会 产 生 KeyPress 事 件, 同 时 返 回 按 键 代 码 KeyAscii 回 车 键 的 代 码 为 13, 所 以 程 序 首 先 判 断 用 户 是 否 在 Text1 中 按 下 了 回 车 键, 若 KeyAscii=13, 表 示 口 令 输 入 完 成 42

第 3 章 Visual Basic 程 序 控 制 结 构 43 说 明 : 本 程 序 中 使 用 了 一 个 窗 体 级 变 量 I 来 统 计 输 入 错 误 口 令 的 次 数 变 量 I 只 在 第 一 次 判 断 口 令 时 被 初 始 化 为 0, 以 后 每 次 执 行 该 过 程 时, 若 口 令 错 误, 则 I 的 值 累 加 1, 因 此, 当 I 的 值 为 3 时, 表 示 用 户 已 经 连 续 3 次 输 入 了 错 误 口 令 程 序 代 码 如 下 : Private Sub Text1_KeyPress(KeyAscii As Integer) Static I As Integer If KeyAscii = 13 Then If Text1.Text = "abc" Then Label2.Caption = " 您 已 成 功 进 入 本 系 统 " ElseIf I < 3 Then I = I + 1 Label2.Caption = " 口 令 错! 请 重 新 输 入 " Text1.SetFocus Else MsgBox " 您 无 权 使 用 本 系 统 " End If End If 3.3 循 环 结 构 循 环 是 重 复 执 行 一 组 指 令, 重 复 次 数 由 一 定 的 条 件 决 定, 结 构 中 反 复 执 行 的 部 分 称 为 循 环 体 如 果 是 无 条 件 循 环, 循 环 体 代 码 将 无 限 地 执 行 下 去 ( 即 死 循 环 ), 这 种 情 况 当 然 应 该 避 免 循 环 结 构 实 现 的 方 法 基 本 上 有 两 种, 一 种 是 指 定 一 个 条 件 表 达 式, 当 表 达 式 的 值 为 True( 或 者 是 False) 时 执 行 循 环 体, 否 则 就 退 出 循 环 ; 另 一 种 是 指 定 循 环 次 数 3.3.1 For Next 循 环 结 构 当 可 以 预 知 程 序 中 循 环 的 次 数 时, 可 用 For Next 语 句 For Next 循 环 中 有 一 个 计 数 器 变 量, 决 定 循 环 的 次 数 For Next 语 句 的 语 法 格 式 如 下 : For 循 环 控 制 变 量 = 初 值 To 终 值 [Step 步 长 ] [ 程 序 段 ] [If 条 件 式 Then Exit For] ' 在 特 定 条 件 下 退 出 循 环 [ 程 序 段 ] Next [ 循 环 控 制 变 量 ] 其 中 : 循 环 控 制 变 量 初 值 终 值 步 长 是 数 值 型 变 量 步 长 若 为 正 数, 则 终 值 应 该 大 于 初 值 ; 若 为 负 数, 则 终 值 应 该 小 于 初 值 循 环 开 始 时, 循 环 控 制 变 量 的 值 为 初 值, 每 执 行 一 次 循 环 体, 它 的 值 要 加 一 次 步 长 的 值, 然 后 判 断 其 值 是 否 小 于 等 于 ( 或 大 于 等 于, 在 步 长 为 负 值 的 情 况 下 ) 终 值, 如 果 判 断 结 果 为 真, 则 继 续 执 行 循 环 体, 否 则 退 出 循 环 For Next 语 句 的 执 行 过 程 如 图 3.9 所 示 43

44 Visual Basic 程 序 设 计 循 环 变 量 = 初 值 假 循 环 变 量 终 值? 真 循 环 体 循 环 变 量 = 循 环 变 量 + 步 长 图 3.9 For Next 语 句 的 执 行 过 程 例 如, 要 输 出 1~6 之 间 所 有 整 数 的 平 方 值, 可 使 用 如 下 语 句 : Private Sub Form_Click() Dim I, J, k As Integer I = 6: J = 1 For k = I To J Step -1 Print k^2 Next k 例 3.6 计 算 S=1+2+3+ +n (n 值 由 用 户 输 入 ) 这 是 一 个 累 加 求 和 的 问 题 解 决 这 类 程 序 时, 通 常 是 引 入 一 个 用 来 存 放 和 值 的 单 元 S, 然 后 循 环 地 向 S 中 加 入 一 个 加 数, 最 后, 在 变 量 S 中 存 放 的 就 是 累 加 的 结 果 程 序 代 码 如 下 : n = InputBox("input n") S = 0 For I = 1 To Val(n) S = S + I Next I Print S 在 这 个 程 序 中 就 是 循 环 地 向 S 中 加 了 n 次 数, 第 1 次 加 的 是 1, 第 2 次 加 的 是 2,, 第 n 次 加 的 是 n, 即 每 次 的 累 加 项 总 是 与 次 数 相 同, 因 为 循 环 控 制 变 量 I 表 示 了 次 数, 所 以, 在 循 环 体 中 累 加 项 用 I 来 表 示 为 了 使 结 果 不 受 到 影 响, 所 以 将 S 的 初 始 值 设 置 为 0 在 累 加 问 题 中, 关 键 在 于 设 置 了 一 个 用 来 表 示 累 加 和 的 变 量, 然 后 通 过 循 环 依 次 的 向 其 中 放 入 一 个 有 规 律 变 化 的 累 加 项 除 此 以 外, 还 有 累 乘 求 积 的 问 题, 累 乘 与 累 加 44

第 3 章 Visual Basic 程 序 控 制 结 构 45 的 区 别 除 了 运 算 不 同 之 外, 就 是 用 来 表 示 积 的 变 量 的 初 始 值 应 设 置 为 1, 因 为 1 不 影 响 运 算 的 结 果 在 解 决 这 类 问 题 时, 关 键 在 于 确 定 循 环 次 数 和 找 到 每 次 要 相 加 或 相 乘 的 项 与 循 环 变 量 之 间 的 关 系 有 的 累 加 或 累 乘 问 题 中, 每 次 的 累 加 项 或 累 乘 项 与 循 环 变 量 之 间 不 存 在 任 何 关 系, 这 种 情 况 下 可 以 单 独 设 置 一 个 变 量 来 表 示 这 个 项 3.3.2 Do Loop 循 环 结 构 Do Loop 语 句 是 最 常 用 且 较 有 效 的 循 环 结 构 它 有 两 种 形 式 1. 当 型 循 环 当 型 循 环 是 先 判 断 条 件, 当 条 件 满 足 时 反 复 执 行 循 环 体, 直 到 条 件 不 满 足 为 止 循 环 体 有 可 能 一 次 也 不 执 行 其 语 法 格 式 如 下 : Do[ { While Until } 条 件 表 达 式 ] [ 程 序 段 ] [If 条 件 式 Then Exit Do] [ 程 序 段 ] Loop ' 在 特 定 条 件 下 退 出 循 环 其 中, 条 件 表 达 式 是 可 选 参 数, 可 以 是 数 值 表 达 式 或 字 符 串 表 达 式, 其 值 为 True 或 False 若 条 件 表 达 式 的 值 是 Null, 则 会 被 当 作 False 程 序 段 包 括 一 条 或 多 条 语 句 当 型 循 环 的 执 行 过 程 如 图 3.10 所 示 程 序 段 判 断 语 句 条 件 为 真 条 件 为 假 图 3.10 当 型 循 环 的 执 行 过 程 2. 直 到 型 循 环 直 到 型 循 环 是 先 执 行 循 环 体, 后 判 断 条 件, 当 条 件 满 足 时 继 续 执 行 循 环, 否 则 退 出 循 环 体 至 少 会 被 执 行 一 次 其 语 法 格 式 如 下 : Do [ 程 序 段 ] [If 条 件 式 Then Exit Do] ' 在 特 定 条 件 下 退 出 循 环 [ 程 序 段 ] Loop [ { While Until } 条 件 表 达 式 ] 其 中, 条 件 表 达 式 是 可 选 参 数 它 可 以 是 数 值 表 达 式 或 字 符 串 表 达 式, 其 值 为 True 或 45

46 Visual Basic 程 序 设 计 False 如 果 条 件 表 达 式 的 值 是 Null, 则 会 被 当 作 False 程 序 段 包 括 一 条 或 多 条 语 句 在 Do Loop 语 句 中 可 以 在 任 何 位 置 放 置 Exit Do 语 句, 随 时 跳 出 Do Loop 循 环 Exit Do 语 句 通 常 用 于 条 件 判 断 之 后, 在 这 种 情 况 下,Exit Do 语 句 将 控 制 权 转 移 到 紧 接 在 Loop 命 令 之 后 的 语 句 直 到 型 循 环 的 执 行 过 程 如 图 3.11 所 示 程 序 段 判 断 语 句 条 件 为 假 条 件 为 真 图 3.11 直 到 型 循 环 的 执 行 过 程 下 面 将 详 细 介 绍 Do Loop 语 句 的 4 种 结 构 (1) Do While < 条 件 表 达 式 > [ 程 序 段 ] Loop 当 条 件 表 达 式 为 True 时, 循 环 继 续 进 行, 直 到 条 件 表 达 式 变 为 False 为 止 这 种 循 环 被 称 为 当 型 循 环 例 如 要 计 算 5 的 阶 乘, 可 编 程 如 下 : Private Sub Form_Click() Dim I As Integer, Sum As Integer I = 1 'I 的 初 值 赋 为 1 P = 1 Do While I <= 5 P = P* I I = I + 1 Loop Print P (2) Do Until < 条 件 表 达 式 > [ 程 序 段 ] Loop 当 条 件 表 达 式 为 False 时, 循 环 继 续 进 行, 直 到 条 件 表 达 式 变 为 True 为 止 例 如 上 例 可 以 改 写 为 : Private Sub Form_Click() Dim I As Integer, Sum As Integer I = 1 P = 1 Do Until I > 5 46

P = P* I I = I + 1 Loop 程 序 输 出 的 结 果 与 上 例 相 同 (3) Do [ 程 序 段 ] Loop While < 条 件 表 达 式 > 第 3 章 Visual Basic 程 序 控 制 结 构 47 当 条 件 表 达 式 为 True 时, 循 环 继 续 进 行, 直 到 条 件 表 达 式 变 为 False 为 止 例 如 : Private Sub Form_Click() Dim I As Integer I = 6 Do Print I I = I + 1 Loop While I <= 5 程 序 输 出 结 果 为 :6 请 读 者 分 析 一 下, 当 本 程 序 的 循 环 体 改 为 Do While I <= 5 Print I I = I + 1 Loop 此 时, 程 序 的 输 出 结 果 是 否 有 变 化? 为 什 么 有 变 化? 请 找 出 原 因 如 果 循 环 体 不 变, 只 改 变 I 的 初 值, 将 I 的 初 值 赋 为 1, 结 果 会 是 什 么? (4) Do [ 程 序 段 ] Loop Until < 条 件 表 达 式 > 当 条 件 表 达 式 为 False 时, 循 环 继 续 进 行, 直 到 条 件 表 达 式 变 为 True 为 止 例 如 : Private Sub Form_Click() Dim I As Integer I = 6 Do Print I I = I + 1 Loop Until I > 5 程 序 输 出 结 果 为 :6 例 3.7 编 写 程 序, 计 算 如 下 多 项 式, 要 求 精 度 小 于 10-12 1 1 1 + + + + 2 2 2 1 2 n 47

48 Visual Basic 程 序 设 计 在 窗 体 单 击 事 件 中 添 加 如 下 代 码 : Private Sub Form_Click() Dim sum As Double, temp As Double Dim i As Double sum = 0 temp = 1 i = 1 Do While (temp >= 0.000000000001) sum = sum + temp i = i + 1 temp = 1 / i ^ 2 Loop Print sum 3.3.3 While Wend 循 环 结 构 对 于 简 单 的 循 环 可 以 用 While Wend 语 句, 它 的 功 能 比 其 他 的 循 环 语 句 简 单 其 一 般 格 式 为 : While < 条 件 表 达 式 > [ 程 序 段 ] Wend 该 循 环 格 式 中 的 条 件 表 达 式 一 般 为 布 尔 表 达 式, 也 可 以 是 数 值 和 字 符 表 达 式, 结 果 为 True 或 False, 用 来 表 示 一 个 判 断 条 件 该 语 句 首 先 计 算 给 定 的 条 件 表 达 式 的 值, 若 结 果 为 True( 非 0 值 ), 则 执 行 循 环 体, 当 遇 到 Wend 语 句 时, 控 制 返 回 并 继 续 对 条 件 表 达 式 进 行 测 试, 若 仍 然 为 True, 重 复 上 述 过 程 ; 若 条 件 表 达 式 的 结 果 为 False, 则 直 接 执 行 Wend 后 面 的 语 句 这 种 循 环 结 构 的 循 环 体 内 一 般 应 该 包 括 对 条 件 进 行 改 变 的 语 句, 使 条 件 表 达 式 的 结 果 发 生 变 化 否 则, 若 初 始 条 件 成 立, 则 每 次 执 行 完 循 环 体 后 再 检 验 条 件, 条 件 仍 然 成 立, 再 执 行 循 环 体, 这 样 无 限 执 行 下 去, 不 能 结 束, 就 形 成 了 死 循 环 若 初 始 条 件 不 成 立, 则 循 环 体 一 次 也 不 执 行, 循 环 就 毫 无 意 义 While 循 环 与 For 循 环 的 区 别 在 于 :For 循 环 对 循 环 体 执 行 指 定 的 次 数 ; 而 While 循 环 则 是 在 给 定 的 条 件 为 真 时 重 复 一 组 语 句 的 执 行 也 就 是 说, 通 过 While 循 环 可 以 指 定 一 个 循 环 终 止 的 条 件, 而 使 用 For 循 环 只 能 进 行 指 定 次 数 的 重 复 因 此, 当 需 要 由 数 据 的 某 个 条 件 是 否 满 足 来 控 制 循 环 时, 使 用 While 循 环 比 较 灵 活 例 3.8 找 出 1000 以 下 的 能 够 被 5 和 17 整 除 的 最 大 的 10 个 数 并 将 它 们 输 出 分 析 : 这 里 专 门 设 置 一 个 变 量 found 记 录 当 前 找 到 的 数 的 个 数, 只 要 found 的 值 小 于 10, 说 明 还 没 有 找 足, 循 环 继 续 进 行 窗 体 事 件 过 程 代 码 如 下 : Private Sub Form_Click() a = 1000 found = 0 While (found <> 10) a = a - 1 48

第 3 章 Visual Basic 程 序 控 制 结 构 49 If a Mod 5 = 0 And a Mod 17 = 0 Then found = found + 1 Print a End If Wend While Wend 循 环 也 可 以 是 多 层 的 嵌 套 结 构 每 个 Wend 匹 配 最 近 的 While 语 句 与 While Wend 语 句 相 比,Do Loop 语 句 提 供 了 一 种 结 构 化 与 适 应 性 更 强 的 方 法 来 执 行 循 环 Do Loop 语 句 中 的 条 件 表 达 式 既 可 以 放 在 循 环 之 首, 也 可 以 放 在 循 环 之 尾 此 外, Do Loop 循 环 可 以 在 条 件 没 有 满 足 的 情 况 下 退 出 循 环 ( 当 遇 到 Exit Do 语 句 ) 3.3.4 循 环 的 嵌 套 一 个 循 环 体 内 又 包 含 另 一 个 完 整 的 循 环 体 结 构, 称 为 循 环 的 嵌 套 内 嵌 的 循 环 中 还 可 以 嵌 套 循 环, 这 就 是 多 层 循 环 的 嵌 套 在 嵌 套 结 构 中, 对 嵌 套 的 层 数 没 有 限 制, 有 几 层 嵌 套, 就 称 为 几 重 循 环 多 重 循 环 的 执 行 过 程 是 : 外 循 环 每 执 行 一 次, 内 循 环 都 要 从 头 到 尾 执 行 一 遍 同 类 循 环 和 不 同 种 类 的 循 环 都 可 以 互 相 嵌 套 嵌 套 的 循 环 在 程 序 设 计 中 起 着 很 重 要 的 作 用 例 如, 下 面 的 程 序 段 实 现 计 算 1!+2!+3!+4! 的 结 果 并 打 印 结 果 : Dim I,J As Integer Dim Sum1,Sum2 As Integer Sum1=0:Sum2=1 For I=1 To 4 For J=1 To I Sum2=Sum2*J Next J Sum1=Sum1+Sum2 Next I Print Sum1 嵌 套 时 需 要 注 意, 内 层 循 环 必 须 完 全 包 含 在 外 层 循 环 之 内, 不 能 相 互 交 叉, 内 层 循 环 和 外 层 循 环 应 该 使 用 不 同 的 循 环 控 制 变 量 另 外, 在 多 重 循 环 的 任 何 一 层 循 环 中 都 可 以 使 用 Exit Do 或 Exit For 退 出 循 环, 但 要 注 意 只 能 退 出 Exit Do 或 Exit For 语 句 所 对 应 的 最 内 层 循 环, 而 不 是 一 次 退 出 多 层 循 环 例 3.9 编 程 计 算 Sum=1+(1+2)+(1+2+3)+ + (1+2+3+ +n), 其 中 n 由 用 户 输 入 分 析 : 这 是 一 个 累 加 问 题, 共 有 n 项 相 加, 可 以 设 置 存 放 累 加 和 的 变 量 为 Sum, 而 对 于 第 I 个 累 加 项 1+2+ +I, 又 是 一 个 累 加 问 题, 设 存 放 该 累 加 项 的 变 量 为 Sum1, 因 此 可 以 用 双 重 循 环 实 现 用 外 循 环 对 I 依 次 取 1 2 n 值, 对 于 每 一 次 的 累 加 项 ( 如 第 I 项 ), 用 内 循 环 控 制 求 1+2+ +I 设 文 本 框 Text1 用 于 输 入 总 项 数 n,text2 用 于 输 出 总 和 Sum, 运 行 时 单 击 窗 体 计 算 结 果 在 窗 体 单 击 事 件 中 添 加 如 下 代 码 : Private Sub Form_Click() n = Val(Text1.Text) Sum = 0 For I = 1 To n 49

50 Visual Basic 程 序 设 计 Sum1 = 0 ' 在 计 算 每 个 累 加 项 之 前, 将 存 放 累 加 和 的 变 量 清 零 For J = 1 To I Sum1 = Sum1 + J Next J Sum = Sum + Sum1 Next I Text2.Text = Sum 3.3.5 应 用 举 例 例 3.10 求 任 意 两 个 整 数 a b 的 最 大 公 约 数 分 析 : 所 谓 最 大 公 约 数 是 被 a b 都 能 整 除, 并 且 其 值 不 可 能 超 过 a b 中 较 小 的 一 个 的 最 大 数 因 此 可 以 循 环 地 依 次 将 该 范 围 内 的 每 一 个 整 数 进 行 验 证, 直 到 发 现 一 个 能 够 同 时 被 a 和 b 整 除 的 数 为 止 新 建 工 程, 在 窗 体 上 添 加 一 个 命 令 按 钮 和 两 个 文 本 框, 编 写 程 序 如 下 : Private Sub Command1_Click() Dim a As Integer, b As Integer, min As Integer a = Val(Text1.Text) b = Val(Text2.Text) If a > b Then b = min Else a = min End If For i = min To 1 Step -1 If (a Mod i = 0) And (b Mod i) = 0 Then Print " 最 大 公 约 数 为 ", i Exit For ' 得 出 解 之 后, 循 环 停 止 End If Next i 例 3.11 编 程 判 断 用 户 输 入 的 数 是 否 为 素 数 分 析 : 素 数 是 指 除 了 1 和 该 数 本 身 外, 不 能 被 任 何 整 数 整 除 的 数 判 断 一 个 自 然 数 n(n >= 3) 是 否 为 素 数, 只 要 依 次 用 从 2 到 n 作 除 数 去 除 n, 若 n 不 能 被 其 中 任 何 一 个 数 整 除, 则 n 为 素 数 可 以 在 While 循 环 语 句 的 循 环 体 中 编 写 语 句, 依 次 从 2 到 n 作 除 数 去 试 除 n, 并 不 断 判 断 n 是 否 被 当 前 数 整 除 若 n 被 某 数 整 除, 表 明 n 不 是 素 数, 则 退 出 循 环 ; 若 直 到 循 环 结 束, 还 没 有 一 个 数 能 整 除 n, 则 输 出 n 为 素 数 可 以 在 程 序 中 设 置 布 尔 变 量 flag,flag = False 表 示 在 程 序 执 行 过 程 中 没 有 找 到 一 个 除 了 1 和 它 本 身 以 外 能 整 除 n 的 数, 即 n 为 素 数 ; 若 flag=true, 则 说 明 找 到 了 某 个 能 整 除 n 的 正 整 数, 即 n 不 是 素 数 新 建 工 程, 编 写 代 码 如 下 : 50

第 3 章 Visual Basic 程 序 控 制 结 构 51 Private Sub Form_Click() ' 单 击 窗 体 时 执 行 Dim n As Integer, km As Integer, flag As Boolean, i As Integer n = InputBox(" 请 输 入 一 个 正 整 数 ( 3)") k = Int(Sqr(n)) flag = False i = 2 While i <= k And flag = False If n Mod i = 0 Then flag = True Else i = i + 1 End If Wend If flag = False Then Print n; " 是 素 数 " Else Print n; " 不 是 素 数 " End If 3.4 小 结 在 程 序 设 计 语 言 中 控 制 结 构 用 于 指 明 程 序 的 执 行 流 程 Visual Basic 语 言 提 供 的 基 本 控 制 结 构 可 以 分 为 3 种 类 型 (1) 顺 序 结 构 : 按 照 先 后 顺 序 依 次 执 行 程 序 中 的 语 句 ; (2) 选 择 结 构 : 按 照 给 定 条 件 有 选 择 地 执 行 程 序 中 的 语 句 ; (3) 循 环 结 构 : 按 照 给 定 规 则 重 复 地 执 行 程 序 中 的 语 句 顺 序 结 构 是 Visual Basic 程 序 中 执 行 流 程 的 默 认 结 构 在 一 个 没 有 选 择 和 循 环 结 构 的 程 序 中, 语 句 将 按 照 书 写 的 先 后 顺 序 ( 从 左 到 右, 自 上 而 下 ) 被 依 次 执 行 但 除 了 极 其 简 单 的 情 况 之 外, 程 序 的 顺 序 结 构 一 般 不 能 满 足 解 决 实 际 问 题 的 需 要 本 章 讨 论 了 顺 序 结 构 语 句 中 的 赋 值 数 据 输 入 输 出 注 释 暂 停 和 结 束 语 句 等 赋 值 语 句 的 语 法 格 式 为 : [Let] 变 量 或 属 性 = 表 达 式 或 Set 变 量 名 = 表 达 式 Visual Basic 常 用 的 键 盘 数 据 输 入 和 输 出 使 用 InputBox 函 数 和 MsgBox 函 数 Print 方 法 可 以 作 用 于 窗 体, 用 于 输 出 有 关 内 容 选 择 结 构 是 3 种 基 本 结 构 之 一 在 大 多 数 程 序 中 都 会 包 含 选 择 结 构 它 的 作 用 是, 根 据 所 指 定 的 条 件 是 否 满 足, 决 定 从 给 定 的 两 组 操 作 中 选 择 其 一 Visual Basic 提 供 了 If Then Else 语 句 和 Select Case 语 句 实 现 选 择 结 构 If Then Else 语 句 包 括 3 种 形 式 : (1) 行 If Then Else 语 句, 其 语 法 格 式 如 下 : 51

52 Visual Basic 程 序 设 计 If < 条 件 表 达 式 > Then < 语 句 > [Else < 语 句 > ] (2) 块 If Then Else 语 句, 其 语 法 格 式 如 下 : If < 条 件 表 达 式 > Then < 程 序 段 1> Else < 程 序 段 2> End If (3) If Then ElseIf 多 分 支 选 择 语 句, 其 一 般 格 式 如 下 : If < 条 件 表 达 式 1> Then < 程 序 段 1> ElseIf < 条 件 表 达 式 2> Then < 程 序 段 2> ElseIf < 条 件 表 达 式 n> Then < 程 序 段 n> [Else 默 认 程 序 段 ] End If Select Case 语 句 的 一 般 格 式 为 : Select Case < 测 试 表 达 式 > Case 表 达 式 列 表 1 程 序 段 1 [Case 表 达 式 列 表 2 程 序 段 2] [Case Else 默 认 程 序 段 ] End Select 循 环 控 制 结 构 是 程 序 中 的 另 一 个 基 本 结 构 在 实 际 问 题 中, 常 常 需 要 进 行 大 量 的 重 复 处 理, 循 环 结 构 可 以 使 程 序 设 计 者 只 写 很 少 的 语 句, 而 让 计 算 机 反 复 执 行, 从 而 完 成 大 量 类 似 的 计 算 Visual Basic 提 供 了 For 语 句 Do Loop 语 句 和 While 语 句 实 现 循 环 结 构 For 语 句 的 一 般 格 式 为 : For 循 环 控 制 变 量 = 初 值 To 终 值 [Step 步 长 ] [ 程 序 段 ] [If 条 件 式 Then Exit For] ' 在 特 定 条 件 下 退 出 循 环 [ 程 序 段 ] Next [ 循 环 控 制 变 量 ] Do Loop 语 句 提 供 了 当 型 循 环 和 直 到 型 循 环 两 种 描 述 方 式, 分 别 为 : Do[ { While Until } 条 件 表 达 式 ] [ 程 序 段 ] [If 条 件 式 Then Exit Do] [ 程 序 段 ] Loop ' 在 特 定 条 件 下 退 出 循 环 52

第 3 章 Visual Basic 程 序 控 制 结 构 53 和 Do [ 程 序 段 ] [If 条 件 式 Then Exit Do] ' 在 特 定 条 件 下 退 出 循 环 [ 程 序 段 ] Loop [ { While Until } 条 件 表 达 式 ] while 语 句 的 一 般 格 式 为 : While < 条 件 表 达 式 > [ 程 序 段 ] Wend 3.5 习 题 一 选 择 题 1. 执 行 下 面 的 程 序 段 后, 变 量 S 的 值 为 ( ) S=5 For i =3.5 To 8.7 Step 0.5 S=S+1 Next i A) 14 B) 15 C) 16 D) 17 2. 下 面 的 循 环 体 的 执 行 次 数 为 ( ) For I=30 to -10 Step -4 Print I Next I A) 7 B) 9 C) 11 D) 12 3. 在 窗 体 上 添 加 一 个 命 令 按 钮, 然 后 编 写 如 下 事 件 过 程 : Private Sub Command1_Click() x = 5: a = 0: b = 0 Do a = a+b-x a = Val(InputBox(" 请 输 入 a 的 值 ")) b = Val(InputBox(" 请 输 入 b 的 值 ")) x = Val(InputBox(" 请 输 入 x 的 值 ")) Loop Until x=-1 Print a 程 序 运 行 后, 单 击 命 令 按 钮, 依 次 在 输 入 对 话 框 中 输 入 4 3 2 1 0-1, 则 输 出 结 果 为 ( ) A) 0 B) 1 C) -1 D) 2 53

54 Visual Basic 程 序 设 计 4. 阅 读 下 面 的 程 序 段 : a=0 For i=1 To 3 For j=1 To i For k=j To 3 a=a+1 Next k Next j Next i 执 行 上 面 的 三 重 循 环 后,a 的 值 为 ( ) A) 3 B) 9 C) 14 D) 21 5. 在 窗 体 上 添 加 一 个 命 令 按 钮 ( 其 Name 属 性 为 Command1), 然 后 编 写 如 下 事 件 过 程 : Private Sub Command1_Click() x=0 Do While x<50 x=(x+2)*(x+3) n=n+1 Loop Print n; x 程 序 运 行 后, 单 击 命 令 按 钮,n 和 x 的 值 分 别 为 ( ) A) 1 和 0 B) 2 和 72 C) 3 和 50 D) 4 和 168 二 填 空 题 1. 以 下 程 序 的 功 能 是 : 生 成 10 个 50~100 之 间 的 随 机 整 数, 输 出 其 中 能 被 3 整 除 的 数 并 求 出 它 们 的 和 请 填 空 Private Sub Commandl_C1ick() For i=1 To 10 x=int( *200+ ) If =0 Then Print x S=S+ End If Print "Sum=";S 2. 由 用 户 输 入 3 个 数, 找 出 其 中 的 最 大 值 和 最 小 值 Private Sub Form_Click() Dim a, b, c, T a = b = c = If a < b Then If Then T = a: a = c: c = T 54

第 3 章 Visual Basic 程 序 控 制 结 构 55 If b < c Then T = b: b = c: c = T Print " 最 大 值 为 :"; Print " 最 小 值 为 :"; 三 编 程 题 1. 由 用 户 输 入 一 个 整 数, 编 程 判 断 该 数 是 奇 数 还 是 偶 数 2. 找 出 100 以 内 的 被 5 整 除 余 3 被 4 整 除 余 2 的 数 并 输 出 到 窗 体 上 3. 找 出 1000 以 内 所 有 的 水 仙 花 数 并 输 出 水 仙 花 数 即 该 数 的 个 位 的 立 方 加 上 十 位 的 立 方 加 上 百 位 的 立 方 等 于 这 个 数 本 身 例 如 :153=1 3 +5 3 +3 3 4. 编 程 输 出 九 九 乘 法 表 55

第 4 章 Visual Basic 常 用 内 部 控 件 教 学 提 示 : 控 件 是 组 成 程 序 外 部 表 象 的 基 本 元 素, 通 过 合 理 整 齐 地 布 置 控 件, 可 以 方 便 地 使 用 程 序, 使 程 序 的 易 用 性 大 大 提 高 本 章 主 要 介 绍 常 用 控 件 的 属 性 事 件 和 方 法 教 学 要 求 : 掌 握 命 令 按 钮 标 签 框 文 本 框 复 选 框 单 选 按 钮 框 架 图 像 框 图 片 框 滚 动 条 以 及 定 时 器 等 控 件 的 基 本 要 素 和 使 用 方 法 4.1 概 述 在 Visual Basic 中, 控 件 分 两 类 : 一 类 是 标 准 控 件, 又 叫 内 部 控 件, 也 就 是 Visual Basic 预 设 的 控 件, 这 类 控 件 是 在 Visual Basic 启 动 时 工 具 箱 内 的 控 件 ; 另 一 类 是 外 挂 控 件, 必 须 通 过 Visual Basic 的 工 程 菜 单 中 的 添 加 用 户 控 件 来 增 加 控 件, 又 称 为 ActiveX 控 件 本 章 中 主 要 介 绍 的 是 常 用 的 12 个 标 准 控 件, 如 表 4-1 所 示 表 4-1 Visual Basic 常 用 内 部 控 件 控 件 名 称 图 标 类 名 说 明 命 令 按 钮 CommandButton 命 令 按 钮, 可 以 和 多 个 按 钮 组 合 使 用 标 签 Label 为 用 户 显 示 不 可 交 互 操 作 或 不 可 修 改 的 文 本 文 本 框 TextBox 提 供 用 户 交 互 区 或 显 示 文 本 复 选 框 CheckBox 与 多 个 复 选 框 组 成 的 多 项 选 择 中, 允 许 选 择 多 个 选 项 单 选 按 钮 OptionButton 与 多 个 单 选 按 钮 组 成 的 多 项 选 择 中, 只 允 许 做 一 种 选 择 框 架 Frame 为 控 件 提 供 可 视 的 功 能 化 容 器 图 像 框 Image 显 示 位 图 图 标 Windows 图 元 文 件 JPEG 或 GIF 文 件 图 片 框 PictureBox 显 示 位 图 图 标 Windows 图 元 文 件 JPEG 或 GIF 等 文 件 也 可 显 示 文 本 或 者 作 为 其 他 控 件 的 可 视 容 器 列 表 框 ListBox 显 示 项 目 列 表, 用 户 可 以 从 中 选 择 组 合 框 ComboBox 文 本 框 和 列 表 框 的 组 合, 即 可 以 输 入 又 可 以 选 择 滚 动 条 HscrollBar,VscrollBar 用 户 通 过 滚 动 条 选 择 指 定 区 间 的 数 据 定 时 器 Timer 按 一 定 的 时 间 间 隔 执 行 定 时 器 事 件

第 4 章 Visual Basic 常 用 内 部 控 件 57 在 窗 体 上 创 建 了 一 个 控 件 后, 控 件 会 自 动 获 得 一 个 名 字, 新 对 象 的 唯 一 名 字 由 对 象 类 型 加 上 一 个 唯 一 的 整 数 组 成 例 如, 第 一 个 文 本 框 控 件 的 Name 属 性 是 Text1, 第 二 个 文 本 框 名 字 就 是 Text2 但 实 际 程 序 的 编 写 中, 为 了 操 作 方 便 提 高 程 序 的 可 读 性, 可 以 考 虑 根 据 控 件 在 程 序 中 的 实 际 作 用, 为 其 另 取 一 个 合 适 的 名 称 建 议 使 用 : 英 文 缩 写 + 数 字 编 码 作 为 控 件 的 名 称 控 件 的 命 名 规 则 如 下 (1) 对 象 的 Name 属 性 必 须 以 一 个 字 母 开 始 (2) 最 长 可 达 40 个 字 符 (3) 它 可 以 包 括 数 字 和 带 下 划 线 的 字 符, 但 不 能 包 括 标 点 符 号 或 空 格 Name 属 性 是 每 个 控 件 都 有 的, 具 有 唯 一 性, 不 同 类 型 的 控 件 不 能 共 享 相 同 的 名 字 每 个 控 件 除 了 Name 属 性 外, 其 余 属 性 都 因 它 的 作 用 而 有 所 区 别, 并 由 于 功 能 上 的 特 殊 性 而 包 含 一 些 自 身 特 殊 或 常 用 的 属 性 事 件 和 方 法 4.2 命 令 按 钮 命 令 按 钮 控 件 是 使 用 最 为 广 泛 的 控 件 之 一 它 可 以 控 制 一 个 程 序 的 开 始 中 断 和 结 束 命 令 按 钮 控 件 的 名 称 (Name) 和 Caption( 标 题 ) 的 默 认 值 都 为 :Command1 Command2 4.2.1 命 令 按 钮 的 常 用 属 性 1. Caption 属 性 ( 字 符 串 类 型 ) 控 件 的 Caption 属 性 值 为 显 示 在 控 件 上 的 标 题, 运 行 时 用 户 在 界 面 上 看 到 的 是 Caption 值 并 不 是 所 有 的 控 件 都 有 这 个 属 性, 比 如 文 本 框 驱 动 器 或 目 录 或 文 件 列 表 框 图 像 或 图 片 框 定 时 器 滚 动 条 组 合 框 数 据 库 等 控 件 就 没 有 这 个 属 性, 初 始 状 态 Caption 与 名 称 属 性 同 名 2. Enabled 属 性 ( 逻 辑 类 型 ) Enabled( 可 用 性 ) 属 性 只 能 取 值 为 False 或 True: 当 值 为 False 时 控 件 不 可 用, 为 灰 色 ; 当 值 为 True 时 控 件 可 用 Enabled 属 性 可 以 在 设 计 时 设 置, 也 可 以 在 运 行 时 用 赋 值 语 句 为 其 赋 值 3. 命 令 按 钮 的 其 他 属 性 (1) Appearance 属 性 ( 整 数 0 1) 值 为 1 则 以 3D 效 果 显 示 该 控 件, 值 为 0 则 不 然, 该 属 性 运 行 时 只 读 (2) BackColor 属 性 ( 整 数 类 型 ) 背 景 色 的 设 置, 可 以 在 调 色 板 中 选 择, 或 者 采 用 系 统 的 调 色 方 案 (3) Cancel 属 性 ( 逻 辑 类 型 ) 该 属 性 值 决 定 按 钮 是 否 为 一 个 取 消 按 钮, 当 按 Esc 键 时,Cancel 属 性 为 True 的 命 令 按 钮 ( 只 有 一 个 ) 的 Click 事 件 过 程 被 调 用 57

58 Visual Basic 程 序 设 计 (4) Default 属 性 ( 逻 辑 类 型 ) 该 属 性 值 决 定 哪 一 个 命 令 按 钮 控 件 是 窗 体 的 默 认 命 令 按 钮, 即 不 论 焦 点 处 于 任 何 控 件 上 ( 非 命 令 按 钮 ), 在 按 下 回 车 键 时, 都 会 调 用 默 认 命 令 按 钮 的 Click 事 件 窗 体 中 只 能 有 一 个 命 令 按 钮 可 以 为 默 认 命 令 按 钮, 当 某 个 命 令 按 钮 的 Default 设 置 为 True 时, 窗 体 中 其 他 的 命 令 按 钮 自 动 设 置 为 False (5) Font 属 性 属 性 名 FontBold ( 逻 辑 类 型 ), 值 为 True 则 显 示 文 字 字 体 加 粗 属 性 名 FontItalic( 逻 辑 类 型 ), 值 为 True 则 显 示 文 字 为 斜 体 属 性 名 FontName( 字 符 串 类 型 ), 值 为 控 件 上 所 显 示 字 体 类 型 的 名 称 属 性 名 FontSize( 整 数 类 型 ), 值 为 控 件 上 所 显 示 的 文 字 字 号 的 大 小 属 性 名 FontStrikethru( 逻 辑 类 型 ), 值 为 True, 则 控 件 上 所 显 示 的 文 字 被 加 删 除 线, 值 为 False 则 无 删 除 线 属 性 名 FontUnderline( 逻 辑 类 型 ), 值 为 True, 则 控 件 上 所 显 示 的 文 字 下 加 下 划 线, 值 为 False 则 无 下 划 线 (6) Left Top Height Width 属 性 ( 数 值 类 型 ) 控 件 的 位 置 属 性, 以 缇 (twip) 为 单 位,1 英 寸 =1440 缇 Left 属 性 值 为 控 件 的 左 边 界 与 它 所 在 容 器 左 边 界 之 间 的 距 离 Top 属 性 值 为 控 件 的 上 边 界 与 它 所 在 容 器 上 边 界 之 间 的 距 离 Height 属 性 值 为 控 件 的 高 度 Width 属 性 值 为 控 件 的 宽 度 修 改 以 上 4 个 属 性 可 以 设 定 控 件 的 位 置 和 大 小 (7) Style Picture 属 性 Style 属 性 值 决 定 按 钮 的 显 示 方 式 是 否 以 图 像 形 式 出 现 : 值 为 0 则 按 钮 上 只 能 显 示 文 字 ; 值 为 1 则 在 按 钮 上 显 示 图 像 : 图 像 文 件 的 名 由 Picture 属 性 值 确 定 (8) Visible 属 性 ( 逻 辑 类 型 ) 判 断 控 件 是 否 为 可 见, 值 为 True 和 False, 当 为 False 时, 按 钮 不 可 见 (9) Index 属 性 ( 整 数 类 型 ) 当 控 件 为 一 控 件 数 组 时, 此 属 性 值 为 该 控 件 在 数 组 中 的 下 标 值 4.2.2 命 令 按 钮 的 常 用 事 件 命 令 按 钮 标 题 上 所 显 示 的 按 钮 功 能 是 由 该 控 件 相 应 的 事 件 过 程 赋 予 的 相 应 的 动 作 激 发 相 应 的 事 件 过 程, 对 于 命 令 按 钮 最 常 用 的 事 件 就 是 Click 单 击 事 件 命 令 按 钮 没 有 双 击 事 件, 它 解 释 为 两 次 连 续 的 单 击 事 件 例 4.1 设 置 一 个 用 于 卸 载 当 前 窗 体 的 命 令 按 钮 将 控 件 名 称 改 为 cmdexit, 把 Caption 属 性 设 为 退 出, 其 Click 事 件 过 程 如 下 : Private Sub cmdexit_click() Unload Me ' 卸 载 当 前 窗 体, 此 处 Me 是 指 当 前 窗 体 运 行 时 单 击 窗 体 中 显 示 的 退 出 按 钮, 则 激 活 了 它 的 Click 事 件, 执 行 Unload Me 语 句 使 得 窗 体 被 卸 载 58

第 4 章 Visual Basic 常 用 内 部 控 件 59 4.3 文 本 控 件 与 文 本 相 关 的 标 准 控 件 是 标 签 和 文 本 框 标 签 只 能 用 来 显 示 文 本, 而 文 本 框 可 以 在 用 户 之 间 进 行 交 互, 既 可 以 显 示 文 本, 又 可 以 输 入 文 本 4.3.1 标 签 标 签 控 件 默 认 的 控 件 名 称 和 Caption 属 性 值 都 为 :Label1 Label2 Label 控 件 是 图 形 控 件, 可 以 显 示 用 户 不 能 直 接 改 变 的 文 本 标 签 的 用 途 非 常 广, 几 乎 在 所 有 的 设 计 中 都 会 用 它 来 做 一 些 说 明 运 行 时 不 能 在 标 签 框 上 直 接 输 入 文 字, 但 可 以 用 程 序 中 的 语 句 来 改 变 Label 控 件 显 示 的 文 本 标 签 有 如 下 几 个 常 用 属 性 (1) Caption 属 性 ( 字 符 串 类 型 ) 标 签 控 件 的 主 要 作 用 是 在 应 用 程 序 界 面 上 加 入 说 明, 用 户 在 界 面 上 看 到 的 是 它 的 Caption 属 性, 所 以 Caption 属 性 是 标 签 最 重 要 的 属 性 它 的 许 多 其 他 属 性, 比 如 字 体 颜 色 等, 也 是 为 标 题 的 字 体 而 设 置 的 由 于 运 行 时,Caption 属 性 的 值 可 以 被 改 写, 因 此 也 时 常 通 过 改 写 该 属 性 值 而 在 界 面 上 显 示 运 行 结 果 (2) Autosize 属 性 ( 逻 辑 类 型 ) 该 属 性 决 定 控 件 是 否 自 动 改 变 大 小, 以 显 示 其 全 部 内 容 当 字 符 串 Caption 的 字 符 数 超 过 设 定 的 字 符 串 Caption 的 宽 度 时, 有 以 下 两 种 情 况 若 Autosize 属 性 值 为 True, 则 自 动 改 变 控 件 大 小 以 显 示 全 部 内 容 ; 若 Autosize 属 性 值 为 False( 默 认 值 ), 则 保 持 控 件 大 小 不 变, 超 出 部 分 不 予 显 示 (3) WordWrap 属 性 ( 逻 辑 类 型 ) 该 属 性 用 来 指 示 AutoSize 属 性 设 置 为 True 时, 标 签 控 件 是 否 要 进 行 水 平 或 垂 直 展 开 以 适 合 其 Caption 属 性 中 指 定 的 文 本 的 要 求 (4) Backstyle 属 性 ( 整 数 类 型, 取 值 0,1) 该 属 性 值 用 于 指 示 标 签 是 否 透 明 Backstyle 属 性 值 为 0, 透 明 ( 与 窗 体 同 色 ); Backstyle 属 性 值 为 1( 默 认 值 ), 不 透 明 (5) Bordstyle 属 性 ( 整 数 类 型, 取 值 0,1) 该 属 性 值 用 于 判 断 控 件 是 否 有 边 框 Bordstyle 属 性 值 为 0( 默 认 值 ), 无 边 框 ; Bordstyle 属 性 值 为 1, 有 边 框 标 签 控 件 也 会 用 到 如 Click DbClick 等 事 件 但 在 程 序 设 计 中, 习 惯 上 还 是 将 其 作 为 文 本 显 示 使 用 59

60 Visual Basic 程 序 设 计 4.3.2 文 本 框 文 本 框 控 件 名 称 和 Text 属 性 的 默 认 值 都 为 :Text1 Text2 TextBox 控 件 有 时 也 称 作 编 辑 字 段 或 编 辑 控 件, 它 可 以 在 程 序 运 行 过 程 中 接 收 数 据 ( 字 符 型 ), 也 可 以 用 来 显 示 程 序 的 运 行 结 果 1. 文 本 框 的 常 用 属 性 文 本 框 的 常 用 属 性 有 如 下 几 个 (1) Text 属 性 ( 字 符 串 类 型 ) 该 属 性 是 文 本 框 控 件 最 重 要 的 属 性 之 一 可 以 在 设 计 时 设 定 Text 属 性, 也 可 以 在 运 行 时 用 直 接 在 文 本 框 内 输 入 或 向 Text 属 性 赋 值 的 方 法 来 改 变 该 属 性 的 值 给 文 本 框 控 件 的 Text 属 性 赋 值 的 语 法 为 : 文 本 框 控 件 名.text = < 字 符 串 > (2) MaxLength 属 性 ( 整 数 类 型, 取 值 在 0~65535 之 间 ) 该 属 性 值 设 定 在 文 本 框 控 件 中 能 够 输 入 的 最 大 字 符 数, 默 认 值 为 0, 表 示 在 文 本 框 中 输 入 的 字 符 数 没 有 限 制 该 属 性 值 不 得 大 于 65535, 若 在 其 取 值 范 围 内 设 定 了 一 个 非 0 值, 则 Text 尾 部 多 出 的 部 分 被 截 断 (3) MultiLine 属 性 ( 逻 辑 类 型 ) 该 属 性 值 设 定 Text 字 符 串 中 是 否 接 收 换 行 符 MultiLine 属 性 值 为 False( 默 认 值 ), 文 本 框 中 的 字 符 只 能 在 一 行 中 显 示 MultiLine 属 性 值 为 True, 则 文 本 框 中 的 字 符 可 以 多 行 显 示 设 计 时, 在 属 性 窗 口 中 直 接 写 入 Text, 按 回 车 键 则 换 行 ; 运 行 时, 用 赋 值 语 句 修 改 Text 属 性, 必 须 加 入 回 车 换 行 符 才 可 换 行 例 如 :Text1.Text = " 未 到 达 边 界 " + Chr(13) + Chr(10) + " 另 起 一 行 " (4) ScrollBars 属 性 ( 整 数 类 型, 取 值 0 1 2 3) 该 属 性 值 决 定 是 否 为 文 本 框 加 滚 动 条 当 文 本 过 长, 可 能 超 过 文 本 输 入 / 显 示 边 界 时, 应 为 该 控 件 添 加 滚 动 条 ScrollBars 属 性 值 为 0( 默 认 值 ), 无 滚 动 条 ; ScrollBars 属 性 值 为 1, 加 水 平 滚 动 条 ; ScrollBars 属 性 值 为 2, 加 垂 直 滚 动 条 ( 当 MultiLine 属 性 为 True 时 该 设 置 有 效 ); ScrollBars 属 性 值 为 3, 同 时 加 水 平 和 垂 直 滚 动 条 (5) PasswordChar 属 性 ( 字 符 类 型 ) 该 属 性 值 设 定 输 入 文 本 的 特 殊 显 示 字 符, 在 设 计 密 码 程 序 时 非 常 有 效 其 值 只 能 为 1 个 字 符, 默 认 值 为 空 仅 当 MultiLine 属 性 为 False 且 PasswordChar 值 为 非 空 格 符 时, 该 属 性 设 置 有 效 无 论 用 户 按 下 了 什 么 字 符, 在 输 入 框 中 一 律 是 用 PasswordChar 值 显 示 ( 非 实 际 字 符 ) 如 在 Form_Load 事 件 中 做 如 下 设 置, 窗 体 装 入 后 直 接 在 Text1 的 输 入 框 中 输 入 "1234567", 可 以 看 到 输 入 框 内 显 示 的 内 容 是 "*******" 60

Private Sub Form_Load() Text1.PasswordChar = "*" 第 4 章 Visual Basic 常 用 内 部 控 件 61 (6) 文 本 编 辑 属 性 SelStart 属 性 ( 数 值 类 型 ) 表 示 文 本 框 内 被 选 中 文 本 的 起 始 位 置, 计 数 从 0 开 始 SelLenght 属 性 ( 数 值 类 型 ) 表 示 文 本 框 内 被 选 中 文 本 的 长 度 SelText 属 性 ( 字 符 串 类 型 ) 是 文 本 框 内 被 选 中 的 文 本 在 Windows 操 作 系 统 中, 剪 贴 板 是 常 用 的 文 本 编 辑 帮 助 工 具 把 文 本 框 和 剪 贴 板 对 象 结 合 使 用, 可 以 方 便 地 实 现 文 本 的 复 制 剪 切 和 粘 贴 有 关 剪 贴 板 操 作 的 几 个 方 法, 简 单 介 绍 如 下 : Clear 方 法 清 除 剪 贴 板 中 的 内 容, 应 用 举 例 : ClipBoard.Clear GetText 方 法 将 剪 贴 板 中 的 文 本 复 制 到 指 定 文 本 框 的 光 标 处 或 复 制 给 字 符 串 变 量 应 用 举 例 : Text1.SelText=Clipboard.GetText str1=clipboard.gettext SetText 方 法 将 选 中 文 本 送 入 剪 贴 板, 应 用 举 例 : Clipboard.SetText(Text1.SelText) 例 4.2 设 计 一 个 简 单 的 文 本 编 辑 器 程 序, 文 本 输 入 在 某 个 文 本 框 控 件 Text1 中, 程 序 具 有 复 制 剪 切 粘 贴 删 除 清 除 和 退 出 功 能 该 程 序 的 界 面 如 图 4.1 所 示 界 面 中 有 关 控 件 的 设 置 如 表 4-2 所 示 图 4.1 例 4.2 的 界 面 设 计 表 4-2 例 4.2 的 控 件 设 计 控 件 名 称 控 件 显 示 控 件 功 能 Command1 复 制 复 制 选 中 的 文 字 到 剪 贴 板 Command2 剪 切 剪 切 选 中 的 文 字 到 剪 贴 板 Command3 粘 贴 粘 贴 文 字 到 光 标 所 在 处 Command4 删 除 删 除 选 中 的 文 字 Command5 清 除 清 除 文 本 框 中 所 有 的 内 容 Command6 退 出 退 出 程 序 Text1 显 示 文 本 61

62 Visual Basic 程 序 设 计 程 序 代 码 如 下 : Private Sub Command1_Click() Clipboard.Clear ' 清 空 剪 贴 板 Clipboard.SetText (Text1.SelText) ' 将 Text1.Text 内 被 选 中 的 文 本 送 剪 贴 板 Private Sub Command2_Click() Clipboard.Clear ' 清 空 剪 贴 板 Clipboard.SetText (Text1.SelText) ' 将 Text1 控 件 选 中 的 文 本 送 剪 贴 板 Text1.SelText = "" ' 删 除 Text1 控 件 选 中 的 文 本 Private Sub Command3_Click() Text1.SelText = Clipboard.GetText ' 将 剪 贴 板 中 的 文 本 复 制 到 指 定 文 本 框 的 光 标 处 Private Sub Command4_Click() Text1.SelText = "" ' 将 Text1.Text 内 被 选 中 的 文 本 置 为 空 串 Private Sub Command5_Click() Text1.Text = "" ' 将 Text1.Text 置 为 空 串 Private Sub Command6_Click() End 2. 文 本 框 的 常 用 事 件 文 本 框 的 常 用 事 件 有 如 下 两 个 (1) Change 事 件 当 文 本 框 中 的 内 容 发 生 改 变 时 触 发 Change 事 件 (2) Keypress 事 件 Keypress 事 件 由 用 户 在 文 本 框 控 件 的 输 入 框 中 按 任 意 键 触 发 Keypress 事 件 过 程 有 一 个 形 参 变 量 KeyAscii, 调 用 该 过 程 时, 触 发 调 用 的 按 键 的 ASCII 码 值 被 赋 与 KeyAscii 文 本 框 输 入 完 后, 一 般 习 惯 于 按 回 车 键 表 示 输 入 结 束 ( 回 车 键 的 ASCII 码 为 13) 下 列 事 件 过 程 可 以 在 输 入 过 程 结 束 后, 在 对 话 框 中 显 示 good student! Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Msgbox("good student!") End If 例 4.3 编 写 一 个 密 码 验 证 程 序, 用 户 只 允 许 输 入 3 次 密 码, 如 果 错 误, 则 退 出 程 序 在 窗 体 中 放 置 两 个 标 签 Lable1 和 Lable2,Lable1 的 Caption 属 性 设 置 为 密 码 输 入 框, Lable2 的 Caption 属 性 设 置 为 空, 再 放 置 一 个 文 本 框 Text1, 其 Text 属 性 设 置 为 空, 用 于 输 入 密 码 62

第 4 章 Visual Basic 常 用 内 部 控 件 63 程 序 代 码 如 下 : Dim password As String Dim flag As Byte Private Sub Form_Load() ' 初 始 量 的 设 置, 文 本 框 的 属 性 也 可 以 放 在 属 性 栏 中 ' 直 接 设 置 Text1.PasswordChar = "*" ' 设 置 文 本 框 为 密 码 框, 密 码 显 示 为 * Text1.MaxLength = 6 ' 设 置 密 码 最 大 长 度 为 6 位, 超 出 部 分 被 截 除 password = "123456" ' 设 置 初 始 密 码 为 123456 Label2.FontSize = 15 Label2.Alignment = 2 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then ' 按 下 回 车 键 后 判 断 密 码 flag = flag + 1 If Text1.Text = password Then ' 密 码 正 确 则 进 入 后 续 程 序, 在 这 里 示 例 直 接 退 出 Label2.Caption = "" MsgBox (" 密 码 正 确!") End Else If flag = 1 Then Label2.Caption = " 第 一 次 密 码 错 误 " ElseIf flag = 2 Then Label2.Caption = " 第 二 次 密 码 错 误 " ElseIf flag = 3 Then Label2.Caption = "" flag = 0 MsgBox (" 您 无 权 进 入, 密 码 错 误!") End End If End If End If 在 这 里 利 用 了 一 个 变 量 Flag 来 计 算 输 入 的 次 数, 每 次 回 车 后 如 果 系 统 判 断 输 入 的 不 是 正 确 的 密 码, 则 Flag 加 1, 允 许 输 入 2 次, 当 Flag 为 3 时, 输 入 被 拒 绝, 程 序 退 出 4.4 单 选 按 钮 复 选 框 和 框 架 单 选 按 钮 是 为 了 在 多 个 选 项 中 选 择 唯 一 一 个 合 适 的 值, 而 复 选 框 则 是 在 多 个 选 项 中 选 择 多 个 结 果, 功 能 上 虽 然 不 同, 但 在 使 用 时 二 者 的 很 多 属 性 和 事 件 都 很 相 似 4.4.1 单 选 按 钮 单 选 按 钮 在 计 算 机 应 用 程 序 中 使 用 非 常 普 遍, 对 于 具 有 互 斥 性 的 答 案, 一 般 都 采 用 单 选 按 钮 作 为 选 择, 比 如 性 别 的 选 择, 男 或 者 女 单 选 按 钮 的 属 性 以 及 名 称 的 默 认 值 都 为 Option1 Option2 63

64 Visual Basic 程 序 设 计 1. 单 选 按 钮 的 常 用 属 性 单 选 按 钮 的 常 用 属 性 有 如 下 一 些 (1) Caption 属 性 ( 字 符 类 型 ) Caption 属 性 值 是 显 示 在 控 件 上 的 文 本, 是 单 选 按 钮 的 标 题 (2) Alignment 属 性 ( 取 值 为 整 数 0 1) Alignment 属 性 决 定 单 选 按 钮 的 标 题 (Caption 属 性 值 ) 在 控 件 上 的 位 置 : 属 性 值 为 0 时 表 示 左 对 齐 (Left Justify), 即 单 选 按 钮 的 标 题 在 右 边, 此 为 默 认 方 式 如 图 4.2 所 示, 控 件 Option1 的 标 题 为 Option1 属 性 值 为 1 时 表 示 右 对 齐 (Right justify), 即 单 选 按 钮 的 标 题 在 左 边, 如 图 4.2 所 示, 控 件 Option2 的 标 题 为 Option2 图 4.2 单 选 按 钮 对 齐 属 性 说 明 (3) Enabled 属 性 ( 逻 辑 类 型 ) 控 件 的 Enabled 属 性 值 为 False 时, 控 件 显 示 为 灰 色, 运 行 时 不 可 用 就 是 说, 当 该 控 件 的 事 件 发 生 时, 相 应 的 事 件 过 程 一 个 也 不 会 被 调 用 (4) Index 属 性 ( 整 数 类 型 ) Index 属 性 值 标 识 由 单 选 按 钮 组 成 的 控 件 数 组 中 某 个 按 钮 的 索 引 值, 利 用 控 件 数 组 的 方 式 使 用 单 选 按 钮, 可 以 简 化 代 码, 增 强 代 码 的 可 读 性 具 体 在 下 章 数 组 中 有 详 细 说 明 (5) TabIndex 属 性 ( 整 数 类 型 ) 建 立 控 件 时,Visual Basic 自 动 为 其 分 配 一 个 TabIndex 值 (Menu Timer Data Image Line 和 Shape 等 控 件 除 外, 这 些 控 件 不 包 括 在 Tab 键 顺 序 中 ), 利 用 Tab 键 可 以 在 控 件 之 间 切 换 焦 点 (6) Value 属 性 ( 逻 辑 类 型 ) 反 映 控 件 状 态 的 属 性, 返 回 True 表 示 已 选 择 了 该 按 钮 ;False( 默 认 值 ) 表 示 没 有 选 择 该 按 钮, 使 用 这 个 属 性 可 以 判 断 哪 个 按 钮 被 选 中 2. 单 选 按 钮 的 常 用 事 件 和 命 令 按 钮 一 样, 单 选 按 钮 最 常 用 的 事 件 也 是 Click 事 件 和 GotFocus( 取 得 焦 点 ) 事 件 例 4.4 利 用 单 选 按 钮 改 变 标 签 控 件 上 的 字 体 程 序 运 行 时, 显 示 如 图 4.3 所 示 的 界 面 64

第 4 章 Visual Basic 常 用 内 部 控 件 65 图 4.3 例 4.4 的 结 果 图 程 序 代 码 如 下 : Private Sub Form_Load() Label1.AutoSize = True Label1.FontSize = 13 Label1.Caption = " 山 色 横 侵 蘸 晕 霞, 湘 川 风 静 吐 寒 花 远 林 屋 散 尚 啼 鸦 " +Chr(10) + Chr (13) + " 梦 到 故 园 多 少 路, 酒 醒 南 望 隔 天 涯 月 明 千 里 照 平 沙 " Private Sub Option1_Click() Label1.FontName = " 宋 体 " Private Sub Option2_Click() Label1.FontName = " 楷 体 _gb2312" Private Sub Option3_Click() Label1.FontName = " 黑 体 " 字 体 的 设 置 要 注 意, 一 个 是 双 引 号 的 问 题, 程 序 设 计 要 在 半 角 状 态 下 ; 另 外 楷 体 的 字 体 名 称 是 " 楷 体 _gb2312", 不 要 与 别 的 字 体 类 型 混 淆 起 来 4.4.2 复 选 框 复 选 控 件 和 单 选 控 件 选 择 结 果 的 方 式 不 同, 是 否 被 选 中 可 以 由 它 的 属 性 Value 的 值 进 行 判 断 一 些 常 用 的 属 性 的 复 选 框 和 单 选 框 基 本 相 同, 这 里 就 不 再 赘 述 复 选 框 控 件 的 Caption 属 性 以 及 名 称 的 默 认 值 都 为 Check1 Check2 1. 复 选 框 的 常 用 属 性 复 选 框 的 常 用 属 性 有 如 下 一 些 (1) Index 属 性 ( 整 数 类 型 ) 该 属 性 值 为 复 选 框 控 件 数 组 的 下 标, 一 般 来 说, 使 用 控 件 数 组 时 这 是 不 可 少 的 属 性, 通 过 它 可 以 区 分 同 一 组 复 选 框 (2) Value 属 性 ( 整 数 0 1 2) 复 选 标 志, 这 是 复 选 框 最 重 要 的 属 性, 它 的 值 与 复 选 框 控 件 的 状 态 有 关, 其 默 认 值 为 0 Value 属 性 值 为 0, 则 复 选 框 内 为 空 白 ;Value 属 性 值 为 1, 则 复 选 框 内 显 示 一 个 标 志 ;Value 属 性 值 为 2, 则 复 选 框 内 为 灰 色 的 标 志 65

66 Visual Basic 程 序 设 计 运 行 时 单 击 复 选 框, 如 果 原 先 Value 属 性 值 为 0( 同 时 框 内 显 示 空 白 ), 单 击 后 Value 属 性 值 变 为 1( 同 时 框 内 显 示 标 志 ) 如 果 原 先 Value 属 性 值 为 1 或 2( 同 时 框 内 显 示 黑 白 或 灰 色 的 标 志 ), 单 击 后 Value 属 性 值 变 为 0( 同 时 框 内 显 示 空 白 ) 反 复 单 击 同 一 复 选 框 控 件 时, 其 Value 属 性 值 只 能 在 0 1 之 间 交 替 变 换 2. 复 选 框 的 常 用 事 件 复 选 框 控 件 的 常 用 事 件 一 般 为 Click 事 件, 复 选 框 不 支 持 鼠 标 双 击 事 件, 系 统 把 一 次 双 击 解 释 为 两 次 单 击 事 件 例 4.5 利 用 复 选 框 设 置 标 签 框 显 示 文 字 的 字 型 变 化 : 加 下 划 线 加 粗 斜 体 程 序 运 行 时, 显 示 如 图 4.4 所 示 的 界 面 程 序 代 码 如 下 : 图 4.4 例 4.5 的 结 果 图 Private Sub Check1_Click() If Check1.Value = 1 Then Label1.FontBold = True Else If Check1.Value = 0 Then Label1.FontBold = False End If Private Sub Check2_Click() If Check2.Value = 1 Then Label1.FontUnderline = True Else If Check2.Value = 0 Then Label1.FontUnderline = False End If Private Sub Check3_Click() If Check3.Value = 1 Then Label1.FontItalic = True Else If Check3.Value = 0 Then Label1.FontItalic = False End If 当 复 选 框 的 Value 属 性 为 1 时, 复 选 框 被 选 中, 产 生 各 种 字 型 变 化 的 效 果 而 当 它 为 0 时, 字 型 恢 复 到 默 认 的 状 态 由 图 4.4 可 见, 字 型 变 化 的 结 果 是 可 以 相 互 叠 加 的 66

第 4 章 Visual Basic 常 用 内 部 控 件 67 4.4.3 框 架 框 架 (Frame) 是 一 种 容 器 控 件, 在 容 器 中 的 控 件, 不 仅 可 以 随 容 器 移 动, 而 且 控 件 的 位 置 属 性 也 是 以 相 对 于 容 器 内 的 位 置 设 置 的 窗 体 图 片 框 都 是 容 器 Frame 控 件 不 仅 可 以 作 为 其 他 控 件 的 容 器, 而 且 可 用 Frame 控 件 将 其 他 控 件 分 为 可 标 识 的 控 件 组, 比 如 单 选 按 钮 可 以 通 过 Frame 分 组, 从 而 产 生 多 个 选 择 框 架 控 件 的 Caption 属 性 以 及 名 称 的 默 认 值 都 为 Frame1 Frame2 框 架 控 件 必 须 先 建 立, 然 后 在 框 架 中 添 加 其 他 的 控 件, 不 能 简 单 地 把 已 建 立 的 控 件 拖 到 框 架 中 去 例 4.6 利 用 框 架 建 立 一 个 设 置 字 体 字 型 字 号 的 对 话 框 字 型 可 以 使 用 复 选 框, 但 字 体 和 字 号 只 能 单 选, 必 须 分 组 才 能 消 除 选 项 之 间 的 互 斥 性 利 用 框 架 可 以 将 两 个 功 能 分 开 在 窗 体 中 放 置 3 个 框 架, 其 中 Frame1 为 字 型 设 置, 里 面 放 置 3 个 复 选 框 Check1( 粗 体 ) Check2( 下 划 线 ) 和 Check3( 斜 体 );Frame2 为 字 号 设 置, 里 面 放 置 3 个 单 选 按 钮 Option1(10) Option2(20) 和 Option3(30);Frame3 为 字 体 设 置, 里 面 放 置 3 个 单 选 按 钮 Option4( 黑 体 ) Option5( 楷 体 ) 和 Option6( 宋 体 ) 程 序 运 行 时, 显 示 如 图 4.5 所 示 的 界 面 程 序 代 码 如 下 : 图 4.5 例 4.6 的 设 计 及 显 示 结 果 图 Private Sub Form_Load() Text1.Text = "Visual Basic" Private Sub Check1_Click() If Check1.Value = 1 Then Text1.FontBold = True Else If Check1.Value = 0 Then Text1.FontBold = False End If Private Sub Check2_Click() If Check2.Value = 1 Then Text1.FontUnderline = True Else If Check2.Value = 0 Then Text1.FontUnderline = False 67

68 Visual Basic 程 序 设 计 End If Private Sub Check3_Click() If Check3.Value = 1 Then Text1.FontItalic = True Else If Check3.Value = 0 Then Text1.FontItalic = False End If Private Sub Option1_Click() Text1.FontSize = 10 Private Sub Option2_Click() Text1.FontSize = 20 Private Sub Option3_Click() Text1.FontSize = 30 Private Sub Option4_Click() Text1.FontName =" 黑 体 " Private Sub Option5_Click() Text1.FontName =" 楷 体 _gb2312" Private Sub Option6_Click() Text1.FontName =" 宋 体 " 4.5 列 表 框 和 组 合 框 列 表 框 和 组 合 框 都 可 以 为 用 户 提 供 选 项 列 表, 用 户 可 以 在 控 件 列 表 项 中 进 行 选 择, 所 以 在 事 件 和 属 性 方 法 上 有 很 多 相 似 之 处 但 二 者 又 有 所 不 同, 使 用 时 要 根 据 需 要 进 行 选 择 4.5.1 列 表 框 列 表 框 控 件 的 名 称 的 默 认 值 为 List1 List2 列 表 框 没 有 Caption 属 性 列 表 框 的 作 用 是 提 供 选 项 进 行 选 择, 如 果 选 项 太 多, 超 出 列 表 框 设 计 时 的 长 度, 则 Visual Basic 会 自 动 给 列 表 框 加 上 垂 直 滚 动 条, 为 了 能 正 确 操 作, 列 表 框 的 高 度 不 应 少 于 3 行 它 不 具 备 编 辑 功 能, 程 序 运 行 后 用 户 不 能 脱 离 代 码 而 改 变 列 表 框 项 目 内 容, 只 能 选 择 项 目 1. 列 表 框 的 常 用 属 性 列 表 框 的 常 用 属 性 有 如 下 一 些 (1) List 属 性 ( 字 符 串 数 组 ) 列 表 框 控 件 的 各 个 表 项 是 使 用 数 组 的 方 式 保 存 的, 数 组 的 每 一 个 元 素 存 储 列 表 框 控 件 的 一 个 表 项 因 此, 利 用 索 引 可 以 访 问 列 表 项 目 68

第 4 章 Visual Basic 常 用 内 部 控 件 69 需 要 注 意 的 是, 数 组 元 素 最 小 下 标 值 的 设 定 对 于 列 表 框 来 说 是 无 效 的, 如 设 定 Option Base 1, 但 对 于 列 表 框 来 说, 第 一 个 表 项 的 索 引 值 总 是 0 (2) ListCount 属 性 ( 正 整 数 ) 该 属 性 值 为 控 件 列 表 部 分 项 目 的 个 数, 由 于 索 引 值 从 0 开 始 计 数, 所 以 ListCount -1 是 最 后 一 个 项 目 的 Index 因 此, 列 表 框 List 属 性 下 标 值 的 范 围 为 0~ListCount -1 (3) ListIndex 属 性 ( 整 数 类 型 ) 该 属 性 值 为 被 选 中 表 项 的 索 引, 通 过 ListIndex 属 性, 可 以 区 分 已 经 选 中 和 未 被 选 中 的 表 项 表 达 式 List1.List(List1.ListIndex) 的 值 应 解 析 为 :List1.ListIndex 是 选 中 项 的 索 引 数 值, 而 list(list1.listindex) 是 列 表 框 所 对 应 的 选 中 项 (4) MultiSelect 属 性 ( 整 数 0 1 2) 利 用 列 表 框 控 件 的 该 属 性, 可 以 为 列 表 框 设 置 单 选 或 允 许 多 选 属 性 值 为 0: 只 能 单 选 ( 默 认 值 ), 若 选 中 一 个 表 项 则 其 他 表 项 取 消 突 出 显 示 值 为 1: 可 以 多 选, 被 选 中 的 表 项 都 被 突 出 显 示 值 为 2: 扩 展 多 选, 可 以 用 鼠 标 在 列 表 栏 内 拖 动 选 中 相 邻 的 若 干 个 表 项 (5) Text 属 性 ( 最 后 一 次 选 中 的 表 项, 字 符 串 类 型 ) 该 属 性 用 来 返 回 当 前 选 中 的 表 项 内 容 对 于 单 选 的 列 表 框 控 件 List1, 字 符 串 List1.list(List1.ListIndex) 与 List1.Text 相 等, 都 是 被 选 中 表 项 的 文 本 (6) Selected 属 性 ( 逻 辑 类 型 ) Selected 属 性 标 识 一 个 数 组, 数 组 各 元 素 为 :Selected(0) Selected(1) Selected( 列 表 框 控 件 名.ListCount-1), 若 列 表 框 控 件 的 第 i 个 表 项 被 选 中, 则 Selected(i-1) 的 值 为 True( 若 为 Selected(i-1) 赋 值 True, 则 列 表 框 控 件 的 第 i 个 表 项 被 突 出 显 示 ) 在 允 许 多 项 选 择 的 情 况, 应 利 用 Selected 属 性 区 分 哪 些 表 项 被 选 中 下 列 语 句 可 以 在 窗 体 上 显 示 列 表 框 控 件 List1 被 选 中 的 表 项 : For i% = 0 To List1.ListCount - 1 If List1.Selected(i%) = True Then Print List1.List(i%) Next i% (7) SelCount 属 性 ( 整 数 类 型 ) 该 属 性 值 为 被 选 中 表 项 的 个 数 (8) Sorted 属 性 ( 逻 辑 类 型 ) 确 定 列 表 框 控 件 的 各 表 项 是 否 按 字 母 数 字 升 序 排 列 : 设 为 True 时 按 序 排 列, 设 为 False 时 不 按 序 排 列 该 属 性 的 默 认 值 为 False (9) Style 属 性 ( 整 数 0 1) 值 为 0( 默 认 值 ), 为 标 准 样 式, 如 图 4.6 左 边 的 列 表 框 所 示 值 为 1, 为 复 选 框 样 式, 如 图 4.6 右 边 的 列 表 框 所 示 69

70 Visual Basic 程 序 设 计 图 4.6 列 表 框 控 件 Style 示 例 如 图 4.6 所 示, 若 列 表 框 控 件 的 Style 属 性 值 为 1, 无 论 MutiSelect 属 性 取 何 值, 该 列 表 框 在 实 际 使 用 上 允 许 多 选 2. 列 表 框 的 常 用 方 法 列 表 框 的 常 用 方 法 有 如 下 几 个 (1) AddItem 方 法 AddItem 方 法 用 于 将 项 目 添 加 到 ListBox 控 件 中, 其 一 般 格 式 为 : 列 表 框 控 件 名.AddItem 表 项 文 本 [, 索 引 号 ] 其 中, 索 引 号 可 以 指 定 项 目 文 本 的 插 入 位 置, 如 果 省 略 索 引 号, 表 项 文 本 自 动 加 到 列 表 框 末 尾 如 下 列 Form_Load 事 件 可 在 装 入 窗 体 时, 为 列 表 框 控 件 List1 添 加 若 干 表 项 Private Sub Form_Load() List1.AddItem " 苹 果 " List1.AddItem " 桔 子 " List1.AddItem " 香 蕉 " List1.AddItem " 木 瓜 " List1.AddItem " 火 龙 果 " List1.AddItem " 榴 莲 " 列 表 框 控 件 的 表 项 也 可 以 在 设 计 时 添 加, 其 方 法 为 : 在 属 性 窗 口 内 选 中 List 属 性, 在 下 拉 框 中 添 加 表 项, 用 Ctrl+Enter 组 合 键 换 行 运 行 时 也 可 以 用 赋 值 语 句 在 列 表 框 控 件 中 添 加 或 修 改 表 项 : 列 表 框 控 件 名.List(List1.ListIndex) = 表 项 文 本 (2) Clear 方 法 Clear 方 法 用 于 清 空 列 表 框 控 件 中 所 有 表 项, 其 一 般 格 式 为 : 列 表 框 控 件 名.Clear (3) RemoveItem 方 法 RemoveItem 方 法 用 于 删 除 列 表 框 中 指 定 的 表 项, 其 一 般 格 式 为 : 列 表 框 控 件 名.RemoveItem 索 引 值 语 句 List1.RemoveItem List1.ListIndex 的 功 能 即 为 删 除 所 选 项 70

第 4 章 Visual Basic 常 用 内 部 控 件 71 3. 列 表 框 的 常 用 事 件 列 表 框 的 常 用 事 件 有 以 下 两 个 (1) Click 单 击 事 件 运 行 时 单 击 列 表 框 控 件 的 某 一 表 项, 可 以 使 该 表 项 在 未 选 状 态 和 选 中 状 态 之 间 切 换, 同 时 触 发 该 列 表 框 控 件 的 Click 事 件 (2) DbClick 双 击 事 件 双 击 直 接 运 行 表 项 所 对 应 的 事 件 例 4.7 本 程 序 运 行 时, 界 面 如 图 4.7 所 示 左 右 两 边 列 表 框 的 单 个 选 项 可 以 互 相 换 位, 也 可 以 一 次 把 所 有 的 选 项 切 换 到 另 一 侧 双 击 左 侧 列 表 框 也 可 以 完 成 右 移, 双 击 右 侧 列 表 框 也 可 以 完 成 左 移 程 序 代 码 如 下 : 图 4.7 例 4.7 的 界 面 设 计 Private Sub Form_Load() List1.AddItem " 苹 果 " List1.AddItem " 桔 子 " List1.AddItem " 木 瓜 " List1.AddItem " 葡 萄 " List1.AddItem " 西 瓜 " List1.AddItem " 香 蕉 " List1.AddItem " 火 龙 果 " List1.AddItem " 菠 萝 蜜 " Private Sub Command1_Click() If List1.ListIndex < 0 Then MsgBox " 没 有 选 择!" Exit Sub Else List2.AddItem List1.Text List1.RemoveItem List1.ListIndex End If Private Sub Command2_Click() If List2.ListIndex < 0 Then MsgBox " 没 有 选 择!" Exit Sub ' 为 list1 控 件 添 加 数 据 ' 移 动 表 项 至 右 边 的 列 表 框 ' 判 断 是 否 选 择 了 表 项 ' 添 加 选 中 的 表 项 到 右 边 的 列 表 框 中 ' 移 动 表 项 至 左 边 的 列 表 框 ' 判 断 是 否 选 择 了 表 项 71

72 Visual Basic 程 序 设 计 Else List1.AddItem List2.Text List2.RemoveItem List2.ListIndex End If Private Sub Command3_Click() Do While List1.ListCount List2.AddItem List1.List(0) List1.RemoveItem 0 Loop Private Sub Command4_Click() Do While List2.ListCount List1.AddItem List2.List(0) List2.RemoveItem 0 Loop Private Sub List1_DblClick() Command1_Click Private Sub List2_DblClick() Command2_Click ' 添 加 选 中 的 表 项 到 左 边 的 列 表 框 中 ' 删 除 此 表 项 ' 将 所 有 表 项 全 部 添 加 到 右 边 的 列 表 框 中 ' 判 断 是 否 到 达 最 后 一 个 表 项 ' 每 次 移 动 最 前 面 的 表 项 ' 将 所 有 表 项 全 部 添 加 到 左 边 的 列 表 框 中 ' 双 击 列 表 框 表 项, 也 可 以 右 移 ' 双 击 列 表 框 表 项, 也 可 以 左 移 4.5.2 组 合 框 组 合 框 是 文 本 框 和 列 表 框 的 组 合 控 件, 它 可 以 接 收 程 序 运 行 过 程 中 的 数 据, 使 用 灵 活, 既 可 以 和 文 本 框 一 样 输 入 数 据, 又 可 以 在 组 合 框 的 已 有 选 项 中 进 行 选 择, 因 此 它 也 同 时 具 有 文 本 框 和 列 表 框 的 大 部 分 属 性 和 事 件 组 合 框 控 件 的 Text 属 性 以 及 名 称 的 默 认 值 都 为 Combo1 Combo2 1. 组 合 框 的 常 用 属 性 组 合 框 和 文 本 框 列 表 框 相 同 的 属 性 不 再 重 复, 这 里 只 介 绍 组 合 框 的 一 些 特 殊 属 性 (1) Style 属 性 ( 整 数 0 1 2) 该 属 性 决 定 组 合 框 的 样 式, 是 只 读 属 性, 只 能 在 设 计 时 设 置 Style 属 性 值 为 0( 该 属 性 的 默 认 值 ), 为 下 拉 式 组 合 框 下 拉 式 组 合 框 包 括 一 个 文 本 框 和 一 个 下 拉 式 列 表 框, 单 击 右 端 的 箭 头 可 以 引 出 下 拉 式 列 表 框, 用 户 可 以 从 中 作 出 选 择 ; 也 可 以 在 文 本 框 中 键 入 文 本 Style 属 性 值 为 1, 为 简 单 组 合 框 简 单 组 合 框 包 括 一 个 文 本 框 和 一 个 非 下 拉 式 列 表 框, 用 户 可 以 从 列 表 中 作 出 选 择, 也 可 以 在 文 本 框 中 键 入 文 本 如 果 建 立 该 控 件 时 所 画 的 列 表 框 区 域 不 够 长, 列 表 框 可 自 动 形 成 垂 直 滚 动 条 Style 属 性 值 为 2, 为 下 拉 式 列 表 框 下 拉 式 列 表 框 包 括 一 个 不 可 输 入 的 文 本 框 和 一 个 下 拉 式 列 表 框 单 击 箭 头 可 以 引 出 列 表 框, 它 限 制 用 户 输 入 图 4.8 所 示 的 第 一 个 组 合 框 控 件 的 Style 属 性 值 为 0, 它 不 仅 可 以 下 拉 弹 出 选 项 的 列 表 框, 也 可 以 在 文 本 框 内 编 辑 ; 第 二 个 组 合 框 控 件 的 Style 属 性 值 为 1, 它 类 似 于 列 表 框 控 72

第 4 章 Visual Basic 常 用 内 部 控 件 73 件, 但 可 以 在 文 本 框 内 输 入 ; 第 三 个 组 合 框 控 件 的 Style 属 性 值 为 2, 它 不 允 许 用 户 输 入, 其 余 特 性 与 Style 属 性 值 为 0 的 组 合 框 情 况 相 同 图 4.8 组 合 框 控 件 Style 属 性 不 同 设 置 的 显 示 效 果 (2) Text 属 性 ( 字 符 串 类 型 ) 对 于 组 合 框 而 言, 一 次 只 能 选 取 一 个 选 项, 所 以 Text 即 为 选 中 表 项 的 文 本 2. 组 合 框 的 常 用 事 件 组 合 框 控 件 的 事 件 取 决 于 它 的 Style 的 属 性 值, 只 有 简 单 组 合 框 (Style=1) 才 可 以 接 收 DbClick 事 件, 其 他 两 种 组 合 框 可 以 接 收 Click 事 件 和 DropDown 事 件 而 下 拉 式 列 表 框 (Style=2) 的 情 况 无 法 接 收 文 本 框 的 事 件, 如 Keypress 等 具 体 情 况 视 问 题 不 同 而 有 所 不 同 (1) Click 事 件 用 户 单 击 组 合 框 控 件 的 列 表 部 分 选 择 表 项 的 同 时 触 发 Click 事 件, 此 时 ListIndex 属 性 值 就 是 组 合 框 中 所 选 表 项 的 索 引 (2) DropDown 事 件 用 户 单 击 组 合 框 的 下 拉 箭 头 时, 触 发 事 件 (3) KeyPress 事 件 对 于 Style 属 性 值 为 0 或 1 的 组 合 框 控 件,KeyPress 事 件 可 以 用 于 修 改 或 添 加 列 表 部 分 的 表 项 该 事 件 由 在 其 文 本 框 中 按 任 何 键 触 发, 一 般 应 在 按 回 车 键 (ASCII 码 为 13) 时 执 行 修 改 或 添 加 表 项 的 操 作 下 列 Combo1 控 件 的 KeyPress 事 件 过 程 可 在 文 本 框 内 新 表 项 的 输 入 结 束 ( 以 回 车 为 标 志 ) 后 向 组 合 框 添 加 该 表 项 : Private Sub Combo1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Combo1.AddItem Combo1.Text End If 例 4.8 设 置 两 个 组 合 框, 分 别 显 示 运 动 项 目 大 球 和 小 球, 大 球 的 选 项 为 足 球 篮 球 排 球, 小 球 的 选 项 分 别 为 乒 乓 球 羽 毛 球 程 序 运 行 时, 显 示 如 图 4.9 所 示 的 界 面 73

74 Visual Basic 程 序 设 计 图 4.9 例 4.8 的 界 面 设 计 程 序 代 码 如 下 : Private Sub Form_Load() Combo1.AddItem " 足 球 " ' 为 组 合 框 添 加 数 据 Combo1.AddItem " 篮 球 " Combo1.AddItem " 排 球 " Combo2.AddItem " 乒 乓 球 " Combo2.AddItem " 羽 毛 球 " Label3.AutoSize = True Label3.Caption = "" Private Sub Combo1_Click() Label3.Caption = " 您 喜 欢 的 球 类 项 目 是 :" + Combo1.Text ' 选 择 第 一 个 ' 选 项 后 显 示 的 结 果 Private Sub Combo2_Click() If Label3.Caption = "" Then ' 开 始 就 选 择 小 球 则 提 醒 先 选 择 大 球, 同 时 MsgBox " 请 先 选 择 大 球 类 " ' 清 空 combo2 的 显 示 Combo2.Text = "" Else ' 在 上 一 个 选 项 的 基 础 上 继 续 选 择 Label3.Caption = Label3.Caption + " 和 " + Combo2.Text End If 4.6 图 像 框 和 图 片 框 图 像 框 和 图 片 框 控 件 都 是 为 了 更 好 地 表 现 程 序 设 计 者 的 意 图, 以 图 形 化 的 方 法 完 成 设 计 需 要 的 一 种 手 段 图 像 框 一 般 作 为 图 片 显 示 居 多, 而 图 片 框 除 了 和 图 像 框 一 样 外, 还 可 以 担 当 框 架 的 作 用, 使 用 更 灵 活, 用 途 更 广 泛 4.6.1 图 片 框 图 片 框 (Picture Box) 不 仅 可 以 用 来 显 示 图 像, 还 可 以 作 为 其 他 对 象 的 容 器 显 示 图 形 方 法 的 输 出 结 果 和 Print 方 法 输 出 的 文 本 其 名 称 的 默 认 值 都 为 Picture1 Picture2 74

第 4 章 Visual Basic 常 用 内 部 控 件 75 1. 图 片 框 的 常 用 属 性 图 片 框 的 常 用 属 性 有 以 下 几 个 (1) Picture 属 性 这 是 图 形 控 件 最 重 要 的 属 性, 在 使 用 时 有 两 种 方 法 界 面 设 计 时, 选 中 该 属 性, 在 弹 出 的 LoadPicture 对 话 框 中 选 择 要 显 示 的 图 片 文 件, 相 应 的 图 片 随 之 被 加 载 到 图 片 框 中 程 序 运 行 时 可 用 LoadPicture 函 数 装 入 图 片, 一 般 格 式 为 : [ 对 象.]Picture=Loadpicture(" 文 件 名 ") 例 如,Picture1.Picture=LoadPicture("C:\zhang\t.bmp"), 该 函 数 的 参 数 是 一 个 字 符 串 表 达 式, 包 括 驱 动 器 文 件 夹 和 文 件 名 ; 加 载 一 个 空 文 件 将 清 除 图 片 框 中 原 有 的 图 片, 如 Picture1.Picture=LoadPicture("") 加 载 到 图 片 框 控 件 上 的 图 片 文 件 可 以 是 以 下 格 式 之 一 : 位 图 (.bmp.dib.cur) 图 标 (.ico) 图 元 (.wmf) 增 强 型 图 元 (.emf) JPEG 或 GIF 也 可 以 来 自 Windows 的 各 种 绘 图 程 序 (2) AutoSize 属 性 该 属 性 值 为 True 时, 图 片 框 的 边 界 会 随 着 所 装 入 图 片 的 大 小 变 化 而 变 化, 图 片 将 不 考 虑 窗 体 上 其 他 控 件 而 调 整 大 小, 可 能 会 覆 盖 其 他 控 件, 使 用 时 注 意 调 试 (3) CurrentX 和 CurrentY 属 性 用 来 设 置 下 一 个 输 出 的 水 平 (CurrentX) 或 垂 直 (CurrentY) 坐 标 这 两 个 属 性 只 能 在 运 行 时 使 用 如 下 所 示 : Picture1.CurrentX=1000 Picture1.CurrentY=2000 则 下 一 个 输 出 点 在 图 片 框 内 的 (1000,2000) 坐 标 处 2. 图 片 框 的 特 殊 使 用 和 Frame 控 件 一 样,PictureBox 控 件 上 也 可 以 画 出 其 他 控 件, 这 些 控 件 随 PictureBox 移 动 而 移 动, 它 们 的 Left 和 Top 属 性 是 相 对 于 PictureBox 而 言 的, 与 窗 体 无 关 图 片 框 还 经 常 用 来 显 示 Print 方 法 输 出 的 文 本 和 图 形 方 法 的 输 出 结 果 具 体 参 照 第 9 章 中 介 绍 的 图 形 方 法 图 片 框 也 有 很 多 事 件, 如 Chang Click 等, 使 用 方 法 视 具 体 情 况 而 定 例 4.9 通 过 图 片 框 交 换 图 片 在 窗 体 中 放 置 4 个 图 片 框,Picture1 用 于 显 示 第 1 幅 图 片,Picture2 用 于 显 示 第 2 幅 图 片, 中 间 图 片 框 为 Picture3, 为 了 交 换 而 设 置, 程 序 运 行 过 程 中 它 一 直 处 于 不 可 见 状 态, 对 结 果 的 构 图 没 有 影 响,Picture4 作 为 一 个 容 器 控 件, 用 于 装 载 命 令 按 钮 在 Picture4 中 设 置 两 个 命 令 按 钮, 一 个 是 交 换 图 片 按 钮, 一 个 是 结 束 按 钮 设 计 的 界 面 如 图 4.10 所 示 75

76 Visual Basic 程 序 设 计 图 4.10 例 4.9 的 界 面 设 计 程 序 代 码 如 下 : Private Sub Form_Load() Picture3.Visible = False ' 隐 藏 中 间 控 件 Picture1.Picture = LoadPicture("f:\or.jpg") Picture2.Picture = LoadPicture("f:\rose.jpg") Private Sub Command1_Click() Picture3.Picture = Picture1.Picture ' 通 过 picture3 进 行 交 换 Picture1.Picture = Picture2.Picture Picture2.Picture = Picture3.Picture Private Sub Command2_Click() End 程 序 运 行 结 果 如 图 4.11 所 示 图 4.11 例 4.9 的 运 行 结 果 4.6.2 图 像 框 图 像 框 只 能 用 于 显 示 图 像, 不 支 持 图 形 方 法, 也 不 能 当 做 容 器 来 使 用 在 图 形 的 使 用 上 它 和 图 片 框 有 很 多 相 似 之 处, 这 里 不 再 复 述 76

第 4 章 Visual Basic 常 用 内 部 控 件 77 作 为 图 形 控 件, 图 像 框 在 使 用 时 需 要 较 少 的 系 统 资 源 而 且 加 载 速 度 也 比 图 片 框 更 快 和 图 片 框 不 同 的 是 图 像 框 在 加 载 图 片 时, 可 以 通 过 Stretch 属 性 使 得 图 片 适 应 图 像 框 的 大 小, 前 面 介 绍 的 图 片 框 控 件, 当 它 的 AutoSize 属 性 设 置 为 True 时, 图 片 框 的 大 小 会 随 所 装 入 的 图 片 的 大 小 而 变 化, 这 样 可 以 得 到 图 片 的 原 始 大 小, 但 有 时 当 所 加 载 的 图 片 比 较 大 时, 可 能 会 影 响 窗 体 上 其 他 控 件 的 显 示 而 Stretch 属 性 为 True 时, 图 片 随 控 件 大 小 调 整 图 像 框 控 件 可 接 收 Click 等 事 件, 因 此 可 以 充 当 图 形 命 令 按 钮 4.7 滚 动 条 滚 动 条 控 件 分 为 水 平 滚 动 条 (HscrollBar) 控 件 和 垂 直 滚 动 条 控 件 (VscrollBar), 在 项 目 列 表 很 长 或 者 信 息 量 很 大 时, 可 以 使 用 滚 动 条 来 提 供 简 便 的 定 位 滚 动 条 可 以 作 为 输 入 设 备, 或 者 速 度 数 量 的 指 示 器 来 使 用 例 如, 可 以 用 它 控 制 计 算 机 游 戏 的 音 量, 或 控 制 颜 色 值 垂 直 和 水 平 滚 动 条 只 是 在 滚 动 方 向 上 不 同, 其 余 的 属 性 和 事 件 都 是 相 同 的 水 平 滚 动 条 控 件 名 称 的 默 认 值 为 Hscroll1 Hscroll2 垂 直 滚 动 条 控 件 名 称 的 默 认 值 为 Vscroll1 Vscroll2 4.7.1 滚 动 条 的 常 用 属 性 滚 动 条 的 常 用 属 性 有 以 下 一 些 (1) Value 属 性 ( 整 数 类 型 ) 在 滚 动 条 上 的 滑 块 所 处 的 位 置 决 定 其 Value 属 性 的 值, 滑 块 处 于 最 顶 端 或 最 左 端 时 值 最 小, 反 之 值 最 大 改 变 滚 动 条 Value 属 性 的 方 法 有 4 种 直 接 在 属 性 窗 口 中 设 定 用 鼠 标 单 击 滚 动 条 两 端 的 箭 头, 改 变 Value 属 性 值 用 鼠 标 将 滚 动 块 ( 滚 动 条 中 间 的 矩 形 图 像 ) 沿 滚 动 条 拖 动 用 鼠 标 单 击 滚 动 块 两 侧 的 空 白 部 分, 使 滚 动 块 以 翻 页 的 速 度 移 动 (2) Max 和 Min 属 性 ( 整 数 类 型 ) Max Min 属 性 值 是 对 滚 动 条 Value 属 性 取 值 范 围 的 限 制, 分 别 代 表 最 大 最 小 值 (3) LargeChange 属 性 ( 整 数 类 型 ) 该 属 性 确 定 : 当 用 户 单 击 滚 动 块 和 滚 动 箭 头 之 间 的 区 域 时, 滚 动 条 控 件 的 Value 属 性 值 的 改 变 量 (4) SmallChange 属 性 ( 整 数 类 型 ) 该 属 性 确 定 : 当 用 户 单 击 滚 动 箭 头 时, 滚 动 条 控 件 的 Value 属 性 值 的 改 变 量 77

78 Visual Basic 程 序 设 计 4.7.2 滚 动 条 的 常 用 事 件 滚 动 条 的 常 用 事 件 有 以 下 两 个 (1) Change 事 件 运 行 时, 无 论 用 何 方 法 改 变 滚 动 条 控 件 的 Value 属 性 值, 都 会 导 致 该 控 件 的 Change 事 件 被 调 用 (2) Scroll 事 件 该 事 件 过 程 在 只 有 在 拖 动 滚 动 滑 块 时 被 调 用 例 4.10 设 计 一 个 图 片 框, 使 得 它 的 背 景 颜 色 随 着 滚 动 条 值 的 变 化 而 变 化 程 序 运 行 时, 显 示 如 图 4.12 所 示 的 界 面 程 序 代 码 如 下 : 图 4.12 例 4.10 的 运 行 界 面 Private Sub Form_Load() HScroll1.Min = 0 ' 滚 动 条 初 始 设 置 HScroll1.Max = 15 HScroll1.LargeChange = 2 HScroll1.SmallChange = 1 Private Sub HScroll1_Change() Picture1.BackColor = QBColor(HScroll1.Value) Private Sub HScroll1_Scroll() Picture1.BackColor = QBColor(HScroll1.Value) ' 图 片 背 景 颜 色 随 滚 动 ' 的 变 化 而 变 化 说 明 :QBColor 是 一 个 颜 色 函 数, 值 在 0~15 之 间 变 化 题 中,Scroll 事 件 和 Chang 事 件 的 代 码 完 全 一 样, 因 为 Chang 事 件 只 有 在 Value 值 变 化 返 回 后 事 件 才 被 激 发, 为 了 看 到 滑 块 的 滚 动 过 程 中 Value 值 的 变 化 所 造 成 的 影 响, 可 补 充 Scroll 事 件 使 程 序 完 整 78

第 4 章 Visual Basic 常 用 内 部 控 件 79 4.8 定 时 器 定 时 器 控 件 借 用 计 算 机 内 部 的 时 钟, 实 现 了 由 计 算 机 控 制 每 隔 一 个 时 间 段 自 动 触 发 一 个 事 件 它 在 运 行 时 是 不 可 见 的, 所 以 在 设 计 阶 段 可 以 放 置 在 窗 体 的 任 意 位 置 定 时 器 控 件 默 认 的 控 件 名 称 为 Timer1 Timer2 1. 定 时 器 的 常 用 属 性 定 时 器 的 常 用 属 性 有 以 下 两 个 (1) Interval 属 性 ( 整 数 类 型 ) 该 属 性 表 示 定 时 的 时 间 间 隔, 以 毫 秒 为 单 位 ( 即 设 置 为 1000 时, 时 间 间 隔 为 1 秒 ) Interval 属 性 值 为 0, 则 定 时 器 不 起 作 用 ;Interval 属 性 的 最 大 值 为 65535 (2) Enabled 属 性 ( 逻 辑 值 ) 当 Enabled 属 性 值 为 True( 默 认 值 ) 时, 激 活 定 时 器 开 始 计 时 ; 当 Enabled 属 性 值 为 False 时, 定 时 器 处 于 休 眠 状 态, 不 计 时 2. 定 时 器 的 Timer 事 件 定 时 器 控 件 只 可 能 响 应 一 个 事 件, 即 该 控 件 的 Timer 事 件 在 控 件 的 Enabled 属 性 值 为 True 时,Interval 属 性 值 的 设 定 决 定 了 间 隔 多 少 时 间 调 用 一 次 Timer 事 件 例 4.11 设 计 一 个 如 图 4.13 所 示 的 电 子 时 钟 程 序 图 4.13 例 4.11 的 界 面 图 4.13 中 界 面 中 的 控 件 的 设 置 如 表 4-3 所 示 表 4-3 例 4.11 的 控 件 设 置 控 件 名 称 Command1 控 件 显 示 Caption 为 24 小 时 制, 它 用 来 切 换 制 式 :12 小 时 制 和 24 小 时 制 Command2 Caption 为 退 出 Label1 Caption 为 电 子 时 钟 Label2 空, 运 行 显 示 从 系 统 内 提 取 时 间 的 时 79

80 Visual Basic 程 序 设 计 续 表 控 件 名 称 控 件 显 示 Label3 Caption 为 时 Label4 空, 运 行 时 显 示 从 系 统 内 提 取 时 间 的 分 Label5 Caption 为 分 Label6 空, 运 行 时 显 示 从 系 统 内 提 取 时 间 的 秒 Label7 Caption 为 秒 Timer1 Interval=1000 程 序 代 码 如 下 : Private Sub Command1_Click() ' 设 定 活 动 按 钮 command1 使 它 可 以 在 制 式 之 间 转 换 Static nflag As Boolean If nflag = False Then Command1.Caption ="12 小 时 制 " nflag = True Else Command1.Caption ="24 小 时 制 " nflag = False End If Private Sub Command2_Click() ' 退 出 按 钮 End Private Sub Timer1_Timer() Form1.Caption = Time ' 窗 体 的 Caption 设 置 成 活 动 的 时 间, ' 它 随 时 钟 的 变 化 而 变 化, 即 使 是 最 小 化 也 可 以 看 见 时 ' 间 的 变 化 If Command1.Caption ="12 小 时 制 "Then Label2.Caption = Hour(Now) Mod 12 Else Label2.Caption = Hour(Now) End If Label4.Caption = Minute(Now) Label6.Caption = Second(Now) 该 程 序 放 大 显 示 的 是 计 算 机 系 统 的 时 间, 只 是 每 隔 1 秒 钟 将 显 示 结 果 刷 新 1 次 4.9 小 结 控 件 是 在 图 形 用 户 界 面 上 输 入 输 出 信 息 启 动 事 件 程 序 等 交 互 操 作 的 图 形 对 象, 是 进 行 可 视 化 程 序 设 计 的 基 础 和 重 要 工 具 本 章 主 要 介 绍 了 Visual Basic 工 具 箱 中 提 供 的 12 个 常 用 控 件, 这 些 控 件 有 命 令 按 钮 标 签 框 文 本 框 复 选 框 单 选 按 钮 框 架 图 像 框 图 片 框 列 表 框 组 合 框 滚 动 条 和 定 时 器, 介 绍 了 每 类 控 件 的 常 用 属 性 事 件 和 方 法 80

第 4 章 Visual Basic 常 用 内 部 控 件 81 4.10 习 题 一 选 择 题 1. 标 签 控 件 的 标 题 和 文 本 框 控 件 的 显 示 文 本 的 对 齐 方 式 由 ( ) 属 性 决 定 A) WordWrap B) AutoSize C) Alignment D) Style 2. 按 Tab 键 时, 焦 点 在 各 个 控 件 之 间 移 动 的 顺 序 是 由 ( ) 属 性 决 定 的 A) Index B) TabIndex C) TabStop D) SetFocus 3. 在 文 本 框 中 按 下 回 车 键 接 收 KeyPress 事 件 时, 回 车 所 响 应 的 ASCII 码 为 ( ) A) 12 B) 14 C) 13 D) 127 4. 单 选 按 钮 选 中 状 态 的 Value 值 是 ( ) A) 0 B) 1 C) False D) True 5. 要 使 复 选 框 不 响 应 Click 时 间, 可 设 置 复 选 框 的 ( ) 属 性 A) Apperarance B) Style C) Enabled D) TabIndex 6. 要 在 同 一 窗 体 中 安 排 两 组 单 选 按 钮, 可 用 ( ) 控 件 予 以 分 隔 A) 文 本 框 B) 框 架 C) 列 表 框 D) 组 合 框 7. 列 表 框 中 表 示 表 项 值 的 属 性 是 ( ) A) ListIndex B) List C) Selected D) Caption 8. 以 下 ( ) 语 句 将 删 除 列 表 框 List1 中 的 最 后 一 项 A) List1.RemoveItem List1.ListCount B) List1.Clear C) List1.List(List1.ListCount-1)= "" D) List1.RemoveItem List1.ListCount-1 9. 要 把 组 合 框 中 的 文 本 加 入 到 列 表 项 中 的 第 3 项, 应 执 行 语 句 ( ) A) Combo1.AddItem 3,Combo1.Text B) Combo1.AddItem Combo1.Text3 C) Combo1.AddItem Combo1.Text2 D) Combo1.AddItem 3,Combo1.Text 10. 要 使 得 图 片 适 合 控 件 的 大 小, 以 下 合 适 的 语 句 是 ( ) A) Picture1.Strech=True B) Image1.AutoSize=True C) Picture1.AutoSize=True D) Image1.Strech=True 11. 单 击 滚 动 条 两 端 任 意 一 个 滚 动 箭 头, 将 触 发 该 滚 动 条 的 ( ) 事 件 A) KeyPress B) Scroll C) Click D) Change 12. 在 窗 体 上 画 一 个 名 称 为 Timer1 的 计 时 器 控 件, 要 求 每 隔 0.5 秒 发 生 一 次 计 时 器 事 件, 则 以 下 正 确 的 属 性 设 置 语 句 是 ( ) A) Timer1.Interval=0.5 B) Timer1.Interval=5 C) Timer.Interval=50 D) Timer1.Interval=500 13. 在 窗 体 ( 名 称 为 Form1) 上 画 一 个 名 称 为 Text1 的 文 本 框 和 一 个 名 称 为 Command1 的 命 令 按 钮, 然 后 编 写 一 个 事 件 过 程 程 序 运 行 以 后, 如 果 在 文 本 框 中 输 入 一 个 字 符, 则 把 命 令 按 钮 的 标 题 设 置 为 计 算 机 等 级 考 试 以 下 能 实 现 上 述 操 作 的 事 件 过 程 是 ( ) 81

82 Visual Basic 程 序 设 计 82 A) Private Sub Text1_Change() Command1.Caption=" 计 算 机 等 级 考 试 " B) Private Sub Command1_Click() Caption=" 计 算 机 等 级 考 试 " C) Private Sub Form1_Click() Text1.Caption=" 计 算 机 等 级 考 试 " D) Private Sub Command1_Click() Text1.Text=" 计 算 机 等 级 考 试 " 14. 假 定 在 图 片 框 Picture1 中 装 入 了 一 个 图 形, 为 了 清 除 该 图 形 ( 不 删 除 图 片 框 ), 应 采 用 的 正 确 方 法 是 ( ) A) 选 择 图 片 框, 然 后 按 Del 键 B) 执 行 语 句 Picture1.Picture=LoadPicture(" ") C) 执 行 语 句 Picture1.Picture=" " D) 选 择 图 片 框, 在 属 性 窗 口 中 选 择 Picture 属 性, 然 后 按 回 车 键 15. 在 窗 体 上 画 一 个 文 本 框 和 一 个 计 时 器 控 件, 名 称 分 别 为 Text1 和 Timer1, 在 属 性 窗 口 中 把 计 时 器 的 Interval 属 性 设 置 为 1000,Enabled 属 性 设 置 为 False, 程 序 运 行 后, 如 果 单 击 命 令 按 钮, 则 每 隔 1 秒 钟 在 文 本 框 中 显 示 一 次 当 前 的 时 间 以 下 是 实 现 上 述 操 作 的 程 序 : Private Sub Command1_Click() Timer1. Private Sub Timer1_Timer() Text1.Text = Time 在 处 应 填 入 的 内 容 是 ( ) A) Enabled=True B) Enabled=False C) Visible=True D) Visible=False 二 填 空 题 1. 组 合 框 有 和 两 种 控 件 的 功 能 2. 在 列 表 框 中 删 除 所 有 表 项 的 语 句 是 3. 滚 动 条 触 发 Change 事 件 是 由 属 性 决 定 的 4. 文 本 框 的 MaxLength 为 0 时, 表 示 5. 窗 体 上 有 一 个 名 称 为 List1 的 列 表 框, 一 个 名 称 为 Text1 的 文 本 框, 一 个 名 称 为 Command1 标 题 为 计 算 的 命 令 按 钮 程 序 运 行 后, 将 把 1~100 之 间 能 够 被 7 整 除 的 数 添 加 到 列 表 框 如 果 单 击 计 算 按 钮, 则 对 List1 中 的 数 进 行 累 加 求 和, 并 在 文 本 框 中 显 示 计 算 结 果, 如 图 4.14 所 示 以 下 是 实 现 上 述 功 能 的 程 序, 请 填 空

第 4 章 Visual Basic 常 用 内 部 控 件 83 Private Sub Form_Load() For i=1 To 100 If i Mod 7 =0 Then 1 End If Next Private Sub Command1_Click() Sum =0 For i=0 To 2 Sum =Sum+ 3 Next Text1.Text=Sum 图 4.14 填 空 题 5 的 效 果 图 6. 有 5 个 Command 按 钮, 分 别 是 剪 切 复 制 粘 贴 删 除 清 空 按 钮, 请 填 空 Private Sub 复 制 _Click() Clipboard.Clear Clipboard.SetText ( 1 ) Private Sub 剪 切 _Click() Clipboard.Clear Clipboard.SetText ( 2 ) 3 Private Sub 粘 贴 _Click() 4 Private Sub 删 除 _Click() 5 Private Sub 清 空 _Click() Text1.Text = 6 83

84 Visual Basic 程 序 设 计 三 编 程 题 1. 设 计 一 个 密 码 验 证 程 序, 在 第 一 个 窗 体 上 有 一 个 文 本 框, 输 入 最 大 长 度 为 6 位 的 字 符 串, 如 果 密 码 正 确, 则 进 入 第 二 个 窗 体, 该 窗 体 上 有 一 个 从 左 至 右 滚 动 的 标 签 欢 迎 光 临!, 如 果 密 码 错 误, 则 被 拒 绝, 最 多 允 许 输 入 3 次 2. 如 图 4.15 所 示, 建 立 1 个 文 本 框,1 个 列 表 框, 在 文 本 框 输 入 单 词 后 按 下 回 车 键 即 可 显 示 在 列 表 框 里, 双 击 列 表 框 中 某 个 单 词 则 可 删 除 之 3. 如 图 4.16 所 示, 建 立 1 个 文 字 字 型 字 体 变 化 程 序 4. 在 窗 体 上 制 作 1 个 动 态 秒 表, 其 中 有 两 个 命 令 按 钮 控 制 开 始 和 结 束 图 4.15 编 程 题 2 的 效 果 图 图 4.16 编 程 题 3 的 效 果 图 84

第 5 章 数 组 教 学 提 示 : 数 组 是 有 序 数 据 的 集 合 数 组 中 的 每 一 个 元 素 都 属 于 同 个 数 据 类 型, 用 一 个 统 一 的 数 组 名 和 下 标 可 唯 一 地 确 定 数 组 中 的 元 素 在 处 理 大 批 数 据 时, 例 如 大 批 量 数 据 的 排 序 统 计 矩 阵 运 算 等, 使 用 数 组 可 以 缩 短 程 序 代 码 提 高 程 序 的 可 读 性 和 执 行 效 率 根 据 数 组 对 内 存 占 有 的 情 况 可 将 其 分 为 动 态 和 静 态 数 组 动 态 数 组 使 用 完 成 后 即 释 放 数 组 空 间, 也 可 重 新 利 用 静 态 数 组 事 先 分 配 存 储 空 间, 运 行 过 程 中 不 再 改 变 本 章 主 要 介 绍 数 组 的 定 义 和 使 用 多 维 数 组 的 理 解 和 应 用 以 及 在 使 用 过 程 中 静 态 数 组 和 动 态 数 组 的 灵 活 运 用 教 学 要 求 : 正 确 理 解 数 组 的 概 念, 掌 握 数 组 的 定 义 和 使 用 方 法, 能 够 正 确 使 用 一 维 数 组 二 维 数 组 动 态 数 组 和 控 件 数 组 5.1 数 组 的 基 本 概 念 5.1.1 数 组 与 数 组 元 素 中 学 数 学 中 已 经 学 过 关 于 数 组 的 定 义 : 一 组 可 顺 序 索 引 并 具 有 相 同 内 部 数 据 类 型 的 元 素 数 组 中 每 个 元 素 具 有 唯 一 的 索 引 号 如 :S=[S 1,S 2,S 3 ] 例 如, 班 级 中 有 30 名 同 学, 如 果 期 末 计 算 成 绩, 标 示 每 个 学 生 某 门 课 程 的 成 绩 为 S 1 S 2 S 3 S 4 S 30,S 代 表 班 级,1 2 3 4 代 表 学 号,S 1 代 表 班 级 中 学 号 为 1 号 的 同 学 的 成 绩, 以 此 类 推, 代 码 可 以 标 识 出 班 级 中 所 有 同 学 的 成 绩, 利 用 这 些 有 规 则 的 数 据 进 行 求 和 求 平 均 数 等 统 计 运 算 非 常 简 单 方 便 在 Visual Basic 中 把 一 组 具 有 相 同 名 字 不 同 下 标 的 数 据 称 为 数 组, 表 示 为 A(n), 其 中 A 为 数 组 的 名 称,n 为 下 标 变 量, 不 同 的 下 标 表 示 不 同 的 数 据 A(1) 表 示 A 数 组 的 第 一 个 元 素,A(n) 表 示 A 数 组 的 第 n 个 元 素 5.1.2 数 组 的 维 数 数 组 在 使 用 时 有 多 种 形 式, 有 时 需 要 表 示 坐 标 数 据 或 其 他 多 维 数 据 时, 需 要 使 用 多 维 数 组 例 如,3 行 3 列 的 二 维 数 组 A(3,3):

86 Visual Basic 程 序 设 计 A(0,0) A(0,1) A(0,2) A(1,0) A(1,1) A(1,2) A(2,0) A(2,1) A(2,2) 第 1 行 第 2 行 第 3 行 第 1 列 第 2 列 第 3 列 每 个 数 据 都 是 由 它 的 下 标 唯 一 标 识, 例 如 A(1,1) 表 示 第 2 行 第 2 列 的 数 据,A(2,2) 表 示 第 3 行 第 3 列 的 数 据 这 里 要 说 明 的 是 在 Visual Basic 里 除 非 加 以 特 殊 说 明, 计 数 都 从 0 开 始 这 样 的 多 维 数 据 的 表 示 容 易 定 位 归 类, 方 便 处 理 5.2 数 组 的 定 义 5.2.1 静 态 数 组 的 定 义 数 组 在 使 用 时 要 严 格 遵 循 先 定 义 后 使 用 的 原 则, 目 的 是 通 知 计 算 机 为 其 留 出 所 需 要 的 空 间 在 程 序 的 通 用 对 象 声 明 部 分 可 用 语 句 Option Base 1 声 明 所 有 数 组 第 1 个 元 素 下 标 为 1,Option Base 0 声 明 所 有 数 组 的 第 1 个 元 素 下 标 为 0( 默 认 值 ) Option Base 语 句 必 须 放 在 数 组 定 义 之 前 数 组 声 明 示 例 : Dim y(5) As Integer ' 声 明 y 是 Integer 类 型 数 组 其 中, 不 加 Option Base 语 句 说 明 的 情 况 下,y 数 组 的 最 小 下 标 从 0 开 始, 最 大 下 标 为 5, 即 数 组 有 6 个 数 :y(0) y(1) y(2) y(3) y(4) 和 y(5) 如 果 程 序 中 有 语 句 Option Base 1, 则 如 下 语 句 : Dim m(6) As Single 所 定 义 的 数 组 m 的 元 素 有 m(1) m(2) m(3) m(4) m(5) 和 m(6) 共 6 个, 不 包 括 a(0), 其 最 大 下 标 和 数 组 个 数 吻 合 数 组 还 有 一 种 表 示 方 式 不 受 Option Base 语 句 的 影 响, 即 程 序 员 在 定 义 数 组 时 指 定 数 组 的 上 下 界 线, 如 :Dim x(1 to 5) As Double, 表 示 数 组 x 的 元 素 有 x(1) x(2) x(3) x(4) 和 x(5) 多 维 数 组 的 定 义 和 一 维 数 组 相 似, 定 义 时 分 别 标 识 出 每 一 维 下 标 的 界 线 即 可, 例 如 : Dim S(2,3) 在 不 加 特 殊 说 明 的 情 况 下, 表 示 一 个 3 行 4 列 的 二 维 数 组, 数 据 元 素 的 类 型 为 变 体 类 型 5.2.2 动 态 数 组 的 定 义 使 用 定 长 数 组 要 预 先 知 道 需 要 存 储 的 数 据 量 的 大 小, 但 有 时 数 据 量 的 大 小 不 能 确 定, 这 就 需 要 用 到 动 态 数 组 动 态 数 组 不 需 要 在 声 明 中 指 出 它 的 存 储 量 的 大 小, 它 可 以 在 运 行 时 根 据 需 求 动 态 改 变 其 大 小 或 上 下 界, 使 用 完 成 后 内 存 即 被 释 放, 从 而 有 效 利 用 了 存 储 空 间 86

第 5 章 数 组 87 动 态 数 组 在 创 建 时 需 要 在 数 据 声 明 部 分 先 定 义 数 据 类 型, 但 不 需 要 说 明 数 据 的 大 小, 然 后 在 使 用 中 根 据 需 要 确 定 数 组 的 元 素 个 数 即 可 用 ReDim 语 句 分 配 数 组 的 元 素 个 数, 称 为 数 组 重 定 义 例 如 : Dim s() as Integer ' 声 明 动 态 数 组 s 是 整 型 n=val(inputbox(" 请 输 入 数 组 的 大 小!") Redim s(n) ' 定 义 数 组 最 大 下 标 为 n 动 态 数 组 在 程 序 的 声 明 阶 段 先 说 明 数 组 的 类 型, 在 程 序 运 行 时 动 态 地 改 变 数 组 的 大 小 ReDim 语 句 有 很 多 具 体 的 限 制 (1) 仅 可 以 在 过 程 级 出 现 这 意 味 着 可 以 在 过 程 中 而 不 是 在 类 或 模 块 级 重 新 定 义 数 组 (2) ReDim 语 句 无 法 更 改 数 组 变 量 的 数 据 类 型 (3) ReDim 语 句 可 以 用 来 更 改 已 被 正 式 声 明 的 数 组 的 一 个 或 多 个 维 度 的 大 小 即 利 用 Redim 可 以 多 次 定 义 同 一 个 数 组, 随 时 修 改 数 组 中 元 素 的 个 数, 但 不 能 修 改 维 数 数 据 可 以 被 保 留 也 可 以 被 删 除, 具 体 操 作 见 保 留 动 态 数 组 的 内 容 5.3 数 组 的 基 本 操 作 5.3.1 数 组 元 素 的 输 入 与 输 出 数 组 元 素 由 于 它 的 规 整 性, 使 得 利 用 它 输 入 输 出 大 批 量 的 数 据 十 分 方 便, 当 数 据 具 有 一 定 的 规 则 时, 尤 其 能 显 示 出 它 的 优 越 性 1. 一 维 数 组 的 输 入 输 出 (1) 规 则 数 据 或 自 动 生 成 数 据 的 输 入 和 输 出 例 5.1 随 机 生 成 10 个 两 位 正 整 数, 并 在 窗 体 上 打 印 出 来 Option Base 1 ' 数 组 下 界 从 1 开 始 计 数 Private Sub Form_Click() Dim i As Integer ' 数 据 定 义 Dim x(10) As Integer For i = 1 To 10 ' 数 据 输 入 x(i) = Int(Rnd * 90) + 10 Next i For i = 1 To 10 ' 数 据 输 出 Print x(i); Next i 规 则 数 据 的 输 入 更 简 单, 只 要 在 循 环 中 说 明 数 组 的 递 增 或 递 减 规 律 即 可 例 如, 从 字 符 a 开 始, 打 印 acegikmoqs 这 10 个 字 符, 代 码 如 下 : x(1) = Asc("a") ' 设 定 起 始 点 For i = 1 To 9 x(i + 1) = x(i) + 2 87

88 Visual Basic 程 序 设 计 Print Chr(x(i)); Next i Print Chr(x(i)) ' 打 印 最 后 一 个 (2) 不 规 则 数 据 的 输 入 和 输 出 有 些 数 组 中 的 数 据 没 有 一 定 的 规 则 可 以 遵 循, 比 如 学 科 成 绩 学 生 姓 名 等, 每 个 数 据 都 需 要 一 个 个 地 录 入, 输 出 时 也 要 根 据 一 定 的 要 求 进 行 输 出 例 5.2 输 入 5 个 学 生 的 姓 名, 输 出 其 中 姓 张 的 同 学 的 姓 名 Option Base 1 Private Sub Form_Click() Dim i As Integer Dim x(5) As String For i = 1 To 5 x(i) = InputBox(" 请 输 入 姓 名 :") If Left(x(i), 1) = " 张 " Then Print x(i); Next i 程 序 中 直 接 把 输 入 和 输 出 放 在 一 个 循 环 里 处 理, 动 态 输 入, 动 态 输 出 2. 二 维 数 组 的 输 入 输 出 二 维 数 组 的 输 入 输 出 是 根 据 二 维 数 组 的 特 点, 对 数 组 一 行 一 行 扫 描 的 结 果 这 样 就 产 生 了 两 层 循 环, 外 层 循 环 处 理 行, 内 层 循 环 处 理 列 例 5.3 把 如 下 数 据 放 入 一 个 3 行 3 列 的 数 组 中, 并 打 印 出 来 2,3,5 4,6,8 4,7,9 Option Base 1 Private Sub Form_Click() Dim i As Integer Dim s(3, 3) As Byte For i = 1 To 3 ' 数 据 输 入 For j = 1 To 3 s(i, j) = Val(InputBox(" 请 输 入 数 据 :")) Next j Next i For i = 1 To 3 ' 数 据 输 出 For j = 1 To 3 Print s(i, j); ' 同 行 打 印 Next j Print ' 换 行 Next i 二 维 数 组 的 输 出 要 注 意 在 一 行 打 印 完 后 要 换 行 88

第 5 章 数 组 89 3. 初 始 化 数 据 数 据 在 定 义 以 后 都 有 一 个 默 认 的 数 据, 默 认 数 据 的 赋 值 规 则 如 数 据 类 型 说 明 中 所 述, 数 值 类 型 初 值 为 0, 字 符 型 数 组 初 始 值 为 空 等 这 对 一 维 二 维 数 组 都 适 用 在 Visual Basic 中 有 允 许 对 变 体 一 维 数 组 中 的 数 据 进 行 初 始 化 的 函 数 Array, 如 : Dim S S=Array(1,2,3,4) ' 声 明 变 量 S 为 变 体 类 型 ' 为 S 数 组 的 每 个 数 据 赋 初 值 5.3.2 数 组 元 素 的 复 制 数 组 元 素 可 以 像 变 量 一 样 灵 活 操 作 1. 单 个 元 素 的 复 制 对 于 一 维 和 二 维 数 组 而 言, 每 个 数 据, 如 A(2) 是 A 数 组 的 第 3 个 数 据,B(1,2) 是 B 数 组 的 第 2 行 第 3 列 的 数 据, 都 可 以 单 独 当 做 一 个 普 通 变 量 来 赋 值 例 如 : A(2)=B(1,2) 即 把 B(1,2) 的 值 赋 给 了 A(2) 2. 整 个 数 组 的 复 制 数 组 的 复 制 仍 然 要 使 用 循 环 来 完 成 如 : Dim a(10) As Integer Dim b(10) As Integer For i = 1 To 10 b(i) = a(i) Next i 对 于 二 维 数 组, 只 需 要 改 成 两 层 循 环,b(i,j)=a(i,j), 行 对 应 行, 列 对 应 列, 就 可 以 完 全 复 制 过 去 当 然, 数 据 有 时 候 需 要 一 些 简 单 的 变 化, 这 时 只 需 对 数 组 的 下 标 进 行 操 作, 非 常 灵 活 例 5.4 对 一 个 自 动 生 成 两 位 正 整 数 的 5 行 5 列 的 二 维 数 组 进 行 转 置 分 析 : 转 置 的 概 念 就 是 将 列 的 数 据 和 行 的 数 据 交 换, 用 如 下 一 个 3 行 3 列 的 数 组 说 明 : 代 码 如 下 : 12,23,45 24,68,96 41,78,22 12,24,41 23,68,78 45,96,22 Option Base 1 Private Sub Command1_Click() Dim a(5, 5) As Integer Dim b(5, 5) As Integer For i = 1 To 5 ' 数 据 自 动 生 成 For j = 1 To 5 a(i, j) = Int(Rnd * 90) + 10 Next j 89

90 Visual Basic 程 序 设 计 Next i For i = 1 To 5 For j = 1 To 5 Print a(i, j); Next j Print Next i Print For i = 1 To 5 For j = 1 To 5 b(j, i) = a(i, j) Next Next For i = 1 To 5 For j = 1 To 5 Print b(i, j); Next Print Next ' 打 印 a 数 组 'b 数 组 转 向 继 承 a 数 组 的 数 据 ' 打 印 b 数 组 其 中 b(j, i) = a(i, j) 正 是 b 数 组 转 向 的 复 制 了 a 数 组 的 数 据 的 代 码, 它 用 于 将 行 列 进 行 互 换 : a(1,2) b(2,1) a(1,3) a(3,1) 5.3.3 保 留 动 态 数 组 的 内 容 利 用 ReDim 语 句 动 态 分 配 数 组 时, 原 数 组 的 内 容 都 会 丢 失, 数 组 元 素 的 值 都 被 初 始 化 ( 数 值 型 被 置 为 0, 字 符 型 被 置 为 空 串, 逻 辑 型 被 置 为 False 等 ) 如 果 要 保 留 原 数 组 的 值, 就 要 在 数 据 的 重 置 时 在 语 句 中 加 上 Preserve 关 键 字,Visual Basic 将 把 这 些 元 素 从 现 有 数 组 中 复 制 到 新 数 组 格 式 如 下 : ReDim [ Preserve ] 数 组 名 ( 数 组 维 数 ) 例 如 : 有 如 下 代 码 : Dim I as Integer, M() As Integer ReDim M(5) For I = 0 To UBound(M) M(I) = I Next I Redim Preserve M(15) ' 声 明 数 组 类 型 ' 动 态 定 义 了 6 个 元 素 ' 赋 值 ' 重 新 定 义 数 组 M 并 保 留 原 数 据 语 句 ReDim Preserve M(15) 重 新 定 义 了 数 组 的 大 小, 但 保 留 了 数 据 原 始 的 值, 扩 充 的 部 分 由 数 据 类 型 的 默 认 值 填 充, 这 里 是 0 如 果 重 新 定 义 的 数 组 元 素 个 数 少 于 原 数 组 的 元 素 个 数,Visual Basic 会 自 动 截 取 说 明 :Ubound( 数 组 名 ) 是 取 数 组 最 大 下 标 的 函 数, 与 之 对 应 的 是 Lbound( 数 组 名 ), 它 提 取 的 是 数 组 的 最 小 下 标 90

第 5 章 数 组 91 5.4 数 组 应 用 举 例 在 数 组 的 使 用 中, 排 序 的 重 要 性 是 显 而 易 见 的 排 序 又 称 为 分 类 (Sorting) 算 法, 是 程 序 设 计 中 常 用 的 算 法 排 序 的 方 法 非 常 多, 这 里 介 绍 选 择 排 序 法 (Selection Sort) 例 5.5 用 随 机 函 数 产 生 20 个 2 位 正 整 数, 用 选 择 法 排 序 法 将 它 们 按 值 从 小 到 大 排 序 输 出 选 择 排 序 法 说 明 : 在 数 组 中 搜 寻 出 最 小 ( 大 ) 的 数, 把 它 与 第 1 个 数 对 调, 这 样, 第 1 个 位 置 上 放 的 是 最 小 ( 大 ) 的 数, 然 后 在 此 基 础 上, 在 数 组 中 从 第 2 个 数 开 始 寻 找 第 2 个 最 小 ( 大 ) 的 数, 再 与 第 2 个 数 互 换, 依 次 类 推, 直 至 全 部 排 列 完 成 本 程 序 可 以 利 用 一 个 哨 兵 来 帮 助 完 成, 哨 兵 每 次 出 发 都 是 寻 找 本 次 循 环 中 的 最 小 ( 大 ) 值 以 如 下 6 个 数 为 例 (Option Base 1), 首 先 设 定 一 个 哨 兵 a(k), 初 始 状 态 和 a(1) 一 样 大 小 : 12 72 6 89 3 83 第 1 次 排 序 : 哨 兵 遍 历 数 组, 找 到 所 有 数 中 最 小 的 数 3, 其 下 标 为 5, 然 后 把 哨 兵 a(k) 与 a(1) 互 换, 即 a(1) 与 a(5) 互 换, 结 果 如 下 3 72 6 89 12 83 第 2 次 排 序 : 哨 兵 变 成 a(2), 从 第 2 个 数 开 始, 找 到 最 小 的 数 a(3), 把 a(2) 与 a(3) 互 换, 此 时, 第 1 和 第 2 个 数 已 经 有 序, 其 后 的 排 序 从 第 3 个 数 开 始, 结 果 如 下 3 6 72 89 12 83 第 3 次 排 序 : 哨 兵 变 成 a(3), 从 第 3 个 数 开 始, 寻 找 到 最 小 数 为 12, 即 a(5), 将 a(k) 与 a(3) 互 换 前 3 个 数 有 序, 结 果 如 下 3 6 12 89 72 83 第 4 次 排 序 : 哨 兵 变 成 a(4), 从 第 4 个 数 开 始, 找 到 最 小 数 为 72, 即 a(5), 将 a(4) 与 a(5) 互 换 前 4 个 数 有 序, 结 果 如 下 3 6 12 72 89 83 最 后 一 次 排 序 : 哨 兵 变 成 a(5), 从 第 5 个 数 开 始, 找 到 最 小 数 为 83, 将 a(5) 与 a(6) 交 换 全 部 排 序 工 作 完 成, 结 果 如 下 91

92 Visual Basic 程 序 设 计 3 6 12 72 83 89 一 般 地,N 个 数 经 过 N-1 次 排 序 后 均 有 序 通 过 以 上 选 择 法 排 序 的 展 开 分 析, 可 以 归 纳 出 选 择 排 序 法 算 法 如 下 : For i=1 to n-1 找 出 a(i) 至 a(n) 间 最 小 的 数 组 元 素 下 标 k 交 换 a(i) 与 a(k) Next i ' 以 下 为 找 出 a(i) 至 a(n-1) 之 间 值 最 小 的 数 组 元 素 下 标 k 的 代 码 k=i ' 假 设 下 标 为 i 的 元 素 值 最 小 For j=i+1 to n If a(j)<a(k) then k=j Next j 程 序 代 码 如 下 : Private Sub Form_click() Dim a(1 to 20) As Integer, temp As Integer Dim i As Byte, j As Byte, k As Byte For i=1 To 20 ' 产 生 数 据 a(i)=int(rnd*90)+10 Next i For i=1 To 19 ' 排 序 k=i ' 设 定 哨 兵 For j=i+1 To 20 ' 查 找 最 小 值 If a(j)<a(k) Then k=j Next j Temp=a(i): a(i)=a(k): a(k)=temp ' 交 换 哨 兵 ( 最 小 值 ) 和 排 序 位 的 数 据 Next i For i=1 To 20 ' 打 印 输 出 Print a(i); Next i Print 例 5.6 把 一 个 字 符 插 入 到 一 个 基 本 有 序 的 字 符 串 中 分 析 : 输 入 字 符 串 的 长 度 不 固 定, 所 以 采 用 动 态 数 组 的 形 式, 而 插 入 的 动 作 包 括 以 下 几 个 (1) 比 较 插 入 字 符 的 ASCII 码 在 字 符 串 中 的 大 小, 确 定 插 入 位 置 (2) 把 已 有 字 符 串 从 插 入 位 置 开 始 到 最 末 端 向 后 逐 个 移 位, 如 有 数 组 a, 即 a(i+1)=a(i) (3) 把 插 入 字 符 放 到 留 出 的 空 位 中 以 含 5 个 字 符 的 字 符 串 为 例 : abdef, 插 入 字 符 为 c 首 先 找 到 字 符 d 为 插 入 位, 下 标 为 3, 然 后 扩 大 数 组, 动 态 增 加 1 个 元 素 位, 为 c 留 下 空 间, 此 时, 字 符 串 为 abdef &, 然 后 从 f 字 符 开 始 到 d 逐 个 后 移, 形 成 字 符 串 abddef, 最 后 把 c 赋 值 给 插 入 位 a(3), 形 成 字 符 串 abcdef 程 序 代 码 如 下 : 92

第 5 章 数 组 93 Option Base 1 Private Sub Form_Click() Dim a() As String Dim s As String Dim n As Integer s = InputBox(" 请 输 入 有 序 字 符 串 :") n = Len(s) ReDim a(n) For i = 1 To n a(i) = Mid(s, i, 1) ' 将 串 中 字 符 逐 个 取 出, 放 入 数 组 a 中 Next i addstr = InputBox(" 请 添 加 需 要 插 入 的 字 符 :") ReDim Preserve a(n + 1) ' 保 留 数 据, 增 加 一 个 数 组 元 素 For i = 1 To n If addstr < a(i) Then ' 寻 找 插 入 位 f = i: Exit For Else f = n + 1 End If Next i For i = n + 1 To f + 1 Step 1 ' 倒 序 重 新 排 列 a(i) = a(i - 1) Next i a(f) = addstr ' 插 入 字 符 For i = 1 To n + 1 Print a(i); Next i 数 组 应 用 中 对 二 维 数 组 的 统 计 也 是 比 较 常 用 的 比 如 分 数 的 求 和, 求 平 均 数 等 例 5.7 输 入 一 个 3 行 4 列 的 数 组, 求 它 的 和 以 及 最 大 值 程 序 代 码 如 下 : Option Base 1 Private Sub Form_Click() Dim x(3, 4) As Single Dim i As Byte, j As Byte, max As Single, s As Single For i = 1 To 3 ' 赋 值 并 打 印 For j = 1 To 4 x(i, j) = Val(InputBox(" 请 输 入 数 据 x(" & i & "," & j & ") 的 值 :")) Print x(i, j); Next Print Next max = x(1, 1) ' 设 定 最 大 值 max 的 初 始 值 For i = 1 To 3 For j = 1 To 4 If x(i, j) > max Then max = x(i, j) ' 求 最 大 数 s = s + x(i, j) ' 求 和 Next Next Print " 此 数 组 的 最 大 值 为 :" & max ' 打 印 结 果 Print " 此 数 组 的 和 为 :" & s 93

94 Visual Basic 程 序 设 计 例 5.8 建 立 一 个 5 行 5 列 的 二 维 数 组, 两 条 对 角 线 上 的 元 素 为 1, 其 余 元 素 为 0 程 序 代 码 如 下 : Private Sub Form_Click() Dim s(1 To 5, 1 To 5) As Integer Dim i As Integer, j As Integer For i=1 To 5 For j=1 To 5 If i=j Or i+j=6 Then ' 对 角 线 上 的 元 素 赋 值 1, 其 余 赋 为 0 s(i,j)=1 Else s(i,j)=0 End If Print s(i, j); ' 打 印 输 出 Next j Print Next i 程 序 的 输 出 结 果 如 下 : 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 5.5 控 件 数 组 当 界 面 上 需 要 若 干 个 控 件 执 行 大 致 相 同 的 操 作 时, 可 以 将 这 些 控 件 定 义 为 控 件 数 组 控 件 数 组 由 一 组 类 型 相 同 的 控 件 组 成, 这 些 控 件 共 用 一 个 相 同 的 控 件 名, 共 享 同 一 个 事 件 过 程 控 件 数 组 中 每 个 元 素 都 有 唯 一 与 之 相 关 联 的 下 标, 或 称 为 索 引 (Index) 控 件 数 组 中 的 控 件 由 它 的 索 引, 即 下 标 来 进 行 区 分, 如 Command1(0) Command1(1) 由 于 控 件 数 组 是 自 动 生 成 的, 所 以 控 件 的 下 标 由 系 统 内 定, 与 Option Base 的 设 置 无 关, 总 是 从 0 开 始 计 数 5.5.1 控 件 数 组 的 建 立 控 件 数 组 的 建 立 有 两 种 方 法 1. 直 接 建 立 直 接 建 立 控 件 数 组 的 方 法 如 下 (1) 先 建 立 一 个 初 始 控 件, 如 图 5.1 所 示 94

第 5 章 数 组 95 图 5.1 建 立 初 始 控 件 (2) 在 窗 体 上 单 击 该 控 件 后, 选 择 编 辑 菜 单 中 的 复 制 命 令 ( 或 按 Ctrl+C 键 ), 然 后 选 择 编 辑 菜 单 中 的 粘 贴 命 令 ( 或 按 Ctrl+V 键 ) 此 时 弹 出 如 图 5.2 所 示 的 对 话 框 图 5.2 建 立 数 组 控 件 对 话 框 (3) 选 择 是, 则 控 件 Command1 更 名 为 Command1(0), 新 建 控 件 名 称 为 Command1(1), 继 续 粘 贴 则 建 立 控 件 Command1(2) Command1(3), 它 们 构 成 了 一 个 控 件 数 组 Command1, 每 个 控 件 都 是 数 组 中 的 一 个 元 素 2. 修 改 控 件 的 名 称 通 过 修 改 控 件 的 名 称 来 建 立 控 件 数 组 的 方 法 如 下 (1) 在 容 器 内 画 出 所 需 要 的 所 有 控 件 ( 为 一 个 类 型 ), 如 Command1 Command2, Command3 (2) 选 择 一 个 母 体, 如 Command1, 然 后 对 别 的 控 件 改 名, 改 成 与 母 体 相 同 的 名 称, 这 时 Visual Basic 会 询 问 是 否 建 立 控 件 数 组, 选 择 是 即 可 以 上 两 个 方 法 都 可 以 建 立 控 件 数 组, 所 不 同 的 是 如 果 控 件 有 显 示 的 文 本, 则 用 直 接 建 立 方 法 建 立 的 控 件 数 组 中 所 有 控 件 显 示 的 文 本 都 相 同, 而 通 过 修 改 名 称 得 到 的 控 件 数 组 其 显 示 文 本 还 保 留 了 初 始 建 立 时 的 状 态 5.5.2 控 件 数 组 的 使 用 控 件 数 组 的 使 用 就 是 要 灵 活 应 用 控 件 属 性 中 的 Index 属 性, 它 标 识 的 就 是 控 件 数 组 的 下 标 95

96 Visual Basic 程 序 设 计 以 例 4.6 为 例, 每 个 Frame 控 件 中 的 单 选 按 钮 如 果 以 控 件 数 组 的 形 式 建 立, 程 序 代 码 就 可 以 简 化 很 多 例 5.9 以 控 件 数 组 的 方 式 重 做 例 4.6 这 个 程 序 中 将 例 4.6 中 的 两 组 单 选 按 钮 定 义 为 两 个 控 件 数 组, 即 两 个 Frame 中 分 别 以 Option1 和 Option2 做 母 体, 派 生 出 各 自 2 个 子 个 体 注 意 在 Frame 中 建 立 控 件 数 组 时, 粘 贴 一 定 要 在 框 架 里, 形 成 的 子 控 件 和 母 体 控 件 在 一 个 框 架 中 程 序 代 码 如 下 : Private Sub Form_Load() Text1.Text = "Visual Basic" Private Sub Check1_Click() If Check1.Value = 1 Then Text1.FontBold = True Else If Check1.Value = 0 Then Text1.FontBold = False End If Private Sub Check2_Click() If Check2.Value = 1 Then Text1.FontUnderline = True Else If Check2.Value = 0 Then Text1.FontUnderline = False End If Private Sub Check3_Click() If Check3.Value = 1 Then Text1.FontItalic = True Else If Check3.Value = 0 Then Text1.FontItalic = False End If Private Sub Option1_Click(Index As Integer) ' 控 件 数 组 以 Index 作 为 下 标 Select Case Index Case 0 Text1.FontSize = 10 Case 1 Text1.FontSize = 20 Case 2 Text1.FontSize = 30 End Select Private Sub Option2_Click(Index As Integer) Select Case Index Case 0 Text1.FontName = " 黑 体 " Case 1 Text1.FontName = " 楷 体 _gb2312" 96

第 5 章 数 组 97 Case 2 Text1.FontName = " 宋 体 " End Select 由 此 可 见, 控 件 数 组 使 代 码 更 为 简 洁 例 5.10 编 写 一 个 月 食 程 序 在 窗 体 中 放 置 一 个 图 片 控 件 数 组 Image1, 使 用 图 片 控 件 数 组 保 存 月 食 变 化 的 5 幅 图 片, 再 在 窗 体 中 放 置 一 个 图 片 控 件 Image2, 用 来 循 环 显 示 5 幅 图 片 中 的 1 幅 图 片,5 幅 图 片 不 断 变 化 的 图 片 效 果 利 用 Timer 控 件 来 完 成 设 计 的 界 面 如 图 5.3 所 示 程 序 代 码 如 下 : 图 5.3 例 5.10 的 界 面 设 计 Dim i As Integer Private Sub Form_Load() For j = 0 To 4 Image1(j).Visible = False Next j Private Sub Timer1_Timer() Image2.Picture = Image1(i).Picture i = i + 1 If i = 5 Then i = 0 ' 设 置 I 为 窗 体 级 变 量 ' 设 置 图 像 过 程 不 可 见 ' 由 Image2 显 示 变 化 过 程 ' 循 环 播 放 5.6 小 结 数 组 是 有 序 数 据 的 集 合 数 组 中 的 每 一 个 元 素 都 属 于 同 个 数 据 类 型, 用 一 个 统 一 的 数 组 名 和 下 标 来 唯 一 地 确 定 数 组 中 的 元 素 数 组 可 以 是 一 维 数 组, 也 可 以 是 多 维 数 组 ( 如 二 维 数 组 ) 根 据 数 组 对 内 存 占 有 的 情 况 可 将 其 分 为 动 态 和 静 态 数 组 动 态 数 组 使 用 完 成 后 即 释 放 数 组 空 间, 也 可 重 新 利 用 静 态 数 组 事 先 分 配 存 储 空 间, 运 行 过 程 中 不 再 改 变 数 组 元 素 通 过 下 标 访 问, 因 而 数 组 常 用 循 环 结 构 处 理 数 组 元 素 为 控 件 时, 称 为 控 件 数 组, 用 于 界 面 设 计 时 组 织 相 关 操 作 的 对 象 97

98 Visual Basic 程 序 设 计 5.7 习 题 98 一 选 择 题 1. 用 下 面 的 语 句 定 义 的 数 组 元 素 的 个 数 是 ( ) Dim s(7) as Integer A) 6 B) 7 C) 8 D) 9 2. 用 下 面 的 语 句 定 义 的 数 组 元 素 的 个 数 是 ( ) Dim s(3,4) as String A) 7 B) 12 C) 20 D) 18 3. 定 义 数 组 Array(1 to 5,5) 后, 下 列 哪 一 个 数 组 元 素 不 存 在?( ) A) Array(1,1) B) Array(1,0) C) Array(0,1) D) Array(5,5) 4. 在 过 程 中 定 义 Dim x(1 to 10,3) As Single, 则 数 组 占 用 ( ) 字 节 的 内 存 空 间 A) 132 B) 80 C) 160 D) 120 5. 在 窗 体 上 画 一 个 名 称 为 Command1 的 命 令 按 钮, 然 后 编 写 如 下 事 件 过 程 : Option Base 1 Private Sub Command1_Click() Dim a a= Array(1,2,3,4,5) For i=1 To UBound(a) a(i) = a(i)+i-1 Next i Print a(3) 程 序 运 行 后, 单 击 该 命 令 按 钮, 则 在 窗 体 上 显 示 的 内 容 是 ( ) A) 4 B) 5 C) 6 D) 7 6. 有 如 下 程 序 : Option Base 1 Private Sub Form_Click() Dim arr,sum Sum = 0 arr = Array(1,3,5,7,9,11,13,15,17,19) For i=1 To 10 If arr(i)/3 = arr(i)\3 Then Sum =Sum+arr(i) End If Next i Print Sum 程 序 运 行 后, 单 击 窗 体, 输 出 结 果 为 ( )

第 5 章 数 组 99 A) 13 B) 14 C) 27 D) 15 7. 在 窗 体 上 画 一 个 名 称 为 Label1 的 标 签, 然 后 编 写 如 下 事 件 过 程 : Private Sub Form_Click() Dim arr(10, 10) As Integer Dim i As Integer, j As Integer For i = 2 To 4 For j = 2 To 4 arr(i, j) = i * j Next j Next i Label1.Caption = Str(arr(2, 2) + arr(3, 3)) 程 序 运 行 后, 单 击 窗 体, 在 标 签 中 显 示 的 内 容 是 ( ) A) 12 B) 13 C) 14 D) 15 8. 有 如 下 程 序 : Option Base 1 Dim arr() As Integer Private Sub Form_Click() Dim i As Integer, j As Integer ReDim arr(3, 2) For i = 1 To 3 For j = 1 To 2 arr(i, j) = i * 2 + j Next j Next i ReDim Preserve arr(3, 4) For j = 3 To 4 arr(3, j) = j + 9 Next j Print arr(3, 2) + arr(3, 4) 程 序 运 行 后, 单 击 窗 体, 输 出 结 果 为 ( ) A) 21 B) 13 C) 8 D) 25 二 填 空 题 1. 控 件 数 组 的 名 字 由 属 性 指 定, 而 数 组 中 的 每 个 元 素 由 属 性 指 定 2. Array 函 数 建 立 的 数 组 类 型 必 须 是 类 型, 而 且 只 对 维 数 组 有 效 3. 以 下 程 序 的 功 能 是 用 Array 函 数 建 立 一 个 含 有 8 个 元 素 的 数 组, 然 后 查 找 并 输 出 该 数 组 中 的 最 小 值, 请 填 空 Option Base 1 Private Sub Command1_Click() Dim arr1 99

100 Visual Basic 程 序 设 计 Dim Min As Integer, i As Integer arr1 = Array(12, 435, 76, -24, 78, 54, 866, 43) Min = 1 For i = 2 To 8 If arr1(i) < Min Then 2 Next i Print " 最 小 值 是 :"; Min 4. 下 列 程 序 用 来 在 窗 体 上 输 出 如 下 数 据, 请 填 空 1,2,3,4,5 2,3,4,5,1 3,4,5,1,2 4,5,1,2,3 5,1,2,3,4 Private Sub Form_Click() Dim a(5, 5) As Byte, i As Byte, j As Byte For i = 1 To 5 For j = 1 To 6 - i a(i,j)= 1 Next j Next i For i = 2 To 5 For j = 2 To 5 a(i, j) = j + i - 6 Next j Next i For i = 1 To 5 For j = 1 To 5: Print a(i, j);: Next j 3 Next i 5. 完 成 10 输 入 数 据 的 排 序 程 序 Private Sub Form_click() Dim a(1 to 10) As Integer, temp As Integer Dim i As Byte, j As Byte, k As Byte For i=1 To 20 a(i)= 1 Next i For i=1 To 19 2 For j=i+1 To 20 If a(j)<a(k) Then 3 Next j Temp=a(i): 4 : a(k)=temp Next i For i=1 To 20 100

第 5 章 数 组 101 Print a(i); Next i Print 三 编 程 题 1. 求 50 个 数 的 斐 波 那 契 (Fibonacci) 数 列 Fibonacci 数 列 问 题 起 源 于 一 个 古 典 的 有 关 兔 子 繁 殖 的 问 题 : 假 设 在 第 1 个 月 时 有 一 对 小 兔 子 ; 第 2 个 月 时 小 兔 子 成 为 大 兔 子 ; 第 3 个 月 成 为 老 兔 子, 并 生 出 一 对 小 兔 子 ( 一 对 老, 一 对 小 ); 第 4 个 月 时 老 兔 子 又 生 出 一 对 小 兔 子, 上 个 月 的 小 兔 子 变 成 大 兔 子 ( 一 对 老, 一 对 大, 一 对 小 ); 第 5 个 月 时 上 个 月 的 大 兔 子 成 为 老 兔 子, 上 个 月 的 小 兔 子 变 成 大 兔 子, 两 对 老 兔 子 生 出 两 对 小 兔 子 ( 两 对 老, 一 对 大, 两 对 小 ) 2. 某 数 组 有 20 个 元 素, 元 素 的 值 由 键 盘 输 入, 要 求 将 前 10 个 元 素 与 后 10 个 元 素 对 换 即 第 1 个 元 素 与 第 20 个 元 素 互 换, 第 2 个 元 素 与 第 19 个 元 素 互 换,, 第 10 个 元 素 与 第 11 个 元 素 互 换 输 出 数 组 原 来 各 元 素 的 值 和 对 换 后 各 元 素 的 值 3. 由 键 盘 输 入 一 串 字 符, 对 其 排 序 后 输 出 4. 有 一 个 6 6 的 矩 阵, 各 元 素 的 值 由 键 盘 输 入, 求 全 部 元 素 的 平 均 值, 并 输 出 高 于 平 均 值 的 元 素 以 及 它 们 的 行 列 号 5. 编 程 实 现 如 图 5.4 所 示 的 效 果 : 文 本 框 的 背 景 颜 色 由 单 选 按 钮 所 组 成 的 控 件 数 组 控 制, 可 显 示 红 绿 蓝 三 色 也 可 以 自 行 添 加 颜 色 项 目 图 5.4 编 程 题 5 的 效 果 图 101

第 6 章 过 程 教 学 提 示 : 过 程 是 程 序 设 计 语 言 中 的 一 个 重 要 的 概 念, 所 谓 过 程 就 是 完 成 某 一 特 定 功 能 的 程 序 代 码 段, 它 由 一 系 列 可 执 行 语 句 组 成, 是 一 个 相 对 独 立 的 实 体 Visual Basic 把 应 用 程 序 按 功 能 分 为 多 个 模 块 每 个 模 块 中 包 含 实 现 各 种 操 作 的 相 互 独 立 的 过 程, 每 个 过 程 完 成 一 个 特 定 的 任 务 本 章 介 绍 Sub 过 程 和 Function 过 程 的 定 义 和 使 用 教 学 要 求 : 掌 握 Sub 过 程 的 定 义 和 调 用 方 法, 掌 握 Function 过 程 的 定 义 和 调 用 方 法, 掌 握 进 行 参 数 传 递 的 方 法, 掌 握 不 同 变 量 的 作 用 域, 在 编 程 过 程 中 灵 活 运 用 过 程 6.1 过 程 的 定 义 6.1.1 Sub 过 程 Sub 过 程 是 指 一 组 能 够 完 成 特 定 操 作 和 相 对 独 立 的 程 序 段 ( 语 句 块 ) 其 他 过 程 中 要 执 行 这 个 操 作 时, 可 以 调 用 Sub 过 程 Sub 过 程 定 义 的 一 般 格 式 为 : [Private Public ] [ Static ] Sub 子 过 程 名 [( 参 数 表 )] 局 部 变 量 或 常 数 定 义 语 句 块 [Exit Sub] 语 句 块 其 中 : (1) Sub 为 定 义 过 程 的 关 键 字, 前 缀 Private Public Static 为 可 选 关 键 字, 用 来 说 明 过 程 的 性 质 (2) Private 和 Public 用 来 声 明 该 Sub 过 程 是 私 有 的 ( 局 部 的 ), 还 是 公 有 的 ( 全 局 的 ); 系 统 默 认 为 Public Public 关 键 字 声 明 全 局 级 过 程, 全 局 过 程 在 应 用 程 序 的 所 有 模 块 中 都 可 以 调 用 ;Private 关 键 字 声 明 模 块 级 过 程, 只 有 在 声 明 它 的 模 块 中 才 可 以 调 用 此 过 程 (3) Static 是 静 态 变 量 声 明 如 果 定 义 过 程 时 使 用 Static 关 键 字, 则 该 过 程 中 的 所 有 局 部 变 量 的 存 储 空 间 只 分 配 一 次, 且 这 些 变 量 的 值 在 整 个 程 序 运 行 期 间 都 存 在, 即 在 每 次 调 用 该 过 程 时, 各 局 部 变 量 的 值 一 直 存 在 如 果 省 略 Static, 过 程 每 次 被 调 用 时 重 新 为 其 局 部 变 量 分 配 存 储 空 间, 当 该 过 程 结 束 时 释 放 其 局 部 变 量 的 存 储 空 间 (4) 过 程 名 与 变 量 名 的 命 名 规 则 相 同 在 同 一 模 块 中, 同 一 过 程 名 不 能 既 用 于 Sub 过

第 6 章 过 程 103 程, 又 用 于 Function 过 程 (5) 参 数 表 类 似 于 变 量 声 明, 它 指 明 了 调 用 过 程 传 递 给 过 程 的 变 量 个 数 和 类 型, 称 为 形 式 参 数 ( 简 称 形 参 ) Sub 过 程 可 以 没 有 形 参, 也 可 以 有 一 个 或 多 个 形 参 当 有 多 个 形 参 时, 各 参 数 之 间 用 逗 号 隔 开 形 参 声 明 的 一 般 格 式 为 : [ [Optional] [ ByVal ByRef] ParamArray ] < 变 量 名 > [( )] [As < 类 型 >] 其 中 : Optional 表 示 参 数 是 可 选 参 数 如 果 参 数 表 中 某 个 参 数 声 明 中 使 用 了 该 选 项, 则 参 数 表 中 该 参 数 的 所 有 后 续 参 数 都 必 须 是 可 选 的, 而 且 必 须 都 使 用 Optional 关 键 字 声 明 如 果 使 用 了 ParamArray, 则 任 何 参 数 都 不 能 使 用 Optional ByVal 表 示 该 参 数 按 值 传 递,ByRef 表 示 该 参 数 按 地 址 传 递 如 果 没 有 明 确 指 明 参 数 的 传 递 方 式,Visual Basic 默 认 为 ByRef ParamArray 关 键 字 用 于 表 示 可 变 参 数, 只 用 于 参 数 表 的 最 后 一 个 参 数, 指 明 最 后 这 个 参 数 是 一 个 Variant 元 素 的 Optional 数 组 使 用 ParamArray 关 键 字 可 以 提 供 任 意 数 目 的 参 数 ParamArray 关 键 字 不 能 与 ByVal ByRef 或 Optional 一 起 使 用 变 量 名 代 表 参 数 的 变 量 的 名 称, 遵 循 标 准 的 变 量 命 令 约 定 如 果 是 数 组 变 量, 则 要 在 数 组 名 后 加 上 一 对 小 括 号 有 关 过 程 中 的 参 数 和 参 数 的 传 递 在 6.3 节 中 将 详 细 讨 论 (6) 用 于 表 示 本 Sub 过 程 的 结 束 在 Sub 与 之 间 的 语 句 块 称 为 过 程 体 在 过 程 体 内 可 以 用 Exit Sub 语 句 强 制 从 Sub 过 程 中 退 出, 结 束 过 程 的 执 行 Sub 过 程 可 以 放 在 标 准 模 块 和 窗 体 模 块 中,Visual Basic 的 Sub 过 程 分 为 事 件 过 程 和 通 用 过 程 两 大 类 事 件 过 程 是 Visual Basic 预 定 义 好 的 过 程, 过 程 名 和 参 数 的 类 型 与 个 数 不 能 改 变, 编 程 人 员 只 能 填 写 事 件 过 程 中 的 语 句 通 用 过 程 则 是 编 程 人 员 根 据 需 要 自 己 定 义 的, 过 程 名 及 参 数 的 个 数 和 类 型 均 可 以 自 己 设 定 1. 事 件 过 程 事 件 过 程 是 当 发 生 某 个 事 件 时, 对 该 事 件 做 出 响 应 的 程 序 段, 它 是 Visual Basic 应 用 程 序 的 主 体 在 前 面 几 章 中 写 的 程 序 段 就 是 作 为 事 件 过 程 而 存 在 的 事 件 过 程 由 Visual Basic 声 明, 用 户 不 能 增 加 或 删 除 当 用 户 对 某 个 对 象 发 出 一 个 动 作 时,Windows 会 通 知 Visual Basic 产 生 了 一 个 事 件,Visual Basic 会 自 动 调 用 与 该 事 件 相 关 的 事 件 过 程 事 件 过 程 是 附 加 在 窗 体 或 控 件 上 的, 通 常 总 是 处 于 空 闲 状 态, 直 到 响 应 用 户 引 发 的 事 件 或 系 统 引 发 的 事 件 才 被 调 用 窗 体 事 件 过 程 定 义 为 : Form_ 事 件 名, 其 一 般 格 式 为 : Private Sub Form_< 事 件 名 > ([ 参 数 表 ]) [ 语 句 组 ] 需 要 注 意 的 是, 不 管 窗 体 名 字 如 何 定 义, 在 窗 体 事 件 过 程 定 义 中 只 能 使 用 Form, 而 在 程 序 中 对 窗 体 进 行 引 用 才 会 用 到 窗 体 名 字 如 果 正 在 使 用 MDI(Multiple Document Interface) 窗 体, 则 事 件 过 程 定 义 为 :MDIForm_ 事 件 名 103

104 Visual Basic 程 序 设 计 104 例 如, 单 击 窗 体 的 事 件 过 程 为 : Private Sub Form_Click() ' 过 程 体 控 件 事 件 过 程 的 定 义 为 : 控 件 名 _ 事 件 名, 其 一 般 格 式 为 : Private Sub < 控 件 名 >_< 事 件 名 > ([ 参 数 表 ]) [ 语 句 组 ] 例 如, 一 个 命 令 按 钮 ( 设 该 命 令 按 钮 的 名 称 为 CmdOk) 的 单 击 事 件 过 程 代 码 为 : Private Sub CmdOk_Click() ' 过 程 体 2. 通 用 过 程 当 几 个 不 同 的 事 件 过 程 要 执 行 同 样 的 动 作 ( 即 可 能 需 要 使 用 同 一 段 程 序 代 码 ), 为 了 不 必 重 复 编 写 代 码, 可 将 这 段 代 码 独 立 出 来, 编 写 成 一 个 共 用 的 过 程, 这 种 过 程 通 常 称 为 通 用 过 程, 它 独 立 于 事 件 过 程 之 外, 可 供 其 他 过 程 调 用 通 用 过 程 既 可 保 存 在 窗 体 模 块 中, 也 可 以 保 存 在 标 准 模 块 中 通 用 过 程 与 事 件 过 程 不 同, 通 用 过 程 并 不 是 由 对 象 的 某 种 事 件 激 活, 也 不 依 附 于 某 一 个 对 象 建 立 通 用 过 程 有 两 种 方 法 : 直 接 在 代 码 编 辑 窗 口 中 输 入 过 程 代 码 或 使 用 添 加 过 程 对 话 框 例 如, 编 写 一 个 通 用 过 程 Reverse, 将 一 个 正 整 数 逆 序 输 出, 如 1234 输 出 为 4321, 12300 输 出 为 321 Private Sub Reverse(ByVal x As Integer) s = 0 Do While x <> 0 r = x Mod 10 s = s * 10 + r x = x \ 10 Loop Print s 6.1.2 Function 过 程 函 数 是 过 程 的 另 一 种 形 式, 当 过 程 的 执 行 返 回 一 个 值 时, 使 用 函 数 就 比 较 简 单 Visual Basic 包 含 了 许 多 内 部 的 函 数, 如 sin abs int rnd 等 用 户 在 编 写 程 序 时, 只 需 写 出 一 个 函 数 名 并 给 定 参 数 就 能 得 出 函 数 值 当 在 程 序 中 需 要 多 次 用 到 某 一 公 式 或 要 处 理 某 一 函 数 关 系, 而 又 没 有 现 成 的 内 部 函 数 可 使 用 时,Visual Basic 允 许 使 用 Function 语 句 编 写 用 户 自 定 义 的 Function 函 数 过 程 与 Sub 过 程 一 样,Function 过 程 也 是 一 个 独 立 的 过 程, 可 传 递 参 数, 执 行 一 系 列 语 句

第 6 章 过 程 105 并 改 变 其 参 数 的 值 与 Sub 过 程 不 同 的 是,Function 过 程 可 返 回 一 个 值 到 调 用 的 过 程 Function 过 程 定 义 的 一 般 格 式 为 : [Private Public ] [ Static ] Function 函 数 过 程 名 ([ 参 数 列 表 ]) [As 类 型 ] 局 部 变 量 或 常 数 定 义 语 句 块 函 数 过 程 名 = 表 达 式 [Exit Function] 语 句 块 函 数 过 程 名 = 表 达 式 End Function 其 中 : (1) Function 为 定 义 函 数 过 程 的 关 键 字, 其 前 缀 Private Public Static 为 可 选 关 键 字, 用 来 说 明 该 函 数 过 程 的 性 质 (2) As 类 型 是 函 数 返 回 值 的 数 据 类 型, 与 变 量 一 样, 如 果 没 有 As 子 句, 默 认 的 数 据 类 型 为 Variant (3) 函 数 过 程 名 = 表 达 式 : 在 函 数 体 中 用 该 语 句 给 函 数 赋 值, 在 关 键 字 Function 与 End Function 之 间 的 函 数 体 中, 应 该 至 少 有 一 条 给 函 数 过 程 名 赋 值 的 语 句 最 后 一 次 给 函 数 过 程 名 赋 的 值 就 是 该 函 数 过 程 的 返 回 值 如 果 在 Function 过 程 中 没 有 给 函 数 名 赋 值, 则 该 Function 过 程 的 返 回 值 为 数 据 类 型 的 默 认 值 例 如, 数 值 函 数 返 回 值 为 0, 字 符 串 函 数 返 回 值 为 空 字 符 串, 可 变 类 型 (Variant) 函 数 返 回 值 为 空 值 (4) Exit Function 语 句 用 于 提 前 从 Function 过 程 中 退 出, 程 序 接 着 从 调 用 该 Function 过 程 语 句 的 下 一 条 语 句 继 续 执 行 在 Function 过 程 的 任 何 位 置 都 可 以 有 Exit Function 语 句 但 用 户 退 出 函 数 之 前, 应 该 有 给 函 数 过 程 名 赋 值 的 语 句 被 执 行 例 如, 下 面 是 一 个 计 算 三 角 形 面 积 的 函 数 过 程, 函 数 名 为 TriArea 函 数 返 回 值 的 数 据 类 型 为 Single, 函 数 的 形 参 为 三 角 形 三 条 边 的 边 长 a b 和 c, 返 回 值 为 该 三 角 形 的 面 积 Function 过 程 代 码 如 下 : Private Function TriArea(ByVal a As Single, ByVal b As Single, ByVal c As Single) Dim p As Single, s As Single p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c)) TriArea = s End Function 与 Sub 过 程 一 样,Function 过 程 既 可 以 直 接 在 代 码 编 辑 窗 口 中 输 入 过 程 代 码, 也 可 以 使 用 添 加 过 程 对 话 框 来 定 义 Function 过 程 由 于 函 数 过 程 具 有 返 回 值, 还 需 对 系 统 自 动 产 生 的 函 数 过 程 模 板 进 行 适 当 的 修 改, 即 在 过 程 名 后 面 加 上 对 其 返 回 值 类 型 的 定 义 和 说 明 6.2 过 程 的 调 用 一 个 过 程 定 义 后, 必 须 通 过 调 用 才 能 执 行 事 件 过 程 通 过 发 生 相 关 事 件 调 用 或 用 语 句 105

106 Visual Basic 程 序 设 计 调 用, 用 户 定 义 的 Sub 通 用 过 程 或 Function 函 数 过 程 通 过 语 句 调 用 6.2.1 调 用 Sub 事 件 过 程 Sub 事 件 过 程 可 有 事 件 自 动 调 用, 也 可 以 被 在 同 一 模 块 中 的 其 他 过 程 使 用 调 用 语 句 调 用 用 调 用 语 句 调 用 Sub 过 程 有 两 种 方 式 : 使 用 Call 语 句 和 直 接 使 用 Sub 过 程 名 其 一 般 格 式 为 : Call 过 程 名 [( 参 数 列 表 )] 或 者 过 程 名 [ 参 数 列 表 ] 其 中 : (1) 参 数 列 表 中, 在 调 用 语 句 中 的 参 数 称 为 实 在 参 数 ( 简 称 实 参 ) 实 参 可 以 是 常 量 变 量 表 达 式 和 数 组 (2) 使 用 Call 语 句 调 用 时, 参 数 必 须 在 括 号 内, 当 被 调 用 过 程 没 有 参 数 时, 则 括 号 也 可 省 略 ; 用 过 程 名 调 用 时, 参 数 列 表 不 加 括 号 (3) 执 行 调 用 语 句 时,Visual Basic 将 控 制 转 移 到 被 调 用 的 Sub 过 程 例 6.1 检 查 文 本 框 中 输 入 的 数 据 是 否 是 数 值 在 文 本 框 (txtinput) 中 输 入 数 据, 在 文 本 框 失 去 焦 点 时 检 查 输 入 的 数 据 是 否 为 数 值, 在 按 钮 检 查 (cmdcheck) 的 单 击 事 件 中 也 进 行 检 查 程 序 代 码 如 下 : Private Sub txtinput_lostfocus() If IsNumeric(txtInput.Text) = True Then MsgBox (" 输 入 的 是 数 值 ") Else MsgBox (" 输 入 的 是 文 字 ") End If Private Sub cmdcheck_click() Call txtinput_lostfocus ' 调 用 事 件 过 程 6.2.2 调 用 Sub 通 用 过 程 调 用 Sub 通 用 过 程 的 语 法 和 调 用 Sub 事 件 过 程 的 相 同 不 同 的 是,Sub 通 用 过 程 只 有 通 过 语 句 调 用 后 才 被 执 行, 否 则 不 被 执 行 例 6.2 编 写 一 个 Sub 过 程 Divisor 输 出 两 个 正 整 数 的 最 大 公 约 数 单 击 窗 体 时, 通 过 InputBox 输 入 两 个 正 整 数, 然 后 调 用 过 程 Divisor 输 出 结 果 求 两 个 正 整 数 的 最 大 公 约 数 采 用 辗 转 相 除 法, 算 法 如 下 : (1) 输 入 两 个 正 整 数 m,n; (2) 计 算 m 除 以 n 的 余 数 r; (3) 若 r=0, 则 转 步 骤 (6); 106

(4) 用 n 替 换 m(m=n), 用 r 替 换 n(n=r); (5) 转 步 骤 (2); (6) n 的 值 就 是 m n 两 个 数 的 最 大 公 约 数 程 序 代 码 如 下 : 第 6 章 过 程 107 Private Sub Form_Click() Dim x%, y% x = Val(InputBox(" 请 输 入 一 个 正 整 数 ")) y = Val(InputBox(" 请 再 输 入 一 个 正 整 数 ")) Print x; " 和 "; y; " 的 "; Call Divisor(x, y) ' 调 用 通 用 Sub 过 程 x = Val(InputBox(" 请 输 入 一 个 正 整 数 ")) y = Val(InputBox(" 请 再 输 入 一 个 正 整 数 ")) Print x; " 和 "; y; " 的 "; Divisor x, y ' 调 用 通 用 Sub 过 程 Private Sub Divisor(ByVal m As Integer, ByVal n As Integer) Dim r As Integer r = m Mod n Do While r <> 0 m = n n = r r = m Mod n Loop Print " 最 大 公 约 数 为 "; n 6.2.3 调 用 Function 过 程 调 用 Function 函 数 过 程 的 方 法 与 调 用 Visual Basic 内 部 函 数 的 方 法 一 样 ( 如 Int(x)), 在 语 句 中 直 接 使 用 函 数 名, 其 一 般 格 式 为 : 函 数 名 ([ 参 数 列 表 ]) 例 6.3 输 入 三 角 形 的 三 条 边 的 边 长, 求 三 角 形 的 面 积 Private Function TriArea(ByVal a As Single, ByVal b As Single, ByVal c As Single) Dim p As Single, s As Single p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c)) TriArea = s End Function Private Sub Form_Click() Dim x As Single, y As Single, z As Single x = Val(InputBox(" 请 输 入 三 角 形 第 一 条 边 的 边 长 ")) y = Val(InputBox(" 请 输 入 三 角 形 第 二 条 边 的 边 长 ")) z = Val(InputBox(" 请 输 入 三 角 形 第 三 条 边 的 边 长 ")) If x > 0 And y > 0 And z > 0 Then If x + y > z And x + z > y And y + z > x Then s = TriArea(x, y, z) ' 调 用 函 数 过 程 求 三 角 形 的 面 积 107

108 Visual Basic 程 序 设 计 MsgBox (" 三 角 形 的 面 积 为 " & s) Else MsgBox (" 输 入 的 三 个 数, 不 能 组 成 一 个 三 角 形!") End If Else MsgBox (" 输 入 的 数 据 必 须 全 部 大 于 0") End If 6.3 参 数 的 传 递 参 数 是 过 程 与 外 部 程 序 传 输 信 息 的 纽 带 外 部 程 序 调 用 过 程 时 可 以 把 数 据 传 递 给 过 程, 也 可 以 把 过 程 中 的 数 据 传 递 回 来 在 调 用 过 程 时, 需 考 虑 调 用 过 程 和 被 调 用 过 程 之 间 的 数 据 是 如 何 传 递 的 通 常 在 编 制 一 个 过 程 时, 应 考 虑 需 要 输 入 哪 些 数 据, 进 行 处 理 后 输 出 哪 些 数 据 ; 正 确 地 为 一 个 过 程 提 供 输 入 数 据 和 正 确 地 引 用 其 输 出 数 据, 是 使 用 过 程 的 关 键, 也 就 是 调 用 过 程 和 被 调 用 过 程 之 间 的 数 据 传 递 问 题 在 调 用 一 个 有 参 数 的 过 程 时, 首 先 进 行 的 是 形 参 与 实 参 的 结 合, 实 现 调 用 过 程 的 实 参 与 被 调 用 过 程 的 形 参 之 间 的 数 据 传 递 数 据 传 递 有 两 种 方 式 : 按 值 传 递 和 按 地 址 传 递 6.3.1 形 参 和 实 参 在 过 程 定 义 的 参 数 表 中 出 现 的 参 数 称 为 形 式 参 数 ( 简 称 形 参 ) 在 过 程 被 调 用 之 前, 形 参 并 未 被 分 配 内 存, 只 是 说 明 形 参 的 类 型 和 在 过 程 中 的 作 用 形 参 列 表 中 的 各 参 数 之 间 用 逗 号 分 隔, 形 参 可 以 是 变 量 名 和 数 组 名 在 调 用 过 程 语 句 或 表 达 式 中 出 现 的 参 数 表 称 为 实 在 参 数 ( 简 称 实 参 ), 在 过 程 调 用 时 实 参 将 数 据 传 递 给 形 参 实 参 表 可 由 常 量 表 达 式 有 效 的 变 量 名 数 组 名 组 成, 实 参 表 中 各 参 数 用 逗 号 分 隔 在 调 用 一 个 过 程 时, 必 须 把 实 参 传 送 给 过 程 中 的 形 参, 完 成 形 参 与 实 参 的 结 合, 这 种 参 数 的 传 递 也 称 为 参 数 的 结 合 例 如, 定 义 一 个 过 程 : Private Sub Divisor(ByVal m As Integer, ByVal n As Integer) 则 其 形 参 与 实 参 的 结 合 关 系 如 下 : 过 程 调 用 :Call Divisor (x, y) 过 程 定 义 :Sub Divisor (ByVal m As Integer, ByVal n As Integer) 在 传 递 参 数 时, 形 参 表 与 实 参 表 中 对 应 参 数 的 名 字 可 以 不 同, 但 要 求 形 参 表 与 实 参 表 中 参 数 的 个 数 数 据 类 型 位 置 顺 序 必 须 一 一 对 应 因 为 在 调 用 过 程 时, 形 参 和 实 参 结 合 是 按 位 置 结 合 的, 即 第 一 个 实 参 与 第 一 个 形 参 结 合, 第 二 个 实 参 与 第 二 个 形 参 结 合, 依 次 类 推 108

第 6 章 过 程 109 6.3.2 参 数 按 值 传 递 和 按 地 址 传 递 Visual Basic 中 传 递 参 数 的 方 式 有 两 种 : 一 种 是 按 值 传 递, 另 一 种 是 按 地 址 传 递 在 过 程 定 义 时, 形 参 前 加 ByVal 关 键 字 的 是 按 值 传 递, 形 参 前 加 ByRef 关 键 字 ( 或 省 略 ) 的 是 按 地 址 传 递 1. 按 值 传 递 参 数 按 值 传 递 参 数 时,Visual Basic 给 传 递 的 形 参 分 配 一 个 临 时 的 内 存 单 元, 将 实 参 的 值 传 递 到 这 个 临 时 单 元 中 去 实 参 向 形 参 传 递 是 单 向 的, 如 果 在 被 调 用 的 过 程 中 改 变 了 形 参 值, 则 只 是 临 时 单 元 的 值 变 动, 不 会 影 响 实 参 变 量 本 身 当 被 调 用 过 程 结 束 返 回 调 用 过 程 时, Visual Basic 将 释 放 给 形 参 分 配 的 临 时 内 存 单 元, 实 参 变 量 的 值 保 持 不 变 如 果 调 用 语 句 中 的 实 参 是 常 量 或 表 达 式, 此 时 参 数 传 递 是 按 值 传 递 例 6.4 按 值 传 递 参 数 示 例 Private Sub ChangeByVal(ByVal x As Integer, ByVal 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 = 10 b = 20 Print " 交 换 前,a="; a; " b="; b Call ChangeByVal(a, b) Print " 交 换 后,a="; a; " b="; b 程 序 运 行 时, 单 击 窗 体, 在 窗 体 中 输 出 结 果 为 : 交 换 前,a=10 b=20 交 换 后,a=10 b=20 从 输 出 结 果 可 以 看 到, 调 用 过 程 ChangeByVal 没 能 交 换 变 量 的 值, 其 原 因 是 : 过 程 ChangeByVal 采 用 按 值 传 递 形 参, 过 程 被 调 用 时 系 统 给 形 参 x 和 y 分 配 临 时 内 存 单 元, 将 实 参 a 和 b 的 值 分 别 传 递 ( 赋 值 ) 给 x 和 y, 在 过 程 ChangeByVal 中, 变 量 a b 不 可 使 用,x y 通 过 临 时 变 量 t 实 现 交 换, 调 用 结 束 返 回 调 用 过 程 后 形 参 x y 的 临 时 内 存 单 元 将 释 放, 实 参 单 元 a 和 b 仍 保 留 原 值 由 此 可 以 看 出, 按 值 传 递 时, 参 数 的 传 递 是 单 向 的 2. 按 地 址 传 递 参 数 按 地 址 传 递 参 数 是 指 实 参 变 量 的 内 存 地 址 传 递 给 形 参, 使 形 参 和 实 参 具 有 相 同 的 地 址, 这 意 味 着 形 参 和 实 参 共 享 一 段 存 储 单 元 因 此, 在 被 调 用 过 程 中 改 变 形 参 的 值, 则 相 应 实 参 的 值 也 被 改 变, 也 就 是 说, 与 按 值 传 递 参 数 不 同, 按 地 址 传 递 参 数 可 以 在 被 调 用 过 程 中 改 变 实 参 的 值 系 统 默 认 情 况 下 是 按 地 址 传 递 参 数 的 109

110 Visual Basic 程 序 设 计 例 6.5 按 地 址 传 递 参 数 示 例 Private Sub ChangeByRef(ByRef x As Integer, ByRef 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 = 10 b = 20 Print " 交 换 前,a="; a; " b="; b Call ChangeByRef(a, b) Print " 交 换 后,a="; a; " b="; b 程 序 运 行 时, 单 击 窗 体, 在 窗 体 中 的 输 出 结 果 为 : 交 换 前,a=10 b=20 交 换 后,a=20 b=10 从 输 出 结 果 可 以 看 到, 调 用 过 程 ChangeByRef 交 换 了 变 量 的 值, 其 原 因 是 : 过 程 ChangeByRef 采 用 按 地 址 传 递 形 参, 当 调 用 过 程 ChangeByRef 时, 通 过 虚 实 结 合, 形 参 x y 获 得 实 参 a b 的 地 址, 即 x 和 a 使 用 同 一 存 储 单 元,y 和 b 使 用 同 一 存 储 单 元 因 此, 在 被 调 用 过 程 ChangeByRef 中 x y 通 过 临 时 变 量 t 实 现 交 换 后, 实 参 a 和 b 的 值 也 同 样 被 交 换, 当 调 用 结 束 返 回 后,x y 被 释 放, 实 参 a b 的 值 就 是 交 换 后 的 值 需 要 说 明 的 是, 并 不 是 所 有 ByRef 关 键 字 修 饰 的 形 参 在 过 程 实 际 调 用 时 一 定 是 按 地 址 传 递 的 只 有 当 实 参 是 变 量 名 或 数 组 名 时 才 能 实 现 按 地 址 传 递 如 果 实 参 是 常 量 或 表 达 式, 实 际 进 行 的 是 按 值 传 递 如 果 希 望 强 制 以 单 个 变 量 为 实 参 进 行 按 值 传 递, 可 以 给 这 个 实 参 变 量 加 上 一 个 额 外 的 小 括 号, 这 样 Visual Basic 就 把 它 理 解 为 一 个 表 达 式, 实 行 按 值 传 递 例 如, 若 将 例 6-5 中 的 调 用 语 句 Call ChangeByRef(a, b) 改 为 Call ChangeByRef((a), b) 则 程 序 运 行 后, 单 击 窗 体, 运 行 结 果 为 : 交 换 前,a=10 b=20 交 换 后,a=10 b=10 这 是 由 于 在 调 用 时, 实 参 变 量 a 用 括 号 括 起 来 了, (a) 就 成 为 一 个 表 达 式 了, 实 行 按 值 传 递 ; 而 实 参 变 量 b 按 地 址 传 递, 因 此 调 用 过 程 ChangeByRef((a), b) 后,a 的 值 保 持 不 变,b 的 值 发 生 了 改 变 6.3.3 数 组 参 数 Visual Basic 允 许 把 数 组 作 为 一 个 实 参 传 递 给 过 程, 此 时 要 求 在 定 义 过 程 时 相 应 的 形 参 应 加 空 括 号 表 明 是 数 组 调 用 时, 相 应 的 实 参 必 须 是 数 组, 可 以 只 写 数 组 名, 不 必 加 括 号 数 组 作 参 数 时 必 须 是 按 地 址 传 递 的, 形 参 与 实 参 共 用 同 一 段 内 存 单 元, 不 能 使 用 ByVal 关 110

第 6 章 过 程 111 键 字 修 饰 形 参 数 组 与 实 参 数 组 的 数 据 类 型 应 一 致 例 6.6 10 个 小 孩 围 坐 一 圈 分 糖 果, 开 始 时, 老 师 随 机 分 给 每 位 小 孩 若 干 糖 果, 如 果 哪 位 小 孩 的 糖 果 数 为 一 个 奇 数, 向 老 师 补 要 1 块 为 了 公 平, 现 进 行 调 整, 调 整 规 则 是 : 所 有 小 孩 同 时 把 自 己 糖 果 的 一 半 分 给 左 边 的 小 孩, 糖 的 块 数 变 为 奇 数 的 小 孩 向 老 师 补 要 一 块 ( 设 老 师 手 中 的 糖 果 足 以 满 足 这 些 要 求 ) 问 经 过 多 少 次 调 整, 大 家 的 糖 果 数 都 一 样? 每 人 多 少 块? 程 序 代 码 如 下 : Function IsEqual(a() As Integer) start = LBound(a) For i = start + 1 To UBound(a) If a(i) <> a(start) Then IsEqual = 0 Exit Function End If Next i IsEqual = 1 End Function Private Sub Exchange(a() As Integer) temp = a(ubound(a)) For i = UBound(a) To LBound(a) + 1 Step -1 a(i) = a(i) / 2 + a(i - 1) / 2 Next i a(lbound(a)) = a(lbound(a)) / 2 + temp / 2 Private Sub Supply(a() As Integer) For i = LBound(a) To UBound(a) If a(i) Mod 2 <> 0 Then a(i) = a(i) + 1 End If Next i Private Sub Form_Click() Dim sugars(1 To 10) As Integer Dim ExCount As Integer ExCount = 0 For i = 1 To 10 sugars(i) = Val(InputBox(" 请 输 入 第 " & i & " 个 小 孩 的 糖 果 数 :")) Next i Do While IsEqual(sugars) <> 1 Call Supply(sugars) Call Exchange(sugars) ExCount = ExCount + 1 Loop Print " 经 过 "; ExCount; " 次 调 整 后, 所 有 小 孩 的 糖 果 数 均 相 同 " Print " 每 个 小 孩 的 糖 果 数 为 "; sugars(1) 111

112 Visual Basic 程 序 设 计 程 序 中 定 义 了 3 个 过 程, 这 3 个 过 程 的 形 参 均 为 一 个 一 维 数 组 的 数 组 名 其 中, 过 程 IsEqual 用 来 判 断 数 组 中 所 有 元 素 的 值 是 否 都 相 等, 如 果 都 相 等 则 返 回 1, 否 则 返 回 0; 过 程 Exchange 用 来 完 成 一 次 调 整 过 程, 所 有 小 孩 同 时 把 自 己 糖 果 的 一 半 分 给 左 边 的 小 孩 ; 过 程 Supply 用 来 完 成 补 发 操 作, 即 糖 的 块 数 为 奇 数 的 小 孩 向 老 师 补 要 一 块 在 窗 体 单 击 事 件 过 程 Form_Click() 中 用 一 维 数 组 sugars 来 保 存 10 个 小 孩 的 糖 果 数, 再 调 用 过 程 Exchange 或 过 程 Supply, 将 数 组 sugars 的 首 地 址 送 给 形 参 数 组 a, 因 此 数 组 a 和 数 组 sugars 共 享 一 段 内 存 空 间, 在 过 程 中 对 数 组 a 中 元 素 值 进 行 修 改, 则 数 组 sugars 对 应 的 元 素 值 也 被 修 改 了 由 上 例 可 以 看 出, 数 组 作 为 参 数 时, 应 注 意 以 下 几 点 (1) 为 了 把 一 个 数 组 的 全 部 元 素 传 送 给 个 过 程, 应 将 数 组 名 写 入 形 参 表 中, 并 略 去 数 组 的 上 下 界, 但 括 号 不 能 省 略 例 如, 形 参 a() 即 为 数 组 (2) 被 调 用 过 程 中 可 通 过 Lbound 和 Ubound 函 数 确 定 实 参 数 组 的 上 下 界 (3) 当 用 数 组 作 形 参 时, 对 应 的 实 参 必 须 也 是 数 组, 且 类 型 一 致 (4) 实 参 和 形 参 结 合 是 按 地 址 传 递 的, 即 形 参 数 组 和 实 参 数 组 共 用 一 段 内 存 单 元 6.3.4 可 选 参 数 与 可 变 参 数 在 前 面 介 绍 过 程 的 定 义 时 提 到 过, 在 形 参 的 前 面 除 了 可 以 加 关 键 字 ByVal 或 ByRef 用 于 指 定 参 数 传 递 的 方 式 外, 形 参 前 面 还 可 以 加 关 键 字 Optional 或 ParamArray Optional 关 键 字 修 饰 的 参 数 称 为 可 选 参 数,ParamArray 关 键 字 修 饰 的 参 数 称 为 可 变 参 数 1. 可 选 参 数 一 般 来 说, 个 过 程 在 声 明 时 定 义 了 几 个 形 参, 则 在 调 用 这 个 过 程 时 就 必 须 使 用 相 同 数 量 的 实 参 Visual Basic 允 许 在 形 参 前 面 使 用 Optional 关 键 字 把 它 设 定 为 可 选 参 数 如 果 一 个 过 程 的 某 个 形 参 为 可 选 参 数, 则 在 调 用 此 过 程 时 可 以 不 提 供 对 应 于 这 个 形 参 的 实 参 如 果 在 过 程 定 义 的 形 参 表 中 用 Optional 关 键 字 将 某 个 参 数 指 定 为 可 选 参 数, 则 参 数 表 中 此 参 数 后 面 的 所 有 其 他 参 数 也 必 须 是 可 选 的, 并 都 要 用 Optional 来 修 饰 例 6.7 编 写 一 个 计 算 两 个 数 据 的 乘 积 的 函 数 过 程, 它 能 可 选 择 地 乘 以 第 3 个 数 在 调 用 时, 既 可 以 给 它 传 递 2 个 参 数, 也 可 给 它 传 递 3 个 参 数 为 了 定 义 带 可 选 参 数 的 过 程, 必 须 在 参 数 表 中 使 用 Optional 关 键 字, 并 在 过 程 体 中 通 过 IsMissing 函 数 来 测 试 调 用 时 是 否 传 递 可 选 参 数 当 调 用 时, 提 供 了 可 选 参 数, 则 IsMissing 函 数 的 返 回 值 为 Flase, 如 果 没 有 提 供 可 选 参 数, 则 IsMissing 函 数 返 回 值 为 True 过 程 代 码 如 下 : Private Function multi(byval a%, ByVal b%, Optional ByVal c) p = a * b If Not IsMissing(c) Then p = p * c End If multi = p End Function 112

第 6 章 过 程 113 在 调 用 上 面 的 过 程 时, 可 以 提 供 2 个 参 数, 也 可 提 供 3 个 参 数, 都 能 得 到 正 确 的 结 果 例 如, 可 用 下 述 事 件 过 程 调 用 : Private Sub Command1_Click() Print multi(4, 5) ' 提 供 2 个 参 数 Print multi(1, 2, 3) ' 提 供 3 个 参 数 另 外, 编 程 人 员 也 可 以 给 可 选 参 数 指 定 默 认 值, 这 样 在 调 用 时, 未 提 供 实 参 的 形 参 在 调 用 时 被 赋 以 形 参 类 型 的 默 认 值 例 如, 将 上 面 的 Multi 函 数 过 程 改 写 如 下 : Private Function multi(byval a%, ByVal b%, Optional c As Variant = 1) p = a * b * c multi = p End Function 当 调 用 multi(4, 5) 时, 没 有 提 供 形 参 c 对 应 的 实 参, 则 c 的 值 取 给 定 的 默 认 值 1 2. 可 变 参 数 如 果 一 个 过 程 的 最 后 一 个 参 数 是 使 用 ParamArray 关 键 字 声 明 的 数 组, 则 这 个 过 程 在 被 调 用 时 可 以 接 受 任 意 多 个 实 参 调 用 这 个 过 程 时 使 用 的 多 个 实 参 值 均 按 顺 序 存 于 这 个 数 组 中 ParamArray 关 键 字 不 能 与 Byval ByRrf 或 Optional 关 键 字 针 对 同 一 个 形 参 一 起 使 用 使 用 ParamArray 关 键 字 修 饰 的 参 数 只 能 是 Variant 类 型, 一 个 过 程 只 能 有 个 这 样 的 形 参 当 有 多 个 形 参 时,ParamArray 修 饰 的 形 参 必 须 是 形 参 表 中 的 最 后 一 个 例 6.8 定 义 一 个 可 变 参 数 过 程, 用 这 个 过 程 可 以 求 任 意 多 个 数 的 乘 积 Private Sub Multi(ParamArray Numbers()) p = 1 For Each x In Numbers p = p * x Next x Print p 可 以 用 任 意 个 参 数 调 用 上 述 过 程 : Private Sub Command1_Click() Call Multi(4, 5) ' 提 供 2 个 参 数 Call Multi(1, 2, 3) ' 提 供 3 个 参 数 Multi 2, 3, 4, 5, 6 ' 提 供 5 个 参 数 6.3.5 对 象 参 数 在 声 明 通 用 过 程 时, 可 以 使 用 Object Control Label TextBox 等 关 键 字 把 形 参 定 义 为 对 象 类 型 调 用 具 有 对 象 类 型 形 参 的 过 程 时, 应 该 给 该 形 参 提 供 类 型 相 匹 配 的 对 象 名 作 为 实 参 这 时, 传 递 给 过 程 的 就 是 该 对 象 的 引 用, 在 过 程 中 可 以 存 取 其 属 性 和 调 用 其 方 法 例 6.9 对 文 本 框 中 输 入 的 数 据 进 行 检 查 一 个 界 面 中 有 若 干 个 文 本 框 用 于 输 入 数 据, 现 要 求 文 本 框 中 输 入 的 数 据 均 为 数 值 型 的, 113

114 Visual Basic 程 序 设 计 因 此, 在 文 本 框 的 失 去 焦 点 (LostFocus) 事 件 中, 要 检 查 输 入 数 据 是 否 是 数 值 型 的, 如 果 不 是 数 值 型 的, 则 出 现 MsgBox 对 话 框 提 示 出 错, 并 且 用 SetFocus 方 法 将 焦 点 移 回 文 本 框 显 然, 在 每 个 文 本 框 的 失 去 焦 点 事 件 中, 均 需 要 编 写 进 行 数 据 检 查 的 代 码, 可 以 编 写 一 个 通 用 过 程 txtcheck 进 行 数 据 检 查, 在 文 本 框 的 失 去 焦 点 事 件 过 程 中 调 用 这 个 通 用 过 程 编 写 的 txtcheck 通 用 过 程, 将 文 本 框 作 为 参 数, 调 用 这 个 通 用 过 程 时, 将 文 本 框 的 对 象 名 作 为 实 参 传 递 给 形 参, 从 而 使 得 同 一 个 txtcheck 通 用 过 程 可 以 对 不 同 文 本 框 进 行 检 查 程 序 示 例 代 码 如 下 : ' 定 义 文 本 框 输 入 数 据 检 查 的 通 用 过 程 Private Sub txtcheck(txt As TextBox) If IsNumeric(txt.Text) = True Then txtnumber = Val(txt.Text) Else MsgBox (" 输 入 数 据 出 错!") txt.setfocus End If Private Sub Text1_LostFocus() Call txtcheck(text1) ' 调 用 数 据 检 查 通 用 过 程 Private Sub Text2_LostFocus() Call txtcheck(text2) ' 调 用 数 据 检 查 通 用 过 程 6.4 递 归 过 程 递 归 就 是 某 一 事 物 直 接 地 或 间 接 地 由 自 己 组 成 一 个 过 程 直 接 或 间 接 地 调 用 自 身, 便 构 成 了 过 程 的 递 归 调 用, 前 者 称 为 直 接 递 归 调 用, 后 者 称 为 间 接 递 归 调 用 包 含 递 归 调 用 的 过 程 称 为 递 归 过 程 例 如, 下 面 的 过 程 MySub1() 就 是 直 接 递 归 的 例 子 Private Sub MySub1() Call MySub1 ' 调 用 自 身 下 面 的 过 程 OneSub() 是 间 接 递 归 的 例 子 ' 定 义 过 程 OneSub() Private Sub OneSub() Call TwoSub ' 定 义 过 程 TwoSub() ' 调 用 TwoSub 过 程 114

第 6 章 过 程 115 Private Sub TwoSub() Call OneSub ' 调 用 OneSub 过 程 例 6.10 编 程 计 算 n! 根 据 数 学 知 识, 负 数 的 阶 乘 没 有 定 义,0 的 阶 乘 为 1, 正 数 n 的 阶 乘 为 n(n-1) (n-2) 2 1 可 以 用 下 式 表 示 : 1 (n = 0,1) n! = n(n 1)! (n > 1) 利 用 此 式, 求 n 的 阶 乘 可 以 转 换 为 求 n(n-1)! 在 Visual Basic 中, 可 以 用 递 归 过 程 实 现 上 述 运 算 程 序 如 下 : Function fact(byval n As Integer) If n < 0 Then MsgBox ("Data Error!") fact = -1 Exit Function End If If n = 0 Or n = 1 Then fact = 1 Else fact = n * fact(n - 1) End If End Function Private Sub Form_Click() Dim x As Integer x = Val(InputBox(" 请 输 入 一 个 非 负 整 数 ")) If fact(x) <> -1 Then Print x; " 的 阶 乘 为 "; fact(x) End If 在 函 数 过 程 fact 中, 当 形 参 n 的 值 大 于 1 时, 函 数 的 返 回 值 为 n*fact(n-1), 其 中 fact (n-1) 又 是 一 次 函 数 过 程 调 用, 而 调 用 的 又 是 fact 函 数 这 就 是 在 一 个 函 数 过 程 中 调 用 自 身 的 情 况, 即 过 程 的 递 归 调 用 下 面 进 一 步 讨 论 函 数 过 程 fact 的 调 用 过 程 例 如 当 n=5 时,fact(5) 的 返 回 值 是 5*fact(4), 而 fact(4) 的 返 回 值 是 4*fact (3), 仍 然 是 个 未 知 数, 还 要 先 求 出 fact(3), 而 fact(3) 也 不 知 道, 它 的 返 回 值 为 3*fact (2), 而 fact (2) 的 值 为 2*fact (1), 现 在 fact (1) 的 返 回 值 为 1, 是 一 个 已 知 数 然 后 回 头 根 据 fact(1) 求 出 fact (2), 将 fact(2) 的 值 乘 以 3, 求 出 fact(3), 将 fact(3) 乘 以 4, 得 到 fact(4), 再 将 fact (4) 乘 以 5, 得 到 fact (5) 这 就 是 说, 递 归 过 程 在 执 行 时, 将 引 起 一 系 列 的 调 用 和 回 代 的 过 程 当 n=5 时 fact 的 调 用 和 回 代 过 程 如 图 6.1 所 示 115

116 Visual Basic 程 序 设 计 fact(5) = =120 5*fact(4) = =5*24 调 用 过 程 回 代 过 程 4*fact(3) = =4*6 3*fact(2) = =3*2 2*fact(1) = =2*1 fact(1) = 1 1 图 6.1 递 归 函 数 的 调 用 和 回 代 过 程 从 图 6.1 可 以 看 出, 递 归 过 程 不 应 无 限 制 地 进 行 下 去, 当 调 用 若 干 次 以 后, 就 应 当 到 达 递 归 调 用 的 终 点 得 到 一 个 确 定 值 ( 例 如 本 程 序 中 的 fact (1)=l), 然 后 进 行 回 代, 回 代 的 过 程 是 从 一 个 已 知 值 推 出 下 一 个 值 实 际 上 这 是 一 个 递 推 过 程 在 设 计 递 归 过 程 时 应 当 考 虑 到 递 归 的 终 止 条 件, 在 本 例 中, 使 递 归 终 止 的 条 件 是 : If n = 0 Or n = 1 Then fact = 1 所 以, 任 何 有 意 义 的 递 归 总 是 由 两 部 分 组 成 的 : 递 归 方 式 与 递 归 终 止 条 件 递 归 是 一 种 非 常 有 用 的 程 序 设 计 技 术 当 一 个 问 题 蕴 含 递 归 关 系 且 结 构 比 较 复 杂 时, 采 用 递 归 算 法 往 往 比 较 自 然 简 捷, 而 且 容 易 理 解 例 6.11 用 递 归 求 解 汉 诺 塔 (Tower of Hanoi) 问 题 在 19 世 纪, 一 种 称 为 汉 诺 塔 的 游 戏 在 欧 洲 广 为 流 行 游 戏 的 装 置 是 一 块 铜 板, 上 面 有 3 根 柱 子, 左 柱 自 下 而 上 由 大 到 小 顺 序 串 有 64 个 金 盘, 呈 塔 形 ( 如 图 6.2 所 示 ) 游 戏 的 目 标 是 把 左 柱 上 的 金 盘 全 部 移 到 右 边 的 柱 子 上 条 件 是, 一 次 只 能 移 动 一 个 金 盘, 被 移 动 的 盘 子 必 须 放 在 其 中 的 一 根 柱 子 上, 并 且 不 允 许 大 盘 在 小 盘 上 面 编 写 一 个 程 序, 打 印 将 盘 子 从 第 1 根 柱 子 移 到 第 3 根 柱 子 的 移 动 次 序 A B C 图 6.2 汉 诺 塔 问 题 116

第 6 章 过 程 117 假 定 要 把 n 个 盘 子 按 规 定 由 a 柱 借 助 b 柱 移 到 c 柱 模 拟 这 一 过 程 的 算 法 称 为 hanoi(n, a,b,c), 那 么, 很 自 然 的 想 法 是 : (1) 先 把 n 1 个 盘 子 设 法 借 助 c 柱 移 到 b 柱 上, 记 做 hanoi(n-1,a,c,b) (2) 把 第 n 个 盘 子 从 a 柱 移 到 c 柱 (3) 把 b 柱 上 的 n-1 个 盘 子 借 助 a 柱 移 到 c 柱, 记 做 hanoi(n-1,b,a,c) 根 据 以 上 分 析, 编 写 程 序 如 下 : Private Sub Hanoi(ByVal n%, ByVal A$, ByVal B$, ByVal C$) If n = 1 Then Print A; "->"; C Else Hanoi n - 1, A, C, B Print A; "->"; C Hanoi n - 1, B, A, C End If Private Sub Form_Click() Dim x As Integer x = Val(InputBox("Please input the number of disks to be moves:")) Hanoi x, "A", "B", "C" 6.5 变 量 的 作 用 域 与 生 存 期 Visual Basic 的 程 序 模 块 由 一 些 过 程 组 成, 在 过 程 中 会 使 用 到 变 量 变 量 的 定 义 位 置 不 同, 定 义 方 式 不 同, 允 许 被 访 问 的 范 围 和 作 用 时 间 也 不 相 同 变 量 的 作 用 域 即 指 变 量 的 有 效 范 围 变 量 的 生 存 期 即 指 变 量 的 作 用 时 间 6.5.1 变 量 的 作 用 域 变 量 的 作 用 域 决 定 了 应 用 程 序 中 哪 些 过 程 可 以 访 问 该 变 量 按 变 量 的 作 用 域 不 同, 可 以 将 变 量 分 为 局 部 变 量 窗 体 / 模 块 级 变 量 和 全 局 变 量 1. 局 部 变 量 局 部 变 量 指 在 过 程 内 用 Dim 语 句 声 明 的 变 量 未 声 明 而 直 接 使 用 的 变 量 以 及 用 Static 声 明 的 变 量 这 种 变 量 只 能 在 本 过 程 中 使 用, 不 能 被 其 他 过 程 访 问 在 其 他 过 程 中 如 果 有 同 名 的 变 量, 也 与 本 过 程 的 变 量 无 关, 即 不 同 的 过 程 中 可 以 使 用 同 名 的 变 量 除 了 用 Static 声 明 的 变 量 外, 局 部 变 量 在 其 所 在 的 过 程 每 次 运 行 时 都 被 初 始 化 2. 模 块 级 变 量 模 块 级 变 量 指 在 窗 体 模 块 或 标 准 模 块 的 通 用 声 明 段 中 用 Dim 语 句 或 Private 语 句 声 明 的 变 量 模 块 级 变 量 的 作 用 范 围 为 其 定 义 位 置 所 在 的 模 块, 可 以 被 本 模 块 中 的 所 有 过 程 访 问 模 块 级 变 量 在 其 所 在 的 模 块 运 行 时 被 初 始 化 117

118 Visual Basic 程 序 设 计 如 果 在 一 个 模 块 中 的 几 个 过 程 中 均 需 要 访 问 某 些 变 量, 则 需 要 将 这 些 变 量 定 义 为 模 块 级 变 量 例 6.12 一 个 猜 数 字 小 游 戏 在 这 个 游 戏 的 界 面 窗 体 中 有 4 个 标 签 3 个 文 本 框 和 2 个 命 令 按 钮, 运 行 时, 单 击 开 始 游 戏 命 令 按 钮 后, 计 算 机 随 机 产 生 一 个 1~100 之 间 的 正 整 数, 用 户 在 文 本 框 TxtMyGuess 中 输 入 自 己 猜 测 的 数 后, 单 击 猜 命 令 按 钮 提 交, 计 算 机 给 出 猜 测 结 果 提 示, 并 在 文 本 框 TxtGuessCount 和 TxtGuessList 中 记 录 猜 测 的 次 数 和 猜 测 情 况, 猜 测 正 确 后, 不 再 让 用 户 猜 测, 只 有 重 新 开 始 游 戏 ( 单 击 开 始 游 戏 命 令 按 钮 ) 后 才 可 猜 测 窗 体 的 运 行 界 面 如 图 6.3 所 示 窗 体 中 的 控 件 属 性 设 置 如 表 6-1 所 示 图 6.3 猜 数 字 游 戏 表 6-1 窗 体 中 控 件 属 性 表 对 象 对 象 名 属 性 名 属 性 值 Form GuessNumber Caption 猜 数 字 游 戏 TxtMyGuess Text 空 TxtGuessCount Text 空 TextBox Text 空 TxtGuessList MultiLine ScrollBars True 2-Vertical CommandButton cmdguess Caption 开 始 游 戏 cmdstart Caption 猜 LabPrompt Caption 我 是 一 个 1~100 之 间 的 数 字, 猜 猜 我 是 多 少 Label LabMyGuess Caption 我 猜 LabGuessCount Caption 猜 测 次 数 LabGuessList Caption 猜 测 记 录 118

第 6 章 过 程 119 程 序 代 码 如 下 : Dim guessnumber, GuessCount As Integer ' 模 块 级 变 量 Dim guessflag As Boolean ' 模 块 级 变 量 Dim GuessList As String ' 模 块 级 变 量 Private Sub Form_Load() guessfalg = False Randomize Private Sub cmdstart_click() guessnumber = Int(100 * Rnd + 1) guessflag = True GuessCount = 0 TxtGuessCount.Text = "" TxtMyGuess.text = "" TxtMyGuess.SetFocus GuessList = "" TxtGuessList.Text = "" cmdstart.enabled = False Private Sub cmdguess_click() If (guessflag) Then GuessCount = GuessCount + 1 x = Val(TxtMyGuess.Text) If (x < guessnumber) Then result = " 你 猜 小 了!" ElseIf (x = guessnumber) Then result = " 你 猜 对 了!" guessflag = False cmdstart.enabled = True Else result = " 你 猜 大 了!" End If MsgBox (result) GuessList = GuessList & GuessCount & ":" & x & result & Chr(13) & Chr(10) TxtGuessList.Text = GuessList TxtGuessCount.Text = GuessCount TxtMyGuess.Text = "" TxtMyGuess.SetFocus Else MsgBox (" 请 开 始 游 戏 ") End If 程 序 中 定 义 了 3 个 事 件 过 程 Form_Load cmdstart_click 和 cmdguess_click, 在 这 3 个 过 程 中, 需 要 对 计 算 机 产 生 的 随 机 数 guessnumber 用 户 猜 测 次 数 GuessCount 用 户 猜 测 情 况 GuessList 以 及 是 否 可 以 进 行 猜 测 guessflag 等 变 量 进 行 操 作, 因 此 需 要 将 它 们 定 义 为 模 块 级 变 量, 在 这 3 个 过 程 中 均 可 以 对 这 些 变 量 进 行 操 作 119

120 Visual Basic 程 序 设 计 3. 全 局 变 量 全 局 变 量 指 在 模 块 的 通 用 声 明 段 中 用 Public 语 句 声 明 的 变 量, 其 作 用 范 围 为 应 用 程 序 的 所 有 过 程 全 局 变 量 在 应 用 程 序 运 行 时 被 初 始 化 6.5.2 变 量 的 生 存 期 当 一 个 过 程 被 调 用 时, 系 统 将 给 该 过 程 中 的 变 量 分 配 存 储 单 元, 当 该 过 程 执 行 结 束 时, 是 释 放 还 是 保 留 变 量 的 存 储 单 元, 这 就 是 变 量 的 生 存 期 问 题 根 据 变 量 的 生 存 期, 可 以 将 变 量 分 为 动 态 变 量 和 静 态 变 量 1. 动 态 变 量 在 应 用 程 序 中 的 变 量 如 果 不 使 用 Static 语 句 进 行 声 明, 则 属 于 动 态 变 量 对 于 过 程 级 的 动 态 变 量, 在 程 序 运 行 到 变 量 所 在 的 过 程 时, 系 统 为 变 量 分 配 存 储 空 间, 并 进 行 变 量 的 初 始 化 工 作 ; 当 该 过 程 结 束 时, 释 放 变 量 所 占 用 的 存 储 空 间, 其 值 不 再 存 在 模 块 级 动 态 变 量 在 运 行 模 块 时 被 初 始 化, 在 退 出 模 块 时 释 放 其 所 占 用 的 存 储 空 间 全 局 级 动 态 变 量 在 应 用 程 序 执 行 时 分 配 存 储 空 间, 在 退 出 应 用 程 序 时 释 放 存 储 空 间 2. 静 态 变 量 如 果 一 个 变 量 用 Static 语 句 声 明, 则 该 变 量 只 被 初 始 化 一 次, 在 应 用 程 序 运 行 期 间 保 留 其 值, 即 在 每 次 调 用 该 变 量 所 在 的 过 程 时, 该 变 量 不 会 被 更 新 初 始 化, 而 在 退 出 变 量 所 在 的 过 程 时, 不 释 放 该 变 量 所 占 的 存 储 空 间 在 Sub 过 程 Function 过 程 的 定 义 语 句 中 使 用 Static 修 饰 词, 表 明 该 过 程 内 所 有 的 变 量 均 为 静 态 变 量 例 6.13 静 态 变 量 的 使 用 示 例 在 窗 体 中 放 置 一 个 命 令 按 钮 Command1, 每 次 单 击 该 命 令 按 钮 后, 弹 出 一 个 对 话 框, 显 示 这 是 第 几 次 单 击 命 令 按 钮! 这 一 信 息 程 序 代 码 如 下 : Private Sub Command1_Click() Static num As Integer ' 定 义 num 为 静 态 变 量 num = num + 1 MsgBox (" 这 是 第 " & num & " 次 单 击 命 令 按 钮!") 运 行 程 序 时, 会 发 现 每 次 单 击 命 令 按 钮 后, 会 在 对 话 框 中 显 示 是 第 几 次 单 击 如 果 将 num 不 定 义 为 静 态 变 量, 则 每 次 单 击 命 令 按 钮 后, 对 话 框 中 显 示 的 信 息 均 为 这 是 第 1 次 单 击 命 令 按 钮! 这 是 由 于 将 num 定 义 为 静 态 变 量 后,num 在 应 用 程 序 运 行 期 间 分 配 一 个 固 定 存 储 单 元, 定 义 num 变 量 的 过 程 结 束 时,num 的 值 仍 然 存 在, 该 过 程 再 次 被 调 用 时, num 的 值 为 上 次 过 程 调 用 结 束 时 的 值 120

第 6 章 过 程 121 6.6 小 结 过 程 是 程 序 设 计 语 言 中 的 一 个 重 要 的 概 念, 所 谓 过 程 就 是 完 成 某 一 特 定 功 能 的 程 序 代 码 段, 它 由 一 系 列 可 执 行 语 句 组 成, 是 一 个 相 对 独 立 的 实 体 将 应 用 程 序 划 分 为 多 个 过 程, 可 带 来 如 下 好 处 : (1) 把 一 个 复 杂 的 任 务 划 分 为 小 任 务, 用 过 程 来 表 达, 使 任 务 更 容 易 理 解, 容 易 实 现 和 维 护 ; (2) 过 程 可 以 被 反 复 调 用, 从 而 避 免 了 重 复 编 码, 使 程 序 结 构 简 洁 在 Visual Basic 中 用 户 可 以 定 义 4 种 类 型 的 过 程 以 关 键 字 Sub 开 头 的 子 过 程 ; 以 关 键 字 Function 开 头 的 函 数 过 程 ; 以 关 键 字 Property 开 头 的 属 性 过 程 ; 以 关 键 字 Event 开 头 的 事 件 过 程 本 章 主 要 介 绍 了 Sub 过 程 和 Function 过 程 Sub 过 程 是 指 一 组 能 够 完 成 特 定 操 作 和 相 对 独 立 的 程 序 段 ( 语 句 块 ) 在 其 他 过 程 中 要 执 行 这 个 操 作 时, 可 以 调 用 Sub 过 程 Sub 过 程 定 义 的 一 般 格 式 为 : [Private Public ] [ Static ] Sub 子 过 程 名 [( 参 数 表 )] 局 部 变 量 或 常 数 定 义 语 句 块 [Exit Sub] 语 句 块 Visual Basic 允 许 使 用 Function 语 句 编 写 用 户 自 定 义 的 Function 函 数 过 程 Function 过 程 可 返 回 一 个 值 到 调 用 的 过 程 Function 过 程 定 义 的 一 般 格 式 为 : [Private Public ] [ Static ] Function 函 数 过 程 名 ([ 参 数 列 表 ]) [As 类 型 ] 局 部 变 量 或 常 数 定 义 语 句 块 函 数 过 程 名 = 返 回 值 [Exit Function] 语 句 块 函 数 过 程 名 = 返 回 值 End Function 用 调 用 语 句 调 用 Sub 过 程 有 两 种 方 式 : 使 用 Call 语 句 直 接 使 用 Sub 过 程 名 其 一 般 格 式 为 : Call 过 程 名 [( 参 数 列 表 )] 或 者 过 程 名 [ 参 数 列 表 ] 121

122 Visual Basic 程 序 设 计 调 用 Function 函 数 过 程 的 方 法 与 调 用 Visual Basic 内 部 函 数 的 方 法 一 样, 在 语 句 中 直 接 使 用 函 数 名, 其 一 般 格 式 为 : 函 数 名 ([ 参 数 列 表 ]) 在 调 用 一 个 有 参 数 的 过 程 时, 首 先 进 行 的 是 形 参 与 实 参 的 结 合, 实 现 调 用 过 程 的 实 参 与 被 调 用 过 程 的 形 参 之 间 的 数 据 传 递 数 据 传 递 有 两 种 方 式 : 按 值 传 递 和 按 地 址 传 递 在 过 程 定 义 时, 形 参 前 有 ByVal 关 键 字 的 是 按 值 传 递, 形 参 前 有 ByRef 关 键 字 ( 或 省 略 ) 的 是 按 地 址 传 递 Visual Basic 的 程 序 模 块 由 一 些 过 程 组 成, 在 过 程 中 会 使 用 变 量 变 量 的 定 义 位 置 不 同, 定 义 方 式 不 同, 允 许 被 访 问 的 范 围 和 作 用 时 间 也 不 相 同 变 量 的 作 用 域 决 定 了 应 用 程 序 中 哪 些 过 程 可 以 访 问 该 变 量 按 变 量 的 作 用 域 不 同, 可 以 将 变 量 分 为 局 部 变 量 窗 体 / 模 块 级 变 量 和 全 局 变 量 当 一 个 过 程 被 调 用 时, 系 统 将 给 该 过 程 中 的 变 量 分 配 存 储 单 元, 当 该 过 程 执 行 结 束 时, 是 释 放 还 是 保 留 变 量 的 存 储 单 元, 这 就 是 变 量 的 生 存 期 问 题 根 据 变 量 的 生 存 期, 可 以 将 变 量 分 为 动 态 变 量 和 静 态 变 量 6.7 习 题 一 选 择 题 1. 以 下 关 于 函 数 过 程 的 叙 述 中, 正 确 的 是 ( ) A) 函 数 过 程 形 参 的 类 型 与 函 数 返 回 值 的 类 型 没 有 关 系 B) 在 函 数 过 程 中, 过 程 的 返 回 值 可 以 有 多 个 C) 当 数 组 作 为 函 数 过 程 的 参 数 时, 既 能 以 按 值 方 式 传 递, 也 能 以 按 址 方 式 传 递 D) 如 果 不 指 明 函 数 过 程 参 数 的 类 型, 则 该 参 数 没 有 数 据 类 型 2. 以 下 关 于 过 程 及 过 程 参 数 的 描 述 中, 错 误 的 是 ( ) A) 过 程 的 参 数 可 以 是 控 件 名 称 B) 用 数 组 作 为 过 程 的 参 数 时, 使 用 的 是 传 地 址 方 式 C) 只 有 函 数 过 程 能 够 将 过 程 中 处 理 的 信 息 传 回 调 用 的 程 序 中 D) 窗 体 可 以 作 为 过 程 的 参 数 3. 以 下 关 于 变 量 作 用 域 的 叙 述 中, 正 确 的 是 ( ) A) 窗 体 中 凡 被 声 明 为 Private 的 变 量 只 能 在 某 个 指 定 的 过 程 中 使 用 B) 全 局 变 量 必 须 在 标 准 模 块 中 声 明 C) 模 块 级 变 量 只 能 用 Private 关 键 字 声 明 D) Static 类 型 变 量 的 作 用 域 是 它 所 在 的 窗 体 或 模 块 文 件 4. Sub 过 程 与 Function 过 程 最 根 本 的 区 别 是 ( ) A) Sub 过 程 可 以 使 用 Call 语 句 或 直 接 使 用 过 程 名 调 用, 而 Function 过 程 不 可 以 B) Function 过 程 可 以 有 多 数,Sub 过 程 不 可 以 C) 两 种 过 程 参 数 的 传 递 方 式 不 同 122

第 6 章 过 程 123 D) Sub 过 程 不 能 返 回 值, 而 Function 过 程 能 返 回 值 5. 若 希 望 在 离 开 某 过 程 后, 还 能 保 存 该 过 程 中 局 部 变 量 的 值, 则 应 使 用 哪 个 关 键 字 在 该 过 程 中 定 义 局 部 变 量?( ) A) Dim B) Private C) Public D)Static 6. 在 参 数 传 递 过 程 中, 使 用 关 键 字 来 修 饰 参 数, 可 以 使 之 按 值 传 递, 此 关 键 字 是 ( ) A) ByVal B) ByRef C) Value D) Reference 7. 在 语 句 Public Sub Sort(i As Integer) 中 的 i 是 一 个 按 ( ) 传 递 的 参 数 A) 地 址 B) 值 C) 变 量 D) 常 量 8. 在 窗 体 上 画 一 个 名 称 为 Text1 的 文 本 框 如 一 个 名 称 为 Command1 的 命 令 按 钮, 然 后 编 写 如 下 事 件 过 程 和 通 用 过 程 : Private Sub Command1_Click() n = Val(Text1.Text) If n\2 = n/2 Then f = f1(n) Else f = f2(n) End If Print f; n Public Function f1(byref x) x=x*x f1=x+x End Function Public Function f2(byval x) x=x*x f2=x+x+x End Function 程 序 运 行 后, 在 文 本 框 中 输 入 6, 然 后 单 击 命 令 按 钮, 窗 体 上 显 示 的 是 ( ) A) 72 36 B) 108 36 C) 72 6 D) 108 6 二 填 空 题 1. 在 窗 体 上 画 一 个 名 称 为 Command1 的 命 令 按 钮, 然 后 编 写 如 下 通 用 过 程 和 命 令 按 钮 的 事 件 过 程 : Private Function f(m As Integer) If m Mod 2 = 0 Then f = m Else f = 1 End If End Function Private Sub Command1_Click() Dim i As Integer s = 0 For i = 1 To 5 123

124 Visual Basic 程 序 设 计 s = s + f(i) Next Print s 程 序 运 行 后, 单 击 命 令 按 钮, 在 窗 体 上 显 示 的 是 2. 在 窗 体 上 画 一 个 名 称 为 Command1 的 命 令 按 钮 和 3 个 名 称 分 别 为 Label1 Label2 Label3 的 标 签, 然 后 编 写 如 下 代 码 : Private x As Integer Private Sub Command1_Click() Static y As Integer Dim z As Integer n = 10 z = n + z y = y + z x = x + z Label1.Caption = x Label2.Caption = y Label3.Caption = z 运 行 程 序, 连 续 3 次 单 击 命 令 按 钮 后, 则 3 个 标 签 中 显 示 的 内 容 分 别 是 3. 设 有 如 下 程 序 : Private Sub Form_Click() Dim a As Integer, b As Integer a = 20: b = 50 p1 a, b p2 a, b p3 a, b Print "a="; a, "b="; b Sub p1(x As Integer, ByVal y As Integer) x = x + 10 y = y + 20 Sub p2(byval x As Integer, y As Integer) x = x + 10 y = y + 20 Sub p3(byval x As Integer, ByVal y As Integer) x = x + 10 y = y + 20 该 程 序 运 行 后, 单 击 窗 体, 则 在 窗 体 上 显 示 的 内 容 是 :a = 和 b = 4. 运 行 下 面 的 程 序, 当 单 击 窗 体 时, 在 窗 体 上 显 示 的 内 容 是 Private Sub Test(x As Integer) 124

第 6 章 过 程 125 x=x*2+1 If x<6 Then Call Test(x) End If x=2*x-1 Form1.Print x Private Sub Form_Click() Test 2 三 编 程 题 1. 给 定 两 组 已 按 升 序 排 列 的 整 型 数 据, 使 用 过 程 编 写 程 序 把 它 们 合 并 为 一 组 仍 能 按 升 序 排 列 的 数 据 2. 编 写 一 个 函 数 reversedigit(byval num as Integer) 该 函 数 将 整 数 num 的 每 个 位 上 的 数 字 逆 序 排 列 后 返 回 3. 编 写 一 个 递 归 程 序, 求 a 和 b 的 最 大 公 约 数 递 归 公 式 为 : 当 b=0 时,a 与 b 的 最 大 公 约 数 为 a; 当 b>0 时,a 与 b 的 最 大 公 约 数 为 b(a Mod b) 的 最 大 公 约 数 125

第 7 章 鼠 标 和 键 盘 事 件 过 程 教 学 提 示 : 鼠 标 和 键 盘 是 用 户 与 计 算 机 交 流 的 重 要 工 具 Visual Basic 应 用 程 序 可 以 响 应 多 种 鼠 标 事 件 和 键 盘 事 件 例 如, 单 击 Click 双 击 DblClick 事 件 是 最 基 本 的 鼠 标 事 件 许 多 控 件, 如 窗 体 图 像 控 件 等 都 可 以 检 测 鼠 标 指 针 的 位 置, 并 响 应 相 应 的 单 击 双 击 左 ( 右 ) 键 按 下 等 事 件 利 用 键 盘 事 件 可 以 响 应 各 种 键 盘 操 作, 还 能 解 释 和 处 理 ASCII 字 符 教 学 目 标 : 了 解 常 用 的 鼠 标 事 件, 能 够 设 置 鼠 标 光 标, 掌 握 KeyPress 事 件 KeyDown 事 件 和 KeyUp 事 件 的 正 确 用 法, 理 解 拖 放 的 概 念 7.1 鼠 标 7.1.1 鼠 标 事 件 由 用 户 操 作 鼠 标 所 引 起 的 能 够 被 Visual Basic 各 种 对 象 识 别 的 事 件 即 为 鼠 标 事 件 当 按 下 鼠 标 的 按 键 时, 发 生 MouseDown 事 件 ; 松 开 鼠 标 按 键 时, 发 生 MouseUp 事 件 ; 移 动 鼠 标 时, 发 生 MouseMove 事 件 工 具 箱 中 的 大 多 数 控 件 都 能 响 应 这 3 个 事 件, 当 鼠 标 位 于 某 个 控 件 或 窗 体 上, 则 该 控 件 或 窗 体 将 识 别 鼠 标 事 件 鼠 标 事 件 的 语 法 结 构 基 本 相 同, 下 面 以 窗 体 上 发 生 的 MouseMove 为 例 进 行 说 明 Private Sub < 对 象 名 >_MouseMove([index As Integer,] button As Integer,shift As Integer,x As Single,y As Single) 其 中 : 对 象 名 是 可 以 响 应 鼠 标 事 件 的 对 象 名 称 Index 参 数 值 是 一 个 整 型 数, 用 来 唯 标 识 一 个 在 控 件 数 组 中 的 控 件 如 果 不 是 控 件 数 组, 此 项 省 略 Button 参 数 值 是 一 个 整 型 数, 参 数 的 值 反 映 事 件 发 生 时 按 下 的 是 哪 个 鼠 标 键 1( 常 数 vbleftbutton) 表 示 左 键 ;2( 常 数 vbrightbutton) 表 示 右 键 ;4( 常 数 vbmiddlebutton) 表 示 中 键 对 于 MouseMove 事 件, 事 件 发 生 时, 可 能 同 时 有 两 个 或 3 个 鼠 标 键 被 按 下, 这 时 button 参 数 是 相 应 的 两 个 或 3 个 值 的 和 例 如, 如 果 MouseMove 事 件 发 生 时, 左 键 和 右 键 都 被 按 下, 则 参 数 button 的 值 是 3(=1+2) 因 为 移 动 鼠 标 时, 可 以 不 按 下 任 何 一 个 鼠 标 键, 所 以 对 于 MouseMove 事 件, 这 个 参 数 可 以 为 0 Shift 参 数 也 是 一 个 整 数, 它 表 明 在 这 3 个 鼠 标 事 件 发 生 时, 键 盘 上 的 哪 一 个 控 制 键 (Shift Ctrl 和 Alt 键 ) 被 按 下 1( 常 数 vbshiftmask) 表 示 Shift 键 ;2( 常 数 vbctrlmask)

第 7 章 鼠 标 和 键 盘 事 件 过 程 127 表 示 Ctrl 键 ;4( 常 数 vbaltmask) 表 示 A1t 键 如 果 同 时 有 两 个 或 3 个 控 制 键 被 按 下, 则 shift 参 数 值 是 相 应 键 的 数 值 之 和 例 如, 当 事 件 发 生 时,Ctrl 键 被 按 下, 则 Shift 参 数 传 递 的 值 为 2; 如 果 Shift 键 和 A1t 键 同 时 处 于 按 下 状 态, 则 shift 参 数 值 为 5 如 果 事 件 发 生 时, 没 有 键 盘 控 制 键 被 按 下, 则 这 个 参 数 的 值 为 0 参 数 x y 用 于 指 定 鼠 标 指 针 当 前 的 位 置 采 用 ScaleMode 属 性 指 定 的 坐 标 系 应 该 注 意 的 是, 当 移 动 鼠 标 时, 会 不 断 地 发 生 MouseMove 事 件 但 是, 并 不 是 每 经 过 一 点 都 会 发 生 MouseMove 事 件, 而 是 在 移 动 过 程 中 每 间 隔 很 短 的 一 段 时 间 发 生 一 个 此 事 件, 所 以, 在 相 同 的 距 离 上, 鼠 标 移 动 的 速 度 越 快, 产 生 的 MouseMove 事 件 就 越 少 由 于 应 用 程 序 能 接 二 连 三 迅 速 识 别 大 量 MouseMove 事 件, 因 此, 一 个 MouseMove 事 件 过 程 不 适 合 去 做 那 些 需 要 大 量 计 算 时 间 的 工 作 另 外, 在 对 象 上 操 作 一 次 鼠 标, 会 产 生 多 个 与 鼠 标 有 关 的 事 件, 如 Click 事 件 DblClick 事 件 MouseDown 事 件 MouseUp 事 件 或 MouseMove 事 件 对 于 不 同 类 型 的 对 象, 这 些 事 件 的 产 生 顺 序 可 能 不 同, 还 有 些 对 象 不 支 持 其 中 的 某 个 事 件 所 以, 在 使 用 前 一 定 要 仔 细 测 试 比 如, 在 窗 体 上 单 击, 会 依 次 引 发 MouseDown MouseUp Click 这 3 个 事 件, 在 窗 体 上 双 击, 会 依 次 引 发 MouseDown MouseUp C1ick Dbclick MouseUp 等 事 件, 在 命 令 按 钮 上 单 击, 会 依 次 引 发 MouseDown Click MouseUp 事 件 例 7.1 设 计 一 个 涂 鸦 程 序 当 在 窗 体 上 按 下 鼠 标 左 键 并 移 动 时, 在 窗 体 上 画 出 线 条, 释 放 鼠 标 左 键 时 停 止 画 线 按 住 Shift 键, 画 出 的 线 条 为 红 色 ; 按 住 Ctrl 键, 画 出 的 线 条 为 绿 色 ; 按 住 A1t 键, 画 出 的 线 条 为 蓝 色 ;3 个 键 都 不 按 时, 画 出 的 线 条 为 黑 色 程 序 代 码 如 下 : Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then CurrentX = X ' 设 置 画 线 的 起 点 CurrentY = Y End If Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim DrawColor As Long If Button = 1 Then If Shift = 1 Then DrawColor = vbred ElseIf Shift = 2 Then DrawColor = vbgreen ElseIf Shift = 4 Then DrawColor = vbblue Else DrawColor = vbblack End If Line -(X, Y), DrawColor End If 127

128 Visual Basic 程 序 设 计 程 序 运 行 情 况 如 图 7.1 所 示 图 7.1 例 7.1 的 运 行 情 况 7.1.2 鼠 标 光 标 形 状 在 应 用 程 序 中, 经 常 要 根 据 鼠 标 光 标 所 处 位 置 或 应 用 程 序 的 状 况 来 决 定 鼠 标 光 标 的 形 状, 如 鼠 标 光 标 形 状 为 I 字 形 表 示 插 入 文 本, 鼠 标 光 标 为 + 字 形 状 表 示 画 线 或 画 圆 等 鼠 标 光 标 的 形 状 由 对 象 的 MousePointer 属 性 设 置, 属 性 值 与 形 状 如 表 7-1 所 示 表 7-1 MousePointer 属 性 值 值 常 数 形 状 0 vbdefault 形 状 由 操 作 系 统 决 定 ( 默 认 值 ) 1 vbarrow 箭 头 2 vbcrosshair + 字 型 3 vbibeam I 型 4 vbiconpointer 箭 头 图 标 5 vbsizepointer 4 个 方 向 的 箭 头 6 vbsizenesw 指 向 右 上 和 左 下 方 向 的 双 向 箭 头 7 vbsizens 指 向 上 下 的 双 向 箭 头 8 vbsizenwse 指 向 左 上 右 下 方 向 的 双 向 箭 头 9 vbsizewe 左 右 方 向 的 双 向 箭 头 10 vbuparrow 向 上 的 箭 头 11 vbhourglass 沙 漏 ( 表 示 等 待 状 态 ) 12 vbnodrop 不 能 停 止 图 标 13 vbarrowhourglass 箭 头 和 沙 漏 14 vbarrowquestion 箭 头 和 问 号 15 vbsizeall 四 向 箭 头 ( 表 示 改 变 大 小 ) 99 vbcustom 通 过 MouseIcon 属 性 指 定 的 自 定 义 图 标 128

第 7 章 鼠 标 和 键 盘 事 件 过 程 129 MouseIcon 属 性 使 用 一 个 图 标 文 件 来 自 定 义 鼠 标 指 针 形 状 只 有 当 MousePointer 属 性 的 值 为 99 时, 此 属 性 才 有 效 在 程 序 中 应 该 使 用 LoadPicture 函 数 装 入 磁 盘 文 件 ( 以.ico 和.cur 为 扩 展 名 的 图 标 文 件 ) 来 设 置 此 属 性 例 如 : Forml.MousePointer = 99 Form1.MouseIcon = LoadPicture("abc.ico") 一 般 来 说, 改 变 鼠 标 指 针 的 形 状 不 是 为 了 美 观, 而 是 向 用 户 显 示 当 前 的 工 作 状 态 不 同 的 状 态 下 具 有 描 述 性 的 鼠 标 指 针 形 状 是 良 好 用 户 界 面 的 重 要 部 分 7.2 键 盘 在 需 要 处 理 文 本 的 地 方, 经 常 会 用 到 键 盘, 因 而 有 必 要 对 键 盘 事 件 进 行 编 程 Visual Basic 中, 常 用 的 键 盘 事 件 有 KeyUp KeyDown KeyPress 等 事 件 7.2.1 KeyDown 和 KeyUP 事 件 当 一 个 对 象 拥 有 焦 点 时 按 下 或 松 开 一 个 键 时 发 生 KeyDown 和 KeyUp 事 件 其 语 法 为 : Private Sub Form_KeyDown(keycode As Integer,shift As Integer) Private Sub < 控 件 名 >_KeyDown([index As Integer,]keycode As Integer,shift As Integer) Private Sub Form_KeyUp(keycode As Integer,shift As Integer) Private Sub < 控 件 名 >_KeyUp([index As Integer,]keycode As Integer,shift As Integer) 其 中 : keycode 是 一 个 整 型 参 数, 表 示 按 键 的 代 码 每 一 个 按 键 都 有 相 应 的 代 码 Visual Basic 还 为 每 个 按 键 的 代 码 声 明 了 一 个 内 部 常 量 例 如,Fl 键 的 代 码 为 112, 相 应 的 内 部 常 量 为 vbkeyf1;home 键 的 代 码 为 36, 内 部 常 量 为 vbkeyhome 键 盘 上 字 母 与 数 字 键 的 代 码 与 其 ASCII 码 是 相 同 的, 其 他 键 的 代 码 与 相 应 的 常 量 可 参 考 Visual Basic 的 帮 助 文 件 shift 也 是 一 个 整 型 参 数, 它 指 示 在 按 下 一 个 键 时, 是 否 同 时 按 下 了 Shift Ctrl 和 Alt 键 此 参 数 为 1 时, 表 示 按 下 了 Shift 键 ; 为 2 时, 表 示 按 下 了 Ctrl 键 ; 为 4 时, 表 示 按 下 了 Alt 键 当 这 3 个 键 中 有 不 只 一 个 键 被 按 下, 则 shift 参 数 是 被 按 下 键 相 应 数 值 之 和 例 如, 如 果 shift 参 数 值 为 5, 表 明 按 下 了 Shift 和 Alt 两 个 键 如 果 3 个 键 均 未 被 按 下, 该 参 数 值 为 0 对 于 KeyDown 和 KeyUp 事 件 来 说, 带 焦 点 的 对 象 都 可 以 接 收 所 有 用 户 击 键 一 个 窗 体 只 有 当 它 的 所 有 控 件 都 不 可 见 或 都 无 效 时 才 可 以 获 得 焦 点, 得 到 键 盘 事 件 虽 然 KeyDown 和 KeyUp 事 件 可 应 用 于 大 多 数 键, 但 它 们 最 常 用 于 扩 展 的 字 符 键 如 功 能 键 定 位 键 键 盘 修 饰 键 和 按 键 的 组 合, 区 别 数 字 小 键 盘 和 常 规 数 字 键 下 列 情 况 不 能 引 用 KeyDown 和 KeyUp 事 件 (1) 窗 体 上 有 一 个 命 令 按 钮 控 件, 并 且 其 Default 属 性 设 置 为 True 时 按 下 Enter 键 129

130 Visual Basic 程 序 设 计 因 为 此 时 Enter 键 将 触 发 该 命 令 按 钮 的 Click 事 件 而 不 是 KeyDown 和 KeyUp 事 件 (2) 窗 体 上 有 一 个 命 令 按 钮 控 件, 并 且 其 Cancel 属 性 设 置 为 True 时 按 下 Esc 键 因 为 此 时 Esc 键 将 触 发 该 命 令 按 钮 的 Click 事 件 而 不 是 KeyDown 和 KeyUp 事 件 (3) 窗 体 上 有 多 个 可 拥 有 焦 点 的 控 件 时, 按 下 Tab 键 对 于 字 母 键,keycode 参 数 返 回 的 总 是 大 写 形 式, 要 知 道 当 前 的 大 小 写 形 式, 应 该 检 测 shift 参 数 的 值 7.2.2 KeyPress 事 件 当 用 户 按 下 和 松 开 一 个 ANSI 键 时 发 生 KeyPress 事 件 ANSI 键 包 括 数 字 大 小 写 字 母 Enter BackSpace Esc Tab 等 键 方 向 键 不 会 产 生 KeyPress 事 件 KeyPress 事 件 过 程 的 语 法 为 : Private Sub Form_KeyPress(keyascii As Integer) Private Sub < 对 象 名 >_KeyPress([index As Integer,]keyascii As Integer) 其 中 : index 为 整 型 参 数, 它 用 来 唯 标 识 一 个 在 控 件 数 组 中 的 控 件 keyascii 参 数 返 回 一 个 标 准 数 字 ANSI 键 代 码 的 ASCII 值 keyascii 通 过 引 用 传 递, 对 它 进 行 改 变 可 给 对 象 发 送 一 个 不 同 的 字 符 将 keyascii 改 变 为 0 时 可 取 消 击 键, 此 时 对 象 接 收 不 到 字 符 需 要 特 别 注 意 的 是, 只 有 具 有 焦 点 的 对 象 才 能 接 收 KeyPress 事 件 一 个 窗 体 仅 在 它 没 有 可 视 和 有 效 的 控 件 或 KeyPreview 属 性 被 设 置 为 True 时 才 能 接 收 该 事 件 KeyPress 事 件 过 程 在 截 取 TextBox 或 ComboBox 控 件 所 输 入 的 击 键 时 是 非 常 有 用 的, 它 可 立 即 测 试 击 键 的 有 效 性 或 在 字 符 输 入 时 对 其 进 行 格 式 处 理 改 变 keyascii 参 数 的 值 会 改 变 所 显 示 的 字 符 将 keyascii 改 变 为 0 时 可 取 消 击 键, 这 样 对 象 便 接 收 不 到 字 符 了 KeyPreview 是 窗 体 的 一 个 属 性, 当 此 属 性 被 设 置 为 True 时, 窗 体 先 于 该 窗 体 上 的 控 件 接 收 到 键 盘 事 件 可 以 利 用 该 属 性, 编 制 窗 体 的 键 盘 处 理 程 序 例 如, 应 用 程 序 使 用 功 能 键 时, 只 需 要 在 窗 体 级 处 理 击 键, 而 不 应 为 每 个 可 以 接 收 击 键 事 件 的 控 件 编 写 程 序 当 窗 体 处 理 完 键 盘 事 件 之 后, 控 件 还 会 接 收 到 键 盘 事 件 如 果 只 在 窗 体 级 处 理 键 盘 事 件, 而 不 允 许 控 件 接 收 键 盘 事 件, 只 需 在 窗 体 的 KeyDown 事 件 过 程 中 设 置 KeyCode 为 0 即 可 一 些 控 件 能 够 拦 截 键 盘 事 件, 以 致 于 窗 体 不 能 接 收 它 们 例 如 按 钮 控 件 有 焦 点 时 按 Enter 键 以 及 焦 点 在 列 表 框 控 件 上 时 按 方 向 键 例 7.2 将 输 入 到 TextBox 控 件 的 文 本 转 换 为 大 写 形 式 Private Sub Text1_KeyPress (KeyAscii As Integer) Char = Chr(KeyAscii) KeyAscii = Asc(UCase(Char)) 执 行 本 代 码 时, 在 Text1 控 件 中 输 入 字 母, 则 可 将 其 转 化 为 大 写 形 式 例 7.3 编 写 一 个 简 易 的 指 法 练 习 程 序 要 求 最 大 时 限 为 1 分 钟 在 窗 体 上 添 加 3 个 标 签 框 Label1~label3, 用 来 动 态 显 示 英 文 字 母, 一 个 命 令 按 钮 130

第 7 章 鼠 标 和 键 盘 事 件 过 程 131 Command1 用 来 开 始 程 序, 计 时 器 Timer1 用 来 控 制 标 签 框 的 移 动, 另 一 个 计 时 器 Timer2 用 来 控 制 总 时 间 设 计 界 面 如 图 7.2 所 示 界 面 中 控 件 的 属 性 如 表 7-2 所 示 图 7.2 指 法 测 试 程 序 设 计 界 面 表 7-2 例 7.3 的 窗 体 中 控 件 属 性 表 对 象 对 象 名 属 性 名 属 性 值 Form Form1 Caption KeyPreview 指 法 练 习 True Timer Timer1 Interval 15 Timer2 Interval 60000 CommandButton Command1 Caption 开 始 Label1 Caption a Label Label2 Caption b 程 序 代 码 如 下 : Label3 Caption c 'n 存 放 正 确 的 击 键 数,m 存 放 总 击 键 数 Dim n As Integer, m As Integer Private Sub Command1_Click() Form1.Cls Timer1.Enabled = True Timer2.Enabled = True Command1.Enabled = False Private Sub Form_KeyPress(KeyAscii As Integer) m = m + 1 ' 总 击 键 数 加 1 ' 击 键 正 确, 正 确 击 键 数 加 1, 并 清 空 标 签 If Chr(KeyAscii) = Label1.Caption Then Label1.Caption = "": n = n + 1 If Chr(KeyAscii) = Label2.Caption Then Label2.Caption = "": n = n + 1 If Chr(KeyAscii) = Label3.Caption Then Label3.Caption = "": n = n + 1 Private Sub Timer1_Timer() Randomize ' 击 键 正 确 后 产 生 新 字 符 并 将 标 签 移 到 窗 体 底 部, 随 机 产 生 小 写 的 英 文 字 母 If Label1.Caption = "" Then Label1.Top = Form1.Height - Label1.Height Label1.Caption = Chr(CInt(Rnd * 26 + 97)) 131

132 Visual Basic 程 序 设 计 Else Label1.Top = Label1.Top - 10 End If If Label2.Caption = "" Then Label2.Top = Form1.Height - Label2.Height Label2.Caption = Chr(CInt(Rnd * 26 + 97)) Else Label2.Top = Label2.Top - 10 End If If Label3.Caption = "" Then Label3.Top = Form1.Height - Label3.Height Label3.Caption = Chr(CInt(Rnd * 26 + 97)) Else Label3.Top = Label3.Top - 10 End If ' 标 签 移 动 到 窗 体 顶 部 后, 重 新 回 到 底 部 If Label1.Top <= 0 Then Label1.Top = Form1.Height - Label1.Height If Label2.Top <= 0 Then Label2.Top = Form1.Height - Label2.Height If Label3.Top <= 0 Then Label3.Top = Form1.Height - Label3.Height Private Sub Timer2_Timer() Timer1.Enabled = False Timer2.Enabled = False Print " 击 键 次 数 :" & m & " 次 " Print " 正 确 次 数 :" & n & " 次 " If m > 0 Then Print " 正 确 率 为 :" & n / m * 100 & "%" n = 0 m = 0 Command1.Enabled = True 7.3 拖 放 拖 放 (Drag and Drop) 是 一 种 将 一 个 对 象 ( 称 为 源 对 象 ) 拖 到 另 一 个 对 象 ( 称 为 目 标 对 象 ) 上 执 行 某 种 操 作 的 功 能 要 拖 动 一 个 对 象, 可 单 击 该 对 象, 按 住 鼠 标 键, 然 后 移 到 指 定 的 新 位 置 释 放 鼠 标, 放 下 对 象 拖 放 是 Windows 操 作 系 统 用 户 界 面 的 一 个 独 到 之 处 在 Windows 桌 面 资 源 管 理 器 控 制 面 板 以 及 各 应 用 程 序 中, 随 处 都 可 以 使 用 拖 放 操 作 Visual Basic 支 持 控 件 拖 放 和 OLE 拖 放 两 种 拖 放 7.3.1 与 拖 放 有 关 的 属 性 事 件 和 方 法 1. DragMode 属 性 拖 放 的 形 式 有 两 种,DragMode 属 性 为 1 时 为 自 动 拖 放,DragMode 属 性 为 0 时 为 手 工 拖 放 启 动 自 动 拖 放 时, 用 户 在 源 对 象 上 按 下 并 拖 动 鼠 标, 则 源 对 象 随 着 鼠 标 一 起 移 动, 132

第 7 章 鼠 标 和 键 盘 事 件 过 程 133 移 动 到 某 个 目 标 对 象 上 时 将 产 生 DragOver 事 件, 释 放 鼠 标 时 将 产 生 DragDrop 事 件 拖 放 过 程 本 身 并 不 会 将 源 对 象 放 到 目 标 对 象 上 要 将 源 对 象 拖 放 到 某 处, 必 须 编 写 目 标 对 象 的 DragOver 事 件 过 程 或 DragDrop 事 件 过 程 采 用 手 动 拖 放 方 式 时, 必 须 在 MouseDown 事 件 过 程 中 使 用 Drag 方 法 启 动 拖 动 操 作, 之 后 的 操 作 同 自 动 拖 放 方 式 当 源 对 象 的 DragMode 属 性 为 1 时, 源 对 象 不 会 接 受 Click 事 件 和 MouseMove 事 件 而 源 对 象 DragMode 属 性 为 0 时, 源 对 象 可 以 接 受 Click 事 件 和 MouseDown 事 件 2. DragIcon 属 性 DragIcon 属 性 用 于 改 变 拖 动 图 标 拖 动 控 件 时,Visual Basic 将 控 件 的 灰 色 轮 廓 作 为 默 认 的 拖 动 图 标 对 DragIcon 属 性 进 行 设 置, 就 可 用 其 他 图 像 代 替 该 轮 廓 设 置 DragIcon 属 性 的 最 简 单 方 法 就 是 使 用 属 性 窗 口 选 定 DragIcon 属 性 后 单 击 属 性 按 钮, 在 打 开 的 加 载 图 标 对 话 框 中 选 择 图 标 文 件 (.ico,.cur) 可 将 Visual Basic 图 标 库 或 操 作 系 统 图 标 库 中 的 图 标 分 配 给 DragIcon 属 性 也 可 用 图 像 程 序 创 建 用 户 自 己 的 拖 动 图 标 另 外, 在 运 行 时 可 以 采 用 如 下 方 法 获 得 一 个 控 件 的 DragIcon 属 性 ' 将 Image2 控 件 的 DragIcon 属 性 赋 给 Image1 控 件 的 同 一 属 性 Set Image1.DragIcon = Image2.DragIcon ' 运 行 时 将 Image2 控 件 的 Picture 属 性 赋 给 Image1 控 件 的 同 一 属 性 Set Image1.DragIcon = Image2.Picture ' 装 入 图 标 文 件 Set Image1.DragIcon = LoadPicture("c:\WINNT\Cursors\3dsmove.ico") 3. Drag 方 法 采 用 手 动 拖 放 方 式 时, 必 须 使 用 Drag 方 法 来 启 动 拖 动 操 作 不 过, 在 自 动 拖 放 方 式 下, 也 可 以 使 用 Drag 方 法 Drag 方 法 的 语 法 为 : [ 对 象 名.]Drag [action] 其 中 : 参 数 action 为 可 选 项, 是 一 个 指 定 要 执 行 的 动 作 的 Visual Basic 常 数 或 数 值 action=1(vbbegindrag): 启 动 控 件 的 拖 动 action=2(vbenddrag): 结 束 拖 放 并 引 发 DragDrop 事 件 action=0(vbcancel): 取 消 拖 放 操 作, 不 引 发 DragDrop 事 件 例 7.4 将 图 片 框 控 件 拖 放 到 窗 体 中 准 确 的 位 置 在 窗 体 中 放 置 一 个 图 片 框 控 件 Picture1, 任 意 设 置 一 个 Picture 属 性 值 将 Picture1 的 DragMode 属 性 设 置 为 1 因 为 在 自 动 拖 放 方 式 下,MouseDown 事 件 无 效, 也 就 无 法 记 住 (X0, Y0) 采 用 Move 方 法 对 控 件 进 行 移 动 时, 总 是 将 控 件 的 左 上 角 移 动 到 Move 方 法 的 参 数 所 指 的 位 置 为 了 将 控 件 准 确 地 拖 到 鼠 标 所 指 位 置, 应 记 住 鼠 标 在 控 件 上 按 下 时 在 控 件 上 所 处 的 位 置 (X0,Y0) 如 果 不 记 住 (X0,Y0), 只 采 用 Move X,Y, 则 必 须 拖 动 控 件 的 左 上 角, 才 能 在 释 放 鼠 标 后 使 控 件 不 出 现 移 动 注 意 (X0,Y0) 是 相 对 于 控 件 左 上 角 的 位 置 133

134 Visual Basic 程 序 设 计 程 序 代 码 如 下 : Dim X0 As Single, Y0 As Single Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) Source.Move (X - X0), (Y - Y0) Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Picture1.Drag=1 ' 启 动 控 件 拖 放 X0 = X: Y0 = Y 4. DragDrop 事 件 和 DragOver 事 件 在 拖 动 对 象 经 过 某 个 对 象 时, 该 对 象 发 生 DragOver 事 件, 拖 动 对 象 并 在 某 个 对 象 上 释 放 鼠 标 按 钮 时, 该 对 象 发 生 DragDrop 事 件 可 用 多 种 方 法 响 应 DragDrop 事 件 和 DragOver 事 件 DragDrop 事 件 和 DragOver 事 件 的 语 法 为 : Private Sub < 对 象 名 >_DragDrop(Source As Control, X As Single, Y As Single) Private Sub < 对 象 名 >_DragOver(Source As Control, X As Single, Y As Single, State As Integer) 其 中 : Source 的 类 型 为 控 件, 对 应 于 正 在 被 拖 动 的 控 件, 因 而 可 以 像 使 用 控 件 一 样 使 用 它, 如 可 引 用 其 属 性 或 调 用 其 方 法 x 和 y 为 当 前 鼠 标 指 针 在 目 标 窗 体 或 控 件 中 水 平 (x) 和 垂 直 (y) 位 置 的 数 字 这 些 坐 标 值 通 常 用 目 标 坐 标 系 统 来 表 示 State 是 一 个 整 数, 它 相 应 于 一 个 控 件 的 转 变 状 态, 该 控 件 在 相 关 目 标 窗 体 或 控 件 中 正 在 被 拖 动,State 为 0 时 表 示 进 入 ( 源 控 件 正 被 向 一 个 目 标 范 围 内 拖 动 ), 为 1 时 表 示 离 去 ( 源 控 件 正 被 向 一 个 目 标 范 围 外 拖 动 ), 为 2 时 表 示 跨 越 ( 源 控 件 在 目 标 范 围 内 从 一 个 位 置 移 到 另 一 位 置 ) 下 面 的 过 程 在 拖 动 Picture1 控 件 经 过 Picture2 控 件 时, 将 Picture1 控 件 中 的 图 像 移 交 给 Picture2 控 件 注 意 在 设 计 时 将 Picture1.DragMode 设 置 为 1 Private Sub Picture2_DragDrop(Source As Control, X As Single, Y As Single) Picture2.Picture = Picture1.Picture : Picture1.Picture = LoadPicture() 对 源 参 数 的 使 用 应 特 别 小 心 因 为 源 参 数 引 用 的 是 控 件, 但 不 一 定 清 楚 引 用 哪 种 控 件 例 如, 如 果 控 件 是 文 本 框, 并 试 图 引 用 Source.Value, 则 由 于 文 本 框 没 有 Value 属 性 而 导 致 运 行 时 错 误 可 以 使 用 TypeOf 函 数 判 断 源 对 象 的 控 件 类 型, 根 据 源 对 象 的 控 件 类 型 决 定 采 取 的 操 作 方 式, 其 形 式 为 : If TypeOf < 对 象 变 量 > Is < 控 件 类 型 > Then 也 可 使 用 TypeName 函 数, 该 函 数 返 回 一 个 类 型 字 符 串 例 7.5 将 控 件 拖 动 到 Picture2 图 片 框 控 件 上 时, 判 断 拖 动 的 控 件 类 型, 如 果 是 图 片 框, 则 将 其 图 片 在 Picture2 上 显 示, 并 在 窗 体 的 标 题 内 显 示 拖 动 控 件 的 类 型 当 拖 离 Picture2 时, 清 除 Picture2 中 的 图 片, 恢 复 窗 体 标 题 栏 的 名 称 ( 设 计 时 窗 体 标 题 为 拖 放 ) 134

第 7 章 鼠 标 和 键 盘 事 件 过 程 135 Private Sub Picture2_DragOver(Source As Control, X As Single, Y As Single, State As Integer) If TypeOf Source Is Picture Then Picture2.Picture = Source.Picture If State = 1 Then Form1.Caption = " 拖 放 " : Picture2.Picture = LoadPicture() Else Form1.Caption = " 这 是 " & TypeName(Source) & " 控 件 " End If 5. Parent 属 性 控 件 作 为 参 数 Source 传 递 给 过 程 后,Source 就 继 承 了 控 件 的 属 性 和 方 法, 包 括 控 件 的 Parent 属 性, 即 控 件 所 在 窗 体, 因 而 可 以 对 控 件 所 在 窗 体 进 行 各 种 操 作 如 上 面 的 程 序 中 的 语 句 : 可 以 改 为 : Form1.Caption = " 拖 放 " Form1.Caption = " 这 是 " & TypeName(Source) & " 控 件 " Source.Parent.Caption = " 拖 放 " Source.Parent.Caption = " 这 是 " & TypeName(Source) & " 控 件 " 7.3.2 OLE 拖 放 使 用 控 件 拖 放 可 以 将 控 件 移 动 到 其 他 地 方 而 采 用 OLE 拖 放, 则 可 以 将 数 据 从 一 个 控 件 或 应 用 程 序 移 动 到 另 外 的 控 件 或 应 用 程 序 中, 如 将 写 字 板 中 的 文 本 拖 动 到 文 本 框 中 拖 数 据 由 OLEDragMode 属 性 控 制, 放 数 据 由 OLEDropMode 属 性 控 制 OLEDragMode=0(Mannual), 为 默 认 的 OLE 拖 动 方 式, 即 手 工 拖 动 OLEDragMode=1(Automatic), 自 动 实 现 拖 操 作 OLEDropMode=0(None), 默 认 方 式, 不 接 受 OLE 放 操 作 OLEDropMode=1(Mannual), 手 工 实 现 放 操 作 OLEDropMode=2(Automatic), 自 动 实 现 放 操 作 说 明 : (1) 在 Visual Basic 中, 文 本 框 图 片 框 等 控 件 完 全 支 持 自 动 OLE 拖 放, 即 不 需 要 额 外 的 编 程 组 合 框 列 表 框 等 控 件 支 持 自 动 拖 操 作, 而 不 支 持 自 动 放 操 作, 它 们 的 OLEDrop Mode 属 性 不 能 设 置 为 2(Automatic), 需 要 额 外 的 编 程 才 能 实 现 放 操 作 (2) 除 非 在 拖 动 的 同 时 按 下 Ctrl 键 或 通 过 代 码 修 改 控 件 的 默 认 性 能, 将 数 据 拖 动 到 文 本 框 控 件 中 时, 进 行 的 是 移 动 而 不 是 复 制 操 作 (3) 自 动 支 持 拖 放 操 作 有 其 局 限 性, 例 如, 如 果 将 Word 文 档 中 的 文 本 拖 动 到 文 本 框 控 件 中, 则 Word 文 档 中 的 所 有 丰 富 文 本 格 式 将 消 失, 因 为 文 本 框 控 件 不 支 持 这 种 格 式 如 果 想 要 确 定 对 象 所 支 持 的 是 哪 种 数 据 格 式 或 拖 放 效 果 ( 复 制 移 动 或 不 放 ), 或 者, 如 果 想 使 从 中 拖 出 数 据 来 的 控 件 不 支 持 自 动 拖 动, 可 使 用 手 工 的 OLE 拖 动 操 作 (4) 为 了 将 Data Object 对 象 中 的 数 据 放 到 目 标 部 件 中, 应 在 目 标 部 件 的 OLEDrag Drop 事 件 过 程 中 使 用 Get Data 方 法, 其 语 法 格 式 为 : 135

136 Visual Basic 程 序 设 计 <Data Object 对 象 名 >.Get Data (Format) 其 中 Format 用 于 确 定 Data Object 对 象 数 据 格 式 的 Visual Basic 常 数 或 值 如 vbcftext 表 示 文 本 文 件,vbCFBitmap 表 示.bmp 文 件 例 7.6 在 Form1 窗 体 中 放 置 两 个 列 表 框 控 件 一 个 文 本 框 控 件 和 一 个 标 签 控 件 将 两 个 列 表 框 控 件 的 OLEDragMode 属 性 设 置 为 1-Automatic,OLEDropMode 属 性 设 置 为 1-Manual,MultiSelect 属 性 设 置 为 2-Extended 以 便 一 次 选 择 多 行 将 文 本 框 的 MultiLine 属 性 设 置 为 True, 将 OLEDragMode 属 性 和 OLEDropMode 属 性 都 设 置 为 Automatic 将 标 签 控 件 的 OLEDropMode 属 性 设 置 为 1-Manual 编 写 程 序 实 现 如 下 功 能 (1) 将 Word 中 的 文 本 采 用 拖 动 的 方 法 复 制 到 中 间 的 文 本 框 中 ; (2) 将 文 本 框 的 内 容 逐 行 拖 放 到 左 边 的 List1 列 表 框 中 ; (3) 将 文 本 框 的 内 容 一 次 拖 放 到 下 边 的 List2 列 表 框 中 ; (4) 将 下 边 List2 列 表 框 的 内 容 拖 放 到 右 边 的 Label1 标 签 上 程 序 代 码 如 下 : Private Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) ' 系 统 将 拖 出 的 数 据 放 在 Data 对 象 中, 利 用 Data 对 象 的 GetData 方 法 获 取 其 中 的 文 本 数 据, ' 利 用 List1 控 件 的 AddItem 方 法 将 数 据 添 加 到 其 List 属 性 中 List1.AddItem Data.GetData(vbCFText) Private Sub List2_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) List2.AddItem Data.GetData(vbCFText) Private Sub Label1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Label1.Caption = Data.GetData(vbCFText) 程 序 运 行 时, 打 开 一 个 Word 文 档, 选 定 全 部 文 本, 按 住 Ctrl 键, 拖 动 到 Text1 文 本 框 中, 然 后 将 Text1 文 本 框 中 的 内 容 逐 行 拖 放 到 左 边 的 List1 列 表 框 中 再 将 Text1 文 本 框 中 的 文 本 一 次 性 拖 动 到 List2 列 表 框 中, 此 时 List2 列 表 框 中 整 个 文 本 将 在 一 行 显 示 ; 将 此 行 文 本 拖 动 到 标 签 控 件 时, 会 在 Label1 中 多 行 显 示 运 行 结 果 如 图 7.3 所 示 图 7.3 OLE 拖 放 实 例 136

第 7 章 鼠 标 和 键 盘 事 件 过 程 137 7.4 小 结 由 用 户 操 作 鼠 标 所 引 起 的 能 够 被 Visual Basic 各 种 对 象 识 别 的 事 件 即 为 鼠 标 事 件 当 按 下 鼠 标 按 键 时, 发 生 MouseDown 事 件 ; 松 开 鼠 标 按 键 时, 发 生 MouseUp 事 件 ; 移 动 鼠 标 时, 发 生 MouseMove 事 件 用 鼠 标 拖 放 对 象 时, 发 生 DragDown 事 件 和 DragOver 事 件 MouseDown MouseUp MouseMove 这 3 个 鼠 标 事 件 过 程 的 格 式 如 下 : Private Sub < 对 象 名 >_ MouseDown ([index As Integer,] button As Integer,shift As Integer,x As Single,y As Single) Private Sub < 对 象 名 >_ MouseUp ([index As Integer,] button As Integer,shift As Integer,x As Single,y As Single) Private Sub < 对 象 名 >_MouseMove([index As Integer,] button As Integer,shift As Integer,x As Single,y As Single) Visual Basic 中 定 义 了 KeyPress KeyUp 和 KeyDown 这 3 个 键 盘 事 件 过 程 当 用 户 在 键 盘 上 按 下 一 个 ANSI 键 时, 就 发 生 KeyPress 事 件 ; 当 控 制 焦 点 位 于 某 对 象 上 时, 在 键 盘 上 按 下 任 一 键 就 触 发 该 对 象 的 KeyDown 事 件, 放 开 该 键 时, 发 生 KeyUp 事 件 KeyPress KeyUp KeyDown 这 3 个 键 盘 事 件 过 程 的 格 式 如 下 : Private Sub < 对 象 名 >_KeyPress([index As Integer,]keyascii As Integer) Private Sub < 对 象 名 >_KeyDown([index As Integer,]keycode As Integer,shift As Integer) Private Sub < 对 象 名 >_KeyUp([index As Integer,]keycode As Integer,shift As Integer) 拖 放 是 一 种 将 一 个 对 象 ( 称 为 源 对 象 ) 拖 到 另 一 个 对 象 ( 称 为 目 标 对 象 ) 上 执 行 某 种 操 作 的 功 能 要 拖 动 一 个 对 象, 可 单 击 该 对 象, 按 住 鼠 标 键, 然 后 移 到 指 定 的 新 位 置 并 释 放 鼠 标 可 释 放 对 象 Visual Basic 支 持 控 件 拖 放 和 OLE 拖 放 两 种 拖 放 7.5 习 题 一 选 择 题 1. 窗 体 的 MouseDown 事 件 过 程 Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) 有 4 个 参 数, 关 于 这 些 参 数, 正 确 的 描 述 是 ( ) A) 通 过 Button 参 数 可 判 定 当 前 按 下 的 是 哪 一 个 鼠 标 键 B) Shift 参 数 只 能 用 来 确 定 是 否 按 下 Shift 键 137

138 Visual Basic 程 序 设 计 C) Shift 参 数 只 能 用 来 确 定 是 否 按 下 Alt 和 Ctrl 键 D) 参 数 X Y 用 来 设 置 鼠 标 当 前 位 置 的 坐 标 2. 程 序 运 行 后, 在 窗 体 上 单 击 鼠 标, 此 时 窗 体 不 会 接 收 到 的 事 件 是 ( ) A) MouseDown B) MouseUp C) Load D) Click 3. 下 面 的 程 序 运 行 时, 为 了 在 窗 体 上 输 出 Visual Basic 6.0, 应 在 窗 体 上 执 行 的 操 作 是 ( ) Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button And 3 = 3 Then Print "Visual Basic 6.0" End If A) 只 能 按 下 鼠 标 右 键 B) 只 能 按 下 鼠 标 左 键 C) 应 同 时 按 下 鼠 标 左 右 键 D) 按 下 鼠 标 左 右 键 之 一 4. 如 果 将 上 述 事 件 改 为 Form_Move 事 件, 为 实 现 同 样 的 输 出, 则 执 行 的 操 作 为 ( ) A) 只 能 按 下 鼠 标 右 键 并 拖 动 B) 只 能 按 下 鼠 标 左 键 并 拖 动 C) 应 同 时 按 下 鼠 标 左 右 键 并 拖 动 D) 按 下 鼠 标 左 右 键 之 一 并 拖 动 5. 在 窗 体 上 画 一 个 名 称 为 TxtA 的 文 本 框, 然 后 编 写 如 下 事 件 过 程 : Private Sub TxtA_KeyPress(keyascii as integer) 若 焦 点 位 于 文 本 框 中, 则 能 够 触 发 KeyPress 事 件 的 操 作 是 ( ) A) 单 击 鼠 标 B) 双 击 文 本 框 C) 让 鼠 标 滑 过 文 本 框 D) 按 下 键 盘 上 的 某 个 键 6. 在 窗 体 上 画 一 个 名 称 为 Text1 的 文 本 框, 要 求 文 本 框 只 能 接 收 大 写 字 母 的 输 入 以 下 能 实 现 该 操 作 的 事 件 过 程 是 ( ) A) Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii < 65 Or KeyAscii > 90 Then MsgBox " 请 输 入 大 写 字 母 " KeyAscii = 0 End If B) Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode < 65 Or KeyCode > 90 Then MsgBox " 请 输 入 大 写 字 母 " KeyCode = 0 End If C) Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Asc(Text1.Text) < 65 Or Asc(Text1.Text) > 90 Then MsgBox " 请 输 入 大 写 字 母 " 138

第 7 章 鼠 标 和 键 盘 事 件 过 程 139 End If D) Private Sub Text1_Change() If Asc(Text1.Text) > 64 And Asc(Text1.Text) < 91 Then MsgBox " 请 输 入 大 写 字 母 " End If 7. 在 窗 体 上 画 一 个 名 称 为 Text1 的 文 本 框, 并 编 写 如 下 程 序 : Private Sub Form_Load() Show Text1.Text = "" Text1.SetFocus Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Print " 程 序 设 计 " Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Print "Visual Basic"; 程 序 运 行 后, 如 果 按 A 键, 然 后 单 击 窗 体, 则 在 窗 体 上 显 示 的 内 容 是 ( ) A) Visual Basic B) 程 序 设 计 C) A 程 序 设 计 D) Visual Basic 程 序 设 计 8. 以 下 叙 述 中 错 误 的 是 ( ) A) 在 KeyPress 事 件 过 程 中 不 能 识 别 键 盘 的 按 下 与 释 放 B) 在 KeyPress 事 件 过 程 中 不 能 识 别 回 车 键 C) 在 KeyDown 和 KeyUp 事 件 过 程 中, 将 从 键 盘 输 入 的 A 和 a 视 作 相 同 的 字 母 D) 在 KeyDown 和 KeyUp 事 件 过 程 中, 从 大 键 盘 上 输 入 的 1 和 从 右 侧 小 键 盘 上 输 入 的 1 被 视 作 不 同 的 字 符 9. 在 文 本 框 中, 当 用 户 输 入 一 个 字 符 时, 能 同 时 引 发 的 事 件 是 ( ) A) KeyPress 和 Click B) KeyPress 和 LostFocus C) KeyPress 和 Change D) Change 和 LostFocus 10. 新 建 工 程 的 窗 体 上 包 括 两 个 文 本 框 Text1 Text2 和 一 个 命 令 按 钮 Command1, 编 写 如 下 事 件 过 程 : Dim str1 As String, str2 As String Private Sub Command1_Click() Text1.Text = str1 Text2.Text = str2 str1 = "" str2 = "" Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 139

140 Visual Basic 程 序 设 计 str2 = str2 & Chr(KeyCode) Private Sub Form_KeyPress(KeyAscii As Integer) str1 = str1 & Chr(KeyAscii) Private Sub Form_Load() Text1.Text = "" Text2.Text = "" Text1.Enabled = False Text2.Enabled = False (1) 在 设 计 时 设 置 KeyPreview 属 性 值 为 False, 程 序 运 行 时, 在 键 盘 上 输 入 abc, 则 Text1 和 Text2 中 显 示 的 内 容 分 别 是 ( ) A) abc 和 ABC B) abc 和 656667 C) 不 显 示 任 何 信 息 D) 出 错 (2) 在 设 计 时 设 置 KeyPreview 属 性 值 为 True, 程 序 运 行 时, 在 键 盘 上 输 入 abc, 则 Text1 和 Text2 中 显 示 的 内 容 分 别 是 ( ) A) abc 和 ABC B) abc 和 656667 C) 不 显 示 任 何 信 息 D) 出 错 二 填 空 题 1. 在 执 行 KeyPress 事 件 过 程 时,KeyAscii 表 示 所 按 键 的 值, 而 KeyCode 表 示 2. 编 写 如 下 代 码, 在 程 序 运 行 时, 如 果 想 在 窗 体 上 输 出 ABCD, 则 应 执 行 的 操 作 是 Dim flag As Boolean Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) flag = True Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) flag = False Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If flag = False Then Print "ABCD" End If 3. 为 自 定 义 鼠 标 光 标, 需 要 将 属 性 设 置 为, 然 后 将 属 性 设 置 为 图 标 文 件 4. 为 了 执 行 自 动 拖 放, 必 须 将 属 性 设 置 为 ; 为 了 执 行 手 动 拖 放, 140

第 7 章 鼠 标 和 键 盘 事 件 过 程 141 应 将 该 属 性 设 置 为 5. 在 对 象 的 MouseDown 和 MouseUp 事 件 过 程 中, 当 参 数 Button 的 值 为 1 2 4 时, 分 别 代 表 按 下 鼠 标 的 和 6. 在 窗 体 上 添 加 一 个 文 本 框 Text1, 编 写 如 下 代 码 : Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Print Chr(KeyCode + 5) & KeyCode 程 序 运 行 时, 在 文 本 框 中 输 入 abc, 则 在 窗 体 上 输 出 为 7. 当 源 对 象 被 拖 动 到 目 标 对 象 上 方 时, 在 目 标 对 象 上 将 引 发 事 件, 释 放 时 又 会 引 发 事 件 8. 控 件 被 拖 动 时 显 示 的 图 标 是 由 控 件 的 属 性 决 定 的 9. 把 窗 体 的 KeyPreview 属 性 设 置 为 True, 然 后 编 写 如 下 两 个 事 件 过 程 : Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Print Chr(KeyCode) Private Sub Form_KeyPress(KeyAscii As Integer) Print Chr(KeyAscii) 程 序 运 行 后, 如 果 直 接 按 键 盘 上 的 A 键 ( 即 不 按 住 Shift 键 ), 则 在 窗 体 上 输 出 的 字 符 分 别 是 和 三 编 程 题 1. 编 写 一 个 程 序, 只 能 向 窗 体 中 的 文 本 框 输 入 字 母 和 数 字 字 符, 并 且 从 键 盘 上 键 入 的 字 母 如 果 是 小 写 的, 则 需 要 转 换 为 大 写 字 母 在 文 本 框 中 显 示 2. 编 写 一 个 程 序, 当 鼠 标 在 窗 体 上 移 动 时, 能 够 绘 出 与 光 标 移 动 轨 迹 相 接 近 的 图 形 3. 编 写 类 似 回 收 站 的 程 序, 当 将 窗 体 上 的 控 件 对 象 拖 到 回 收 站 上 并 释 放 鼠 标 时, 在 打 开 的 消 息 框 中 提 示 是 否 删 除 该 控 件, 单 击 消 息 框 中 的 是 按 钮, 删 除 该 控 件, 否 则 控 件 复 原 拖 动 控 件 时, 鼠 标 的 图 标 为 该 控 件 中 的 图 标 141

第 8 章 界 面 设 计 教 学 提 示 : 用 户 界 面 是 应 用 程 序 的 一 个 重 要 组 成 部 分, 对 用 户 而 言, 界 面 就 是 应 用 程 序, 它 使 得 用 户 感 觉 不 到 在 后 台 运 行 的 代 码 不 论 花 费 多 少 时 间 来 优 化 代 码, 应 用 程 序 的 可 用 性 主 要 取 决 于 界 面 的 设 计 本 章 主 要 介 绍 如 何 使 用 Visual Basic 提 供 的 菜 单 技 术 多 重 窗 体 和 多 重 文 档 技 术 设 计 应 用 程 序 界 面 教 学 要 求 : 掌 握 Visual Basic 中 菜 单 对 话 框 工 具 栏 多 重 窗 体 和 多 重 文 档 的 设 计 方 法, 能 够 熟 练 地 使 用 它 们 设 计 应 用 程 序 界 面 8.1 菜 单 的 设 计 要 执 行 新 建 文 件 打 开 文 件 等 操 作 都 离 不 开 菜 单, 菜 单 已 经 成 为 窗 口 界 面 不 可 或 缺 的 一 部 分 菜 单 代 表 的 是 程 序 的 各 项 命 令, 在 进 行 界 面 设 计 时, 一 般 要 将 功 能 类 型 一 致 的 命 令 放 在 同 一 个 子 菜 单 中, 功 能 类 型 不 同 的 命 令 放 在 不 同 的 子 菜 单 中 设 计 菜 单 时, 开 发 者 基 本 都 遵 循 同 样 的 标 准, 第 一 个 通 常 是 文 件, 最 后 一 个 总 是 帮 助, 这 是 与 Windows 环 境 相 一 致 的 考 虑 到 用 户 的 使 用 习 惯, 程 序 菜 单 应 尽 量 与 别 的 Windows 程 序 菜 单 相 一 致 8.1.1 下 拉 式 菜 单 Visual Basic 6.0 通 过 菜 单 编 辑 器 进 行 菜 单 的 设 计, 使 用 菜 单 编 辑 器 可 以 创 建 新 的 菜 单 和 菜 单 栏, 还 可 以 在 已 有 的 菜 单 上 增 加 新 命 令, 用 自 己 的 命 令 替 换 已 有 的 菜 单 命 令, 以 及 修 改 添 加 和 删 除 已 有 的 菜 单 右 键 单 击 当 前 窗 体, 在 弹 出 菜 单 中 选 择 菜 单 编 辑 器 选 项, 弹 出 的 菜 单 编 辑 器 窗 口 如 图 8.1 所 示 用 户 可 以 在 菜 单 编 辑 器 中 设 计 自 己 的 菜 单 菜 单 相 当 于 简 单 的 按 钮, 它 的 大 部 分 属 性 我 们 都 曾 经 见 过, 包 括 Name Caption Checked Enabled Index Visible 快 捷 键 和 热 键 等 其 中 Name 是 必 需 的 这 些 属 性 的 功 能 如 表 8-1 所 示 表 8-1 菜 单 的 一 些 主 要 属 性 属 性 名 称 设 置 值 的 类 型 说 明 Name 字 符 型 编 辑 代 码 时 用 来 引 用 控 件 的 唯 标 识, 菜 单 名 字 的 标 准 前 缀 是 mnu Caption 字 符 型 出 现 在 控 件 上 的 文 本 若 想 定 义 热 键 可 在 标 题 中 使 用 & 字 符, 运 行 时 可 用 Alt 键 加 上 带 下 划 线 的 字 符 来 选 中 该 菜 单 项

第 8 章 界 面 设 计 143 续 表 属 性 名 称 设 置 值 的 类 型 说 明 Checked 布 尔 型 是 否 在 菜 单 上 放 置 一 个 复 选 标 志 Enabled 布 尔 型 菜 单 项 是 否 可 用, 不 可 用 时 为 灰 色 Index 整 型 用 于 创 建 菜 单 控 件 数 组, 即 所 有 的 菜 单 名 称 都 相 同, 用 不 同 的 Index 属 性 来 区 分 Visible 布 尔 型 设 置 菜 单 项 是 否 可 见 图 8.1 菜 单 编 辑 器 下 面 简 要 介 绍 菜 单 编 辑 器 窗 口 的 其 他 部 分 的 功 能 快 捷 键 : 用 户 可 从 该 下 拉 列 表 中 选 择 快 捷 键 的 组 合 帮 组 上 下 文 ID: 可 选 项, 取 值 为 数 值, 用 来 调 用 为 菜 单 项 准 备 的 帮 助 文 件 的 标 题 页 若 用 户 按 下 F1 键, 则 该 数 值 用 来 定 位 和 显 示 帮 助 文 件 协 调 位 置 : 决 定 如 何 在 容 器 窗 体 中 显 示 菜 单 显 示 窗 口 列 表 : 设 定 MDI 程 序 中, 菜 单 控 件 是 否 包 含 一 个 打 开 的 MDI 子 窗 口 插 入 : 在 选 中 位 置 插 入 一 个 新 的 菜 单 项 删 除 : 删 除 一 个 菜 单 项 下 面 开 始 设 计 一 个 简 单 菜 单 输 入 表 8-2 列 出 的 属 性 值 表 8-2 菜 单 的 属 性 值 设 置 标 题 (Caption) 名 称 (Name) 文 件 (&F) 打 开 (&O) 退 出 (&X) 编 辑 帮 助 mnufile mnuopen mnuexit mnuedit mnuhelp 143

144 Visual Basic 程 序 设 计 设 计 步 骤 如 下 (1) 打 开 菜 单 编 辑 器 对 话 框 (2) 首 先 在 标 题 文 本 框 中 添 入 文 件, 在 名 称 文 本 框 中 添 加 mnufile, 单 击 下 一 个 按 钮, 这 样 就 建 立 了 第 一 级 菜 单, 注 意 菜 单 设 计 窗 口 中 有 4 个 箭 头, 单 击 向 右 的 箭 头, 出 现 了 一 排 小 点, 这 样 就 可 以 开 始 建 立 第 二 级 菜 单 (3) 接 着 填 写 下 一 菜 单 项, 标 题 设 置 为 打 开 (&O), 名 称 设 置 为 MnuOpen, 单 击 下 一 个 按 钮 重 复 上 述 操 作, 直 至 所 有 文 件 菜 单 下 的 二 级 子 菜 单 添 加 完 毕 (4) 单 击 下 一 个 按 钮, 然 后 单 击 左 向 箭 头, 这 样 就 可 继 续 编 辑 与 文 件 菜 单 项 同 级 的 菜 单, 重 复 步 骤 (2)~(4), 直 至 编 辑 完 所 有 菜 单 项 设 计 好 的 菜 单 如 图 8.2 所 示 图 8.2 菜 单 示 例 在 菜 单 里 经 常 会 看 到 把 不 同 项 分 开 的 分 隔 条, 只 要 在 需 要 添 加 分 隔 条 的 地 方 添 加 一 个 菜 单 项, 把 标 题 属 性 设 置 为 ( 减 号 ) 即 可 注 意 : & 符 号 在 设 计 时 有 特 殊 含 义, 如 果 要 在 菜 单 标 题 中 显 示 & 符 号, 则 要 在 其 前 面 加 一 个 & 比 如 :Stop&&Exit 显 示 为 Stop&Exit, 而 Stop&Exit 会 显 示 为 StopExit, 它 的 热 键 是 E 8.1.2 弹 出 式 菜 单 当 用 户 在 窗 体 的 某 个 对 象 上 单 击 鼠 标 右 键, 就 会 弹 出 和 该 对 象 相 关 的 菜 单, 它 是 独 立 于 菜 单 栏 的 浮 动 菜 单, 也 成 为 上 下 文 菜 单 任 何 一 个 至 少 有 一 个 菜 单 项 的 菜 单, 都 可 在 运 行 时 显 示 为 弹 出 式 菜 单 生 成 弹 出 菜 单 主 要 分 为 两 步 : (1) 生 成 一 个 标 准 菜 单 (2) 在 某 个 通 用 事 件 中 使 用 PopupMenu 方 法 PopupMenu 方 法 的 语 法 格 式 如 下 : object.popupmenu mnuname, flags, x, y, boldcommand 144

其 中, 各 参 数 的 说 明 如 表 8-3 所 示 第 8 章 界 面 设 计 145 表 8-3 PopupMenu 方 法 参 数 表 参 数 说 明 object mnuname flags x y boldcommand 使 用 弹 出 菜 单 的 对 象 名, 指 定 的 菜 单 必 须 含 有 至 少 一 个 子 菜 单 必 选 项 要 显 示 的 弹 出 菜 单 名 可 选 项 取 值 为 数 值 或 常 数, 用 来 指 定 弹 出 菜 单 的 行 为 和 位 置 可 选 项 指 定 弹 出 菜 单 的 x y 坐 标, 若 省 略, 则 使 用 鼠 标 的 当 前 坐 标 可 选 项 指 定 弹 出 菜 单 中 菜 单 控 件 的 名 字 flags 参 数 可 设 置 的 值 及 其 含 义 如 表 8-4 所 示 表 8-4 flags 参 数 的 设 计 值 常 数 值 说 明 vbpopupmenuleftalign 0 默 认 值 弹 出 菜 单 的 左 边 定 位 于 x 位 置 vbpopupmenucenteralign 4 弹 出 菜 单 的 中 间 定 位 于 x vbpopupmenurightalign 8 弹 出 菜 单 的 右 边 定 位 于 x 行 为 vbpopupmenuleftbutton 0 vbpopupmenurightbutton 2 默 认 值 仅 当 使 用 鼠 标 左 键 时, 弹 出 菜 单 中 的 项 目 才 响 应 鼠 标 单 击 使 用 鼠 标 左 键 或 右 键, 弹 出 菜 单 中 的 项 目 都 响 应 鼠 标 单 击 要 指 定 两 种 flags, 可 用 or 操 作 符 组 合 上 述 两 种 常 数 这 里 可 以 为 上 一 小 节 创 建 的 菜 单 添 加 弹 出 式 菜 单, 具 体 如 下 : Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Or vbrightbutton Then PopupMenu mnufile End If 若 想 弹 出 一 个 自 定 义 菜 单, 则 可 在 利 用 菜 单 编 辑 器 设 计 菜 单 时, 将 其 Visible 属 性 设 置 为 False 8.1.3 菜 单 事 件 与 菜 单 命 令 若 要 上 述 创 建 的 菜 单 可 用, 就 要 为 它 们 的 事 件 编 写 程 序 菜 单 最 常 用 的 事 件 就 是 Click 事 件 下 面 举 例 说 明 例 8.1 利 用 菜 单 控 制 画 线 其 中 单 击 开 始 画 线 菜 单 开 始 画 线, 单 击 停 止 画 线 菜 单 停 止 画 线, 单 击 变 换 颜 色 菜 单 变 换 画 线 颜 色, 程 序 运 行 界 面 如 图 8.3 所 示 145

146 Visual Basic 程 序 设 计 图 8.3 例 8.1 的 运 行 界 面 程 序 设 计 步 骤 如 下 (1) 新 建 标 准 EXE 工 程 (2) 建 立 程 序 用 户 界 面 在 窗 体 上 添 加 1 个 定 时 器 控 件 和 若 干 个 菜 单, 各 菜 单 的 名 称 标 题 设 置 如 表 8-5 所 示 表 8-5 例 8.1 的 菜 单 属 性 设 置 属 性 标 题 MnuControl mnustart(mnucontrol 的 下 一 级 菜 单 ) mnustop(mnucontrol 的 下 一 级 菜 单 ) MnuColor 控 制 (&C) 开 始 画 线 (&S) 停 止 画 线 (&T) 变 换 颜 色 (3) 进 入 代 码 窗 口 中, 编 写 如 下 事 件 过 程 菜 单 mnustart 的 响 应 代 码 如 下 : Private Sub mnustart_click() Timer1.Interval=10 mnustart.enabled=false mnustop.enabled=true 菜 单 mnustop 的 响 应 代 码 如 下 : Private Sub mnustop_click() Timer1.Interval=0 mnustart.enabled= True mnustop.enabled= False 菜 单 mnucolor 的 响 应 代 码 如 下 : Private Sub mnucolor_click() Form1.ForeColor=QbColor(11) 146

第 8 章 界 面 设 计 147 上 述 QbColor 是 一 个 控 制 颜 色 的 函 数, 具 体 颜 色 取 决 于 它 的 参 数 值, 这 个 值 的 取 值 范 围 为 0~15 定 时 器 控 件 的 Timer 事 件 如 下 : Private Sub Timer1_Timer() Static a as Integer a=a+50 Line (0,a)-(a,a) 最 后 设 置 弹 出 菜 单 : Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Or vbrightbutton Then PopupMenu mnucontrol End If 使 用 弹 出 式 菜 单 的 操 作 结 果 和 直 接 使 用 下 拉 式 菜 单 的 操 作 结 果 是 一 样 的 8.2 对 话 框 的 设 计 Windows 应 用 程 序 中 的 对 话 框 主 要 起 到 显 示 信 息 和 提 示 用 户 输 入 运 行 程 序 所 必 需 的 数 据 等 功 能, 主 要 包 括 两 种 : 自 定 义 对 话 框 和 通 用 对 话 框 自 定 义 对 话 框 与 普 通 窗 体 的 区 别 是 它 基 本 不 包 括 菜 单 栏 工 具 栏 最 小 和 最 大 化 按 钮 状 态 条 和 窗 体 滚 动 条 比 如,Windows 中 常 见 的 关 于 对 话 框 通 用 对 话 框 在 Visual Basic 中 被 制 作 成 为 ActiveX 控 件, 这 一 控 件 可 利 用 Windows 的 资 源, 进 行 打 开 保 存 文 件 和 设 置 字 体 和 颜 色 及 设 置 打 印 机 等 操 作 如 果 自 己 编 写 了 帮 助 文 档, 还 可 通 过 它 进 行 显 示 通 过 使 用 通 用 对 话 框 控 件, 编 程 人 员 可 以 轻 松 的 把 Windows 的 标 准 对 话 框 加 入 到 自 己 的 应 用 程 序 中 来 8.2.1 自 定 义 对 话 框 自 定 义 对 话 框 是 由 用 户 自 己 创 建 的 含 有 控 件 的 窗 体, 它 与 普 通 窗 体 的 区 别 主 要 在 于 自 定 义 对 话 框 没 有 控 制 菜 单 框 最 大 化 和 最 小 化 按 钮, 边 框 不 能 改 变 一 般 情 况 下, 对 话 框 有 两 个 命 令 按 钮 : 确 定 和 取 消 单 击 前 者 后 开 始 执 行 相 应 的 动 作, 单 击 后 者 退 出 该 对 话 框 ; 前 者 的 Default 属 性 设 置 为 True, 后 者 的 Cancel 属 性 设 置 为 True 虽 然 这 两 个 按 钮 是 最 常 用 的, 但 其 他 的 按 钮 标 题 组 合 也 可 以 使 用 比 如 图 8.4 是 Visual Basic 6.0 编 辑 菜 单 中 的 查 找 对 话 框, 它 有 4 个 命 令 按 钮, 没 有 最 小 化 和 最 大 化 按 钮, 也 没 有 控 制 菜 单, 不 能 改 变 窗 口 的 大 小 147

148 Visual Basic 程 序 设 计 图 8.4 查 找 对 话 框 显 示 对 话 框 是 使 用 Show 方 法 其 一 般 格 式 如 下 : Show [style][,owner] 其 中 :owner 参 数 确 保 对 话 框 在 它 的 父 窗 体 最 小 化 时 也 被 最 小 化 对 话 框 分 为 两 种 类 型 : 模 式 和 无 模 式 的 不 同 对 话 框 使 用 的 Show 方 法 的 参 数 是 不 同 的 模 式 对 话 框 一 般 用 来 显 示 重 要 消 息, 它 在 可 以 继 续 操 作 应 用 程 序 的 其 他 部 分 之 前, 必 须 先 被 关 闭 例 如, 一 个 对 话 框 在 可 以 切 换 到 其 他 窗 体 或 对 话 框 之 前, 要 求 单 击 确 定 或 取 消 按 钮, 则 它 是 模 式 的 Visual Basic 中 的 通 用 对 话 框 就 是 模 式 的 显 示 模 式 对 话 框 的 一 般 格 式 如 下 : [ 对 象 ].show vbmodal 其 中 : 对 象 为 某 个 窗 体 的 名 称 例 如,frmAbout.Show vbmodal 就 是 将 名 为 frmabout 的 窗 体 作 为 模 式 对 话 框 来 显 示 无 模 式 对 话 框 一 般 用 来 显 示 频 繁 使 用 的 命 令 和 信 息, 它 允 许 在 对 话 框 和 其 他 窗 体 之 间 转 移 焦 点, 而 不 必 关 闭 对 话 框 当 对 话 框 正 在 显 示 时, 可 以 在 当 前 应 用 程 序 的 其 他 地 方 继 续 工 作 显 示 无 模 式 对 话 框 的 一 般 格 式 如 下 : [ 对 象 ].show 例 如,frmAbout.Show 就 是 将 名 为 frmabout 的 窗 体 作 为 无 模 式 对 话 框 来 显 示 8.2.2 通 用 对 话 框 使 用 通 用 对 话 框 代 替 自 定 义 对 话 框 可 使 得 应 用 程 序 更 加 专 业 化, 也 可 减 少 编 程 人 员 所 花 费 的 编 程 时 间 一 般 情 况 下, 在 建 立 新 的 工 程 后, 工 具 栏 中 不 会 出 现 常 用 对 话 框 控 件 的 图 标, 可 以 通 过 在 工 具 栏 中 添 加 新 控 件 的 方 法 把 常 用 对 话 框 控 件 添 加 到 工 具 栏 中 为 了 使 用 CommonDialog 控 件, 应 将 其 添 加 到 窗 体 上 并 设 置 属 性 设 计 时 CommonDialog 控 件 在 窗 体 上 将 显 示 为 一 个 图 标, 它 的 大 小 不 能 改 变, 在 程 序 运 行 时 不 可 见 双 击 控 件 工 具 栏 上 的 通 用 对 话 框 控 件 的 图 标, 即 可 在 窗 体 上 加 载 该 控 件 保 持 该 控 件 的 选 中 状 态, 在 属 性 窗 口 中 选 择 自 定 义 选 项, 单 击 出 现 的 按 钮, 即 可 打 开 属 性 页 可 以 看 到, 属 性 页 的 内 容 包 括 打 开 / 另 存 为 颜 色 字 体 打 印 和 帮 助 148

第 8 章 界 面 设 计 149 5 个 选 项, 可 以 根 据 提 示 对 属 性 页 进 行 属 性 设 置 该 控 件 运 行 时 所 显 示 的 对 话 框 由 控 件 的 Show 方 法 决 定, 不 同 的 Show 方 法 对 应 的 对 话 框 的 类 型 如 表 8-6 所 示 表 中 的 前 4 种 方 法 比 较 常 用 表 8-6 Show 方 法 对 应 的 对 话 框 的 类 型 方 法 显 示 的 对 话 框 的 类 型 ShowOpen ShowSave ShowColor ShowFont ShowPrinter ShowHelp 显 示 打 开 对 话 框 显 示 另 存 为 对 话 框 显 示 颜 色 对 话 框 显 示 字 体 对 话 框 显 示 打 印 机 或 打 印 选 项 对 话 框 调 用 帮 助 文 件 1. 打 开 对 话 框 打 开 对 话 框 是 在 应 用 程 序 中 显 示 一 个 带 有 驱 动 器 目 录 和 文 件 名 的 选 择 框, 主 要 进 行 打 开 文 件 操 作 只 要 使 用 CommonDialog 的 ShowOpen 方 法 就 会 弹 出 该 对 话 框 如 图 8.5 所 示 图 8.5 打 开 对 话 框 下 面 介 绍 打 开 对 话 框 的 常 用 属 性 (1) Filter 指 定 在 文 件 类 型 下 拉 列 表 中 显 示 的 文 件 过 滤 器 列 表 设 置 格 式 : 描 述 1 过 滤 器 1 描 述 2 过 滤 器 2 149

150 Visual Basic 程 序 设 计 其 中, 描 述 是 指 列 表 框 中 显 示 的 字 符 串, 例 如 : 位 图 文 件 (*.bmp), 过 滤 器 是 指 实 际 的 文 件 类 型 *.bmp, 描 述 和 过 滤 器 之 间 要 用 符 号 来 分 隔 (2) FileName 用 户 在 对 话 框 中 选 择 打 开 的 文 件 的 路 径 名 (3) DialogTitle 设 置 对 话 框 的 标 题 (4) InitDir 设 置 对 话 框 的 初 始 化 文 件 目 录 (5) CancelError 设 置 用 户 选 择 取 消 按 钮 时 是 否 发 生 错 误 以 下 代 码 显 示 打 开 对 话 框 并 将 用 户 选 定 的 文 件 名 显 示 在 标 签 控 件 中 Private Sub mnuopenfile_click() With CommonDialog1.CancelError = False.DialogTitle = " 打 开 ".Filter = " 所 有 文 件 (*.*) *.*".ShowOpen Label1.Caption = " 打 开 的 文 件 名 为 :" &.FileName End With 另 存 为 对 话 框 的 属 性 与 打 开 对 话 框 基 本 一 致, 这 里 不 再 介 绍 2. 颜 色 对 话 框 在 应 用 程 序 中 需 要 调 用 调 色 板 选 择 颜 色 或 自 定 义 颜 色 时 可 调 用 颜 色 对 话 框, 如 图 8.6 所 示, 用 户 选 定 颜 色 后, 可 用 Color 属 性 获 取 选 定 的 颜 色 图 8.6 颜 色 对 话 框 以 下 代 码 将 用 户 从 颜 色 对 话 框 中 选 择 的 颜 色 作 为 窗 体 的 背 景 颜 色 Private Sub mnucolor_click() With CommonDialog1.Flags = cdlccrgbinit 150

.ShowColor Form1.BackColor=. Color End With 第 8 章 界 面 设 计 151 CommonDialog 的 颜 色 对 话 框 的 Flag 属 性 有 4 个 标 志,cdlCCRGBInit 设 置 初 始 颜 色 值,cdlCCFullOpen 显 示 所 有 自 定 义 颜 色 部 分,cdlCCPreviousFullOpen 使 规 定 自 定 义 颜 色 按 钮 无 效,cdlCCShowHelp 将 帮 助 按 钮 显 示 在 对 话 框 中 3. 字 体 对 话 框 使 用 公 用 对 话 框 的 ShowFont 方 法 可 显 示 字 体 对 话 框, 如 图 8.7 所 示, 用 户 可 根 据 大 小 颜 色 式 样 等 选 择 字 体 用 户 选 定 字 体 后, 编 程 人 员 可 根 据 表 8-7 所 示 的 属 性 获 取 用 户 所 选 的 字 体 信 息 图 8.7 字 体 对 话 框 表 8-7 字 体 对 话 框 返 回 的 属 性 属 性 功 能 Color 选 定 的 字 体 颜 色 要 使 用 此 属 性 必 先 将 Flags 属 性 设 置 为 cdlcfeffects FontBold 是 否 设 置 字 体 为 粗 体 FontItalic 是 否 设 置 字 体 为 斜 体 FontName FontSize FontStrikeThru FontUnderLine 选 定 字 体 的 名 称 选 定 字 体 的 大 小 是 否 设 置 字 体 有 删 除 线 要 使 用 此 属 性 必 先 将 Flags 属 性 设 置 为 cdlcfeffects 是 否 设 置 字 体 有 下 划 线 要 使 用 此 属 性 必 先 将 Flags 属 性 设 置 为 cdlcfeffects 在 显 示 字 体 对 话 框 之 前, 必 须 将 Flags 属 性 设 置 为 以 下 Visual Basic 常 数 之 一, 否 则 将 出 现 字 体 不 存 在 错 误 cdlcfscreenfonts &H1: 屏 幕 字 体 cdlcfprinterfonts &H2: 打 印 机 字 体 cdlcfboth-&h3: 包 括 屏 幕 字 体 和 打 印 机 字 体 151

152 Visual Basic 程 序 设 计 新 建 窗 体, 添 加 一 个 标 签 控 件 和 一 个 按 钮 控 件 在 按 钮 控 件 的 单 击 事 件 中 添 加 如 下 代 码 : Private Sub Command1_Click() With CommonDialog1.CancelError = True On Error GoTo errhandler.flags = cdlcfboth Or cdlcfeffects.showfont Label1.FontName =.FontName Label1.FontSize =.FontSize Label1.FontBold =.FontBold Label1.FontItalic =.FontItalic Label1.FontStrikethru =.FontStrikethru Label1.FontUnderline =.FontUnderline Label1.ForeColor =.Color End With ErrHanddler: Exit Sub 此 例 中 用 用 户 在 字 体 对 话 框 中 选 择 的 选 项 来 设 置 标 签 控 件 的 字 体 属 性 4. 打 印 对 话 框 打 印 对 话 框 由 通 用 对 话 框 的 ShowPrinter 方 法 调 用, 如 图 8.8 所 示 它 可 设 置 打 印 页 的 范 围 打 印 质 量 打 印 份 数 等 项 目 不 过 该 对 话 框 并 不 将 数 据 直 接 送 到 打 印 机, 用 户 可 以 指 定 打 印 数 据 的 方 式, 但 要 编 写 代 码 才 能 真 正 实 现 打 印 图 8.8 打 印 对 话 框 用 户 在 对 打 印 对 话 框 的 各 项 作 出 选 择 后, 编 程 人 员 可 通 过 表 8-8 所 列 出 的 属 性 得 到 用 户 选 择 的 信 息 152

第 8 章 界 面 设 计 153 表 8-8 打 印 对 话 框 返 回 值 的 属 性 属 性 功 能 Copies FromPage ToPage Hdc 要 打 印 的 份 数 打 印 的 起 始 页 打 印 的 终 止 页 所 选 打 印 机 的 设 备 描 述 标 识 号 打 印 菜 单 的 实 现 有 些 复 杂, 这 里 只 给 出 了 简 单 框 架, 有 兴 趣 的 读 者 可 参 考 相 关 资 料 5. 帮 助 文 件 的 显 示 使 用 通 用 对 话 框 的 ShowHelp 方 法 可 调 用 Windows 帮 助 引 擎, 显 示 帮 助 文 件 首 先, 设 置 HelpFile 和 HelpCommand 属 性, 然 后 调 用 ShowHelp 方 法 显 示 指 定 的 帮 助 文 件 以 下 代 码 在 单 击 帮 助 菜 单 项 时 显 示 指 定 的 帮 助 文 件 Private Sub mnuhelp_click() With CommonDialog1.HelpFile = "winhlp32.hlp".helpcommand = cdlhelpcontents.showhelp End With 8.2.3 通 用 对 话 框 控 件 的 使 用 例 8.2 调 用 通 用 对 话 框 控 件 的 打 开 对 话 框 时, 能 够 同 时 选 中 多 个 文 件, 并 返 回 所 有 选 中 的 文 件 的 文 件 名 和 路 径 将 通 用 对 话 框 控 件 的 Flags 属 性 设 置 为 常 量 值 cdlofnallowmultiselect, 它 指 定 文 件 名 列 表 框 允 许 多 重 选 择 运 行 时, 按 住 Ctrl 键 的 同 时 单 击 每 个 文 件 名 称 来 选 择 多 个 文 件 完 成 此 操 作 后, 其 FileName 属 性 就 返 回 一 个 包 含 全 部 所 选 文 件 名 的 字 符 串 允 许 选 择 多 文 件 后,CommonDialog 控 件 返 回 的 Filename 是 按 以 下 格 式 的 一 个 字 符 串 : 文 件 路 径 文 件 名 1 文 件 名 2 文 件 名 3 该 文 件 的 完 整 路 径 是 文 件 路 径 + 文 件 名, 所 以 需 要 通 过 对 字 符 串 的 操 作 把 完 整 的 文 件 名 分 离 出 来 程 序 设 计 步 骤 如 下 (1) 新 建 标 准 EXE 工 程 (2) 建 立 程 序 用 户 界 面 在 窗 口 上 添 加 2 个 命 令 按 钮, 分 别 修 改 其 Caption 属 性 为 打 开 文 件 和 退 出 153

154 Visual Basic 程 序 设 计 (3) 进 入 代 码 窗 口 中, 编 写 如 下 事 件 过 程 : Private Sub cmdexit_click() Unload Me Private Sub cmdopen_click() Dim i As Integer Dim n As Integer Dim z As Integer Dim strfile() As String ' 存 储 文 件 名 的 数 组 With CommonDialog1.Filter = "All Files *.*".Flags = cdlofnallowmultiselect.showopen.filename =.FileName & Chr(32) ' 为 文 件 名 字 符 串 尾 部 添 加 一 个 空 格 z = 1 While i <= Len(.FileName) i = InStr(z,.FileName, Chr(32))' 找 到 空 格 在 文 件 名 字 符 串 中 开 始 的 位 置 If i = 0 Then Exit Sub ReDim Preserve strfile(n) strfile(n) = Mid(.FileName, z, i - z) ' 取 得 上 一 次 空 格 和 此 次 空 格 之 间 的 字 符 串, 若 是 第 一 次 则 得 到 文 件 路 径, 否 则 得 到 文 件 名 n = n + 1 i = i + 1 z = i Wend List1.Clear If n = 1 Then List1.AddItem strfile(0) Else For i = 1 To n - 1 List1.AddItem strfile(0) & "\" & strfile(i) Next i End If End With 8.3 状 态 栏 的 设 计 状 态 栏 实 际 上 是 一 个 窗 口, 一 般 分 为 几 个 窗 格, 每 个 窗 格 显 示 不 同 的 信 息 状 态 栏 可 以 用 来 显 示 状 态 栏 提 示 和 Caps Lock Num Lock Scroll Lock 键 的 状 态 可 以 利 用 状 态 栏 的 属 性 页 来 编 辑 状 态 栏 选 中 窗 体 上 的 状 态 栏, 在 鼠 标 右 键 菜 单 中 选 择 属 性 Properties, 这 时 会 弹 出 如 图 8.9 所 示 的 对 话 框, 打 开 窗 格 选 项 卡 其 中 插 入 窗 格 按 钮 用 来 增 加 状 态 栏 中 的 窗 格 数 目, 当 添 加 一 个 窗 格 后 索 引 的 值 也 会 自 动 加 1, 在 程 序 中 可 以 通 过 窗 格 的 索 引 值 来 引 用 窗 格 状 态 栏 的 常 用 属 性 如 表 8-9 所 示 154

第 8 章 界 面 设 计 155 图 8.9 状 态 栏 的 属 性 页 表 8-9 状 态 栏 的 常 用 属 性 属 性 说 明 Text Alignment 在 各 个 窗 格 中 显 示 的 文 字 窗 格 中 文 本 的 对 齐 方 式 Style 窗 格 的 样 式 (0-sbrText 为 显 示 文 本,6-sbrDate 为 显 示 日 期 等 ) 状 态 栏 的 Panels 集 合 提 供 了 Add 方 法, 用 来 在 程 序 中 动 态 添 加 窗 格, 其 一 般 格 式 如 下 : Object.Panels.Add [Index],[Key],[Text],[Style] 其 中 : Object 为 状 态 栏 对 象 Index 为 可 选 项 是 要 添 加 窗 格 的 索 引 号 Key 为 可 选 项 是 要 添 加 窗 格 的 关 键 字 Text 为 可 选 项 是 要 添 加 窗 格 显 示 的 文 字 Style 为 可 选 项 是 要 添 加 窗 格 的 类 型, 默 认 状 态 为 普 通 窗 格, 取 值 为 0~6 的 整 数 分 别 表 示 系 统 时 间 日 期 键 盘 状 态 等 下 面 通 过 一 个 例 子 来 学 习 状 态 栏 的 用 法 例 8.3 用 状 态 栏 显 示 当 前 系 统 日 期 时 间 键 盘 状 态 以 及 不 同 窗 格 样 式 程 序 运 行 界 面 如 图 8.10 所 示 新 建 工 程, 在 窗 体 上 添 加 的 控 件 及 其 属 性 设 置 如 表 8-10 所 示 155

156 Visual Basic 程 序 设 计 图 8.10 状 态 栏 示 例 表 8-10 例 8.3 中 状 态 栏 的 属 性 设 置 控 件 名 称 属 性 取 值 Label1(0) Caption 显 示 系 统 信 息 ( 系 统 时 间 或 日 期 等 ) Label1(1) Caption 显 示 键 盘 状 态 (Caps Lock 或 Num Lock) Label1(2) Caption 显 示 文 本 和 图 片 信 息 Label2(0) Caption 状 态 栏 的 用 途 包 括 : Label2(1) Caption 状 态 栏 的 三 种 式 样 : StatusBar1 SimpleText 状 态 栏 测 试 程 序 代 码 如 下 : Private Sub Label1_Click(Index As Integer) With StatusBar1 Select Case Index Case 0.Panels.Clear.Panels.Add,,, 5.Panels.Add,, " 系 统 日 期 :", 6.Panels.Add.Panels(1).Alignment = sbrcenter.panels(2).alignment = sbrcenter Case 1 '.Panels.Clear.Panels.Add,, " 字 母 大 小 写 ", 1.Panels.Add,,, 2.Panels.Add,,, 3.Panels.Add,,, 4.Panels(1).Alignment = sbrcenter.panels(2).alignment = sbrcenter 156

第 8 章 界 面 设 计 157.Panels(3).Alignment = sbrcenter.panels(4).alignment = sbrcenter Case 2.Panels.Clear.Panels.Add.Panels(1).AutoSize = sbrcontents.panels(1).picture = LoadPicture(App.Path & "\203.gif").Panels(1).Text = " 文 本 式 样 " End Select End With Private Sub Label2_Click(Index As Integer) If Index = 1 Then With StatusBar1.Panels.Clear.Panels.Add.Panels.Add.Panels.Add.Panels(1).Bevel = sbrinset.panels(2).bevel = sbrnobevel.panels(3).bevel = sbrraised.panels(1).text = " 凹 陷 窗 格 ".Panels(2).Text = " 平 面 窗 格 ".Panels(3).Text = " 凸 出 窗 格 " End With End If 8.4 工 具 栏 的 设 计 工 具 栏 是 由 工 具 栏 按 钮 对 象 组 成 的 集 合, 在 应 用 程 序 中, 它 提 供 了 对 最 常 用 命 令 的 快 速 访 问 比 如,Visual Basic 工 具 栏 中 就 提 供 了 诸 如 复 制 粘 贴 剪 切 等 常 用 命 令 的 工 具 栏 按 钮 8.4.1 使 用 手 工 方 式 制 作 工 具 栏 在 窗 体 上 手 工 创 建 工 具 栏, 通 常 是 用 PictureBox 控 件 作 为 工 具 栏 容 器, 用 命 令 按 钮 控 件 或 Image 控 件 作 为 工 具 栏 按 钮 手 工 创 建 工 具 栏 的 一 般 步 骤 如 下 (1) 在 窗 体 或 MDI 窗 体 上 放 置 PictureBox 控 件 ( 工 具 栏 按 钮 的 容 器 ) 若 是 普 通 窗 体, 则 要 将 其 Align 属 性 置 为 1, 图 片 框 才 会 自 动 伸 展 到 窗 体 长 度 若 是 MDI 窗 体, 则 不 需 要 这 一 操 作, 它 会 自 动 伸 展 需 要 注 意 的 是 MDI 窗 体 上 只 能 用 图 片 框 作 为 工 具 栏 按 钮 的 容 器 (2) 在 PictureBox 控 件 中 放 置 CommandButton 或 Image 控 件 作 为 工 具 栏 的 按 钮 为 工 157

158 Visual Basic 程 序 设 计 具 栏 上 显 示 的 每 个 控 件 设 置 Picture 属 性, 指 定 一 个 图 片 如 果 需 要, 也 可 通 过 ToolTipText 属 性 设 置 工 具 提 示 (3) 编 写 代 码 工 具 栏 经 常 用 于 提 供 对 其 他 命 令 的 快 捷 访 问, 大 部 分 时 间 都 是 调 用 对 应 的 菜 单 项 事 件 过 程 8.4.2 使 用 工 具 栏 控 件 制 作 工 具 栏 由 于 工 具 栏 中 包 含 了 一 系 列 的 图 像 按 钮, 需 要 图 片 列 表 框 控 件 (ImageList) 来 存 储 图 片 如 要 在 设 计 时 设 置 图 片, 与 之 关 联 的 ImageList 控 件 需 与 工 具 栏 控 件 运 行 在 同 一 窗 体 上 可 利 用 ImageList 控 件 的 属 性 页 来 为 其 添 加 图 片, 设 置 图 片 大 小, 设 置 图 片 索 引 之 后, 要 设 置 工 具 栏 控 件 的 图 像 列 表 属 性 为 ImageList 控 件 的 名 称, 使 之 关 联 1. 图 片 列 表 框 控 件 利 用 ImageList 控 件 才 能 在 工 具 栏 上 显 示 图 片, 下 面 首 先 了 解 一 下 此 控 件 ImageList 控 件 包 含 在 Microsoft Common Control 6.0 中, 可 为 其 他 Windows 控 件 保 存 图 片, 也 可 将 该 控 件 的 图 片 赋 值 给 图 片 框 等 控 件 ImageList 控 件 可 添 加 的 图 片 大 小 任 意, 不 过 在 显 示 时 大 小 都 相 同 一 般 来 说, 以 加 入 到 该 控 件 的 第 一 幅 图 像 的 大 小 为 标 准 ImageList 控 件 利 用 ListImage 对 象 集 合 中 的 图 片, 该 对 象 具 有 集 合 对 象 的 标 准 属 性, 如 Key Index Count, 可 用 标 准 的 集 合 方 法 如 Add Remove Clear 来 操 作 也 可 使 用 ImageList 控 件 的 属 性 页 ( 见 图 8.11) 设 置 该 控 件 的 属 性 在 将 该 控 件 与 其 他 控 件 相 关 联 之 前, 要 先 向 其 中 添 加 图 片 图 8.11 ImageList 控 件 的 属 性 页 2. 工 具 栏 (ToolBar) 控 件 用 户 使 用 ToolBar 控 件 可 以 方 便 地 在 应 用 程 序 中 创 建 工 具 条, 该 控 件 提 供 了 许 多 属 性 来 定 制 工 具 栏, 表 8-11 介 绍 了 工 具 栏 控 件 的 常 用 属 性 158

第 8 章 界 面 设 计 159 表 8-11 工 具 栏 控 件 的 常 用 属 性 属 性 说 明 Align 决 定 工 具 栏 在 窗 体 上 的 位 置 具 体 设 置 值 见 表 8-12 Buttons ImageList ShowTips Style TextAlignment Wrappable 返 回 一 个 Button 对 象 的 集 合, 可 通 过 标 准 集 合 方 法 来 操 作 集 合 中 的 每 个 成 员 都 可 用 其 唯 索 引 (Index) 或 键 值 (Key) 来 表 示 返 回 与 工 具 栏 相 关 联 的 控 件 设 置 或 返 回 用 户 将 鼠 标 放 置 在 控 件 上 时 是 否 显 示 ToolTips 提 示 信 息 默 认 值 为 True 设 置 或 返 回 工 具 栏 式 样, 默 认 值 为 0, 即 标 准 式 样, 工 具 栏 上 的 按 钮 一 直 以 3D 效 果 显 示 也 可 修 改 为 平 面 式 样, 即 当 鼠 标 移 到 按 钮 上 时, 按 钮 才 突 出 显 示 决 定 按 钮 文 本 显 示 在 图 片 下 方 (0), 还 是 右 侧 (1) 默 认 值 为 0, 即 文 本 在 图 片 下 方 设 置 或 返 回 当 窗 体 大 小 改 变 时, 工 具 栏 是 否 自 动 折 行 默 认 值 为 True 表 8-12 工 具 栏 控 件 的 Align 属 性 设 置 值 Visual Basic 常 数 取 值 说 明 vbalignnone 0 无 对 齐 方 式 可 在 程 序 中 设 置 位 置, 若 在 MDI 窗 体 上, 则 忽 略 该 设 置 vbaligntop 1 默 认 值 对 象 显 示 在 窗 体 顶 部 vbalignbuttom 2 对 象 显 示 在 窗 体 底 部 vbalignleft 3 对 象 显 示 在 窗 体 左 边 vbalignright 4 对 象 显 示 在 窗 体 右 边 工 具 栏 由 按 钮 组 成,Buttons 集 合 中 的 Button 对 象 组 成 了 工 具 栏 控 件 在 设 计 和 运 行 时 都 可 创 建 按 钮 对 象, 表 8-13 介 绍 了 Buttons 集 合 的 常 用 属 性 表 8-13 Buttons 集 合 的 常 用 属 性 属 性 说 明 Caption Count Enabled Image Index Item Key Style 设 置 按 钮 上 的 文 本 返 回 集 合 中 对 象 的 个 数 设 置 按 钮 对 象 是 否 有 效, 默 认 值 为 True 设 置 按 钮 对 象 使 用 ImageList 控 件 中 哪 个 ListImage 对 象 返 回 标 识 集 合 中 对 象 的 数 值, 从 1 开 始 通 过 Index 或 Key 属 性 值 来 返 回 特 定 成 员 返 回 唯 标 识 集 合 中 对 象 的 字 符 串 返 回 或 设 置 按 钮 对 象 的 式 样 它 决 定 了 按 钮 的 行 为 特 点 取 值 为 0~5 默 认 值 为 0- tbrdefault, 普 通 按 钮 ;1-tbrCheck, 复 选 按 钮 ;2-tbrButtonGroup, 按 钮 组, 组 中 一 次 只 能 有 一 个 按 钮 按 下 ;3-tbrSeparator, 分 隔 符 ;4-tbrPlaceHolder, 可 变 宽 度 分 隔 符 ;5-tbrDropDown, 下 拉 菜 单 式 按 钮 159

160 Visual Basic 程 序 设 计 续 表 属 性 说 明 ToolTipText Value Visibile 返 回 按 钮 对 象 的 工 具 提 示 信 息 返 回 或 设 置 按 钮 对 象 是 否 处 于 按 下 或 选 中 状 态 默 认 值 为 0-tbrUnPressed, 表 示 没 有 被 按 下 或 选 中 ;1-tbrPressed, 表 示 按 钮 被 按 下 或 选 中 设 置 按 钮 对 象 是 否 可 见 也 可 打 开 工 具 栏 控 件 的 属 性 页 进 行 设 置, 如 图 8.12 所 示 先 在 通 用 页 将 图 像 列 表 属 性 设 置 为 要 关 联 的 ImageList 控 件 名 然 后 在 按 钮 页 依 次 添 加 按 钮 并 设 置 按 钮 标 题, 还 要 给 每 个 按 钮 设 置 关 键 字, 选 择 式 样 图 8.12 工 具 栏 控 件 的 属 性 页 ToolBar 控 件 的 ButtonClick 事 件 使 用 率 很 高, 当 用 户 单 击 按 钮 时, 将 激 发 该 事 件 此 时, 使 用 Button 对 象 的 索 引 (Index) 或 键 值 (Key) 识 别 被 单 击 的 按 钮 以 下 代 码 是 如 何 编 写 该 事 件 的 一 个 实 例 例 8.4 工 具 栏 控 件 的 使 用 运 行 界 面 如 图 8.13 所 示 图 8.13 工 具 栏 控 件 实 例 界 面 160

第 8 章 界 面 设 计 161 新 建 标 准 EXE 工 程 建 立 程 序 用 户 界 面 在 窗 口 上 添 加 1 个 工 具 栏 控 件 1 个 标 签 控 件 和 1 个 Image 控 件 编 写 如 下 事 件 过 程 : Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Set Image1.Picture = ImageList1.ListImages(Button.Index).Picture 8.4.3 文 档 编 辑 器 的 实 现 例 8.5 设 计 文 档 编 辑 器, 此 例 利 用 RichTextBox 控 件 进 行 文 本 编 辑,RichTextBox 控 件 不 仅 允 许 输 入 和 编 辑 文 本, 同 时 也 提 供 了 TextBox 控 件 没 有 的 更 高 级 的 许 多 功 能 : 字 体 和 段 落 格 式 我 们 称 其 为 格 式 文 本 框 RichTextBox 控 件 能 以 rtf(rich Text File) 格 式 打 开 或 保 存 文 件, 可 以 直 接 读 写 文 件, 或 使 用 Visual Basic 的 文 件 功 能 进 行 输 入 输 出 来 打 开 和 保 存 文 件 它 常 被 用 来 作 为 不 同 文 字 处 理 系 统 之 间 交 流 的 载 体 程 序 运 行 界 面 如 图 8.14 图 8.14 文 档 编 辑 器 的 界 面 程 序 设 计 步 骤 如 下 (1) 新 建 标 准 EXE 工 程 (2) 建 立 程 序 用 户 界 面 在 窗 口 上 添 加 表 8-14 所 示 的 控 件, 并 参 照 表 8-14 设 置 其 属 性 表 8-14 文 档 编 辑 器 的 控 件 设 置 对 象 类 型 属 性 取 值 工 具 条 Name Toolbar1 RichTextBox Name RtfText 图 片 框 Name PicRuler 通 用 对 话 框 Name CommonDialog1 图 片 列 表 Name imltoolbaricons CoolBar Name CoolBar1 161

162 Visual Basic 程 序 设 计 续 表 对 象 类 型 属 性 取 值 菜 单 Name Name Name Name Name Name Name Name mnufile mnunew mnuopen mnusave mnuexit mnuformation mnufont mnucolor (3) 进 入 代 码 窗 口 中, 编 写 如 下 事 件 过 程 : Private Sub tbtoolbar_buttonclick(byval Button As MSComctlLib.Button) On Error Resume Next Select Case Button.Key Case " 新 建 " mnunew_click Case " 打 开 " mnuopen_click Case " 保 存 " mnusave_click Case " 粗 体 " ' 设 置 格 式 文 本 框 的 字 体 格 式, 与 当 前 状 态 相 反 RtfText.SelBold = Not RtfText.SelBold Button.value = IIf(RtfText.SelBold, tbrpressed, tbrunpressed) Case " 斜 体 " RtfText.SelItalic = Not RtfText.SelItalic Button.value = IIf(RtfText.SelItalic, tbrpressed, tbrunpressed) Case " 下 划 线 " RtfText.SelUnderline = Not RtfText.SelUnderline Button.value = IIf(RtfText.SelUnderline, tbrpressed, tbrunpressed) Case " 删 除 线 " RtfText.SelStrikeThru = Not RtfText.SelStrikeThru Button.value = IIf(RtfText.SelStrikeThru, tbrpressed, tbrunpressed) Case " 左 对 齐 " RtfText.SelAlignment = rtfleft ' 设 置 格 式 文 本 框 的 文 字 对 齐 属 性 Case " 置 中 " RtfText.SelAlignment = rtfcenter Case " 右 对 齐 " RtfText.SelAlignment = rtfright 162

Case " 字 体 " mnufont_click Case " 颜 色 " mnucolor_click Case " 关 闭 " mnuexit_click End Select 以 下 是 各 个 菜 单 的 单 击 响 应 程 序 : 第 8 章 界 面 设 计 163 Private Sub mnucolor_click() With CommonDialog1 ' 利 用 公 共 对 话 框 控 件 打 开 系 统 颜 色 对 话 框.DialogTitle = " 颜 色 ".CancelError = False.Flags = &H2.ShowColor RtfText.BackColor =.Color ' 设 置 格 式 文 本 框 背 景 颜 色 为 用 户 选 中 的 颜 色 End With Private Sub mnuexit_click() Dim result As Integer If Me.Caption = " 新 文 件 " And RtfText.Text = "" Then ' 判 断 用 户 是 否 修 改 了 文 件 Unload Me Else ' 若 用 户 修 改 了 文 件, 则 弹 出 消 息 框 询 问 用 户 是 否 要 保 存 文 件 result=msgbox(" 您 已 经 对 文 件 作 了 修 改, 要 保 存 吗?",vbYesNoCancel," 提 示 ") Select Case result Case 6 ' 用 户 单 击 了 Yes 按 钮 mnusave_click Case 2 ' 用 户 单 击 了 Cancel 按 钮 Exit Sub Case 7 ' 用 户 单 击 了 No 按 钮 Unload Me End Select End If Private Sub mnufont_click() CommonDialog1.Flags = cdlcfboth + cdlcfeffects CommonDialog1.ShowFont ' 利 用 公 共 对 话 框 控 件 打 开 字 体 对 话 框, 根 据 用 户 选 择 的 字 体 设 置 格 式 文 本 框 的 字 体 属 性 With RtfText.SelFontName = CommonDialog1.FontName.SelFontSize = CommonDialog1.FontSize.SelBold = CommonDialog1.FontBold.SelItalic = CommonDialog1.FontItalic.SelStrikeThru = CommonDialog1.FontStrikethru.SelUnderline = CommonDialog1.FontUnderline End With 163

164 Visual Basic 程 序 设 计 Private Sub mnunew_click() RtfText.Text = "" ' 将 格 式 文 本 框 中 的 内 容 清 空, 修 改 窗 体 标 题 栏 Me.Caption = " 新 文 件 " Private Sub mnuopen_click() Dim sfile1 As String With CommonDialog1 ' 利 用 公 共 对 话 框 控 件 打 开 系 统 对 话 框.DialogTitle = " 打 开 ".CancelError = False.Filter = "Rich Text 文 件 (*.rtf) *.rtf".showopen If Len(.FileName) = 0 Then Exit Sub sfile1 =.FileName ' 取 得 要 打 开 文 件 的 名 字 End With RtfText.LoadFile sfile1 Me.Caption = sfile1 Private Sub mnusave_click() With CommonDialog1 ' 利 用 公 共 对 话 框 控 件 打 开 保 存 对 话 框.DialogTitle = " 保 存 ".CancelError = False.Filter = "Rich Text 文 件 (*.rtf) *.rtf".showsave If Len(.filename) = 0 Then Exit Sub sfile2 =.filename ' 取 得 保 存 新 文 件 的 名 字 End With RtfText.SaveFile sfile2 8.5 多 文 档 界 面 设 计 在 前 面 各 章 中 提 及 的 例 子 都 是 在 一 个 窗 体 中 完 成 的, 而 复 杂 一 些 的 应 用 程 序 一 般 需 要 多 个 窗 体 才 能 完 成, 这 就 需 要 使 用 多 窗 体 界 面 和 多 文 档 界 面 本 节 主 要 介 绍 对 多 文 档 用 户 界 面 的 创 建 8.5.1 多 文 档 界 面 (MDI) 多 文 档 用 户 界 面 允 许 在 单 个 容 器 窗 口 中 包 含 多 个 子 窗 口, 同 时 处 理 多 个 文 档, 每 个 文 档 都 显 示 在 各 自 的 窗 口 中, 比 如 Microsoft Excel 就 是 这 样 的 应 用 程 序, 如 图 8.15 所 示 MDI 应 用 程 序 的 子 窗 体 包 含 在 父 窗 体 中, 父 窗 体 为 应 用 程 序 的 子 窗 体 提 供 工 作 空 间, 每 个 子 窗 体 都 限 制 在 父 窗 体 范 围 之 内, 最 小 化 父 窗 体 时, 所 有 子 窗 体 也 被 最 小 化, 但 只 有 父 窗 体 的 图 标 显 示 在 任 务 栏 上, 子 窗 体 最 小 化 时, 它 的 图 标 显 示 在 父 窗 体 的 工 作 区 内, 而 不 是 任 务 栏 中 164

第 8 章 界 面 设 计 165 图 8.15 Excel 多 文 档 用 户 界 面 8.5.2 建 立 多 文 档 界 面 1. 创 建 MDI 窗 体 在 工 具 栏 中 单 击 图 标, 在 下 拉 菜 单 中 选 择 添 加 MDI 窗 体 一 个 应 用 程 序 中 只 能 有 一 个 MDI 窗 体, 若 已 经 在 工 程 中 添 加 了 MDI 窗 体, 则 该 命 令 不 可 用 2. 创 建 MDI 子 窗 体 首 先 创 建 一 个 普 通 窗 体, 然 后 将 其 MDIChild 属 性 设 置 为 True, 此 时 该 窗 体 成 为 一 个 MDI 子 窗 体 在 子 窗 体 上 可 像 在 普 通 窗 体 上 一 样 添 加 控 件, 设 置 属 性 在 工 程 资 源 管 理 器 中,MDI 窗 体 和 MDI 子 窗 体 有 确 定 的 显 示 图 标, 如 图 8.16 所 示 图 8.16 工 程 资 源 管 理 器 165

166 Visual Basic 程 序 设 计 子 窗 体 能 够 移 动 和 改 变 大 小, 但 只 能 在 父 窗 体 的 工 作 空 间 之 内 最 大 化 一 个 子 窗 体 时, 它 的 标 题 会 与 父 窗 体 的 标 题 组 合, 显 示 在 父 窗 体 的 标 题 栏 上 子 窗 体 若 有 菜 单, 将 显 示 在 父 窗 体 的 菜 单 栏 中 3. 指 定 活 动 子 窗 体 使 用 MDI 窗 体 的 ActiveForm 属 性, 可 返 回 具 有 焦 点 或 最 后 激 活 的 子 窗 体, 当 然, 使 用 该 属 性 时, 应 至 少 有 一 个 子 窗 体 已 被 加 载 或 可 见 当 一 个 窗 体 中 设 置 了 几 个 控 件 时, 也 可 指 定 活 动 控 件 使 用 ActiveControl 属 性 可 返 回 子 窗 体 上 具 有 焦 点 的 控 件 4. 加 载 MDI 窗 体 和 子 窗 体 加 载 父 窗 体 时, 子 窗 体 并 不 会 自 动 显 示, 可 使 用 AutoShowChildren 属 性 加 载 隐 藏 状 态 的 子 窗 体 加 载 子 窗 体 时 父 窗 体 会 自 动 加 载 5. 用 QueryUnload 事 件 卸 载 MDI 窗 体 QueryUnload 事 件 在 MDI 窗 体 卸 载 之 前 被 调 用, 然 后 每 个 打 开 的 子 窗 体 调 用 该 事 件 若 此 事 件 没 有 代 码, 则 先 卸 载 子 窗 体, 然 后 再 卸 载 MDI 窗 体 该 事 件 使 得 编 程 人 员 有 机 会 在 窗 体 卸 载 之 前 询 问 用 户 是 否 要 保 存 窗 体 例 如 : 子 窗 体 中 有 一 文 本 框, 可 设 置 一 个 全 局 标 志 来 记 录 用 户 是 否 修 改 了 文 本 框 中 的 内 容, 然 后 在 QueryUnload 事 件 中 检 查 此 标 志, 若 用 户 修 改 了 文 本 框 中 的 内 容, 则 询 问 用 户 是 否 保 存 8.5.3 创 建 MDI 应 用 程 序 的 菜 单 在 MDI 应 用 程 序 中, 每 一 个 子 窗 体 的 菜 单 都 显 示 在 MDI 窗 体 上, 而 不 是 在 子 窗 体 本 身 当 子 窗 体 拥 有 焦 点 时, 该 子 窗 体 的 菜 单 ( 如 果 有 的 话 ) 就 代 替 菜 单 栏 上 的 MDI 窗 体 的 菜 单 如 果 没 有 可 见 的 子 窗 体, 或 者 如 果 带 有 焦 点 的 子 窗 体 没 有 菜 单, 则 显 示 MDI 窗 体 的 菜 单 如 果 子 窗 口 有 一 组 菜 单 项, 需 要 这 些 菜 单 项 都 出 现 在 父 窗 口 的 主 菜 单 中, 则 可 以 创 建 作 为 子 窗 口 窗 体 的 主 菜 单 当 激 活 子 窗 口 时, 其 主 菜 单 与 父 窗 口 的 主 菜 单 合 并 1. 创 建 窗 口 菜 单 通 常,MDI 应 用 程 序 有 一 个 窗 口 菜 单, 使 得 用 户 得 以 通 过 平 铺 或 层 叠 排 列 已 经 打 开 的 子 窗 口 窗 口 菜 单 还 使 用 户 得 以 定 位 到 任 何 打 开 的 子 窗 口 创 建 窗 口 菜 单, 首 先 要 将 平 铺 和 层 叠 的 菜 单 项 添 加 到 父 窗 体 的 窗 口 菜 单 中 若 要 在 某 个 菜 单 上 显 示 所 有 打 开 的 子 窗 体 标 题, 则 可 利 用 菜 单 编 辑 器 将 其 WindowList 属 性 设 置 为 True, 即 显 示 打 开 的 子 窗 体 标 题 2. 排 列 子 窗 体 应 用 程 序 常 包 含 对 打 开 的 MDI 子 窗 体 进 行 操 作 的 菜 单 命 令, 如 平 铺 层 叠 和 排 列 可 以 使 用 Arrange 方 法 来 层 叠 平 铺 和 排 列 子 窗 体 的 图 标 ; 这 些 枚 举 值 将 子 窗 体 显 示 为 层 叠 水 平 平 铺 或 垂 直 平 铺, 或 者 显 示 为 排 列 在 MDI 窗 体 下 部 的 子 窗 体 图 标 166

第 8 章 界 面 设 计 167 假 定 MDI 窗 体 名 称 为 frmmdi, 则 以 下 语 句 分 别 实 现 了 不 同 的 子 窗 体 排 列 层 叠 子 窗 体 :frmmdi.arrange vbcascade 平 铺 子 窗 体 :frmmdi.arrange vbtilehorizontal 排 列 图 标 子 窗 体 :frmmdi.arrange vbarrangeicons 其 中,vbCascade vbtilehorizontal 和 vbarrangeicons 是 Visual Basic 的 内 部 常 数 8.6 Visual Basic 的 工 程 结 构 Visual Basic 的 工 程 主 要 包 括 窗 体 模 块 标 准 模 块 类 模 块 等 几 个 部 分 1. 标 准 模 块 标 准 模 块 具 有.bas 文 件 扩 展 名, 可 以 包 含 类 型 常 数 变 量 外 部 过 程 和 公 共 过 程 的 公 共 的 或 模 块 级 的 声 明 2. 窗 体 模 块 窗 体 模 块 具 有.frm 文 件 扩 展 名, 一 般 包 含 窗 体 及 其 控 件 的 正 文 描 述, 包 括 它 们 的 属 性 设 置 它 们 也 含 有 窗 体 级 的 常 数 变 量 和 外 部 过 程 的 声 明 事 件 过 程 和 一 般 过 程 3. 类 模 块 类 模 块 具 有.cls 文 件 扩 展 名, 与 窗 体 模 块 类 似, 只 是 没 有 可 见 的 用 户 界 面 可 以 使 用 类 模 块 创 建 含 有 方 法 和 属 性 代 码 的 自 己 的 对 象 4. SubMain 过 程 在 代 码 模 块 中 使 用 SubMain 过 程, 应 用 程 序 会 马 上 开 始 执 行 程 序, 而 不 必 等 待 窗 体 上 发 生 事 件 一 般 来 说, 要 在 标 准 模 块 中 创 建 一 个 名 为 SubMain 的 过 程, 可 在 其 中 加 入 启 动 应 用 程 序 时 需 执 行 的 代 码, 然 后 通 过 工 程 工 程 属 性 通 用 选 项 卡 启 动 对 象 选 择 Sub Main 这 样 在 启 动 应 用 程 序 时, 就 可 以 首 先 执 行 名 为 Main 的 子 过 程 中 的 内 容 这 个 子 过 程 不 能 在 窗 体 模 块 内, 必 须 在 标 准 模 块 内 创 建 8.7 小 结 在 Windows 环 境 下 运 行 的 应 用 程 序, 虽 然 不 是 所 有 的 用 户 界 面 看 上 去 或 操 作 起 来 都 一 样, 但 是 这 些 界 面 有 许 多 共 同 的 特 点 它 们 都 包 括 一 些 基 本 要 素, 如 菜 单 工 具 栏 状 态 栏, 在 应 用 程 序 的 操 作 过 程 中 又 往 往 要 打 开 一 些 对 话 框 使 用 Visual Basic 开 发 Windows 环 境 下 的 应 用 程 序, 同 样 离 不 开 这 些 常 见 的 界 面 元 素 的 设 计 本 章 介 绍 了 如 何 开 发 Windows 应 用 程 序 中 的 一 些 典 型 的 界 面 要 素, 包 括 菜 单 工 具 栏 状 态 栏 各 种 对 话 框 以 及 多 文 档 界 面 的 设 计 使 用 Visual Basic 设 计 应 用 程 序 时, 当 操 作 比 较 简 单, 且 操 作 命 令 较 少 时, 可 以 直 接 通 167

168 Visual Basic 程 序 设 计 过 控 件 来 执 行 ; 而 当 要 完 成 比 较 复 杂 且 命 令 选 项 比 较 多 的 操 作 时, 使 用 菜 单 操 作 会 更 为 方 便 菜 单 可 以 分 成 两 种 基 本 类 型 : 下 拉 式 菜 单 和 弹 出 式 菜 单 下 拉 式 菜 单 通 常 通 过 单 击 菜 单 标 题 打 开, 弹 出 式 菜 单 通 常 在 莱 单 区 域 通 过 单 击 鼠 标 右 键 打 开 Visual Basic 6.0 通 过 菜 单 编 辑 器 来 进 行 菜 单 的 设 计, 用 菜 单 编 辑 器 可 以 创 建 新 的 菜 单 和 菜 单 栏 工 具 栏 是 许 多 基 于 Windows 的 应 用 程 序 的 标 准 功 能, 它 提 供 了 对 应 用 程 序 中 常 用 的 菜 单 命 令 的 快 速 访 问 在 Visual Basic 中 设 计 工 具 栏 有 两 种 方 法 : 手 工 设 计 和 使 用 工 具 栏 控 件 进 行 设 计 Visual Basic 为 创 建 工 具 栏 提 供 了 一 个 ActiveX 控 件 ToolBar 控 件, 使 用 该 控 件 创 建 工 具 栏 更 方 便 快 捷, 创 建 出 的 工 具 栏 与 Windows 工 具 栏 风 格 更 加 统 一 对 话 框 主 要 起 到 显 示 信 息 和 提 示 用 户 输 入 运 行 程 序 所 必 需 的 数 据 等 功 能, 主 要 包 括 两 种 : 自 定 义 对 话 框 和 通 用 对 话 框 多 文 档 用 户 界 面 允 许 创 建 在 单 个 容 器 窗 口 中 包 含 多 个 窗 口, 同 时 处 理 多 个 文 档, 每 个 文 档 都 显 示 在 各 自 的 窗 口 中 8.8 习 题 一 选 择 题 1. 下 列 有 关 子 菜 单 的 说 法 中, 错 误 的 是 ( ) A) 每 个 菜 单 项 都 是 个 控 件, 与 其 他 控 件 一 样 也 有 其 属 性 和 事 件 B) 除 了 Click 事 件 之 外, 菜 单 项 不 可 以 响 应 其 他 事 件 C) 菜 单 的 索 引 号 可 以 不 连 续 D) 菜 单 项 的 索 引 号 必 须 从 1 开 始 2. 以 下 叙 述 中 错 误 的 是 ( ) A) 下 拉 式 菜 单 和 弹 出 式 菜 单 都 用 菜 单 编 辑 器 建 立 B) 在 多 窗 体 程 序 中, 每 个 窗 体 都 可 以 建 立 自 己 的 菜 单 系 统 C) 在 程 序 运 行 过 程 中 可 以 增 加 或 减 少 菜 单 项 D) 如 果 把 一 个 菜 单 项 的 Enabled 属 性 设 置 为 False, 则 可 删 除 该 菜 单 项 3. 以 下 说 法 正 确 的 是 ( ) A) Visual Basic 中 的 对 话 框 分 为 两 种 类 型 : 预 定 义 对 话 框 和 自 定 义 对 话 框 B) 预 定 义 对 话 框 是 用 户 在 设 置 程 序 代 码 前 定 义 的 C) 自 定 义 对 话 框 是 由 用 户 根 据 自 己 的 需 要 定 义 的 D) 以 上 说 法 都 不 正 确 4. 设 菜 单 中 有 一 个 菜 单 项 为 Open 若 要 为 该 菜 单 项 设 计 访 问 键, 即 按 下 Alt 键 及 字 母 O 时, 能 够 执 行 Open 命 令, 则 在 菜 单 编 辑 器 中 设 置 Open 命 令 的 方 式 是 ( ) A) 把 Caption 属 性 设 置 为 &Open 168

第 8 章 界 面 设 计 169 B) 把 Caption 属 性 设 置 为 O&pen C) 把 Name 属 性 设 置 为 &Open D) 把 Name 属 性 设 置 为 O&pen 5. 以 下 关 于 多 重 窗 体 程 序 的 叙 述 中, 错 误 的 是 ( ) A) 用 Hide 方 法 不 但 可 以 隐 藏 窗 体, 而 且 能 清 除 内 存 中 的 窗 体 B) 在 多 重 窗 体 程 序 中, 各 窗 体 的 菜 单 是 彼 此 独 立 的 C) 在 多 重 窗 体 程 序 中, 可 以 根 据 需 要 指 定 启 动 窗 体 D) 在 多 重 窗 体 程 序 中, 而 且 单 独 保 存 每 个 窗 体 6. 在 窗 体 上 画 一 个 名 称 为 CommandDialog1 的 通 用 对 话 框 和 一 个 名 称 为 Command1 的 命 令 按 钮 然 后 编 写 如 下 事 件 过 程 : Private Sub Command1_Click() CommonDialog1.FileName ="" CommonDialog1.Filter="All file *.* (*.Doc) *.Doc (*.Txt) *.Txt" CommonDialog1.FilterIndex=2 CommonDialog1.DialogTitle="VBTest" CommonDialog1.Action=1 对 于 这 个 程 序, 以 下 叙 述 中 错 误 的 是 ( ) A) 该 对 话 框 被 设 置 为 打 开 对 话 框 B) 在 该 对 话 框 中 指 定 的 默 认 文 件 名 为 空 C) 该 对 话 框 的 标 题 为 VBTest D) 在 该 对 话 框 中 指 定 的 默 认 文 件 类 型 为 文 本 文 件 (*.Txt) 7. 在 窗 体 上 画 一 个 名 称 为 CommonDialog1 的 通 用 对 话 框, 一 个 名 称 为 Command1 的 命 令 按 钮 要 求 单 击 命 令 按 钮 时, 打 开 一 个 打 开 文 件 的 通 用 对 话 框 该 窗 口 的 标 题 为 Open, 在 文 件 类 型 栏 中 显 示 *.bmp 能 够 满 足 上 述 要 求 的 程 序 是 ( ) A) Private Sub Command1_Click() CommonDialog1.Filter = " 所 有 文 件 *.* (* bmp) *. bmp " CommonDialog1.DialogTitle = " Open " CommonDialog1.ShowOpen B) Private Sub Command1_Click() CommonDialog1.Filter = " 所 有 文 件 *.* (* bmp) *. bmp " CommonDialog1.DialogTitle = "Save" CommonDialog1.ShowSave C) Private Sub Command1_Click() CommonDialog1.FileName = "Save" CommonDialog1.Filter = " 所 有 文 件 *.* (* bmp) *. bmp " CommonDialog1.DialogTitle = " Open " CommonDialog1.ShowOpen D) Private Sub Command1_Click() CommonDialog1.Filter = " 所 有 文 件 " 169

170 Visual Basic 程 序 设 计 CommonDialog1.DialogTitle = " Open " CommonDialog1.ShowOpen 二 填 空 题 在 菜 单 编 辑 器 中 建 立 一 个 菜 单, 菜 单 项 的 名 称 为 mnucolor,visible 属 性 为 False, 程 序 运 行 后, 如 果 用 鼠 标 右 键 单 击 窗 体, 则 弹 出 与 mnucolor 相 应 的 菜 单 以 下 是 实 现 上 述 功 能 的 程 序, 请 填 空 Private Sub Form (Button As Integer, Shift As Integer, X As Single, Y As Single) If Button=2 Then mnucolor End If 三 编 程 题 1. 设 计 一 个 具 有 弹 出 式 和 下 拉 式 菜 单 栏 和 工 具 栏 的 窗 体, 单 击 菜 单 或 工 具 栏 图 标 能 够 打 开 不 同 窗 体 2. 利 用 通 用 对 话 框 控 件 编 写 一 个 应 用 程 序, 界 面 如 图 8.17 所 示 要 求 实 现 以 下 功 能 (1) 单 击 打 开 按 钮, 显 示 标 准 的 打 开 文 件 对 话 框, 对 话 框 标 题 为 请 选 择 文 件, 默 认 路 径 为 d:\vbtest( 或 所 用 机 器 中 的 一 个 已 经 存 在 的 文 件 夹 ), 默 认 列 出 的 文 件 扩 展 名 为.txt 文 件, 选 定 路 径 及 文 件 名 后, 该 路 径 和 文 件 名 显 示 在 文 本 框 中 (2) 单 击 字 体 按 钮, 显 示 标 准 的 字 体 对 话 框, 利 用 该 对 话 框 设 置 文 本 框 中 文 字 的 字 体 字 体 样 式 大 小 效 果 和 颜 色 (3) 单 击 颜 色 按 钮 打 开 颜 色 对 话 框, 用 于 设 定 文 本 框 的 背 景 颜 色 图 8.17 编 程 题 2 的 效 果 图 170

第 9 章 Visual Basic 图 形 设 计 教 学 提 示 :Visual basic 为 程 序 设 计 者 提 供 了 非 常 丰 富 的 绘 图 功 能 设 计 程 序 时, 不 仅 可 以 使 用 Visual Basic 提 供 的 图 形 控 件 来 画 图, 还 可 以 调 用 图 形 方 法 绘 制 丰 富 多 彩 的 艺 术 图 形 教 学 目 标 : 了 解 与 绘 图 有 关 的 基 础 知 识, 如 坐 标 系 绘 图 的 颜 色 等, 掌 握 用 图 形 控 件 图 形 函 数 语 句 方 法 进 行 图 形 设 计 的 基 本 方 法 和 技 巧 9.1 图 形 设 计 基 础 9.1.1 坐 标 系 统 坐 标 对 图 形 绘 制 与 文 字 输 出 的 操 作 而 言 是 非 常 重 要 的 坐 标 系 统 包 括 原 点 位 置 坐 标 单 位 以 及 坐 标 轴 的 方 向 等 几 方 面 内 容 在 窗 体 和 图 片 框 中 绘 图 时,Visual Basic 提 供 了 7 种 标 准 坐 标 系 统 供 选 用 此 外, 还 可 以 使 用 自 定 义 坐 标 系 统 1. 标 准 坐 标 系 统 Visual Basic 的 坐 标 系 用 于 在 二 维 空 间 定 义 容 器 对 象 ( 如 窗 体 和 图 片 框 ) 中 点 的 位 置 和 数 学 中 的 坐 标 系 一 样,Visual Basic 的 坐 标 系 也 包 含 坐 标 原 点 x 坐 标 轴 和 y 坐 标 铀 Visual Basic 坐 标 系 的 默 认 坐 标 原 点 (0,0) 在 容 器 对 象 的 左 上 角, 水 平 方 向 的 x 坐 标 轴 向 右 为 正 方 向, 垂 直 方 向 的 y 坐 标 轴 向 下 为 正 方 向, 坐 标 轴 的 默 认 刻 度 单 位 是 缇 (Twip) 除 了 缇 外,Visual Basic 中 坐 标 的 常 用 度 量 单 位 还 有 点 (Point) 厘 米 和 英 寸 等 1 缇 大 约 为 1/1440 英 寸, 1/20 点 1 厘 米 约 等 于 567 缇,1 英 寸 约 等 于 1440 缇 72 点 等 于 1 英 寸 用 户 可 以 根 据 实 际 需 要, 使 用 ScaleMode 属 性 改 变 坐 标 系 的 刻 度 单 位 ScaleMode 属 性 的 取 值 如 表 9-l 所 示 表 9-1 ScaleMode 属 性 的 取 值 值 常 量 描 述 0 vbuser 自 定 义 坐 标 系 统 1 vbtwips 默 认 值, 坐 标 单 位 为 缇 2 vbpoints 坐 标 单 位 为 点 ( 每 英 寸 为 72 点 ) 3 vbpixels 像 素 ( 显 示 器 分 辨 率 的 最 小 单 位 )

172 Visual Basic 程 序 设 计 续 表 值 常 量 描 述 4 vbcharacters 字 符 坐 标 系 统 ( 水 平 每 个 单 位 为 120 缇, 垂 直 每 个 单 位 为 240 缇 ) 5 vbinches 坐 标 单 位 为 英 寸 6 bmillimeters 坐 标 单 位 为 毫 米 7 vbcentimeters 坐 标 单 位 为 厘 米 当 ScaleMode 值 为 1~7 时, 是 Visual Basic 已 定 义 好 的 标 准 坐 标 系 统, 这 7 种 标 准 坐 标 系 统 的 原 点 都 在 对 象 绘 图 区 的 左 上 角, 水 平 坐 标 的 正 方 向 为 向 右, 垂 直 坐 标 的 正 方 向 为 向 下 其 中 坐 标 系 统 3(ScaleMode 属 性 的 取 值 为 3) 以 像 素 为 刻 度 度 量 单 位, 在 不 同 分 辨 率 的 显 示 器 与 打 印 机 上 输 出 的 结 果 大 小 不 同, 是 设 备 相 关 的 其 他 几 种 标 准 坐 标 系 统 都 是 设 备 无 关 的 坐 标 系 统 4(ScaleMode 属 性 的 取 值 为 4) 的 水 平 与 垂 直 度 量 不 相 同, 使 用 时 应 当 注 意 2. 自 定 义 坐 标 系 统 当 窗 体 或 图 片 框 的 ScaleMode 属 性 为 0 时, 使 用 自 定 义 坐 标 系 统, 自 定 义 坐 标 系 统 的 原 点 位 置 和 坐 标 单 位 由 ScaleHeight ScaleWidth ScaleLeft 和 ScaleTop 这 4 个 属 性 决 定 ScaleLeft ScaleTop 属 性 分 别 指 定 在 新 坐 标 系 统 下 对 象 绘 图 区 左 上 角 的 水 平 和 垂 直 坐 标 ScaleHeight ScaleWidth 属 性 决 定 在 新 的 坐 标 下 窗 体 或 图 片 框 绘 画 区 的 高 度 与 宽 度 当 这 两 个 属 性 取 负 值 时, 会 改 变 坐 标 的 正 方 向 在 自 定 义 坐 标 系 统 下, 坐 标 的 实 际 单 位 是 由 对 象 的 实 际 大 小 和 ScaleHeight ScaleWidth 属 性 联 合 决 定 的 例 如, 假 设 当 前 窗 体 内 部 显 示 区 域 的 高 度 是 2000 缇, 宽 度 是 3000 缇 此 时 高 度 和 宽 度 的 刻 度 单 位 均 为 1 缇 如 果 设 置 ScaleHeight=500, 则 将 窗 体 内 部 显 示 区 域 的 高 度 划 分 为 500 个 单 位, 每 个 单 位 为 2000/500, 即 4 缇 如 果 设 置 ScaleWidth=1000, 则 将 窗 体 内 部 显 示 区 域 的 宽 度 划 分 为 1000 个 单 位, 每 个 单 位 为 3000/1000, 即 3 缇 在 使 用 标 准 坐 标 系 统 时,ScaleHeight ScaleWidth ScaleLeft 和 ScaleTop 这 4 个 属 性 也 是 可 用 的, 它 们 分 别 反 映 出 在 当 前 标 准 坐 标 系 统 下 相 应 的 值,ScaleLeft ScaleTop 的 值 都 为 0,ScaleHeight ScaleWidth 值 为 以 当 前 坐 标 单 位 为 度 量 标 准 的 绘 图 区 高 度 与 宽 度 如 果 在 标 准 坐 标 系 统 下, 改 变 了 这 4 个 属 性 中 任 意 一 个 的 值, 会 自 动 使 用 自 定 义 坐 标, ScaleMode 属 性 被 自 动 设 置 为 0 例 9.1 将 一 个 图 片 (Picturel) 的 左 上 角 移 动 到 窗 体 的 中 央 位 置 如 果 不 对 窗 体 重 新 定 义 刻 度 单 位, 就 需 要 以 缇 为 单 位 来 计 算 窗 体 的 中 央 位 置, 如 果 将 窗 体 的 高 度 和 宽 度 都 定 义 为 2 个 刻 度 单 位, 则 窗 体 的 中 央 位 置 即 为 坐 标 为 (1,1) 的 点 设 计 界 面 如 图 9.1(a) 所 示, 运 行 时 单 击 移 动 按 钮, 将 图 片 的 左 上 角 移 动 到 窗 体 的 中 央 位 置, 如 图 9.1(b) 所 示 172

第 9 章 Visual Basic 图 形 设 计 173 (a) (b) 图 9.1 将 一 个 图 片 的 左 上 角 移 动 到 窗 体 的 中 央 位 置 移 动 按 钮 的 C1ick 事 件 过 程 如 下 : Private Sub Command1_Click() Form1.ScaleHeight = 2 Form1.ScaleWidth = 2 Picture1.Top = 1 Picture1.Left = 1 也 可 以 使 用 Scale 方 法 设 置 一 个 自 定 义 坐 标 系 统, 其 格 式 如 下 : [object.] Scale (xl,y1)- (x2,y2) 其 中 : object 为 窗 体 或 图 片 框 对 象 名 xl,y1 为 对 象 绘 图 区 左 上 角 在 新 的 自 定 义 坐 标 系 统 下 的 坐 标 x2,y2 为 对 象 绘 图 区 右 下 角 在 新 的 自 定 义 坐 标 系 统 下 的 坐 标 对 Scale 方 法 的 调 用 等 价 于 对 前 面 提 到 的 4 个 属 性 的 设 置, 关 系 如 下 : ScaleLeft = x1 ScaleTop = y1 ScaleWidth = x2-x1 ScaleHeight = y2-y1 3. 当 前 坐 标 当 在 容 器 中 绘 制 图 形 或 输 出 结 果 时, 经 常 要 将 它 们 定 位 在 某 一 希 望 的 位 置, 这 就 必 须 获 得 某 一 点 的 坐 标, 即 当 前 坐 标 Visual Basic 使 用 CurrentX 和 CurrentY 属 性 设 置 或 返 回 当 前 坐 标 的 水 平 坐 标 和 垂 直 坐 标 9.1.2 颜 色 计 算 机 领 域 中 一 般 采 用 RGB 颜 色 模 型, 认 为 任 何 颜 色 都 是 由 红 (R) 绿 (G) 蓝 (B)3 种 颜 色 按 不 同 比 例 混 合 的 结 果 因 此 要 设 定 一 种 颜 色, 只 要 指 定 其 红 绿 蓝 分 量 的 大 小 即 可 Visual Basic 中 颜 色 的 表 示 就 是 基 于 这 个 概 念 要 得 到 一 种 颜 色 有 以 下 几 种 方 法 173

174 Visual Basic 程 序 设 计 1. 使 用 RGB 函 数 可 以 使 用 Visual Basic 的 内 部 函 数 RGB 返 回 一 个 颜 色 值, 此 函 数 有 3 个 参 数, 取 值 范 围 都 是 0~255, 分 别 表 示 所 要 颜 色 中 红 (R) 绿 (G) 蓝 (B) 分 量 的 大 小 如 :RGB(0,0, 0) 返 回 黑 色,RGB(255,0,0) 返 回 红 色,BGB(0,0,255) 返 回 蓝 色 2. 使 用 长 整 型 数 其 实,RGB 函 数 返 回 的 只 是 一 个 长 整 型 数 在 Visual Basic 中 颜 色 就 是 由 长 整 型 数 表 示 的, 所 以 可 以 直 接 用 长 整 型 数 来 指 定 一 个 颜 色 Visual Basic 中 表 示 一 个 颜 色 的 长 整 型 数 中 的 4 个 字 节 中, 从 高 位 到 低 位, 第 1 个 字 节 的 所 有 位 都 为 0, 第 2 个 字 节 表 示 的 是 蓝 色 (B) 分 量 的 大 小, 第 3 个 字 节 表 示 的 是 绿 色 (G) 分 量 的 大 小, 第 4 个 字 节 表 示 的 是 红 色 (R) 分 量 的 大 小 每 个 分 量 值 的 十 六 进 制 形 式 都 是 & H00~&HFF, 十 进 制 为 0~255 用 十 六 进 制 的 长 整 型 常 量 表 示 个 颜 色 值 是 很 直 观 的, 每 个 颜 色 分 量 占 两 个 十 六 进 制 位, 其 表 示 格 式 为 : &H00BBGGRR 例 如, 下 面 是 一 些 表 示 颜 色 的 长 整 型 数 &H00000000( 黑 色 ) &H00FFFFFF( 白 色 ) &H00FF0000( 浅 蓝 ) &H00800000( 深 蓝 ) &H0000FFFF( 浅 黄 ) &H00008080( 深 黄 ) 在 源 程 序 中 输 入 长 整 数 时, 编 辑 器 会 自 动 删 掉 前 面 不 必 要 的 0 3. 使 用 系 统 颜 色 如 果 一 个 表 示 颜 色 的 长 整 数 最 高 位 为 1, 即 它 的 的 第 一 个 字 节 的 值 为 &H80 时, 则 不 表 示 一 个 具 体 的 RGB 颜 色 值, 而 是 一 个 系 统 颜 色, 系 统 颜 色 是 由 用 户 在 Windows 控 制 面 板 的 显 示 器 属 性 中 设 定 的 各 界 面 元 素 ( 如 菜 单 滚 动 条 桌 面 等 ) 的 颜 色 同 一 个 系 统 颜 色 在 不 同 计 算 机 上 的 具 体 设 置 可 能 不 同 系 统 颜 色 有 25 个 ( & H80000000 ~& H80000018), 它 们 的 具 体 意 义 如 表 9-2 所 示 表 9-2 系 统 颜 色 常 量 符 号 常 量 值 描 述 vbscrollbars &H80000000 滚 动 条 颜 色 vbdesktop &H80000001 桌 面 颜 色 vbactivetitlebar &H80000002 活 动 窗 口 的 标 题 栏 颜 色 vbinactivetitlebar &H80000003 非 活 动 窗 口 的 标 题 栏 颜 色 vbmenubar &H80000004 菜 单 背 景 颜 色 vbwindowbackground &H80000005 窗 口 背 景 颜 色 vbwindowframe &H80000006 窗 口 框 架 颜 色 vbmenutext &H80000007 菜 单 上 文 本 的 颜 色 vbwindowtext &H80000008 窗 口 内 文 本 的 颜 色 174

第 9 章 Visual Basic 图 形 设 计 175 续 表 符 号 常 量 值 描 述 vbtitlebartext &H80000009 标 题 调 整 框 和 滚 动 箭 头 的 文 本 颜 色 vbactiveborder &H8000000A 活 动 窗 口 边 框 颜 色 vbinactiveborder &H8000000B 非 活 动 窗 口 边 框 颜 色 vbapplicationworkspace &H8000000C 多 文 档 界 面 (MDI) 应 用 程 序 的 背 景 颜 色 vbhighlight &H8000000D 控 件 内 选 中 项 的 背 景 色 vbhighlighttext &H8000000E 控 件 内 选 中 项 的 文 本 颜 色 vbbuttonface &H8000000F 命 令 按 钮 表 面 阴 影 颜 色 vbbuttonshadow &H80000010 命 今 按 钮 边 缘 阴 影 颜 色 vbgraytext &H80000011 无 效 文 本 颜 色 vbbuttontext &H80000012 按 钮 文 本 颜 色 vbinactivecaptiontext &H80000013 非 活 动 标 题 内 文 本 颜 色 vb3dhighlight &H80000014 三 维 显 示 元 素 的 高 亮 颜 色 vb3ddkshadow &H80000015 三 维 显 示 元 素 的 最 暗 阴 影 颜 色 vb3dlight &H80000016 低 于 vb3dhighlight 的 三 维 次 高 亮 颜 色 vbinfotext &H80000017 提 示 窗 内 文 字 的 颜 色 vbinfobackground &H80000018 提 示 窗 内 背 景 的 颜 色 4. 使 用 颜 色 常 量 Visual Basic 为 一 些 常 用 颜 色 定 义 了 内 部 常 量, 颜 色 常 量 的 特 点 是 直 观 易 于 记 忆 Visual Basic 中 的 颜 色 常 量 如 表 9-3 所 示 表 9-3 Visual Basic 中 的 常 用 颜 色 常 量 常 量 值 颜 色 常 量 值 颜 色 vbblack &H0 黑 色 vbred &HFF 红 色 vbgreen &HFF00 绿 色 vbyellow &HFFFF 黄 色 vbblue &HFF0000 蓝 色 vbmagenta &HFF00FF 洋 红 vbcyan &HFFFF00 青 色 vbwhite &HFFFFFF 白 色 5. 使 用 QBColor 函 数 Visual Basic 保 留 了 Quick Basic 的 QBColor 函 数 该 函 数 用 一 个 整 数 值 对 应 RGB 的 常 用 颜 色 值 其 格 式 如 下 : QBColor( 颜 色 值 ) 其 中, 颜 色 值 的 取 值 范 围 为 0~15, 共 可 表 示 16 种 颜 色 函 数 根 据 参 数 颜 色 值 返 回 一 个 表 示 颜 色 的 长 整 型 数 不 同 的 参 数 值 与 返 回 值 之 间 的 对 应 关 系 如 表 9-4 所 示 175

176 Visual Basic 程 序 设 计 表 9-4 QBColor 函 数 的 取 值 参 数 值 颜 色 参 数 值 颜 色 参 数 值 颜 色 参 数 值 颜 色 0 黑 色 4 红 色 8 灰 色 12 亮 红 色 1 蓝 色 5 洋 红 色 9 亮 蓝 色 13 亮 洋 红 色 2 绿 色 6 黄 色 10 亮 绿 色 14 亮 黄 色 3 青 色 7 白 色 11 亮 青 色 15 亮 白 色 9.2 图 形 控 件 图 形 控 件 用 于 在 对 象 ( 窗 体 图 片 框 ) 中 绘 制 特 定 形 状 的 图 形, 如 圆 矩 形 直 线 等 图 形 控 件 的 属 性 既 可 以 在 设 计 阶 段 设 置, 也 可 以 在 运 行 阶 段 由 程 序 动 态 地 改 变 9.2.1 Shape 控 件 Shape 控 件 用 于 在 窗 体 或 图 片 框 中 绘 制 常 见 的 几 何 图 形 通 过 设 置 Shape 控 件 的 Shape 属 性 可 以 画 出 多 种 图 形 Shape 属 性 具 有 表 9-5 所 示 的 几 种 设 置 值 表 9-5 Shape 控 件 的 Shape 属 性 值 设 置 值 常 量 形 状 设 置 值 常 量 形 状 0 vbshaperectangle 默 认 值, 矩 形 3 vbshapecircle 圆 形 1 vbshapesquare 正 方 形 4 vbshaperoundedrectangle 圆 角 矩 形 2 vbshapeoval 椭 圆 形 5 vbshaperoundedsquare 圆 角 正 方 形 例 9.2 在 窗 体 中 使 用 Shape 控 件, 画 出 不 同 形 状 的 图 形 窗 体 中 设 置 1 个 Shape 控 件 Shape1 和 一 个 单 选 按 钮 Option1, 将 Option1 的 Index 属 性 设 置 为 0, 创 建 一 个 只 有 一 个 元 素 的 控 件 数 组 程 序 运 行 后 如 图 9.2 所 示, 每 次 单 击 单 选 按 钮, 能 看 到 对 应 的 形 状 图 9.2 用 Shape 控 件 画 出 不 同 形 状 的 图 形 176

第 9 章 Visual Basic 图 形 设 计 177 程 序 代 码 如 下 : Private Sub Form_Load() Dim a(5), i a(0) = " 矩 形 " a(1) = " 正 方 形 " a(2) = " 椭 圆 形 " a(3) = " 圆 形 " a(4) = " 圆 角 矩 形 " a(5) = " 圆 角 正 方 形 " Option1(0).Caption = 0 & ":" & a(0) For i = 1 To 5 ' 创 建 Option1 的 另 外 5 个 元 素 Load Option1(i) ' 为 新 的 单 选 按 钮 设 置 位 置 Option1(i).Top = Option1(i - 1).Top + Option1(0).Height + 30 ' 设 置 单 选 按 钮 的 标 题 Option1(i).Caption = i & ":" & a(i) Option1(i).Visible = True Next i Private Sub Option1_Click(Index As Integer) Shape1.Shape = Index 9.2.2 Line 控 件 Line 控 件 为 用 户 提 供 了 在 容 器 对 象 中 画 直 线 的 方 法 简 单 地 改 变 Line 控 件 的 BorderStyle 属 性 即 可 画 出 多 种 线 型 的 直 线 表 9-6 列 出 了 BorderStyle 属 性 的 设 置 值 表 9-6 BorderStyle 属 性 取 值 设 置 值 常 量 形 状 0 vbtransparent 透 明, 忽 略 BorderWidth 属 性 1 vbbssolid ( 默 认 值 ) 实 线, 边 框 处 于 形 状 边 缘 的 中 心 2 vbbddash 虚 线, 当 BorderWidth 属 性 为 1 时 有 效 3 vbbsdot 点 线, 当 BorderWidth 属 性 为 1 时 有 效 4 bbsdashdot 点 划 线, 当 BorderWidth 属 性 为 1 时 有 效 5 vbbsdashdotdot 双 点 划 线, 当 BorderWidth 属 性 为 1 时 有 效 6 vbbsinsidesolid 内 收 实 线, 边 框 的 外 边 界 就 是 形 状 的 外 边 缘 例 9.3 设 计 一 个 简 单 的 秒 表 在 窗 体 上 放 一 个 图 片 框 Picture1, 在 Picture1 中 用 Shape 控 件 画 一 个 圆, 再 画 4 个 显 示 数 字 的 标 签, 用 Line 控 件 画 一 直 线 Line1 作 为 秒 针 再 在 窗 体 中 放 置 一 个 定 时 器 控 件 Timer1 和 两 个 命 令 按 钮 运 行 时, 单 击 开 始 按 钮 (Command1) 后 秒 针 开 始 旋 转, 单 击 停 止 按 钮 (Command2) 后 秒 针 停 止 旋 转, 如 图 9.3 所 示 177

178 Visual Basic 程 序 设 计 图 9.3 用 Line 控 件 实 现 的 秒 针 程 序 代 码 如 下 : Dim arph ' 定 义 秒 针 旋 转 角 度 Private Sub Command1_Click() Timer1.Enabled = True Private Sub Command2_Click() Timer1.Enabled = False Private Sub Form_Load() Timer1.Enabled = False Timer1.Interval = 1000 Picture1.Scale (-1, 1)-(1, -1) ' 自 定 义 图 片 框 的 坐 标 系 Line1.X1 = 0 ' 设 置 秒 针 两 端 点 的 坐 标, 使 其 指 向 刻 度 0 Line1.Y1 = 0 Line1.X2 = 0 Line1.Y2 = 0.7 arph = 0 ' 初 始 旋 转 角 度 为 0 Private Sub Timer1_Timer() arph = arph + 3.14159 / 30 Line1.Y2 = 0.7 * Cos(arph) Line1.X2 = 0.7 * Sin(arph) 9.3 绘 图 方 法 9.3.1 画 点 方 法 画 点 方 法 (Pset) 可 以 在 窗 体 或 图 片 框 的 指 定 位 置 上 使 用 指 定 颜 色 画 一 个 点 PSet 方 法 的 语 法 如 下 : [object.]pset [step] (x, y) [,color] 其 中,Object 为 窗 体 或 图 片 框 的 对 象 名 [Step](x,y) 指 定 画 点 位 置 的 坐 标 如 没 有 指 定 Step 关 键 字, 则 (x,y) 指 的 是 绝 对 坐 标 178

第 9 章 Visual Basic 图 形 设 计 179 ( 相 对 于 窗 体 或 图 片 框 绘 图 区 的 左 上 角 ), 如 果 指 定 Step 关 键 字, 则 (x,y) 表 示 的 是 相 对 于 (CurrentX,CurrentY) 点 的 相 对 坐 标 注 意, 把 坐 标 参 数 (x,y) 括 起 来 的 小 括 号 是 不 可 少 的 参 数 color 用 来 指 定 点 的 颜 色, 它 可 以 是 长 整 型 数 常 量 或 颜 色 函 数 如 果 没 有 指 定 color,pset 将 点 的 颜 色 设 置 为 前 景 色 (ForeColor) PSet 方 法 执 行 完 后, 对 象 的 CurrentX CurrentY 属 性 值 会 被 自 动 设 置 为 画 点 位 置 的 绝 对 坐 标 例 9.4 单 击 窗 体 时, 用 Pset 方 法 在 窗 体 上 绘 制 一 条 正 弦 曲 线 为 了 便 于 确 定 正 弦 曲 线 中 每 一 点 的 坐 标, 使 用 Scale 方 法 定 义 窗 体 的 水 平 坐 标 从 左 到 右 为 0 到 360, 垂 直 坐 标 从 下 到 上 为 -1~1, 即 Scale(0,1)-(360,-1) 运 行 时 单 击 窗 体, 显 示 结 果 如 图 9.4 所 示 窗 体 的 Click 事 件 过 程 如 下 : Private Sub Form_Click() Scale (0, 1)-(360, -1) DrawWidth = 3 ' 设 置 所 画 点 的 大 小 For x = 0 To 360 y = Sin(x * 3.14159 / 180) PSet (x, y), vbred Next x 图 9.4 在 窗 体 中 绘 制 的 一 条 正 弦 曲 线 例 9.5 用 PSet 方 法 绘 制 艺 术 图 案 在 程 序 中 用 ScaleMode 将 坐 标 系 的 刻 度 单 位 设 置 为 像 素, 在 窗 体 的 (0,0)~(300,200) 区 域 内 通 过 Pset 画 点 来 绘 制 一 幅 图 案, 点 的 颜 色 与 点 的 位 置 相 关, 通 过 一 个 椭 圆 运 算 确 定 运 行 时 单 击 窗 体, 显 示 结 果 如 图 9.5 所 示 图 9.5 用 PSet 方 法 绘 制 艺 术 图 案 179

180 Visual Basic 程 序 设 计 窗 体 的 Click 事 件 过 程 如 下 : Private Sub Form_Click() Dim PColor As Integer ScaleMode = 3 For x = 0 To 300 For y = 0 To 200 PColor = (x * x / 9 + y * y / 25) Mod 4 PSet (x, y), QBColor(PColor) Next y Next x 9.3.2 画 直 线 矩 形 方 法 (Line) Line 方 法 可 以 在 窗 体 或 图 片 框 上 绘 制 一 条 直 线 段 或 一 个 矩 形, 其 语 法 为 : [object.]line [[step] (xl, y1)]- [Step] (x2,y2) [,color] [,B[F]] 其 中 : object 为 窗 体 或 图 片 框 对 象 名 参 数 [step](x1,y1) 指 定 起 始 坐 标,[step](x2,y2) 指 定 终 止 坐 标 如 果 有 参 数 B, 则 绘 制 以 给 定 两 点 为 对 角 的 矩 形, 否 则 画 出 以 给 定 两 点 为 端 点 的 直 线 段 参 数 color 指 定 直 线 或 矩 形 边 框 的 颜 色 如 果 有 参 数 F, 则 用 边 框 颜 色 填 充 矩 形 无 参 数 B 时, 不 能 使 用 参 数 F 如 果 (x2,y2) 参 数 前 有 step 关 键 字, 表 示 是 以 起 始 点 绝 对 坐 标 为 基 准 的 相 对 坐 标 执 行 完 此 方 法 后, 对 象 的 CurrentX CurrentY 属 性 值 即 为 终 点 的 坐 标 如 果 在 调 用 Line 方 法 时, 省 略 了 参 数 [step] (xl, y1), 则 会 把 CurrentX CurrentY 属 性 的 值 作 为 起 始 点 的 坐 标, 相 当 于 step (0,0) 另 外, 调 用 一 次 带 参 数 B 的 Line 方 法 只 能 画 出 4 条 边 是 水 平 或 垂 直 的 矩 形 如 果 要 绘 制 任 意 方 向 的 矩 形, 可 以 调 用 4 次 Line 方 法 画 出 矩 形 的 4 条 边 例 9.6 使 用 Line 方 法 绘 制 几 何 图 案 运 行 时 单 击 窗 体, 显 示 结 果 如 图 9.6 所 示 图 9.6 使 用 Line 方 法 绘 制 的 几 何 图 案 180

窗 体 的 Click 事 件 过 程 如 下 : 第 9 章 Visual Basic 图 形 设 计 181 Private Sub Form_Click() Scale (1, 1)-(400, 180) xmax = 400 ymax = 180 xmin = 1 ymin = 1 s = 20 xs = (xmax - xmin) / s ys = (ymax - ymin) / s For i = 0 To s Line (xmin + xs * i, ymax)-(xmax, ymax - ys * i), vbblue Line (xmax - xs * i, ymin)-(xmax, ymax - ys * i), vbred Line (xmax - xs * i, ymin)-(xmin, ymin + ys * i), vbred Line (xmin, ymin + ys * i)-(xmin + xs * i, ymax), vbblue Next i 9.3.3 画 圆 方 法 (Circle) Circle 方 法 可 以 在 窗 体 或 图 片 框 上 绘 制 圆 形 椭 圆 或 弧, 其 语 法 为 : [object.]circle [Step] (x,y),radius [,color][,start] [,end] [,aspect] 其 中 : object 为 窗 体 或 图 片 框 对 象 名 参 数 [Step](x,y) 指 定 圆 心 或 椭 圆 中 心 的 坐 标,radius 指 定 圆 的 半 径 或 椭 圆 的 长 半 轴, color 为 线 条 颜 色 start 与 end 指 定 弧 的 起 止 角 度 ( 单 位 是 弧 度 ), 如 果 被 省 略, 则 绘 制 出 完 整 的 圆 或 椭 圆 Aspect 指 定 圆 度 ( 垂 直 半 轴 与 水 平 半 轴 长 度 之 比 ), 当 它 为 1 或 省 略 时, 绘 出 的 是 一 个 圆, 取 其 他 值 时 为 椭 圆 当 Circle 方 法 的 start 或 end 参 数 为 负 值 时, 绘 制 的 是 与 相 应 的 正 值 相 向 的 段 弧, 只 不 过 多 画 出 从 端 点 到 中 心 的 连 线 此 方 法 执 行 后, 对 象 的 CurrentX CurrentY 属 性 的 值 会 等 于 圆 心 或 椭 圆 中 心 的 坐 标 例 9.7 使 用 Circle 方 法 绘 制 艺 术 图 案 将 一 个 作 为 圆 心 轨 迹 的 圆 ( 该 圆 的 圆 心 为 (x0,y0), 半 径 为 r) 等 分 为 30 份, 以 这 30 个 等 分 点 为 圆 心 画 30 个 圆, 这 些 圆 的 圆 心 坐 标 为 (x0+r*cos(i),y0 - r*sin(i)), 其 中 i 为 从 水 平 轴 右 侧 逆 时 针 转 动 的 角 度 ( 以 弧 度 为 单 位 ) 运 行 时 单 击 窗 体, 画 出 如 图 9.7 所 示 的 具 有 艺 术 效 果 的 图 案 图 9.7 用 Circle 方 法 绘 制 的 艺 术 图 案 181

182 Visual Basic 程 序 设 计 窗 体 的 Click 事 件 过 程 如 下 : Private Sub Form_Click() r = ScaleHeight / 4 x0 = ScaleWidth / 2 y0 = ScaleHeight / 2 pi = 3.14159 For i = 0 To pi * 2 Step pi / 15 x = x0 + r * cos(i) y = y0 - r * sin(i) Circle (x, y), r * 0.8 Next i 例 9.8 模 拟 地 球 绕 太 阳 旋 转 在 窗 体 中 放 置 2 个 合 适 大 小 的 形 状 控 件 Shape1 Shape2 将 Shape1 的 shape 属 性 设 置 为 圆 形, 显 示 填 充 色 为 红 色, 用 它 代 表 太 阳 ; 将 Shape2 的 shape 属 性 设 置 为 圆 形, 显 示 填 充 色 为 蓝 色, 用 它 代 表 地 球 用 定 时 器 控 件 Timer1 控 制 地 球 运 行 速 度, 将 Timer1 的 时 间 间 隔 设 置 为 100(0.1 秒 ) 程 序 运 行 情 况 如 图 9.8 所 示 地 球 运 动 的 椭 圆 方 程 为 : x=x0+rx*cos(alfa) y=y0+ry*sin(alfa) 图 9.8 地 球 绕 太 阳 旋 转 的 模 拟 图 其 中 x0 y0 为 椭 圆 圆 心 坐 标,rx 为 水 平 半 径,ry 为 垂 直 半 径,alfa 为 圆 心 角 程 序 代 码 如 下 : Dim rx As Single, ry As Single Dim alfa As Single Private Sub Form_Load() ' 将 表 示 太 阳 的 Shape1 放 在 窗 体 的 正 中 央 Shape1.Left = Form1.ScaleWidth / 2 - Shape1.Width / 2 Shape1.Top = Form1.ScaleHeight / 2 - Shape1.Height / 2 ' 计 算 椭 圆 轨 道 的 水 平 半 径 rx 和 垂 直 半 径 ry rx = Form1.ScaleWidth / 2 - Shape2.Width / 2 ry = Form1.ScaleHeight / 2 - Shape2.Height / 2 ' 将 表 示 地 球 的 Shape2 的 初 始 位 置 定 位 在 水 平 轴 的 0 刻 度 位 置 上 Shape2.Left = Form1.ScaleWidth / 2 + rx - Shape2.Width / 2 182

第 9 章 Visual Basic 图 形 设 计 183 Shape2.Top = Form1.ScaleHeight / 2 - Shape2.Height / 2 Private Sub Timer1_Timer() alfa = alfa + 0.05 ' 绘 制 地 球 的 运 行 轨 迹 Circle (Form1.ScaleWidth / 2, Form1.ScaleHeight / 2), rx,,,, ry / rx x = Form1.ScaleWidth / 2 + rx * cos(alfa) y = Form1.ScaleHeight / 2 + ry * sin(alfa) Shape2.Left = x - Shape2.Width / 2 Shape2.Top = y - Shape2.Height / 2 9.3.4 PaintPicture 方 法 PaintPicture 方 法 用 于 在 窗 体 或 图 片 框 上 绘 制 来 自 于 磁 盘 文 件 的 图 像, 在 绘 制 时 可 以 只 绘 制 图 像 的 一 部 分, 并 进 行 缩 放 其 语 法 为 : object.paintpicture picture,x1,y1 [,width1] [,height1] [,x2] [,y2] [,width2] [,height2] [,opcode] 其 中 : object 为 窗 体 或 图 片 框 的 对 象 名 参 数 picture 指 定 要 绘 制 的 图 像, 可 以 使 用 LoadPicture 函 数 调 入 磁 盘 上 的 图 形 文 件, 也 可 以 是 窗 体 或 图 片 框 的 Picture 属 性 指 定 的 图 形 文 件 图 形 文 件 类 型 包 括.bmp.ico.wmf.emf.cur 和.dib 等 x1 y1 参 数 指 定 将 图 像 绘 制 在 窗 体 或 图 片 框 的 什 么 位 置 上 ( 坐 标 ) width1 height1 参 数 指 定 把 图 像 绘 制 在 窗 体 或 图 片 框 上 区 域 的 高 度 和 宽 度, 如 果 是 负 值, 可 以 把 图 像 翻 转 显 示 x2 y2 width2 和 height2 这 4 个 参 数 可 以 指 定 只 绘 制 图 像 的 某 个 矩 形 区 域,x2 y2 为 区 域 左 上 角 的 坐 标,width2 height2 为 绘 制 区 域 的 宽 度 和 高 度 opcode 参 数 指 定 绘 制 的 方 法, 即 绘 制 出 的 图 像 中 每 一 点 使 用 什 么 颜 色 此 颜 色 由 被 绘 制 图 像 中 每 一 个 点 的 颜 色 ( 源 像 素 ) 窗 体 或 图 片 框 上 现 有 像 素 点 的 颜 色 ( 目 标 像 素 ) 和 填 充 颜 色 ( 由 FillColor 和 FillStyle 属 性 决 定 ) 计 算 得 到, 此 计 算 实 质 上 是 表 示 颜 色 的 长 整 数 进 行 按 位 逻 辑 运 算 opcode 参 数 的 默 认 值 为 &H00CC0020, 使 用 源 像 素 颜 色 覆 盖 目 标 像 素,opcode 参 数 的 取 值 如 表 9-7 所 示 表 9-7 opcode 参 数 的 取 值 参 数 值 常 量 描 述 &H005509 vbdstinvert Not ( 目 标 像 素 ) &H00C000CA vbmergecopy ( 源 像 素 ) And ( 填 充 ) &H00BB0226 vbmergepaint (Not ( 源 像 素 )) or ( 目 标 像 素 ) &H00330008 vbnotsrccopy Not ( 源 像 素 ) &H001100A6 vbnotsrcerase Not (( 源 像 素 ) or ( 目 标 像 素 )) 183

184 Visual Basic 程 序 设 计 续 表 参 数 值 常 量 描 述 &H00F00021 vbpatcopy 只 绘 制 填 充 &H005A0049 vbpatinvert ( 填 充 ) Xor ( 目 标 像 素 ) &H00FB0A09 vbpatpaint (Not ( 源 像 素 ) Or ( 填 充 )) Or ( 目 标 像 素 ) &H008800C6 vbsrcand ( 源 像 素 ) And ( 目 标 像 素 ) &H00CC0020 vbsrccopy 使 用 源 像 素 颜 色 &H00440328 vbsrcerase ( 源 像 素 ) And (Not ( 目 标 像 素 )) &H00660046 vbsrcinvert ( 源 像 素 ) Xor ( 目 标 像 素 ) &H00EE0086 vbsrcpaint ( 源 像 素 ) Or ( 目 标 像 素 ) 如 果 省 略 所 有 的 可 选 参 数, 则 PaintPicture 方 法 会 把 整 个 图 像 按 原 来 的 颜 色 和 大 小 绘 制 到 指 定 的 位 置 上 例 9.9 使 用 PaintPicture 方 法 对 图 像 进 行 变 形 裁 剪 和 翻 转 处 理 在 窗 体 中 放 置 4 个 图 片 框 (Picture1 Picture2 Picture3 和 Picture4), 在 图 片 框 Picture1 中 显 示 源 图 形 文 件, 单 击 窗 体 后, 分 别 在 图 片 框 Picture2~Picture4 中 显 示 该 原 始 图 片 经 过 变 形 裁 剪 和 翻 转 后 的 效 果 程 序 运 行 情 况 如 图 9.9 所 示 程 序 代 码 如 下 : 图 9.9 对 图 形 的 变 形 裁 剪 和 翻 转 处 理 效 果 Private Sub Form_Click() ' 把 源 图 形 的 宽 度 拉 伸 1 倍, 绘 制 在 图 片 框 Picture2 中 Picture2.PaintPicture Picture1.Picture, 0, 0, Picture1.Width * 2, Picture1.Height ' 裁 剪 源 图 形 的 上 半 部 分, 绘 制 在 图 片 框 Picture3 中 Picture3.PaintPicture Picture1.Picture, 0, 0,,, 0, 0, Picture1.Width, Picture1.Height / 2 ' 将 源 图 形 旋 转 180 后, 绘 制 在 图 片 框 Picture4 中 Picture4.PaintPicture Picture1.Picture, Picture1.Width + 1, Picture1.Height + 1, -Picture1.Width, -Picture1.Height ' 将 源 图 形 垂 直 翻 转 后 放 大, 绘 制 在 图 片 框 Picture4 中 Picture4.PaintPicture Picture1.Picture, Picture1.Width + 100, Picture1.Height * 1.5, Picture1.Width * 2, -Picture1.Height * 1.5 184

第 9 章 Visual Basic 图 形 设 计 185 使 用 PaintPicture 方 法 绘 制 在 窗 体 或 图 片 框 上 的 图 像, 与 窗 体 和 图 片 框 的 Picture 属 性 设 定 的 背 景 图 像 有 着 根 本 的 区 别 背 景 图 像 不 会 被 擦 除 ( 除 非 改 变 了 Picture 属 性 的 值 ), 显 示 的 位 置 不 能 改 变 ; 绘 制 的 图 像 可 以 指 定 位 置, 可 以 被 擦 除 使 用 窗 体 和 图 片 框 的 绘 图 方 法 绘 制 的 图 形 和 图 像 与 Shape 控 件 Image 控 件 Line 控 件 等 也 有 着 本 质 的 不 同 绘 制 的 图 形 图 像 只 是 临 时 显 示 在 屏 幕 上, 基 本 上 不 占 用 内 存, 而 各 类 控 件 作 为 对 象 具 有 属 性 事 件 和 方 法, 除 了 在 屏 幕 上 显 示 相 应 的 图 形 图 像 之 外, 还 会 占 用 一 定 的 内 存 9.4 与 绘 图 有 关 的 常 用 属 性 和 事 件 9.4.1 清 除 图 形 方 法 Cls 方 法 用 来 清 除 窗 体 或 图 片 框 上 由 Print PSet Line Circle 等 方 法 输 出 的 文 字 图 形 和 图 像 清 除 之 后 CurrentX 和 CurrentY 属 性 值 都 被 设 为 0 其 格 式 为 : [object.] Cls 其 中,object 是 窗 体 或 图 片 框 的 对 象 名 Cls 方 法 没 有 参 数 Cls 方 法 不 会 清 除 窗 体 和 图 片 框 上 由 Picture 属 性 设 置 的 背 景 图 像, 更 不 会 清 除 窗 体 或 图 片 框 上 的 控 件 对 象 9.4.2 线 宽 属 性 和 线 型 属 性 DrawWidth 属 性 设 置 绘 图 方 法 绘 制 的 图 形 的 线 条 样 式, 其 取 值 范 围 从 1~32767, 以 像 素 为 单 位 默 认 值 为 1, 即 一 个 像 素 宽 如 果 DrawWidth 属 性 值 大 于 1, 画 出 的 图 形 是 实 线 ; 如 果 DrawWidth 属 性 值 等 于 1, 可 以 画 出 由 DrawStyle 定 义 的 各 种 线 型 DrawStyle 属 性 设 置 绘 图 方 法 绘 制 的 图 形 的 线 条 宽 度 此 属 性 的 取 值 为 0~6, 具 体 意 义 如 表 9-8 所 示 表 9-8 DrawStyle 属 性 值 设 置 值 常 量 线 型 设 置 值 常 量 线 型 0 VbSolid 实 线, 默 认 值 4 vbdashdotdot 双 点 划 线 1 VbDash 虚 线 5 vbinvisible 无 线 2 VbDot 点 线 6 vbinsidesolid 内 收 实 线 3 vbdashdot 点 划 线 9.4.3 填 充 颜 色 属 性 和 填 充 样 式 属 性 FillColor 属 性 设 置 由 Circle 和 Line 方 法 生 成 的 圆 矩 形 等 封 闭 图 形 的 内 部 填 充 颜 色 FillStyle 属 性 设 置 Shape 控 件 所 画 图 形 的 填 充 样 式, 也 可 以 设 置 由 Circle 和 Line 图 形 185

186 Visual Basic 程 序 设 计 方 法 生 成 的 封 闭 图 形 的 填 充 样 式 此 属 性 的 取 值 为 0~7, 具 体 意 义 如 表 9-9 所 示 FillStyle 属 性 的 默 认 值 为 1( 透 明 ), 此 时,FillColor 属 性 的 值 被 忽 略 表 9-9 FillStyle 属 性 值 设 置 值 常 量 填 充 样 式 设 置 值 常 量 填 充 样 式 0 vbfssolid 实 心 4 vbupwarddiagonal 上 斜 对 角 线 1 vbfstransparent 透 明, 默 认 值 5 vbdownwarddiagonal 下 斜 对 角 线 2 vbhorizontalline 水 平 直 线 6 vbcross 十 字 线 3 vbverticalline 垂 直 直 线 7 vbdiagonalcross 交 叉 对 角 线 9.4.4 自 动 重 画 属 性 应 用 程 序 在 运 行 时 其 窗 体 经 常 被 移 动 或 被 其 他 窗 体 覆 盖, 要 想 保 持 窗 体 中 的 内 容 ( 图 形 等 ) 不 丢 失, 就 要 在 窗 体 移 动 改 变 大 小 或 覆 盖 它 的 窗 体 移 开 后, 重 新 显 示 ( 绘 制 ) 窗 体 中 的 内 容 一 般 来 说,Windows 管 理 和 控 制 窗 口 控 件 的 重 新 显 示, 而 窗 体 和 图 片 框 内 图 形 的 重 新 显 示 必 须 由 用 户 的 应 用 程 序 来 控 制 AutoReDraw 属 性 就 提 供 了 重 新 显 示 窗 体 和 图 片 框 内 图 形 的 功 能 当 AutoReDraw 属 性 设 置 为 False( 默 认 值 ) 时, 对 象 中 的 图 形 不 具 有 持 久 性, 即 当 窗 体 或 图 片 框 全 部 或 部 分 被 其 他 窗 体 遮 盖 再 重 新 显 示 时, 绘 图 方 法 产 生 的 图 形 不 会 被 自 动 重 画, 对 象 上 的 图 形 将 丢 失 当 AutoRedraw 属 性 设 置 为 True 时, 表 示 对 象 的 自 动 重 画 功 能 有 效, 使 用 绘 图 方 法 绘 制 的 图 形 会 被 保 存 在 内 存 中, 当 窗 体 或 图 片 框 的 全 部 或 部 分 被 其 他 窗 体 遮 盖 又 显 示 出 来 后, 图 形 会 自 动 重 画 例 9.10 AutoRedraw 属 性 的 使 用 示 例 在 窗 体 中 的 右 方 放 置 两 个 命 令 按 钮 Command1 Command2 和 一 个 PictureBox 控 件 Picture1 程 序 运 行 时, 单 击 窗 体, 当 AutoReDraw 属 性 为 True 时 在 窗 体 上 画 一 个 绿 色 实 心 圆, 当 AutoReDraw 属 性 为 Flase 时 在 窗 体 上 画 一 个 红 色 实 心 圆 单 击 覆 盖 按 钮 (Command1) 后, 将 图 片 框 Picture1 移 去, 同 时 覆 盖 两 种 颜 色 的 实 心 圆 ; 单 击 移 开 按 钮 (Command2), 使 图 片 框 Picture1 移 开, 此 时 会 发 现 绿 色 实 心 圆 将 完 整 地 再 现, 而 红 色 实 心 圆 被 图 片 框 遮 住 的 部 分 没 有 被 重 画 运 行 情 况 如 图 9.10 所 示 图 9.10 AutoRedraw 属 性 的 使 用 示 例 186

第 9 章 Visual Basic 图 形 设 计 187 程 序 代 码 如 下 : Private Sub Form_Click() ScaleWidth = 100 AutoRedraw = True FillColor = vbgreen FillStyle = 0 Circle (20, ScaleHeight / 2), 15 AutoRedraw = False FillColor = vbred Circle (50, ScaleHeight / 2), 15 Private Sub Command1_Click() Picture1.Top = ScaleHeight / 2 - Picture1.Height / 2 Picture1.Left = 35 - Picture1.Width / 2 Private Sub Command2_Click() Picture1.Top = ScaleHeight - Picture1.Height Picture1.Left = ScaleWidth - Picture1.Width 9.4.5 Paint 事 件 在 应 用 程 序 运 行 时, 当 一 个 对 象 ( 如 窗 体 或 图 片 框 ) 被 移 动 或 改 变 大 小 之 后, 或 当 一 个 覆 盖 该 对 象 的 窗 体 被 移 开 之 后, 如 果 要 保 持 该 对 象 上 所 画 图 形 的 完 整 性 ( 重 现 原 来 的 图 形 ), 可 以 选 择 触 发 Paint 事 件 来 完 成 图 形 的 重 画 工 作 窗 体 与 图 片 框 支 持 Paint 事 件 这 样 当 窗 体 图 片 框 被 遮 盖 后 又 显 示 出 来 或 被 缩 放 时, Visual Basic 向 窗 体 或 图 片 框 发 送 Paint 事 件, 允 许 程 序 ( 写 在 其 Paint 事 件 过 程 中 ) 进 行 重 新 绘 制 使 用 Refresh 方 法 时, 也 将 触 发 Paint 事 件 因 此, 在 改 变 窗 体 大 小 后, 应 在 Resize 事 件 过 程 中 调 用 Refresh 方 法, 强 制 对 象 通 过 Paint 事 件 重 画 图 形 需 要 注 意 的 是, 当 窗 体 或 图 片 框 的 AutoRedraw 属 性 设 为 True 时, 不 引 发 Paint 事 件, 即 不 执 行 Paint 事 件 过 程 中 的 代 码 只 有 当 AutoRedraw 属 性 值 为 False 时, 才 执 行 Paint 事 件 过 程 例 9.11 在 窗 体 中 心 画 一 个 黄 色 米 字 格, 当 窗 体 的 大 小 改 变 时, 米 字 格 也 随 着 自 动 调 整, 如 图 9.11 所 示 (a) 图 9.11 例 9.11 的 运 行 界 面 (b) 187

188 Visual Basic 程 序 设 计 程 序 代 码 如 下 : Private Sub Form_Paint() ' 计 算 窗 体 中 心 坐 标 CenterX = ScaleLeft + ScaleWidth / 2 CenterY = ScaleTop + ScaleHeight / 2 ' 计 算 米 字 格 的 边 长 If ScaleWidth < ScaleHeight Then HalfWidth = ScaleWidth / 2-100 Else HalfWidth = ScaleHeight / 2-100 End If ' 设 置 米 字 格 正 方 形 的 填 充 颜 色 和 样 式 FillColor = vbyellow FillStyle = 0 ' 画 米 字 格 正 方 形 Line (CenterX - HalfWidth, CenterY - HalfWidth)-(CenterX + HalfWidth, CenterY + HalfWidth),, B ' 画 两 条 对 角 线 Line (CenterX - HalfWidth, CenterY - HalfWidth)-(CenterX + HalfWidth, CenterY + HalfWidth) Line (CenterX - HalfWidth, CenterY + HalfWidth)-(CenterX + HalfWidth, CenterY - HalfWidth) ' 画 十 字 形 状 Line (CenterX, CenterY - HalfWidth)-(CenterX, CenterY + HalfWidth) Line (CenterX - HalfWidth, CenterY)-(CenterX + HalfWidth, CenterY) Private Sub Form_Resize() Refresh 9.5 小 结 Visual Basic 为 程 序 设 计 者 提 供 了 非 常 丰 富 的 绘 图 功 能 设 计 程 序 时, 不 仅 可 以 使 用 Visual Basic 提 供 的 图 形 控 件 来 画 图, 还 可 以 调 用 图 形 方 法 绘 制 丰 富 多 彩 的 艺 术 图 形 坐 标 系 统 是 图 形 处 理 的 基 本 概 念, 它 包 括 原 点 位 置 坐 标 单 位 以 及 坐 标 轴 的 方 向 等 几 方 面 内 容 在 窗 体 和 图 片 框 中 绘 图 时,Visual Basic 提 供 了 7 种 标 准 坐 标 系 统 供 选 用 此 外, 还 可 以 使 用 自 定 义 坐 标 系 统 在 Visual Basic 中, 要 得 到 一 种 颜 色 有 5 种 方 法 : 使 用 RGB 函 数 使 用 长 整 型 数 使 用 系 统 颜 色 使 用 颜 色 常 量 使 用 QBColor 函 数 图 形 控 件 包 括 Line 控 件 和 Shape 控 件, 用 于 在 对 象 ( 窗 体 图 片 框 ) 中 绘 制 特 定 形 状 的 图 形, 如 直 线 圆 矩 形 等 图 形 控 件 的 属 性 既 可 以 在 设 计 阶 段 设 置, 也 可 以 在 运 行 阶 段 由 程 序 动 态 地 改 变 Visual Basic 中 提 供 了 一 些 方 法, 用 于 在 窗 体 或 图 片 框 中 直 接 绘 制 图 形 其 中,PSet 方 法 可 以 在 窗 体 或 图 片 框 的 指 定 位 置 上 使 用 指 定 颜 色 画 一 个 点 PSet 方 法 的 语 法 为 : 188

第 9 章 Visual Basic 图 形 设 计 189 [object.]pset [step] (x, y) [,color] Line 方 法 可 以 在 窗 体 或 图 片 框 上 绘 制 一 条 直 线 段 或 一 个 矩 形, 其 语 法 为 : [object.]line [[step] (xl, y1)]- [Step] (x2,y2) [,color] [,B[F]] Circle 方 法 可 以 在 窗 体 或 图 片 框 上 绘 制 圆 形 椭 圆 或 弧, 其 语 法 为 : [object.]circle [Step] (x,y),radius [,color][,start] [,end] [,aspect] Visual Basic 中 与 绘 图 有 关 的 常 用 属 性 有 线 宽 属 性 DrawWidth 线 型 属 性 DrawStyle 填 充 颜 色 属 性 FillColor 填 充 样 式 属 性 FillStyle 和 自 动 重 画 属 性 AutoReDraw 等 9.6 习 题 一 选 择 题 1. 坐 标 系 中 默 认 的 刻 度 单 位 是 缇, 可 以 根 据 需 要, 用 ( ) 属 性 来 改 变 其 刻 度 单 位 A) DrawStyle 属 性 B) ScaleHeight 属 性 C) ScaleWidth 属 性 D) ScaleMode 属 性 2. 执 行 下 列 程 序 段 后, 窗 体 Form1 右 下 角 的 坐 标 为 ( ) Form1.ScaleTop=1 Form1.ScaleLeft=1 Form1.ScaleHeight=-2 Form1.ScaleWidth=2 A) (1,1) B) (1,2) C) (-2,2) D) (3,-1) 3. 如 果 用 长 整 数 &H00FF0000& 来 表 示 颜 色, 则 此 颜 色 为 ( ) A) 红 色 B) 黄 色 C) 蓝 色 D) 绿 色 4. 通 过 设 置 Line 控 件 的 ( ) 属 性, 可 以 绘 制 虚 线 点 线 点 划 线 等 各 种 样 式 的 图 形 A) Line B) Style C) FillStyle D) BorderStyle 5. 当 使 用 Line 方 法 画 直 线 后, 当 前 坐 标 在 ( ) A) (0,0) B) 直 线 起 点 C) 直 线 终 点 D) 容 器 的 中 心 6. 执 行 指 令 Line(1200,1200) Step(1000,500) 后,CurrentX=( ) A) 2200 B) 1200 C) 1000 D) 1700 二 阅 读 下 列 程 序, 写 出 运 行 结 果 1. Private Sub Form_Click( ) For i = 1 To 100 xpos = ScaleWidth / 2 ypos = ScaleHeight / 2 r = Int(Rnd * 256) g = Int(Rnd * 256) b = Int(Rnd * 256) 189

190 Visual Basic 程 序 设 计 If ScaleWidth < ScaleHeight Then radius = Int(ScaleWidth / 2 * Rnd) Else radius = Int(ScaleHeight / 2 * Rnd) End If Circle (xpos, ypos), radius, RGB(r, g, b) Next i 2. Private Sub Form_Click( ) Scale (0, 1)-(360, -1) DrawWidth = 2 pi = 3.14159 For x = 0 To 360 y = cos(x * pi / 180) PSet (x, y), vbred y = sin(x * pi / 180) PSet (x, y), vbblue Next x 三 编 程 题 1. 用 Line 方 法 画 图, 如 图 9.12 所 示 要 求 运 行 时 图 形 将 随 着 窗 体 尺 寸 的 改 变 而 自 动 调 整 图 9.12 编 程 题 1 的 效 果 图 2. 输 入 某 班 学 生 某 门 课 程 成 绩, 统 计 成 绩 在 90~100 分 80~89 分 70~79 分 60~ 69 分 和 不 及 格 等 各 个 分 数 段 的 人 数, 且 以 饼 形 图 的 形 式 显 示 各 个 分 数 段 人 数 占 总 人 数 的 比 例 190

第 10 章 文 件 教 学 提 示 : 大 多 数 的 应 用 程 序 都 需 要 进 行 数 据 的 存 储 及 读 取 操 作, 而 要 在 外 存 上 存 放 数 据, 必 须 使 用 文 件 对 于 文 件 的 操 作 主 要 是 进 行 数 据 的 读 取 保 存 及 修 改 等 操 作 教 学 目 标 : 掌 握 不 同 访 问 类 型 文 件 的 存 取 操 作, 尤 其 是 顺 序 文 件 及 随 机 文 件 的 使 用 熟 练 掌 握 文 件 系 统 控 件 的 使 用 掌 握 FileSystemObject(FSO) 对 象 模 型 的 基 本 特 点 及 使 用 方 法 10.1 文 件 的 基 本 概 念 计 算 机 中 的 文 件 一 般 指 具 有 符 号 名 的 数 据 信 息 的 集 合 该 符 号 名 是 用 以 标 识 文 件 的, 称 为 文 件 名 文 件 在 计 算 机 中 的 地 位 是 非 常 重 要 的, 在 日 常 的 实 用 程 序 中, 经 常 要 与 文 件 打 交 道, 各 种 应 用 信 息 如 通 信 录 职 工 的 工 资 表 人 事 档 案 表 设 备 表 等 给 予 命 名 后 均 可 作 为 一 个 文 件 系 统 中 的 文 件 一 般 分 很 多 类 型, 不 同 类 型 文 件 的 操 作 方 法 也 有 所 不 同 10.1.1 文 件 的 类 型 为 了 便 于 管 理 和 控 制 文 件, 通 常 将 文 件 分 成 若 干 类 型 按 照 文 件 的 存 取 方 式 及 其 组 成 结 构 可 以 将 文 件 分 为 两 种 类 型 : 顺 序 文 件 和 随 机 文 件 ; 按 照 文 件 的 特 征 属 性 可 以 将 文 件 分 为 系 统 文 件 隐 藏 文 件 只 读 文 件 普 通 文 件 和 存 档 文 件 ; 按 照 文 件 的 数 据 组 织 形 式 可 以 将 文 件 分 为 ASCII 文 件 和 二 进 制 文 件, 其 中 ASCII 码 文 件 又 称 为 文 本 文 件 ; 按 文 件 中 的 数 据 可 将 文 件 分 为 程 序 文 件 和 数 据 文 件 在 使 用 文 件 时, 应 根 据 文 件 包 括 什 么 类 型 的 数 据, 确 定 合 适 的 文 件 访 问 类 型 在 Visual Basic 中, 有 3 种 文 件 访 问 类 型, 即 顺 序 型 文 件 随 机 型 文 件 和 二 进 制 型 文 件 顺 序 型 文 件 : 是 普 通 的 文 本 文 件 文 件 中 每 个 字 节 存 放 的 是 该 字 节 所 表 示 的 字 符 的 ASCII 码 值 随 机 型 文 件 : 简 称 随 机 文 件, 是 由 固 定 长 度 的 记 录 集 合 组 成 数 据 一 般 以 二 进 制 方 式 存 储 二 进 制 型 文 件 : 简 称 二 进 制 文 件, 是 将 数 据 按 照 内 存 中 的 存 储 格 式 来 表 示, 允 许 程 序 按 所 需 的 任 何 方 式 组 织 和 访 问 数 据 除 了 没 有 数 据 类 型 或 记 录 长 度 的 含 义 以 外, 它 与 随 机 文 件 很 相 似 然 而, 为 了 能 够 正 确 地 检 索, 必 须 精 确 地 知 道 数 据 是 如 何 写 到 文 件 中 的 10.1.2 文 件 访 问 函 数 和 语 句 表 10-1 列 出 了 可 用 于 3 种 文 件 访 问 类 型 的 各 种 文 件 访 问 的 语 句 和 函 数

192 Visual Basic 程 序 设 计 表 10-1 可 用 于 3 种 文 件 访 问 类 型 的 各 种 文 件 访 问 语 句 和 函 数 语 句 与 函 数 顺 序 型 随 机 型 二 进 制 型 Open Close Input( ) Input# Line Input# Print # Write # Get Put Type End Type 10.2 顺 序 文 件 顺 序 文 件 是 普 通 的 文 本 文 件, 是 一 种 结 构 比 较 简 单 的 格 式 它 的 存 储 方 式 是 顺 序 存 储, 即 数 据 是 一 个 接 一 个 地 顺 序 写 入 文 件 中 的 这 种 方 式 只 提 供 了 第 一 个 数 据 的 存 储 位 置, 其 他 数 据 的 位 置 则 无 法 获 得, 因 此, 要 对 文 件 内 部 进 行 修 改, 就 必 须 将 整 个 文 件 读 到 内 存 中 进 行, 然 后 再 写 回 文 件 这 种 数 据 存 取 方 式 简 单, 占 用 磁 盘 空 间 较 少, 但 是 无 法 灵 活 而 随 意 地 存 取 文 件 数 据, 仅 适 用 于 不 经 常 修 改 的 数 据 的 存 储 顺 序 文 件 的 打 开 与 关 闭 读 取 和 写 入 在 Visual Basic 中 均 有 相 应 的 语 句 10.2.1 顺 序 文 件 的 打 开 与 关 闭 要 对 文 件 进 行 操 作, 第 一 步 就 是 要 先 打 开 文 件 Visual Basic 提 供 了 Open 语 句, 使 用 该 语 句, 用 户 可 以 用 顺 序 随 机 或 二 进 制 方 式 打 开 文 件 Open 语 句 的 语 法 格 式 如 下 : Open FileName [For Mode] [Access access][locktype] As [#] FileNumber [Len=RecordLenth] 其 中,FileName 为 要 操 作 的 文 件 名 ;For 子 句 中 的 Mode 用 来 描 述 打 开 模 式 :Output Append Input Random 或 Binary, 其 中 Output 模 式 打 开 的 文 件 用 来 写 入 ;Append 模 式 打 开 的 文 件 用 来 在 文 件 尾 部 追 加 数 据 ;Input 模 式 打 开 的 文 件 用 来 从 文 件 中 读 取 数 据 ;Random 模 式 打 开 的 文 件 用 来 对 文 件 读 取 或 写 入 定 长 记 录 ;Binary 模 式 打 开 的 文 件 用 来 读 取 或 写 入, 但 不 要 求 记 录 定 长 Access 子 句 中 的 access 用 来 指 定 文 件 的 存 取 权 限 :Read( 只 读 ) Write( 只 写 ) 或 ReadWrite( 可 读 或 写 );LockType 设 置 文 件 打 开 后 其 他 进 程 对 打 开 的 文 件 所 能 进 行 的 操 作, 可 设 置 为 Shared Lock LockRead LockWrite 和 LockReadWrite 等 192

第 10 章 文 件 193 FileNumber 用 来 标 识 打 开 文 件 的 句 柄, 它 必 须 是 1 到 511 之 间 的 整 数, 打 开 文 件 后 就 可 通 过 FileNumber 来 读 写 文 件 及 关 闭 文 件 ; 在 Len 子 句 中,RecordLength 用 于 设 置 以 Random 方 式 打 开 的 文 件 中 记 录 的 长 度 ( 以 字 节 为 基 本 单 位 ), 默 认 的 RecordLength 为 128 在 对 顺 序 文 件 进 行 操 作 时, 可 用 Input Output 和 Append 模 式 打 开 文 件 ; 在 对 随 机 文 件 进 行 操 作 时, 可 用 Random 模 式 打 开 文 件 ; 在 对 二 进 制 类 型 文 件 进 行 操 作 时, 可 用 Binary 模 式 打 开 文 件 在 完 成 对 文 件 的 各 种 处 理 后, 还 需 关 闭 文 件 以 防 数 据 丢 失, 这 由 Close 语 句 完 成 它 的 语 法 格 式 如 下 : Close [[#]FileNumber] 其 中,FileNumber 参 数 是 Open 语 句 打 开 文 件 时 指 定 的 句 柄 当 执 行 Close 语 句 时, 与 FileNumber 相 对 应 的 文 件 被 关 闭, 以 后 可 以 用 相 同 或 不 同 的 文 件 号 重 新 打 开 此 文 件 例 10.1 使 用 Open 语 句 打 开 文 件 示 例 (1) 以 顺 序 模 式 打 开 E:\VB\VB.txt 文 件, 并 从 中 读 取 数 据 Open "E:\VB\VB.txt" For Input As #1 (2) 以 只 允 许 写 操 作 的 二 进 制 方 式 打 开 E:\VB\VB1.txt 文 件 Open "E:\VB\VB1.txt" For Binary Access Write As #2 (3) 以 顺 序 方 式 打 开 E:\VB\VB3.txt 文 件 进 行 写 操 作 Open "E:\VB\VB3.txt" For Output As #3 例 10.2 使 用 Close 语 句 关 闭 文 件 示 例 (1) 关 闭 E:\VB\VB.txt 文 件 Close #1 (2) 关 闭 E:\VB\VB1.txt 文 件 Close #2 (3) 关 闭 E:\VB\VB3.txt 文 件 Close #3 10.2.2 顺 序 文 件 的 读 写 对 顺 序 文 件 可 以 用 相 应 的 方 法 进 行 写 入 操 作, 掌 握 了 正 确 的 操 作 方 法 就 可 以 灵 活 使 用 文 件 1. 顺 序 文 件 的 读 取 Visual Basic 提 供 了 以 下 过 程 和 函 数 对 文 件 进 行 读 操 作 : Input #FileNumber,VarName[,VarName ] Input (Length,#FileNumber) Line Input #FileNumber,VarName 其 中 FileNumber 表 示 用 Open 打 开 文 件 时 使 用 的 文 件 句 柄,VarName 用 来 存 储 从 文 件 193

194 Visual Basic 程 序 设 计 中 读 出 数 据 的 变 量 名 Input 函 数 中 的 Length 参 数 用 来 指 明 要 从 文 件 中 读 出 字 符 的 长 度, 此 函 数 返 回 的 是 一 个 字 符 串 使 用 Line Input 读 取 数 据 时, 会 一 直 读 到 回 车 / 换 行 符 或 文 件 尾 为 止 例 10.3 按 行 读 取 文 件 E:\VB\VB1.txt 中 的 数 据, 并 将 数 据 显 示 在 屏 幕 上 Dim FileNumber As Integer Dim Inbuf As String Open "E:\VB\VB1.txt" For Input As FileNumber ' 以 顺 序 方 式 打 开 文 件 进 行 读 操 作 Do While Not EOF(FileNumber) ' 用 来 判 断 文 件 是 否 结 束 Line Input #FileNumber, Inbuf ' 从 文 件 中 读 取 一 行 数 据 存 入 Inbuf Print Inbuf ' 在 屏 幕 上 输 出 Inbuf 中 的 数 据 Loop Close #FileNumber ' 关 闭 文 件 2. 顺 序 文 件 的 写 操 作 对 顺 序 文 件 的 写 操 作 比 较 方 便,Visual Basic 提 供 了 Print # 和 Write # 语 句 来 完 成 写 操 作 Print # 语 句 的 功 能 是 把 格 式 化 显 示 的 数 据 写 入 顺 序 文 件 中, 其 语 法 格 式 如 下 : Print # FileNumber,[OutputList] [, ;] 其 中,FileNumber 为 一 有 效 的 文 件 号,OutputList 表 示 要 写 入 文 件 的 表 达 式, 可 用 逗 号 将 这 些 表 达 式 分 隔 开 来 ; 和, 决 定 下 一 个 字 符 输 出 的 位 置, 分 号 表 示 下 一 个 字 符 紧 随 其 前 面 一 个 字 符 打 印, 逗 号 表 示 下 一 个 字 符 在 前 一 个 字 符 的 下 一 个 打 印 区 开 始 打 印, 若 不 加, 和 ; 参 数,Print # 语 句 会 在 字 符 结 束 处 添 加 回 车 / 换 行 符 Print # 语 句 常 和 Line Input # 语 句 配 合 使 用 Write # 的 语 法 格 式 如 下 : Write # FileNumber,[OutputList] 其 中,FileNumber 为 一 有 效 的 文 件 号,OutputList 表 示 要 写 入 文 件 的 表 达 式, 用 逗 号 将 这 些 表 达 式 分 隔 开 来 Write # 语 句 常 和 Input # 语 句 配 合 使 用 在 使 用 Print # 语 句 或 Write # 语 句 对 文 件 进 行 写 操 作 时, 文 件 必 须 以 Output 或 Append 模 式 打 开 当 以 Append 模 式 打 开 文 件 时,Print # 或 Write # 语 句 输 出 的 内 容 将 追 加 到 文 件 尾 部 例 10.4 顺 序 文 件 的 写 操 作 Private Sub Command1_Click() Open "E:\VB\MyTest1.txt" For Output As #1 ' 以 顺 序 方 式 打 开 文 件 进 行 写 操 作 Print #1, 2 * 3; '(;) 表 示 下 一 个 数 据 的 输 出 紧 随 该 数 据 Print #1,4, '(,) 表 示 下 一 个 数 据 在 下 一 个 输 出 区 输 出 Print #1, 3 ' 数 据 后 无 符 号 表 示 下 一 个 数 据 在 下 一 行 输 出 Print #1, 5 Close #1 194

第 10 章 文 件 195 执 行 该 程 序 后, 打 开 文 件 可 看 到 数 据 的 格 式 如 下 : 6 4 3 5 从 该 格 式 可 看 出,4 尾 随 在 6 后 输 出, 而 3 在 4 的 下 一 输 出 区,5 则 在 下 一 行 输 出 10.3 随 机 文 件 随 机 文 件 由 固 定 长 度 的 记 录 组 成, 每 个 记 录 可 以 设 计 成 若 干 个 字 段, 各 字 段 的 类 型 可 以 不 同 此 类 文 件 中 的 数 据 是 以 二 进 制 形 式 存 放 在 外 存 中 的 随 机 文 件 对 文 件 的 读 写 顺 序 没 有 限 制, 可 以 随 意 读 写 某 一 条 记 录, 它 以 记 录 号 来 定 位 记 录 的 位 置 随 机 文 件 的 读 写 速 度 快, 而 且 打 开 后 可 同 时 做 读 写 操 作, 不 像 顺 序 文 件 那 样 打 开 后 只 能 做 读 或 写 中 的 一 种 但 是 随 机 文 件 的 缺 点 是 占 用 空 间 大 随 机 文 件 的 建 立 分 4 个 步 骤 : 定 义 数 据 类 型 打 开 文 件 对 文 件 进 行 读 写 和 关 闭 文 件 10.3.1 定 义 数 据 类 型 和 变 量 声 明 因 为 随 机 文 件 是 由 固 定 长 度 的 记 录 组 成, 所 以 在 对 随 机 文 件 进 行 操 作 时, 需 要 先 定 义 记 录 数 据 类 型 并 声 明 变 量, 然 后 才 能 进 行 读 写 操 作 在 Visual Basic 中, 使 用 语 句 Type End Type 来 定 义 记 录 类 型 例 10.5 设 计 一 个 通 信 录 记 录 结 构, 包 括 姓 名 手 机 号 码 和 电 话 号 码 Type ContactInfo Name As String*8 Mobile As String*11 Phone As String*12 End Type 有 了 自 定 义 的 数 据 类 型, 就 可 以 用 来 声 明 变 量, 从 而 可 以 处 理 文 件 中 的 数 据 下 面 是 定 义 一 个 ContactInfo 类 型 变 量 的 语 句 Public Contact As ContactInfo 10.3.2 随 机 文 件 的 打 开 与 关 闭 打 开 随 机 文 件 使 用 的 语 句 同 样 是 Open 语 句, 但 是 打 开 模 式 必 须 是 Random 方 式, 同 时 要 指 明 记 录 长 度, 其 语 法 格 式 为 : Open FileName For Random As #FileNumber Len=RecordLen 其 中,Random 是 默 认 的 访 问 类 型, 是 可 选 项 表 达 式 Len=RecordLen 指 定 了 每 个 记 录 的 长 度 如 果 RecordLen 比 实 际 长 度 短, 则 产 生 一 个 错 误, 如 果 RecordLen 比 实 际 长 度 长, 则 可 写 入, 但 是 会 浪 费 磁 盘 空 间 因 此, 在 文 件 处 理 前, 应 合 理 设 计 记 录 结 构, 确 定 记 录 长 度, 可 以 用 Len 函 数 获 得 记 录 的 实 际 长 度, 如 使 用 Len(ContactInfo) 便 可 获 得 通 信 录 记 录 的 实 际 长 度 下 面 的 语 句 可 以 打 开 随 机 文 件 File.dat 进 行 读 写 操 作 Open "File.dat" For Random As #1 Len=Len(ContactInfo) 195

196 Visual Basic 程 序 设 计 随 机 文 件 的 关 闭 同 顺 序 文 件 一 样, 使 用 Close #FileNumber 语 句 即 可 10.3.3 随 机 文 件 的 读 写 操 作 Visual Basic 读 写 随 机 文 件 的 语 句 是 Get # 和 Put # 它 们 的 语 法 格 式 如 下 : Get #FileNumber,[RecordNumber],VarName Put #FileNumber,[RecordNumber],VarName 其 中,Get # 语 句 用 于 从 文 件 中 把 RecordNumber 记 录 号 所 代 表 的 记 录 读 到 对 应 类 型 的 变 量 VarName 中 ;Put # 语 句 则 把 VarName 中 的 数 据 写 入 文 件 中, 形 成 文 件 的 第 RecordNumber 条 记 录 例 10.6 已 知 文 件 E:\VB\MyContact.dat 中 存 放 着 3 条 通 信 录 信 息, 现 要 将 张 三, 13504312087,01062620610 这 条 记 录 存 入 该 文 件 中 形 成 第 4 条 记 录, 并 将 第 2 条 记 录 的 信 息 显 示 在 屏 幕 上 ' 以 随 机 方 式 打 开 文 件 E:\VB\MyContact.dat Open "E:\VB\MyContact.dat" For Random As #1 Len=Len(ContactInfo) ' 为 通 信 录 类 型 的 变 量 赋 值 Contact.Name=" 张 三 " Contact.Mobile="13504312087" Contact.Phone="0062620610" ' 将 记 录 写 入 文 件 的 第 4 条 记 录 处 Put #1,4,Contact ' 读 取 文 件 的 第 2 条 记 录 Get #1,2,Contact ' 在 屏 幕 上 输 出 第 2 条 记 录 Print Contact.Name,Contact.Mobile,Contact.Phone Close #1 其 中,Contact 的 记 录 类 型 见 例 10-5, 记 录 类 型 的 定 义 及 变 量 的 声 明 放 在 模 块 中 10.4 文 件 系 统 控 件 Visual Basic 6.0 中 包 括 3 个 文 件 系 统 控 件, 分 别 是 驱 动 器 列 表 框 目 录 列 表 框 和 文 件 列 表 框 控 件 利 用 这 3 个 控 件 可 以 很 方 便 地 实 现 查 看 磁 盘 驱 动 器 目 录 及 文 件 的 功 能, 它 们 常 常 配 合 使 用, 以 实 现 对 相 关 文 件 的 控 制 10.4.1 驱 动 器 列 表 框 控 件 驱 动 器 列 表 框 控 件 (DriveListBox) 用 于 设 置 或 显 示 当 前 磁 盘 驱 动 器 的 名 称, 在 工 具 箱 中 的 图 标 是 该 控 件 是 一 个 下 拉 列 表 框, 单 击 列 表 框 中 的 下 拉 箭 头, 会 显 示 用 户 系 统 中 所 有 有 效 驱 动 器 的 列 表 如 图 10.1 为 驱 动 器 列 表 框 控 件 在 运 行 时 的 情 况 196

第 10 章 文 件 197 图 10.1 驱 动 器 列 表 框 控 件 运 行 示 意 图 该 控 件 的 使 用 非 常 简 单, 只 要 在 窗 体 上 将 该 控 件 放 上, 运 行 时, 即 可 在 下 拉 列 表 中 显 示 所 在 系 统 的 驱 动 器 一 般 驱 动 器 列 表 框 控 件 的 名 称 是 Drive1 Drive2 等 驱 动 器 列 表 框 的 主 要 属 性 是 Drive 属 性, 用 来 在 程 序 运 行 时 设 置 或 返 回 选 定 的 驱 动 器, 只 在 运 行 阶 段 有 效 如 要 设 置 当 前 的 驱 动 器 为 C 盘, 若 使 用 的 驱 动 器 列 表 框 控 件 的 名 称 为 Drive1, 则 可 在 程 序 中 使 用 如 下 语 句 : Drive1.Drive="C:" 或 Drive1.Drive="C:\" 驱 动 器 的 常 用 方 法 主 要 是 Refresh 方 法, 用 于 刷 新 驱 动 器 列 表 另 外 驱 动 器 列 表 框 控 件 也 支 持 SetFocus 方 法 和 Move 方 法 驱 动 器 列 表 框 控 件 最 重 要 的 事 件 是 Change 事 件 当 驱 动 器 列 表 框 控 件 的 Drive 属 性 值 发 生 变 化 时 触 发 Change 事 件, 该 事 件 主 要 是 为 了 与 目 录 列 表 框 配 合 使 用 的 10.4.2 目 录 列 表 框 控 件 目 录 列 表 框 控 件 (DirListBox) 用 于 显 示 当 前 驱 动 器 或 指 定 驱 动 器 上 的 目 录 结 构 目 录 列 表 框 控 件 在 工 具 箱 中 的 图 标 为, 该 控 件 一 般 要 与 驱 动 器 列 表 框 控 件 联 合 使 用 目 录 列 表 框 控 件 的 默 认 名 称 一 般 为 Dir1 Dir2 目 录 列 表 框 控 件 在 运 行 时 以 所 在 驱 动 器 的 根 目 录 开 头, 各 目 录 按 子 目 录 的 层 次 结 构 依 次 缩 进 运 行 时 用 鼠 标 双 击 某 个 目 录, 就 能 打 开 其 下 的 子 目 录 图 10.2 为 目 录 列 表 框 控 件 运 行 时 的 示 意 图 图 10.2 目 录 列 表 框 控 件 运 行 示 意 图 为 了 与 驱 动 器 列 表 框 控 件 联 合 使 用, 使 得 目 录 列 表 框 控 件 中 的 根 目 录 与 驱 动 器 列 表 框 控 件 中 的 驱 动 器 相 对 应, 目 录 列 表 框 控 件 提 供 了 相 应 的 属 性 方 法 和 事 件 197

198 Visual Basic 程 序 设 计 1. 常 用 属 性 目 录 列 表 框 控 件 的 一 个 重 要 属 性 是 Path 属 性, 用 于 设 置 或 返 回 当 前 显 示 的 工 作 目 录 的 路 径, 包 括 驱 动 器 名 该 属 性 只 在 运 行 阶 段 有 效 如 果 要 让 目 录 列 表 框 控 件 显 示 目 录 C:\ 下 的 目 录 结 构, 则 相 应 的 设 置 语 句 为 : Dir1.Path="C:\" 为 了 在 驱 动 器 列 表 框 控 件 中 的 驱 动 器 改 变 时, 目 录 列 表 框 随 之 改 变, 则 需 要 在 驱 动 器 列 表 框 的 Change 事 件 中 设 置 目 录 列 表 框 的 Path 属 性 具 体 实 现 过 程 如 下 : Private Sub Drive1_Change() Dir1.Path=Drive1.Drive 2. 方 法 目 录 列 表 框 控 件 的 常 用 方 法 主 要 有 Refresh 方 法 SetFocus 方 法 和 Move 方 法 这 些 方 法 可 参 考 驱 动 器 列 表 框 控 件 的 方 法 3. 事 件 目 录 列 表 框 控 件 最 重 要 的 事 件 是 Change 事 件 当 目 录 列 表 框 的 Path 属 性 值 发 生 变 化 时 触 发 Change 事 件, 该 事 件 主 要 是 为 了 与 文 件 列 表 框 配 合 使 用 的 10.4.3 文 件 列 表 框 控 件 文 件 列 表 框 控 件 (FileListBox) 用 来 显 示 指 定 目 录 下 的 文 件 列 表, 该 控 件 在 工 具 箱 中 的 图 标 为, 其 默 认 名 称 为 File1 File2 该 控 件 一 般 与 目 录 列 表 框 控 件 配 合 使 用 图 10.3 为 文 件 列 表 框 控 件 在 运 行 时 的 示 意 图 图 10.3 文 件 列 表 框 控 件 运 行 时 示 意 图 文 件 列 表 框 可 以 与 目 录 列 表 框 配 合 使 用, 这 可 以 通 过 它 的 属 性 方 法 和 事 件 来 实 现 1. 常 用 属 性 文 件 列 表 框 与 列 表 框 相 似, 也 具 有 List ListIndex 和 ListCount 等 常 用 属 性, 此 外 还 有 文 件 列 表 框 特 有 的 属 性 (1) Path 属 性 该 属 性 用 来 设 置 或 返 回 文 件 列 表 框 所 显 示 的 路 径 全 称, 仅 在 运 行 阶 段 有 效 一 般 该 属 性 都 是 与 目 录 列 表 框 配 合 使 用 的, 当 目 录 列 表 框 中 的 目 录 发 生 改 变 时, 可 设 置 文 件 列 表 框 198

第 10 章 文 件 199 的 Path 属 性, 使 文 件 列 表 框 显 示 对 应 目 录 中 的 文 件 一 般 可 在 目 录 列 表 框 的 Change 事 件 中 设 置, 其 事 件 过 程 如 下 : Private Sub Dir1_Change() File1.Path=Dir1.Path (2) Pattern 属 性 该 属 性 用 来 设 置 在 文 件 列 表 框 中 要 显 示 的 文 件 类 型 通 过 设 置 该 属 性, 可 对 所 显 示 的 文 件 起 到 过 滤 效 果 该 属 性 可 在 控 件 的 属 性 窗 口 设 置, 也 可 在 运 行 阶 段 设 置 例 如 媒 体 播 放 软 件 如 果 只 播 放 AVI 类 型 文 件, 则 可 将 Pattern 属 性 设 置 为 *.avi 若 要 表 达 的 文 件 类 型 有 多 种, 各 组 类 型 表 达 式 之 间 应 用 分 号 (;) 进 行 分 隔 例 如, 若 仅 允 许 列 表 框 中 显 示 AVI 文 件 和 DAT 文 件, 则 相 应 的 设 置 语 句 为 : File1.Pattern="*.avi ; *.dat" (3) FileName 属 性 该 属 性 用 于 设 置 或 返 回 文 件 列 表 框 中 被 选 中 的 文 件 名 仅 在 运 行 阶 段 有 效 (4) MultiSelect 属 性 该 属 性 用 来 设 定 是 否 允 许 用 户 进 行 多 重 选 择 它 的 值 若 为 0 表 示 只 允 许 单 选 ; 若 为 1 则 表 示 可 直 接 通 过 鼠 标 进 行 多 选 ; 值 若 为 1 则 表 示 可 通 过 鼠 标 与 Shift 或 Ctrl 键 配 合 进 行 多 选 (5) Archive 属 性 ReadOnly 属 性 System 属 性 和 Hidden 属 性 这 些 属 性 分 别 用 于 决 定 是 否 可 显 示 档 案 文 件 只 读 文 件 系 统 文 件 和 隐 藏 文 件 它 们 的 类 型 均 为 布 尔 类 型 值 为 True 或 False 为 True 则 可 显 示 对 应 属 性 的 文 件, 为 False 则 不 可 显 示 2. 方 法 文 件 列 表 框 的 常 用 方 法 主 要 有 Refresh 方 法 SetFocus 方 法 和 Move 方 法 3. 事 件 文 件 列 表 框 可 响 应 很 多 事 件, 其 中 比 较 特 殊 的 事 件 有 PathChange 事 件 和 PatternChange 事 件 (1) PathChange 事 件 当 文 件 列 表 框 的 Path 属 性 值 发 生 变 化 时 触 发 PathChange 事 件 (2) PatternChange 事 件 当 文 件 列 表 框 的 Pattern 属 性 值 发 生 变 化 时 触 发 PatternChange 事 件 例 10.7 设 计 一 个 查 找 文 件 的 程 序, 可 在 指 定 驱 动 器 指 定 目 录 下 选 择 1 个 TXT 或 DOC 文 件, 当 鼠 标 双 击 指 定 文 件 时, 在 文 本 框 控 件 中 显 示 文 件 的 路 径 名 和 文 件 名 运 行 界 面 如 图 10.4 所 示 199

200 Visual Basic 程 序 设 计 图 10.4 例 10.7 运 行 界 面 程 序 代 码 如 下 : Private Sub Dir1_Change() File1.Path = Dir1.Path ' 当 目 录 列 表 框 中 的 目 录 发 生 变 化 时 改 变 文 件 列 表 框 Text1.Text = Dir1.Path ' 将 新 的 路 径 显 示 在 文 本 框 中 Private Sub Drive1_Change() Dir1.Path = Drive1.Drive ' 当 驱 动 器 列 表 框 中 的 驱 动 器 发 生 变 化 时 改 变 目 录 列 表 框 Text1.Text = Drive1.Drive ' 将 新 的 驱 动 器 显 示 在 文 本 框 中 ' 当 对 选 中 文 件 进 行 双 击 时 触 发 Private Sub File1_DblClick() Text1.Text = File1.Path & "\" & File1.FileName ' 将 选 中 文 件 的 路 径 和 文 件 名 显 示 在 文 本 框 中 Private Sub Form_Load() File1.Pattern = "*.txt;*.doc" ' 设 置 文 件 过 滤 器 只 显 示.txt 和.doc 文 件 10.5 文 件 系 统 对 象 模 型 10.5.1 文 件 系 统 对 象 模 型 概 述 Visual Basic 的 一 个 新 功 能 是 File System Object(FSO) 对 象 模 型 该 模 型 提 供 了 一 个 基 于 对 象 的 工 具 来 处 理 文 件 夹 和 文 件 这 使 用 户 除 了 使 用 传 统 的 Visual Basic 语 句 和 命 令 及 文 件 系 统 控 件 外, 还 可 以 使 用 带 有 一 整 套 属 性 方 法 和 事 件 的 File System Object 处 理 文 件 夹 和 文 件 FSO 对 象 模 型 使 应 用 程 序 能 够 创 建 改 变 移 动 和 删 除 文 件 夹, 或 者 检 测 是 否 存 在 指 200

第 10 章 文 件 201 定 的 文 件 夹, 如 果 存 在, 指 出 在 什 么 地 方 FSO 对 象 模 型 也 能 使 用 户 获 取 关 于 文 件 夹 的 信 息, 诸 如 名 称 创 建 日 期 或 最 近 修 改 日 期 等 FSO 对 象 模 型 使 得 对 文 件 的 处 理 变 得 更 加 简 单 使 用 FSO 对 象, 不 需 要 用 户 因 为 文 件 类 型 的 不 同, 而 花 费 太 多 的 精 力 FSO 对 象 模 型 编 程 包 括 三 项 主 要 任 务 (1) 使 用 CreateObject 方 法, 或 将 一 个 变 量 声 明 为 FileSystemObject 对 象 类 型, 来 创 建 一 个 FileSystemObject 对 象 (2) 对 新 创 建 的 对 象 使 用 适 当 的 方 法 (3) 访 问 该 对 象 的 属 性 FSO 对 象 模 型 包 含 在 一 个 称 为 Scripting 的 类 型 库 中, 此 类 型 库 位 于 Scrrun.dll 文 件 中 如 果 还 没 有 引 用 此 文 件, 选 择 工 程 菜 单 中 的 引 用 命 令, 可 打 开 选 择 引 用 对 话 框, 再 选 择 Microsoft Scripting Runtime 项 然 后 就 可 以 使 用 对 象 浏 览 器 来 查 看 其 对 象 集 合 属 性 方 法 以 及 它 的 常 数 创 建 一 个 FileSystemObject 对 象 的 方 法 为 : Dim fso as new FileSystemObject 或 Set fso =CreateObject("Scripting.FileSystemObject") 其 中,Scripting 是 类 型 库 的 名 称, 而 FileSystemObject 则 是 要 创 建 一 个 实 例 对 象 的 名 字 第 一 种 方 法 在 Visual Basic 中 有 效, 而 第 二 种 方 法 在 Visual Basic 或 VBScript 中 都 是 可 行 的 FileSystemObject 提 供 了 管 理 驱 动 器 文 件 夹 和 文 件 的 方 法 和 属 性 10.5.2 管 理 驱 动 器 使 用 FSO 可 以 访 问 已 有 的 驱 动 器, 还 可 获 得 驱 动 器 的 信 息 1. 取 得 驱 动 器 的 名 字 要 取 得 一 个 包 含 指 定 路 径 的 驱 动 器 名 字 的 字 符 串, 可 使 用 FSO 对 象 中 的 GetDriveName 方 法, 其 语 法 格 式 为 : object.getdrivename(path) 如 果 驱 动 器 不 能 确 定,GetDriveName 方 法 返 回 一 个 长 度 为 零 的 字 符 串 (" ") GetDriveName 方 法 只 对 提 供 的 路 径 字 符 串 起 作 用 2. 访 问 已 有 的 驱 动 器 要 访 问 一 个 已 有 的 驱 动 器, 可 以 使 用 FSO 对 象 中 的 GetDrive 方 法, 该 方 法 返 回 指 向 某 个 已 有 驱 动 器 的 Drive 对 象 其 语 法 格 式 如 下 : object.getdrive DriveSpec 其 中,DriveSpec 为 一 个 驱 动 器 字 符 加 冒 号 和 路 径 分 隔 符 ( 如 C:\ ) 或 任 何 网 络 共 享 的 说 明 ( 如 \\computer2\share1 ) 如 果 DriveSpec 不 符 合 任 何 一 种 可 以 接 受 的 形 式 或 者 不 存 在, 则 发 生 一 个 错 误 201

202 Visual Basic 程 序 设 计 3. Drive 对 象 Drive 对 象 允 许 获 得 一 个 系 统 的 各 个 驱 动 器 的 信 息, 这 些 信 息 可 以 是 物 理 的, 也 可 以 是 网 络 上 的 通 过 该 对 象 的 属 性 可 以 获 得 下 列 信 息 (1) 以 字 节 表 示 的 驱 动 器 总 空 间 (TotalSize 属 性 ); (2) 以 字 节 表 示 的 驱 动 器 可 用 空 间 (AvailableSpace 或 FreeSpace 属 性 ); (3) 为 驱 动 器 指 定 的 符 号 (DriveLetter 属 性 ) 和 驱 动 器 类 型 ( 诸 如 可 移 动 的 固 定 的 网 络 上 的 CD-ROM 或 者 RAM 盘 ); (4) 驱 动 器 序 列 号 (SerialNumber 属 性 ); (5) 驱 动 器 使 用 的 文 件 系 统 类 型, 如 FAT FAT32 NTFS 等 (FileSystem 属 性 ); (6) 驱 动 器 是 否 可 用 (IsReady); (7) 共 享 和 / 或 卷 标 的 名 称 (ShareName 和 VolumeName 属 性 ); (8) 驱 动 器 的 路 径 或 根 文 件 夹 (Path 和 RootFolder 属 性 ) 例 10.8 使 用 Drive 对 象 收 集 有 关 驱 动 器 的 信 息 新 建 一 个 标 准 工 程, 再 添 加 引 用 Microsoft Scripting Runtime, 然 后 向 窗 体 中 添 加 一 个 命 令 按 钮, 最 后 给 命 令 按 钮 添 加 如 下 代 码 注 意 在 下 面 的 代 码 中 并 没 有 对 实 际 Drive 对 象 的 引 用, 而 是 使 用 GetDrive 方 法 获 得 一 个 对 已 有 Drive 对 象 的 引 用 Private Sub Command1_Click() ' 定 义 一 个 FSO 对 象 和 Drive 类 型 变 量 及 String 类 型 变 量 Dim fso As New FileSystemObject,drv As Drive, s As String ' 取 得 c: 驱 动 器 对 象 Set drv=fso.getdrive(fso.getdrivename("c:"); s=" 驱 动 器 :"&Ucase("c:") &"-" ' 取 得 c 盘 的 卷 标 名 称 s=s& drv.volumename &vbcrlf ' 取 得 c 盘 总 空 间 数 s-s & " 总 空 间 :" & FormatNumber(drv.TotalSize /1024,0) s=s & "kb" &vbcrlf ' 取 得 c 盘 可 用 空 间 数 s=s & " 可 用 空 间 :" & FormatNumber(drv.FreeSpace/1024,0) s=s &"kb" &vbcrlf msgbox s 10.5.3 管 理 文 件 夹 1. Folder 对 象 Folder 对 象 允 许 对 文 件 夹 进 行 操 作, 该 对 象 可 以 通 过 CreateFolder 方 法 新 建, 如 : Dim fso As New FileSystemObject, fdr As Folder fdr=fso.createfolder("e:\myvb") 也 可 以 通 过 FSO 对 象 的 GetFolder 获 得 已 存 在 的 文 件 夹 对 象, 如 : fdr=fso.getfolder("e:\vb") 202

第 10 章 文 件 203 2. 文 件 夹 的 操 作 有 关 文 件 夹 的 操 作 和 方 法 如 表 10-2 所 示 表 10-2 文 件 夹 的 操 作 方 法 操 作 方 法 创 建 一 个 文 件 夹 FSO 对 象 的 CreateFolder 方 法 删 除 一 个 文 件 夹 Folder 对 象 的 Delete 或 FSO 对 象 的 DeleteFolder 方 法 移 动 一 个 文 件 夹 Folder 对 象 的 Move 或 FSO 对 象 的 MoveFolder 方 法 复 制 一 个 文 件 夹 Folder 对 象 的 Copy 或 FSO 对 象 的 CopyFolder 方 法 检 索 文 件 夹 的 名 称 Folder 对 象 的 Name 属 性 查 找 一 个 文 件 夹 是 否 在 驱 动 器 上 FSO 对 象 的 FolderExists 方 法 获 取 已 有 Folder 对 象 的 一 个 实 例 FSO 对 象 的 GetFolder 方 法 获 取 一 个 文 件 夹 的 父 文 件 夹 的 名 称 FSO 对 象 的 GetParentFolderName 获 取 系 统 文 件 夹 的 路 径 FSO 对 象 的 GetSpecialFolder 方 法 下 面 通 过 例 10-9 来 阐 述 使 用 FSO 对 象 的 方 法 及 其 对 文 件 夹 进 行 的 操 作 例 10.9 操 作 文 件 夹 并 获 取 其 信 息 Private Sub Command2_Click() ' 定 义 一 个 FSO 对 象 和 Folder 类 型 变 量 及 String 类 型 变 量 Dim fso as New FileSystemObject,fdr as folder, s as String Set fdr=fso.getfolder("e:") ' 获 得 Folder 对 象 Print " 父 文 件 夹 名 是 :" & fdr Print " 文 件 夹 所 在 驱 动 器 名 称 :" & fdr.drive if fdr.isrootfolder=true then ' 若 该 文 件 夹 为 根 文 件 夹 Print " 该 文 件 夹 是 根 文 件 夹 " end if fso.createfolder("e:\myvb") ' 创 建 文 件 夹 E:\MyVB Print(" 创 建 了 文 件 夹 E:\MyVB") fdr=fso.getfolder("e:\myvb") fdr.delete ' 使 用 Folder 对 象 删 除 文 件 夹 10.5.4 管 理 文 件 1. File 对 象 File 对 象 用 来 对 文 件 进 行 相 应 的 操 作 它 可 通 过 FSO 对 象 的 GetFile 方 法 来 创 建, 例 如 : Dim fso As new FileSystemObject,fil as File Set fil=fso.getfile("e:\vb\test.txt") 2. TextStream 对 象 该 对 象 可 对 文 本 文 件 进 行 读 写 操 作, 它 可 通 过 FSO 对 象 的 CreateTextFile 方 法 来 创 建 一 个 空 的 文 本 文 件, 并 返 回 TextStream 对 象 203

204 Visual Basic 程 序 设 计 204 Dim fso As new FileSystemObject,fil as File Set fil=fso.createtextfile("e:\vb\test.txt",true) 本 方 法 的 第 2 个 参 数 为 布 尔 型 值, 若 为 真 表 示 对 已 存 在 的 文 件 进 行 覆 盖 操 作 3. 文 件 的 操 作 (1) 添 加 数 据 到 文 本 文 件 文 件 一 经 创 建, 就 可 以 分 3 步 向 其 中 加 入 数 据 1 打 开 文 件, 可 以 使 用 下 面 两 种 方 法 中 的 任 一 种 :File 对 象 的 OpenAsTextStream 方 法 或 FSO 对 象 的 OpenTextFile 方 法 来 创 建 一 个 TextStream 对 象 2 向 打 开 的 文 本 文 件 中 写 入 数 据, 可 以 使 用 TextStream 对 象 的 Write 或 WriteLine 方 法 它 们 之 间 的 唯 区 别 是 WriteLine 在 指 定 的 字 符 串 末 尾 添 加 换 行 符 如 果 向 文 本 文 件 中 添 加 一 个 空 行, 则 使 用 WriteBlankLines 方 法 3 使 用 TextStream 对 象 的 Close 方 法, 关 闭 一 个 已 打 开 的 文 件 (2) 读 取 文 件 要 从 一 个 文 本 文 件 中 读 取 数 据, 可 使 用 TextStream 对 象 的 Read ReadLine 或 ReadAll 方 法 从 一 个 文 件 中 读 取 指 定 数 量 的 字 符 用 Read 方 法, 读 取 一 整 行 用 ReadLine 方 法, 读 取 一 个 文 本 文 件 的 所 有 内 容 用 ReadAll 方 法 如 果 使 用 Read 或 ReadLine 方 法 并 且 要 跳 过 数 据 的 某 些 部 分, 可 以 使 用 Skip 或 SkipLine 方 法 这 些 读 取 方 法 产 生 的 文 本 被 存 储 在 一 个 字 符 串 中, 而 这 个 字 符 串 可 以 在 控 件 中 显 示, 也 可 以 被 字 符 串 操 作 符 分 解 或 合 并 (3) 移 动 复 制 和 删 除 文 件 可 使 用 File 对 象 的 方 法 和 FSO 对 象 的 方 法 对 文 件 进 行 移 动 复 制 和 删 除 操 作 File 对 象 的 方 法 Move 用 来 移 动 文 件, 方 法 Copy 用 来 复 制 文 件, 方 法 Delete 用 来 删 除 文 件 FSO 对 象 的 方 法 MoveFile 用 来 移 动 文 件, 方 法 CopyFile 用 来 复 制 文 件, 方 法 Delete 用 来 删 除 文 件 例 10.10 文 件 操 作 的 使 用 示 例 本 例 首 先 在 E 盘 的 根 目 录 下 创 建 一 个 文 本 文 件, 并 向 其 中 写 入 一 些 信 息, 再 将 该 文 件 移 至 E:\VB 目 录 下, 同 时 复 制 到 E:\MyVB 目 录 中, 并 打 开 E:\MyVB 目 录 下 的 文 件, 读 取 后 显 示 在 消 息 框 中, 最 后 将 这 两 个 目 录 中 的 复 制 文 件 删 除 新 建 一 个 标 准 工 程, 再 添 加 引 用 Microsoft Scripting Runtime, 然 后 向 窗 体 中 添 加 一 个 命 令 按 钮, 最 后 给 命 令 按 钮 添 加 如 下 代 码 Sub Command1_Click() ' 定 义 一 个 FSO 对 象 和 TextStream 类 型 变 量 及 File 类 型 变 量 Dim fso As new FileSystemObject, txtfile as TextStream, f1 as File Set txtfile=fso.createtextfile("e:\test.txt",true) ' 创 建 一 个 空 文 件 并 返 回 TextStream 对 象 txtfile.write(" 这 是 对 文 件 的 一 个 操 作 ") ' 使 用 TextStream 对 象 的 Write 写 入 数 据 txtfile.close ' 关 闭 文 件 Set f1=fso.getfile("e:\test.txt") ' 取 得 TextStream 对 象

第 10 章 文 件 205 fso.copyfile("e:\test.txt","e:\myvb\test.txt") ' 使 用 FSO 对 象 进 行 文 件 复 制 f1.move("e:\vb\test.txt") ' 使 用 File 对 象 进 行 文 件 移 动 Set f1=fso.getfile("e:\vb\test.txt") ' 取 得 File 对 象 Set txtfile=f1.openastextstream ' 通 过 f1 取 得 TextStream 对 象 MsgBox txtfile.readall ' 读 取 文 件 的 全 部 内 容, 在 消 息 框 中 显 示 txtfile.close f1.delete ' 使 用 File 的 Delete 方 法 删 除 文 件 fso.deletefile("e:\myvb\test.txt") ' 使 用 fso 的 方 法 删 除 文 件 注 意 在 使 用 该 代 码 时 要 求 文 件 夹 E:\VB 和 E:\MyVB 必 须 存 在 10.6 文 件 应 用 举 例 下 面 利 用 文 件 的 功 能 实 现 一 个 简 单 的 通 信 录 程 序, 该 程 序 可 添 加 新 的 通 信 录 信 息, 也 可 在 列 表 中 选 择 某 一 个 人 的 姓 名, 并 得 到 其 手 机 号 码 和 住 宅 电 话 该 程 序 的 运 行 效 果 如 图 10.5 所 示 图 10.5 通 信 录 程 序 运 行 界 面 该 程 序 窗 体 上 有 3 个 标 签 控 件 和 3 个 文 本 框 控 件 1 个 列 表 框 控 件 和 2 个 命 令 按 钮 控 件 除 了 Caption 属 性 外, 其 他 属 性 均 取 默 认 值 当 单 击 添 加 按 钮 时, 可 将 3 个 文 本 框 中 的 信 息 加 入 到 列 表 框 及 文 件 中 为 了 方 便 查 找, 在 读 取 文 件 时, 将 文 件 中 所 有 记 录 读 入 到 对 应 的 数 组 中 该 通 信 录 的 程 序 代 码 如 下 : Dim FileNumber As Integer Dim Length As Long Dim N As Long Private Sub Command1_Click() ' 将 新 信 息 存 入 数 组 第 N-1 个 元 素 中 ' 记 录 记 录 号 ' 添 加 按 钮 的 单 击 事 件 205

206 Visual Basic 程 序 设 计 Contact(N - 1).Name = Trim(Text1.Text) Contact(N - 1).Mobile = Trim(Text2.Text) Contact(N - 1).Phone = Trim(Text3.Text) ' 将 新 信 息 存 入 到 文 件 第 N 条 记 录 处 Put #FileNumber, N, Contact(N) ' 将 新 信 息 的 姓 名 添 加 到 列 表 框 中 List1.AddItem Contact(N - 1).Name, N - 1 N = N + 1 ' 清 空 文 本 框 中 的 信 息 Text1.Text = "" Text2.Text = "" Text3.Text = "" Private Sub Command2_Click() ' 关 闭 按 钮 的 单 击 事 件 Close #FileNumber Unload Me Private Sub Form_Load() FileNumber = FreeFile ' 取 得 空 闲 文 件 号 Length = Len(ContactInfo) N = 1 Open "E:\contact.dat" For Random As #FileNumber ' 打 开 随 机 文 件 RefreshList ' 取 得 已 有 的 通 信 录 Private Sub RefreshList() Do While Not EOF(FileNumber) ' 将 文 件 中 的 通 信 录 信 息 依 次 读 入 数 组 中 Get #FileNumber, N, Contact(N - 1) ' 将 每 条 记 录 的 姓 名 填 加 入 列 表 框 中 List1.AddItem Contact(N - 1).Name, N - 1 N = N + 1 Loop ' 单 击 列 表 框 中 的 姓 名, 将 其 对 应 的 电 话 信 息 显 示 在 文 本 框 中 Private Sub List1_Click() I = List1.ListIndex Text1.Text = Contact(I).Name Text2.Text = Contact(I).Mobile Text3.Text = Contact(I).Phone ' 下 面 的 代 码 要 放 到 模 块 中 Type ContactInfo Name As String * 8 Mobile As String * 11 Phone As String * 12 End Type Public Contact(100) As ContactInfo 该 程 序 只 实 现 了 有 限 的 功 能, 感 兴 趣 的 同 学 可 增 加 删 除 功 能 修 改 功 能 及 控 制 信 息 的 输 入 格 式 和 不 允 许 重 名 功 能 206

第 10 章 文 件 207 10.7 小 结 文 件 是 具 有 相 同 类 型 数 据 的 集 合, 保 存 在 外 存 储 器 上, 且 以 文 件 名 作 为 标 识 文 件 的 基 本 操 作 有 打 开 文 件 读 / 写 文 件 和 关 闭 文 件 打 开 文 件 的 作 用 是 指 定 操 作 文 件 名 操 作 方 式 和 建 立 缓 冲 区 打 开 文 件 用 Open 语 句 读 / 写 文 件 是 通 过 对 文 件 指 针 的 操 作, 在 内 存 和 文 件 之 间 传 输 数 据 读 是 指 把 文 件 中 的 数 据 送 入 内 存, 写 是 指 把 内 存 中 的 数 据 写 入 文 件 文 件 读 写 完 成 后, 需 要 关 闭 文 件 文 闭 文 件 包 括 处 理 缓 冲 区 释 放 内 存 以 及 终 止 程 序 与 文 件 的 联 系 关 闭 文 件 使 用 Close 语 句 在 Visual Basic 中, 有 3 种 文 件 访 问 类 型 的 文 件, 即 顺 序 型 文 件 随 机 型 文 件 和 二 进 制 型 文 件 DriveListBox DirListBox 和 FileListBox 是 3 个 关 于 文 件 操 作 的 控 件 Visual Basic 的 File System Object(FSO) 对 象 模 型 提 供 了 一 个 基 于 对 象 的 工 具 来 处 理 文 件 夹 和 文 件 FSO 对 象 模 型 使 得 对 文 件 的 处 理 变 得 更 加 简 单 使 用 FSO 对 象, 不 会 因 为 文 件 类 型 的 不 同, 而 花 费 用 户 太 多 的 精 力 FSO 对 象 模 型 编 程 包 括 三 项 主 要 任 务 (1) 使 用 CreateObject 方 法, 或 将 一 个 变 量 声 明 为 FSO 对 象 类 型, 来 创 建 一 个 FSO 对 象 (2) 对 新 创 建 的 对 象 使 用 适 当 的 方 法 (3) 访 问 该 对 象 的 属 性 10.8 习 题 一 填 空 题 1. 按 照 文 件 的 特 征 属 性, 可 将 文 件 分 为 和 2. 可 以 对 顺 序 文 件 进 行 格 式 化 写 操 作 的 语 句 是 3. 一 个 文 件 在 使 用 前 必 须 先, 使 用 后 必 须 4. Visual Basic 6.0 中 包 括 3 个 文 件 系 统 控 件, 分 别 是 和 5. 若 想 要 使 用 FSO 对 象, 必 须 在 工 程 菜 单 中 的 引 用 对 话 框 中 选 择 项 6. 文 件 的 移 动 可 使 用 FSO 对 象 的 方 法 或 者 File 对 象 的 方 法 二 选 择 题 1. 下 列 哪 些 语 句 和 函 数 可 用 于 随 机 文 件 的 操 作?( ) A) Input # B) Type End Type C) Write # D) Print # 207

208 Visual Basic 程 序 设 计 2. 如 果 使 用 Open 语 句 打 开 随 机 文 件 进 行 操 作, 则 For 子 句 后 应 使 用 的 打 开 模 式 应 该 为?( ) A) Append B) Input C) Random D) Output 3. 若 要 设 置 文 件 列 表 控 件 的 路 径, 则 需 要 使 用 属 性 ( ) A) FileName B) Pattern C) Path D) Drive 4. 使 用 文 件 系 统 对 象 模 型 对 文 件 进 行 操 作 时, 如 果 向 打 开 的 文 本 文 件 添 加 一 个 空 行, 需 要 使 用 TextStream 对 象 的 ( ) 方 法 A) WriteBlankLines B) Write C) WriteLine 三 简 答 题 1. 文 件 列 表 框 的 FileName 属 性 是 否 包 含 路 径? 2. 随 机 文 件 和 二 进 制 文 件 的 读 写 操 作 有 何 不 同? 3. 如 何 用 FSO 对 象 模 型 来 管 理 文 件? 4. 如 何 将 文 件 列 表 框 控 件 和 目 录 列 表 框 控 件 配 合 使 用? 四 编 程 题 1. 向 一 个 顺 序 文 件 中 写 入 多 个 字 符 串, 然 后 将 每 个 字 符 串 中 的 所 有 小 写 字 母 都 改 为 大 写 字 母 2. 编 写 一 个 程 序, 输 入 一 个 班 所 有 学 生 的 3 门 课 程 的 成 绩 信 息, 其 中 每 位 学 生 的 成 绩 信 息 包 括 学 号 姓 名 高 等 数 学 成 绩 大 学 英 语 成 绩 程 序 设 计 成 绩 等, 将 输 入 的 学 生 成 绩 信 息 存 放 到 成 绩 文 件 Score.dat 中 208

第 11 章 数 据 库 程 序 设 计 教 学 提 示 : 数 据 库 程 序 设 计 是 计 算 机 应 用 技 术 中 的 一 个 重 要 组 成 部 分, 对 于 大 量 的 数 据, 使 用 数 据 库 来 存 储 管 理 可 以 降 低 数 据 的 冗 余 度, 提 高 数 据 存 储 效 率 Visual Basic 中 提 供 了 多 种 访 问 数 据 库 的 方 法, 可 以 访 问 的 数 据 库 类 型 有 dbase FoxPro 和 Access 等 本 地 数 据 库 另 外, 还 可 以 通 过 ODBC 方 式 访 问 MS SQL Server Oracle SQL Server 和 Sybase SQL Server, 并 以 客 户 / 服 务 器 方 式 存 取 数 据 库 中 的 数 据 Visual Basic 提 供 的 数 据 库 访 问 方 法 主 要 有 : 使 用 数 据 (Data) 控 件 或 ADO 数 据 控 件 访 问 数 据 库 通 过 ODBC 方 式 访 问 远 程 数 据 库 以 及 采 用 ADO 对 象 模 型 访 问 数 据 库 等 教 学 目 标 : 掌 握 可 视 化 数 据 管 理 器 的 使 用 方 法, 能 熟 练 地 建 立 数 据 库 表, 对 数 据 进 行 必 要 的 管 理 ; 熟 练 使 用 数 据 控 件 数 据 绑 定 控 件 及 ADO 控 件 和 ADO 对 象 模 型 访 问 本 地 数 据 库 11.1 数 据 库 和 SQL 语 言 基 础 11.1.1 数 据 库 简 介 数 据 库 (Database) 是 指 一 组 排 列 成 易 于 处 理 或 读 取 的 相 关 数 据 的 有 序 集 合, 它 是 由 一 个 或 多 个 表 对 象 组 成 的 集 合 它 类 似 于 Excel 的 工 作 簿 和 工 作 表 按 数 据 组 织 形 式 可 以 将 数 据 库 分 为 层 次 型 网 状 型 和 关 系 型 结 构, 其 中 最 常 用 的 是 关 系 型 数 据 库 关 系 型 数 据 库 模 型 把 数 据 用 表 的 集 合 来 表 示, 通 过 建 立 简 单 表 之 间 的 关 系 来 定 义 结 构, 而 不 是 根 据 数 据 的 物 理 存 储 方 式 来 建 立 数 据 中 的 关 系 不 管 表 在 数 据 库 文 件 中 的 物 理 存 储 方 式 如 何, 都 可 以 把 它 看 成 一 组 行 和 列 下 面 介 绍 几 个 关 系 型 数 据 库 的 相 关 概 念 1. 表 表 是 一 种 按 行 与 列 排 列 的 相 关 信 息 的 逻 辑 组, 类 似 于 工 作 表 例 如, 一 张 表 可 以 包 含 一 个 班 级 学 生 的 一 系 列 信 息, 如 姓 名 性 别 年 龄 地 址 相 片 每 门 功 课 的 成 绩 等 2. 字 段 数 据 库 表 中 的 每 一 列 称 为 一 个 字 段 表 是 由 其 包 含 的 各 种 字 段 定 义 的, 每 个 字 段 描 述 了 它 所 含 有 的 数 据 创 建 数 据 库 时, 需 要 为 每 个 字 段 分 配 一 个 数 据 类 型 最 大 长 度 和 其 他 属 性 字 段 可 包 括 各 种 字 符 数 字 甚 至 图 形

210 Visual Basic 程 序 设 计 3. 记 录 表 中 的 每 一 行 称 为 一 条 记 录 一 般 来 说, 数 据 库 表 的 记 录 必 须 惟, 即 数 据 库 表 的 记 录 创 建 时 任 意 两 行 都 不 能 完 全 相 同 例 如, 学 生 档 案 中 不 能 有 两 个 名 字 性 别 地 址 等 字 段 完 全 相 同 的 学 生 记 录 4. 记 录 集 记 录 集 是 表 或 查 询 中 的 记 录 集 合 Visual Basic 使 用 记 录 集 来 检 索 和 显 示 数 据 库 中 的 数 据 记 录 集 通 常 有 3 种 类 型 : 表 (Table) 动 态 集 (Dynaset) 和 快 照 (Snapshot) Table 类 型 的 记 录 集 代 表 了 数 据 库 中 单 个 的 表 它 的 RecordSet 对 象 是 当 前 数 据 库 中 真 实 的 数 据 表, 因 此 对 于 Table 类 型 的 记 录 集 的 处 理 速 度 比 其 他 记 录 集 类 型 都 快, 但 它 需 要 大 量 的 内 存 空 间 Dynaset 类 型 的 记 录 集 是 一 个 动 态 记 录 集 合 的 本 地 复 本 Dynaset 类 型 的 记 录 集 的 记 录 字 段 不 但 可 以 取 自 同 一 个 表, 还 可 以 取 自 多 个 表, 这 使 得 它 与 Table 类 型 的 记 录 集 相 比 具 有 更 大 的 灵 活 性 尽 管 Dynaset 类 型 的 记 录 集 是 一 个 本 地 副 本, 它 存 储 于 本 地 内 存 中, 但 是,Dynaset 类 型 的 记 录 集 是 和 原 始 数 据 库 中 的 表 相 关 联 的, 因 此, 用 户 仍 然 可 以 对 Dynaset 类 型 的 记 录 集 进 行 添 加 删 除 修 改 等 操 作, 并 且 和 Table 类 型 的 记 录 集 一 样, 这 些 操 作 都 会 被 保 存 到 相 应 的 数 据 库 中 Snapshot 类 型 的 记 录 集 同 Dynaset 类 型 的 记 录 集 相 似, 但 它 是 一 个 静 态 的 本 地 副 本 也 就 是 说, 用 户 不 能 通 过 Snapshot 类 型 的 记 录 集 对 原 始 表 中 的 记 录 进 行 修 改, 而 只 能 以 只 读 方 式 浏 览 与 Dynaset 类 型 的 记 录 集 一 样,Table 类 型 的 记 录 集 也 是 存 储 在 本 地 内 存 中 的 5. 索 引 为 了 便 于 查 找, 可 以 在 数 据 库 中 建 立 索 引 来 加 快 查 找 速 度, 大 多 数 数 据 库 都 使 用 索 引 数 据 库 表 的 索 引 是 比 表 搜 索 更 快 的 排 序 列 表 每 个 索 引 输 入 项 指 向 其 相 关 的 数 据 库 行 当 与 Data 控 件 一 起 使 用 表 类 型 的 记 录 集 时, 表 的 主 索 引 可 用 于 加 速 检 索 操 作 建 立 数 据 库 时, 可 以 设 置 任 意 多 个 索 引 字 段 虽 然 索 引 表 是 不 可 见 的, 却 同 样 会 占 据 磁 盘 空 间 选 择 索 引 字 段 时, 应 该 尽 量 选 择 惟 字 段 11.1.2 结 构 化 查 询 语 言 结 构 化 查 询 语 言 SQL 是 操 作 数 据 库 的 工 业 标 准 SQL 语 言 进 行 数 据 操 作, 只 要 提 出 做 什 么, 而 无 须 指 明 怎 么 做,SQL 语 句 的 操 作 过 程 由 系 统 自 动 完 成 SQL 中 最 经 常 使 用 的 是 从 数 据 库 中 获 取 数 据, 从 数 据 库 中 获 取 数 据 称 为 查 询 数 据 库, 查 询 数 据 库 通 过 使 用 SELECT 语 句 实 现 常 见 的 SELECT 语 句 包 含 六 部 分, 其 语 法 形 式 为 : SELECT 字 段 列 表 FROM 表 名 [WHERE 查 询 条 件 GROUP BY 分 组 字 段 HAVING 分 组 条 件 ORDER BY 字 段 [ASC DESC] ] 其 中 : 210

第 11 章 数 据 库 程 序 设 计 211 (1) 字 段 列 表 部 分 包 含 了 查 询 结 果 要 显 示 的 字 段 清 单, 字 段 之 间 用 逗 号 隔 开 要 选 择 表 中 的 所 有 字 段, 可 以 用 * 代 替 如 果 要 对 选 定 的 字 段 进 行 更 名, 可 在 该 字 段 后 用 AS[ 新 名 ] 来 实 现 如 果 需 要 查 询 的 某 字 段 在 数 据 表 中 没 有, 而 是 通 过 若 干 字 段 进 行 运 算 的 结 果, 则 可 以 用 SQL 提 供 的 基 本 的 运 算 符 ( + - * / ), 以 及 重 命 名 关 键 字 AS 来 实 现 例 如 : 在 学 生 成 绩 数 据 表 中 通 过 已 有 的 期 末 考 试 成 绩 平 时 成 绩 来 计 算 学 生 的 综 合 成 绩, 则 可 以 写 成 : SELECT 期 末 考 试 成 绩 *0.7+ 平 时 成 绩 *0.3 AS 综 合 成 绩 (2) WHERE 子 句 用 于 限 制 记 录 的 选 择, 构 造 查 询 条 件 可 使 用 大 多 数 Visual Basic 内 部 函 数 和 运 算 符 ( < <= > >= <> + - * / 等 ) 以 及 SQL 特 有 的 运 算 符 ( Between Like 和 In 运 算 符 等 ) 构 成 表 达 式 其 中, 比 较 运 算 符 < <= > >= <> 主 要 与 数 值 类 型 的 字 段 一 起 使 用, 比 较 运 算 只 能 在 数 据 类 型 相 似 的 字 段 列 之 间 进 行 ; 比 较 运 算 符 = 和 <> 也 可 以 用 于 文 本 和 算 术 数 据 类 型 的 字 段, 查 询 的 值 为 文 本 时, 用 单 引 号 将 文 本 字 段 值 括 起 来 ; 算 术 运 算 符 + - * / 用 于 执 行 算 术 运 算 Between 运 算 符 用 于 数 值 或 日 期 类 型 的 字 段, 语 法 形 式 为 :field_fieldname Between Value1 and Value2, 要 求 在 日 期 的 数 值 两 边 加 上 标 志 #, 如 : 报 到 日 期 Between #2005-08-23 and 2005-09-3# Like 运 算 符 用 来 找 出 符 合 指 定 条 件 的 记 录 可 以 指 定 完 整 的 值 ( 例 如,Like 字 段 值 ), 或 使 用 通 配 符 来 指 定 查 询 的 范 围 语 法 形 式 为 :field_fieldname like 字 段 值, 如 : 姓 名 Like *dia 表 示 在 姓 名 字 段 中 所 有 以 dia 结 尾 的 记 录, 如 Like 李 *, 则 查 询 返 回 该 字 段 中 所 有 姓 李 的 学 生 In 运 算 符 用 于 判 断 表 达 式 的 数 值 是 否 等 于 指 定 列 表 中 几 个 数 值 中 的 一 个 例 如 : 地 区 in ( 华 东 华 南 华 北 ) 表 示 在 地 区 字 段 值 等 于 华 东 华 南 华 北 其 中 之 一 的 所 有 记 录 (3) GROUP BY 和 HAVING 子 句 用 于 分 组 和 分 组 过 滤 处 理 它 能 把 指 定 字 段 中 有 相 同 值 的 记 录 合 并 成 一 条 记 录 如 果 在 SELECT 语 句 中 含 有 SQL 合 计 函 数, 例 如 SUM 或 者 COUNT 函 数, 那 么 就 为 每 条 记 录 创 建 摘 要 值 在 GROUP BY 字 段 中 的 NULL 值 会 被 分 组, 并 不 省 略 但 是, 在 任 何 SQL 合 计 函 数 中 都 计 算 NULL 值 可 用 WHERE 子 句 来 排 除 不 想 分 组 的 行, 将 记 录 分 组 后, 也 可 以 用 HAVING 子 句 进 行 筛 选 一 旦 GROUP BY 子 句 完 成 了 记 录 分 组,HAVING 子 句 就 显 示 由 GROUP BY 子 句 分 组 的 并 且 满 足 HAVING 子 句 条 件 的 所 有 记 录 (4) ORDER BY 子 句 决 定 了 查 找 出 来 的 记 录 的 排 列 顺 序, 在 ORDER BY 子 句 中 可 以 指 定 一 个 或 者 多 个 字 段 作 为 排 序 关 键 字,ASC 选 项 代 表 升 序,DESC 选 项 代 表 降 序 在 上 述 SQL 语 句 中,SELECT 和 FROM 子 句 是 必 须 要 有 的, 它 指 明 Visual Basic 从 何 处 寻 找 想 要 的 数 据, 通 过 SELECT 语 句 可 返 回 一 个 记 录 集 可 在 SELECT 子 句 内 使 用 合 计 函 数 对 记 录 进 行 操 作, 它 返 回 一 组 记 录 的 单 一 值 例 如, AVG 函 数 可 以 返 回 记 录 集 的 特 定 字 段 中 所 有 值 的 平 均 数 表 11-1 列 出 了 合 计 函 数 211

212 Visual Basic 程 序 设 计 表 11-1 合 计 函 数 合 计 函 数 描 述 AVG COUNT SUM MAX MIN 用 来 获 取 特 定 字 段 中 的 值 的 平 均 数 用 来 返 回 选 定 记 录 的 个 数 用 来 返 回 特 定 字 段 中 所 有 值 的 总 和 用 来 返 回 指 定 字 段 中 的 最 大 值 用 来 返 回 指 定 字 段 中 的 最 小 值 11.2 可 视 化 数 据 管 理 器 Visual Basic 所 支 持 的 不 同 类 型 的 数 据 库 可 以 通 过 相 关 的 数 据 库 管 理 系 统 来 建 立 可 视 化 数 据 管 理 器 (VisData) 是 Visual Basic 的 数 据 库 设 计 工 具, 使 用 这 个 工 具 不 但 能 够 创 建 多 种 格 式 的 数 据 库, 而 且 可 对 它 们 进 行 浏 览 和 其 他 操 作 除 此 之 外,VisData 还 有 其 他 功 能, 如 修 复 和 压 缩 MDB 数 据 库 11.2.1 启 动 可 视 化 数 据 管 理 器 打 开 可 视 化 数 据 管 理 器 的 方 法 是 单 击 外 接 程 序 主 菜 单 的 可 视 化 数 据 管 理 器 选 项, 进 入 可 视 化 数 据 管 理 器 ( 图 11.1), 在 其 中 对 数 据 库 进 行 各 种 操 作 通 过 交 互 方 式 可 以 实 现 如 下 数 据 库 管 理 器 的 基 本 功 能 (1) 打 开 已 经 存 在 的 数 据 库 ; (2) 新 建 一 个 指 定 类 型 的 数 据 库 ; (3) 建 立 新 增 及 删 除 数 据 表 ; (4) 建 立 增 加 字 段 ; (5) 建 立 增 加 更 正 删 除 和 查 询 记 录 ; (6) 建 立 增 加 和 删 除 索 引 ; (7) 整 理 数 据 库 可 视 化 数 据 管 理 器 的 缺 点 是 无 法 修 改 原 有 数 据 库 的 字 段 名 称 类 型 和 字 段 的 长 度 图 11.1 可 视 化 数 据 管 理 器 212

第 11 章 数 据 库 程 序 设 计 213 11.2.2 新 建 数 据 库 在 Visual Basic 中, 利 用 可 视 化 数 据 库 管 理 器 可 以 创 建 多 种 类 型 的 数 据 库, 如 :Access FoxPro dbase Excel 等 格 式 其 中 Access 数 据 库 又 包 括 Access 2.0 和 Access 7.0 两 种 版 本 另 外,FoxPro dbase 和 Paradox 也 包 含 不 同 版 本 具 体 的 创 建 步 骤 如 下 单 击 外 接 程 序 主 菜 单 的 可 视 化 数 据 管 理 器 选 项, 打 开 可 视 化 数 据 管 理 器 ( 见 图 11.1) 可 视 化 数 据 管 理 器 文 件 菜 单 中 的 选 项 功 能 描 述 如 表 11-2 所 示 可 视 化 数 据 管 理 器 实 用 程 序 菜 单 中 的 选 项 功 能 描 述 如 表 11-3 所 示 表 11-2 文 件 菜 单 中 的 选 项 功 能 选 项 功 能 描 述 打 开 数 据 库 新 建 导 入 / 导 出 工 作 空 间 压 缩 MDB 修 复 MDB 打 开 指 定 的 数 据 库 根 据 所 选 类 型 建 立 新 数 据 库 从 其 他 数 据 库 中 导 入 数 据 表, 或 导 出 数 据 表 及 SQL 查 询 结 果 显 示 注 册 对 话 框, 注 册 新 工 作 空 间 压 缩 指 定 的 Access 数 据 库 修 复 指 定 的 Access 数 据 库 表 11-3 实 用 程 序 菜 单 中 的 选 项 功 能 选 项 功 能 描 述 查 询 生 成 器 数 据 窗 口 设 计 器 全 局 替 换 附 加 用 户 组 / 用 户 System.mda 首 选 项 建 立 查 看 执 行 和 存 储 SQL 查 询 创 建 数 据 窗 体 并 将 其 添 加 到 VB 工 程 中 创 建 SQL 表 达 式 并 更 新 所 选 数 据 表 中 满 足 条 件 的 记 录 显 示 当 前 Access 数 据 库 中 所 有 附 加 数 据 表 及 连 接 条 件 查 看 和 修 改 用 户 组 用 户 权 限 等 设 置 创 建 System.mda 文 件, 以 便 为 每 个 文 件 设 置 安 全 机 制 设 置 查 询 或 登 录 超 时 值 以 及 启 动 时 是 否 打 开 上 一 次 使 用 的 数 据 库 文 件 单 击 可 视 化 数 据 管 理 器 文 件 菜 单 中 的 新 建 选 项, 出 现 图 11.2 所 示 的 对 话 框, 用 户 指 定 一 个 数 据 库 文 件 名 ( 可 以 包 括 路 径 ), 就 会 出 现 如 图 11.3 所 示 的 窗 口 图 11.3 左 边 的 数 据 库 窗 口 用 于 列 出 指 定 数 据 库 所 包 含 的 表 名 及 结 构 ( 但 这 个 数 据 库 是 新 建 的, 没 有 用 户 表, 只 是 显 示 数 据 库 的 一 些 基 本 属 性 ) 213

214 Visual Basic 程 序 设 计 图 11.2 指 定 新 建 一 个 Access 数 据 库 的 名 称 和 路 径 图 11.3 新 建 一 个 Access 数 据 库 11.2.3 打 开 数 据 库 打 开 数 据 库 的 操 作 和 新 建 数 据 库 的 操 作 基 本 类 似, 只 是 需 要 保 证 打 开 的 数 据 必 须 在 硬 盘 上 存 在 具 体 的 创 建 步 骤 如 下 单 击 外 接 程 序 主 菜 单 的 可 视 化 数 据 管 理 器 选 项, 打 开 可 视 化 数 据 管 理 器 ( 图 11.1) 使 用 可 视 化 数 据 管 理 器 文 件 菜 单 中 的 打 开 选 项, 选 择 需 要 打 开 的 数 据 库 类 型, 然 后 指 定 数 据 库 的 全 路 径 即 可 11.2.4 添 加 数 据 表 下 面 以 学 生 基 本 情 况 表 来 说 明 使 用 数 据 管 理 器 建 立 Student.mdb 数 据 库 的 过 程 学 生 基 本 情 况 表 结 构 如 表 11-4 所 示 214

第 11 章 数 据 库 程 序 设 计 215 表 11-4 学 生 基 本 情 况 表 字 段 名 类 型 宽 度 字 段 名 类 型 宽 度 学 号 Text 12 专 业 Text 20 姓 名 Text 10 出 生 年 月 Date 8 性 别 Text 2 照 片 Binary 在 VisData 中, 单 击 文 件 菜 单 下 的 新 建 选 项, 出 现 数 据 库 类 型 选 择 菜 单 单 击 菜 单 中 的 Microsoft Access, 将 出 现 版 本 子 菜 单, 在 版 本 菜 单 中 选 择 要 创 建 的 数 据 库 版 本, 如 :Microsoft Access 7.0 版 本 选 定 要 创 建 的 数 据 类 型 及 版 本 后, 出 现 新 建 数 据 库 对 话 框, 在 文 件 名 框 中 输 入 要 创 建 的 数 据 库 文 件 名, 如 : E:\Student, 单 击 保 存 按 钮 ( 图 11.2) 在 可 视 化 数 据 库 管 理 器 窗 口 中 出 现 数 据 库 窗 口 和 SQL 语 句 窗 口, 如 图 11.3 所 示 在 数 据 库 窗 口 中 只 有 Properties 一 项, 单 击 其 前 面 的 + 可 以 以 树 型 结 构 显 示 库 的 具 体 属 性 SQL 语 句 窗 口 主 要 用 来 执 行 数 据 查 询 语 句, 并 且 在 该 窗 口 中 可 以 执 行 和 清 除 SQL 语 句, 如 需 要 保 存 SQL 语 句 可 以 单 击 保 存 按 钮 另 外, 在 数 据 库 窗 口 中 单 击 鼠 标 右 键 打 开 快 捷 菜 单, 在 此 菜 单 中 有 新 建 表 和 刷 新 列 表 等 选 项 当 要 创 建 新 表 时, 单 击 新 建 表 选 项, 即 可 打 开 如 图 11.4 所 示 的 表 结 构 对 话 框, 在 该 对 话 框 中 可 以 进 行 建 立 一 个 新 表 的 基 本 操 作, 如 输 入 新 表 的 名 称 添 加 字 段 删 除 字 段 等 图 11.4 表 结 构 对 话 框 215

216 Visual Basic 程 序 设 计 其 中, 表 名 称 文 本 框 用 于 输 入 数 据 库 的 表 名, 在 本 例 中 输 入 学 生 基 本 情 况 表, 单 击 添 加 字 段 按 钮, 打 开 如 图 11.5 所 示 的 添 加 字 段 对 话 框, 在 该 对 话 框 中 可 为 数 据 库 表 添 加 字 段 添 加 字 段 对 话 框 内 各 选 项 功 能 描 述 见 表 11-5 首 先 在 名 称 框 中 输 入 添 加 字 段 的 名 称, 然 后 在 类 型 项 中 进 行 合 适 的 选 择 选 定 类 型 后, 大 小 文 本 框 中 出 现 该 字 段 类 型 的 默 认 长 度, 也 可 根 据 需 要 输 入 字 段 长 度 另 外, 还 可 在 添 加 字 段 对 话 框 中 设 置 其 他 项 各 项 设 置 完 后, 单 击 确 定 按 钮, 可 以 添 加 下 一 个 字 段 最 后, 单 击 关 闭 按 钮, 返 回 表 结 构 对 话 框 图 11.5 添 加 字 段 对 话 框 表 11-5 添 加 字 段 对 话 框 中 各 选 项 说 明 选 项 名 描 述 名 称 类 型 大 小 固 定 字 段 可 变 字 段 允 许 零 长 度 必 要 的 顺 序 位 置 验 证 文 本 验 证 规 则 默 认 值 字 段 名 称 指 定 字 段 的 类 型 字 段 宽 度 字 段 宽 度 固 定 不 变 字 段 宽 度 可 变 表 示 空 字 符 串 可 作 为 有 效 的 字 段 值 表 示 该 字 段 值 不 可 缺 少 字 段 在 表 中 的 顺 序 位 置 当 向 表 中 输 入 无 效 值 时 所 显 示 的 提 示 验 证 输 入 字 段 的 简 单 规 则 在 输 入 时 设 置 的 字 段 初 始 值 此 时, 在 表 结 构 对 话 框 中 的 字 段 列 表 中 显 示 了 所 添 加 的 所 有 字 段, 单 击 各 个 字 段, 可 以 浏 览 该 字 段 属 性 的 各 项 设 置, 如 图 11.6 所 示 216

第 11 章 数 据 库 程 序 设 计 217 图 11.6 添 加 字 段 后 的 表 结 构 图 在 该 对 话 框 中 单 击 添 加 索 引 按 钮 后, 出 现 添 加 索 引 对 话 框, 如 图 11.7 所 示 在 该 对 话 框 中 的 名 称 框 中 输 入 建 立 索 引 表 的 名 称, 其 中 在 可 用 字 段 列 表 中, 列 出 了 所 有 可 以 用 做 索 引 的 字 段, 以 供 用 户 选 择 单 击 确 定 按 钮, 将 当 前 索 引 表 加 入 表 结 构 中 同 时 还 可 以 再 单 击 添 加 索 引 按 钮 新 建 其 他 索 引 表 所 有 索 引 表 建 立 后, 单 击 关 闭 按 钮, 关 闭 添 加 索 引 对 话 框 通 过 添 加 索 引 对 话 框 可 以 将 数 据 表 中 的 某 些 字 段 设 置 为 索 引, 以 加 快 查 找 速 度 图 11.7 添 加 索 引 对 话 框 在 图 11.6 所 示 的 对 话 框 中, 单 击 生 成 表 按 钮, 就 会 出 现 如 图 11.8 所 示 的 学 生 基 本 情 况 表 双 击 学 生 基 本 情 况 表 前 面 的 + - 号 可 以 将 其 展 开 或 者 折 叠 217

218 Visual Basic 程 序 设 计 图 11.8 表 结 构 建 立 后 的 数 据 库 管 理 器 11.2.5 数 据 的 增 加 删 除 和 修 改 在 图 11.8 所 示 的 数 据 库 窗 口 中, 应 注 意 在 工 具 栏 中 使 动 态 集 类 型 记 录 集 和 在 新 窗 体 上 使 用 Data 控 件 按 钮 被 选 中, 右 击 学 生 基 本 情 况 表, 在 快 捷 菜 单 中 选 择 打 开 选 项, 即 可 向 表 中 添 加 记 录, 如 图 11.9 所 示 为 了 便 于 后 面 的 使 用, 请 输 入 若 干 条 记 录 若 要 修 改 该 表 的 结 构, 可 在 快 捷 菜 单 中 选 择 设 计 选 项, 便 可 以 返 回 到 图 11.4 进 行 修 改 当 表 建 好 后, 用 鼠 标 双 击 数 据 库 窗 口 中 的 学 生 基 本 情 况 表, 打 开 如 图 11.9 所 示 的 对 话 框, 选 择 对 应 的 选 项 进 行 添 加 编 辑 和 删 除 操 作 图 11.9 中 各 按 钮 功 能 描 述 如 表 11-6 所 示 图 11.9 添 加 记 录 对 话 框 218

第 11 章 数 据 库 程 序 设 计 219 表 11-6 图 11.9 中 各 按 钮 功 能 描 述 添 加 更 新 删 除 查 找 刷 新 关 闭 按 钮 名 称 描 述 数 据 区 清 空, 等 待 数 据 输 入 保 存 新 输 入 的 数 据, 更 新 数 据 库 删 除 选 中 的 当 前 记 录 设 置 查 找 条 件, 查 找 数 据 取 消 上 次 更 新 以 后 的 改 变 关 闭 当 前 窗 口 11.2.6 数 据 的 查 询 查 询 生 成 器 是 一 个 用 来 构 造 SQL 查 询 的 表 达 式 生 成 器, 可 用 来 生 成 查 看 执 行 和 保 存 SQL 查 询 生 成 的 查 询 条 件 将 作 为 数 据 库 的 一 部 分 保 存 使 用 查 询 生 成 器 建 立 查 询 的 步 骤 如 下 (1) 打 开 可 视 化 数 据 管 理 器 和 要 建 立 查 询 的 数 据 库 从 实 用 程 序 菜 单 中 选 择 查 询 生 成 器 选 项, 打 开 查 询 生 成 器 对 话 框 ( 图 11.10) 在 表 列 表 对 话 框 中 列 出 了 该 数 据 库 中 包 含 的 所 有 数 据 表 (2) 在 表 列 表 框 中, 单 击 要 查 询 的 表, 该 表 中 的 所 有 字 段 将 出 现 在 要 显 示 的 字 段 列 表 框 中, 在 该 框 中 选 中 所 有 查 询 时 要 显 示 的 列 的 字 段 名, 使 它 们 处 于 选 中 状 态 查 询 还 可 以 在 多 个 表 之 间 进 行, 选 择 多 个 表 后, 可 以 选 择 不 同 表 的 字 段 组 成 查 询 结 果 的 列, 通 常 还 要 建 立 表 间 的 连 接 (3) 在 对 话 框 上 部 有 字 段 名 称 运 算 符 和 值 3 个 下 拉 列 表 框, 它 们 用 来 构 成 一 个 查 询 条 件 表 达 式 字 段 名 称 中 列 出 了 选 中 表 的 所 有 字 段, 运 算 符 中 列 出 了 选 中 的 字 段 可 以 参 加 的 关 系 运 算, 主 要 有 > >= < <= <> 和 Like 等, 在 值 下 拉 列 表 框 中 可 以 输 入 条 件 值, 也 可 以 单 击 列 出 可 能 的 值 按 钮, 选 择 字 段 的 取 值 添 加 到 值 列 表 中 图 11.10 查 询 生 成 器 对 话 框 219

220 Visual Basic 程 序 设 计 (4) 单 击 将 And 加 入 条 件 或 将 Or 加 入 条 件 按 钮, 可 以 将 条 件 依 次 添 加 到 条 件 列 表 框 中 查 询 条 件 表 达 式 可 以 是 由 多 个 条 件 组 合 而 成 的 逻 辑 表 达 式 单 击 清 除 按 钮 可 以 删 除 条 件 (5) 要 查 看 查 询 条 件, 可 以 单 击 显 示 按 钮, 打 开 SQL 查 询 对 话 框, 如 图 11.11 所 示 单 击 复 制 按 钮, 可 以 将 SQL 查 询 复 制 到 SQL 语 句 窗 口 (6) 查 询 条 件 设 定 后, 可 以 单 击 运 行 按 钮 查 看 结 果 这 时 将 弹 出 如 图 11.12 所 示 的 对 话 框 单 击 否 按 钮 后, 将 显 示 查 询 结 果, 如 图 11.13 所 示 单 击 关 闭 按 钮 可 以 结 束 查 询 图 11.11 SQL 查 询 对 话 框 图 11.12 确 认 对 话 框 (7) 如 果 要 保 存 创 建 的 查 询, 则 在 查 询 生 成 器 对 话 框 中 单 击 保 存 按 钮, 即 可 打 开 保 存 对 话 框, 如 图 11.14 所 示, 输 入 查 询 名 称, 将 查 询 保 存 到 数 据 库 中 图 11.13 SQL 查 询 结 果 窗 口 图 11.14 输 入 查 询 名 保 存 查 询 后, 在 数 据 库 窗 口 中 就 可 以 看 到 刚 才 建 立 的 查 询 以 后 要 执 行 该 查 询, 只 需 在 数 据 库 窗 口 中 双 击 该 查 询 名 同 时, 可 以 选 择 该 查 询 右 键 快 捷 菜 单 中 的 设 计 选 项, 在 SQL 语 句 窗 口 中 对 该 查 询 条 件 进 行 修 改, 如 图 11.15 所 示 图 11.15 SQL 语 句 窗 口 220

第 11 章 数 据 库 程 序 设 计 221 11.2.7 数 据 窗 体 设 计 器 数 据 窗 体 设 计 器 可 以 根 据 数 据 库 中 建 立 的 表 或 查 询 快 速 生 成 一 个 窗 体, 并 添 加 到 工 程 中 使 用 数 据 窗 体 设 计 器 建 立 数 据 库 操 作 窗 体 的 步 骤 如 下 (1) 新 建 一 个 标 准 EXE 工 程 (2) 在 可 视 化 数 据 管 理 器 中, 从 实 用 程 序 菜 单 中 选 择 数 据 窗 体 设 计 器 选 项, 打 开 数 据 窗 体 设 计 器 对 话 框, 如 图 11.16 所 示 在 窗 体 名 称 ( 为 带 扩 展 名 ) 框 中 输 入 要 添 加 到 VB 工 程 中 的 窗 体 的 名 称 从 记 录 源 列 表 中 选 择 一 个 存 在 的 查 询 或 表, 或 者 输 入 一 个 新 的 SQL 语 句 记 录 源 是 用 于 窗 体 或 报 表 的 基 本 数 据 源 ( 表 查 询 或 SQL 语 句 ) 可 用 字 段 框 中 列 出 了 选 中 记 录 源 的 所 有 字 段 包 括 字 段 框 中 列 出 了 要 在 窗 体 出 现 的 字 段 在 可 用 字 段 框 中 选 择 出 现 在 窗 体 上 的 字 段, 单 击 > 按 钮 把 该 字 段 移 到 包 括 字 段 框 中 单 击 < 按 钮 可 以 进 行 相 反 的 操 作 如 果 是 全 部 选 中 或 者 全 部 移 除, 则 可 以 使 用 >> 或 << 按 钮 单 击 对 话 框 右 侧 的 上 下 箭 头 按 钮, 可 以 重 新 排 列 字 段 在 窗 体 中 出 现 的 次 序 (3) 单 击 生 成 窗 体 按 钮, 可 以 在 工 程 中 添 加 一 个 数 据 窗 体 图 11.16 数 据 窗 体 设 计 器 对 话 框 11.3 数 据 控 件 和 数 据 绑 定 控 件 数 据 控 件 (Data) 是 Visual Basic 访 问 数 据 库 的 一 种 利 器, 添 加 数 据 控 件 并 对 其 某 些 属 性 进 行 设 置 后, 就 可 对 数 据 库 进 行 操 作 但 是, 它 只 是 负 责 数 据 库 和 工 程 之 间 的 数 据 交 换, 允 许 将 数 据 从 一 个 记 录 移 动 到 另 一 个 记 录, 它 本 身 并 不 能 独 立 显 示 数 据 如 果 要 显 示 数 据 库 的 访 问 结 果, 或 往 数 据 库 中 加 入 新 的 数 据, 还 需 要 文 本 框 或 标 签 等 控 件 当 这 些 控 件 和 数 据 控 件 捆 绑 在 一 起 时 称 为 数 据 绑 定 控 件 常 用 的 数 据 绑 定 控 件 有 文 本 框 (TextBox) 标 签 (Label) 复 选 框 (CheckBox) 图 像 框 (Image) 图 片 框 (PictureBox) 列 表 框 (ListBox) 和 组 合 框 (ComboBox) 等 数 据 绑 定 控 件 必 须 与 数 据 控 件 在 同 一 窗 体 中 221

222 Visual Basic 程 序 设 计 11.3.1 数 据 控 件 数 据 控 件 (Data) 是 Visual Basic 的 标 准 控 件 之 一, 可 直 接 从 工 具 箱 中 加 入 窗 体 它 的 某 些 属 性 必 须 在 属 性 窗 体 中 设 置 其 他 属 性 既 可 在 属 性 窗 体 中 设 置, 也 可 在 程 序 运 行 时 用 代 码 来 设 置 或 改 变 表 11-7 表 11-8 表 11-9 分 别 列 出 了 Data 数 据 控 件 的 常 用 属 性 方 法 和 事 件 表 11-7 数 据 控 件 的 常 用 属 性 属 性 描 述 Connect DatabaseName RecordSource RecordsetType 指 定 数 据 控 件 所 要 连 接 的 数 据 库 类 型 指 定 被 访 问 数 据 库 的 名 称 和 所 在 路 径 设 置 或 返 回 数 据 库 中 所 要 访 问 的 数 据 库 表 名 或 查 询 名 设 置 记 录 集 的 类 型 :Dynaset Snapshot 或 Table 类 型 ReadOnly 决 定 数 据 库 是 否 可 以 编 辑 (True, 可 以 ;False, 不 可 以 ) Exclusive 表 示 当 前 用 户 是 否 对 所 访 问 的 数 据 库 独 自 享 用 (True, 单 用 户 ;False, 多 用 户 ) 表 11-8 数 据 控 件 的 常 用 方 法 方 法 描 述 Refresh UpdateRecord 用 来 建 立 或 重 新 显 示 与 数 据 控 件 相 连 接 的 数 据 库 记 录 集 将 数 据 绑 定 控 件 中 的 当 前 内 容 写 入 到 数 据 库 表 中 表 11-9 数 据 控 件 的 常 用 事 件 事 件 描 述 Error Reposition Validate 主 要 用 来 处 理 不 能 被 任 何 应 用 程 序 捕 获 的 错 误 当 用 户 单 击 数 据 控 件 上 某 个 箭 头 按 钮, 或 者 在 代 码 中 使 用 了 某 个 Move 或 Find 方 法 使 某 条 新 记 录 成 为 当 前 记 录 时, 将 激 发 Reposition 事 件 在 一 条 不 同 的 记 录 成 为 当 前 记 录 之 前, 在 Update 方 法 之 前 ( 用 UpdateRecord 方 法 保 存 数 据 时 除 外 ) 以 及 Delete Unload 或 Close 操 作 之 前 会 发 生 该 事 件 11.3.2 Recordset 对 象 的 属 性 和 方 法 在 Visual Basic 中 数 据 库 表 是 不 能 直 接 被 访 问 的,Visual Basic 6.0 通 过 Microsoft Jet 3.51 数 据 库 引 擎 (Access 97 以 前 的 版 本, 从 Access 2000 开 始 数 据 库 引 擎 改 为 Microsoft Jet 4.0) 提 供 的 Recordset( 记 录 集 ) 对 象 来 检 索 和 显 示 数 据 库 记 录 一 个 Recordset 对 象 表 示 一 个 或 多 个 数 据 库 表 中 的 对 象 集 合 的 多 个 对 象, 或 运 行 一 次 查 询 所 得 到 的 记 录 结 果 一 个 记 录 集 对 象 相 当 于 一 个 变 量, 与 数 据 库 表 相 似, 记 录 集 也 是 由 行 和 列 组 成 的, 但 不 同 的 是 记 录 集 可 以 同 时 包 含 多 个 表 中 的 数 据 表 11-10 表 11-11 分 别 列 出 了 Recordset 对 象 的 常 用 属 性 和 方 法 222

第 11 章 数 据 库 程 序 设 计 223 表 11-10 Recordset 对 象 的 常 用 属 性 属 性 描 述 ActiveConnection Source RecordCount BOF 和 EOF AbsolutePosition Bookmark CursorType Filter Sort 返 回 Recordset 对 象 所 属 的 Connection 对 象 返 回 或 设 置 Recordset 对 象 的 生 成 方 式 返 回 Recordset 对 象 中 的 记 录 个 数 指 示 记 录 指 针 是 否 指 向 了 第 一 条 记 录 之 前 和 最 后 一 条 记 录 之 后 返 回 当 前 记 录 的 序 号 返 回 或 设 置 当 前 记 录 集 指 针 的 书 签 设 置 或 返 回 Recordset 对 象 使 用 的 光 标 类 型 设 置 Recordset 对 象 中 的 数 据 筛 选 条 件 设 置 排 序 字 段 表 11-11 Recordset 对 象 的 常 用 方 法 方 法 描 述 Open Move MoveFirst MoveLast MoveNext MovePrevious AddNew Requery Update CancelUpdate Delete 打 开 代 表 数 据 表 查 询 结 果 等 Recordset 对 象 中 记 录 的 光 标 移 动 记 录 的 指 针 到 指 定 位 置 使 记 录 集 中 的 第 一 条 记 录 成 为 当 前 记 录 使 记 录 集 中 的 最 后 一 条 记 录 成 为 当 前 记 录 下 移 一 条 记 录, 使 下 一 条 记 录 成 为 当 前 记 录 上 移 一 条 记 录, 使 上 一 条 记 录 成 为 当 前 记 录 为 可 更 新 的 Recordset 对 象 添 加 一 条 空 记 录 重 新 执 行 生 成 的 Recordset 对 象 的 查 询, 更 新 其 中 数 据 保 存 对 当 前 记 录 的 更 改 取 消 在 调 用 Update 方 法 之 前 对 记 录 的 更 改 删 除 当 前 记 录 或 记 录 组 11.3.3 数 据 绑 定 控 件 数 据 绑 定 控 件 是 用 于 访 问 数 据 库 信 息 的 数 据 识 别 控 件 为 创 建 一 个 简 单 的 数 据 库 应 用 程 序, 使 文 本 框 等 控 件 与 数 据 控 件 捆 绑 在 一 起, 成 为 数 据 控 件 的 绑 定 控 件 创 建 一 个 Data 控 件 后, 通 过 设 定 相 应 的 属 性, 可 把 数 据 绑 定 控 件 与 Data 控 件 联 系 起 来 绑 定 控 件 的 常 用 属 性 如 表 11-12 所 示 表 11-12 数 据 绑 定 控 件 的 常 用 属 性 属 性 描 述 DataChanged DataSource DataField 显 示 于 绑 定 控 件 里 的 数 据 是 否 被 修 改 用 来 设 置 与 数 据 绑 定 控 件 捆 绑 在 一 起 的 数 据 控 件 设 置 绑 定 控 件 所 连 接 数 据 库 中 的 当 前 字 段 的 名 称 223

224 Visual Basic 程 序 设 计 例 11.1 通 过 手 工 方 式 建 立 一 个 简 单 的 学 生 信 息 管 理 界 面, 如 图 11.17 所 示 图 11.17 一 个 简 单 的 学 生 信 息 管 理 界 面 设 计 步 骤 如 下 (1) 建 立 应 用 程 序 用 户 界 面 与 设 置 对 象 属 性 单 击 新 建 工 程 命 令, 进 入 窗 体 设 计 器 首 先 在 窗 体 上 增 加 一 个 数 据 控 件 Data1, 并 将 其 Align 属 性 改 为 :2-Align Bottom, 使 之 位 于 窗 体 的 下 端 然 后 在 窗 体 上 增 加 1 个 标 签 控 件 数 组 lbllabels 1 个 文 本 控 件 数 组 txtfields 和 4 个 命 令 按 钮, 按 照 表 11-13 进 行 属 性 的 设 置 表 11-13 属 性 设 置 对 象 属 性 属 性 值 说 明 Align 2-Align Bottom 设 置 位 置 Data1 DataBaseName E:\Student.mdb 与 数 据 源 连 接 RecordSource 学 生 基 本 情 况 表 与 数 据 表 连 接 LblLabels(0)~ LblLabels(5) Caption 学 号 姓 名 性 别 专 业 出 生 年 月 照 片 DataSource Data1 设 置 数 据 源 txtfields DataField 学 号 姓 名 性 别 专 业 出 生 年 月 照 片 分 别 绑 定 到 表 中 的 字 段 Command1 Name cmdadd Command2 Name cmddelete Command3 Name cmdrefresh Command4 Name cmdupdate Command5 Name cmdclose 224

(2) 编 写 代 码 第 11 章 数 据 库 程 序 设 计 225 Private Sub cmdadd_click() Data1.Recordset.AddNew Private Sub cmddelete_click() Data1.Recordset.Delete Data1.Recordset.MoveNext Private Sub cmdrefresh_click() Data1.Refresh Private Sub cmdupdate_click() Data1.UpdateRecord Data1.Recordset.Bookmark = Data1.Recordset.LastModified Private Sub cmdclose_click() Unload Me Private Sub Data1_Error(DataErr As Integer, Response As Integer) MsgBox " 数 据 错 误 事 件 命 中 错 误 :" & Error$(DataErr) Response = 0 ' 忽 略 错 误 Private Sub Data1_Reposition() Screen.MousePointer = vbdefault On Error Resume Next Data1.Caption = " 记 录 :" & (Data1.Recordset.AbsolutePosition + 1) 11.4 使 用 ADO 访 问 数 据 ADO(ActiveX Data Object, 数 据 访 问 接 口 ) 是 Microsoft 公 司 提 出 的 数 据 库 访 问 策 略, 它 采 用 了 被 称 为 OLE DB 的 数 据 访 问 模 式, 是 数 据 访 问 对 象 DAO 远 程 数 据 对 象 RDO 和 开 放 数 据 库 互 连 ODBC 这 3 种 方 式 的 扩 展 Visual Basic 6.0 可 以 很 好 地 支 持 ADO 和 OLE DB 数 据 访 问 模 式 用 户 可 以 使 用 ADO 快 速 建 立 数 据 库 连 接, 并 通 过 它 方 便 地 操 作 数 据 库 11.4.1 ADO 对 象 模 型 ADO 对 象 模 型 定 义 了 一 个 可 以 编 程 的 分 层 对 象 集 合, 主 要 由 3 个 对 象 成 员 Connection Command 和 Recordset 对 象, 以 及 几 个 集 合 对 象 Errors Parameters 和 Fields 等 组 成 图 11.18 示 意 了 这 些 对 象 彼 此 之 间 的 关 系, 表 11-14 是 这 些 对 象 分 工 的 描 述 225

226 Visual Basic 程 序 设 计 Connection Errors Error Command Properties Parameters Parameter Property Recordset Fields Field 图 11.18 ADO 对 象 模 型 表 11-14 ADO 对 象 的 分 工 描 述 对 象 名 描 述 Connection Command Recordset Error Parameter Field Property 连 接 数 据 源 从 数 据 源 获 取 所 需 数 据 的 命 令 信 息 所 获 取 的 一 组 记 录 组 成 的 记 录 集 在 访 问 数 据 时, 由 数 据 源 返 回 的 错 误 信 息 与 命 令 对 象 相 关 的 参 数 包 含 了 记 录 集 中 某 个 字 段 的 信 息 包 含 由 提 供 者 定 义 的 ADO 对 象 的 动 态 特 征 要 想 在 程 序 中 使 用 ADO 对 象, 必 须 先 为 当 前 工 程 引 用 ADO 的 对 象 库, 引 用 方 式 是 执 行 工 程 菜 单 的 引 用 命 令, 启 动 引 用 对 话 框, 在 列 表 中 选 取 Microsoft ActiveX Data Object 2.0 Library 选 项 11.4.2 ADODC 控 件 在 使 用 ADODC 数 据 控 件 前, 必 须 先 通 过 工 程 部 件 菜 单 选 择 Microsoft ADO Data Control 6.0(OLE DB) 选 项, 将 ADO 数 据 控 件 添 加 到 工 具 箱 ADO 数 据 控 件 与 Visual Basic 的 内 部 数 据 控 件 很 相 似, 它 允 许 使 用 ADO 数 据 控 件 的 基 本 属 性 快 速 地 创 建 与 数 据 库 的 连 接 1. ADODC 控 件 的 基 本 属 性 方 法 和 事 件 ADODC 控 件 的 基 本 属 性 如 表 11-15 所 示, 它 的 方 法 和 事 件 与 Data 控 件 对 应 的 方 法 和 事 件 基 本 一 致, 此 处 不 再 介 绍 ADODC 的 ConnectionString 属 性 可 以 带 4 个 参 数, 其 参 数 说 明 如 表 11-16 所 示 226

第 11 章 数 据 库 程 序 设 计 227 表 11-15 ADODC 控 件 的 基 本 属 性 属 性 描 述 ConnectionString RecordSource ConnectionTimeOut MaxRecords 连 接 数 据 源, 它 包 含 了 用 于 与 数 据 源 建 立 连 接 的 相 关 信 息 设 置 或 返 回 数 据 库 中 所 要 访 问 的 数 据 库 表 名 或 查 询 名 设 置 数 据 连 接 的 超 时 设 置 一 个 查 询 中 最 多 能 返 回 的 记 录 数 表 11-16 ConnectionString 属 性 的 参 数 说 明 参 数 说 明 Provider File Name Remote Provider Remote Server 指 定 用 于 连 接 的 数 据 源 名 称 指 定 基 于 数 据 源 的 文 件 名 指 定 在 远 程 数 据 服 务 器 打 开 一 个 客 户 端 时 所 用 的 数 据 源 名 称 指 定 在 远 程 数 据 服 务 器 打 开 一 个 服 务 器 端 时 所 用 的 数 据 源 名 称 2. 设 置 ADO 数 据 控 件 的 属 性 下 面 通 过 使 用 ADO 数 据 控 件 连 接 Student.mdb 数 据 库 来 说 明 ADODC 控 件 属 性 的 设 置 过 程 : (1) 在 窗 体 上 添 加 ADO 数 据 控 件, 控 件 名 采 用 默 认 名 Adodcl (2) 右 击 ADO 控 件, 在 弹 出 的 快 捷 菜 单 中 选 择 ADODC 属 性 选 项, 将 打 开 如 图 11.19 所 示 的 属 性 页 对 话 框 图 11.19 属 性 页 对 话 框 (3) 在 通 用 选 项 卡 中 选 择 使 用 连 接 字 符 串 选 项, 单 击 生 成 按 钮, 打 开 如 图 11.20 所 示 的 数 据 链 接 属 性 对 话 框, 在 其 中 可 以 设 置 ADO 控 件 的 窗 口 中 的 ConnectionString 属 性 在 数 据 链 接 属 性 对 话 框 的 提 供 程 序 选 项 卡 中, 选 择 适 当 的 OLE DB 的 提 供 者 ( 本 例 选 择 Microsoft Jet 3.51 OLE DB Provider 项 ), 单 击 下 一 步 按 钮, 进 入 数 据 链 接 属 性 对 话 框 的 连 接 选 项 卡, 如 图 11.21 所 示 在 其 中 选 择 需 要 使 用 227

228 Visual Basic 程 序 设 计 的 数 据 库 文 件 ( 本 例 选 择 Student.mdb), 然 后 单 击 测 试 连 接 按 钮, 验 证 连 接 的 正 确 性 最 后 单 击 确 定 按 钮 完 成 Connectionstring 属 性 的 设 置 图 11.20 数 据 链 接 属 性 对 话 框 图 11.21 连 接 选 项 卡 (4) 打 开 ADO 控 件 属 性 窗 口 中 的 记 录 源 选 项 卡, 设 置 记 录 源 的 命 令 类 型 为 2( 表 类 型 ), 设 置 表 或 存 储 过 程 的 名 称 为 学 生 基 本 情 况 表, 如 图 11.22 所 示 关 闭 记 录 源 属 性 页 此 时, 已 完 成 了 ADO 数 据 控 件 的 连 接 工 作 228

第 11 章 数 据 库 程 序 设 计 229 图 11.22 记 录 源 选 项 卡 11.5 应 用 示 例 例 11.2 使 用 ADODC 控 件 建 立 数 据 查 看 窗 体, 完 成 例 11-1 实 现 的 功 能 设 计 步 骤 如 下 (1) 建 立 应 用 程 序 用 户 界 面 与 设 置 对 象 属 性 单 击 新 建 工 程 命 令, 进 入 窗 体 设 计 器 首 先 在 窗 体 上 增 加 一 个 ADODC 控 件 Adodc1, 并 将 其 Align 属 性 改 为 :2-vbAlignBottom, 使 之 位 于 窗 体 的 下 端 然 后 在 窗 体 上 增 加 1 个 标 签 控 件 数 组 lbllabels 1 个 文 本 控 件 数 组 txtfields 和 4 个 命 令 按 钮, 按 照 表 11-17 进 行 相 关 属 性 的 设 置 (2) 按 照 11.4 小 节 中 设 置 ADO 数 据 控 件 的 属 性 提 供 的 步 骤, 对 Adodc1 控 件 进 行 属 性 设 置, 使 其 连 接 上 数 据 库 和 数 据 表 表 11-17 属 性 设 置 对 象 属 性 属 性 值 说 明 Adodc1 LblLabels(0) ~ Caption LblLabels(5) txtfields ConnectionString Provider=Microsoft.Jet.OLEDB.3.51; Persist Security Info=False; Data Source=E:\Student.mdb 与 数 据 源 连 接 RecordSource 学 生 基 本 情 况 表 与 数 据 表 连 接 学 号 姓 名 性 别 专 业 出 生 年 月 照 片 DataSource Adodc1 设 置 数 据 源 DataField Command1 Name cmdadd Command2 Name cmddelete Command3 Name cmdrefresh Command4 Name cmdupdate Command5 Name cmdclose 学 号 姓 名 性 别 专 业 出 生 年 月 照 片 分 别 绑 定 到 表 中 的 字 段 229

230 Visual Basic 程 序 设 计 (3) 编 写 程 序 Private Sub Adodc1_MoveComplete(ByVal adreason As ADODB.EventReasonEnum, ByVal perror As ADODB.Error, adstatus As ADODB.EventStatusEnum, ByVal precordset As ADODB.Recordset) On Error Resume Next Adodc1.Caption = " 记 录 :" & Adodc1.Recordset.AbsolutePosition Private Sub cmdadd_click() Adodc1.Recordset.AddNew Private Sub cmddelete_click() Adodc1.Recordset.Delete Adodc1.Recordset.MoveNext Private Sub cmdrefresh_click() Adodc1.Refresh Private Sub cmdupdate_click() Adodc1.Recordset.Update Adodc1.Recordset.MoveFirst Private Sub cmdclose_click() Unload Me 例 11.3 利 用 ADO 对 象 编 程 模 型 建 立 数 据 查 看 窗 体 ( 图 11.23) 图 11.23 使 用 ADO 对 象 编 程 模 型 设 计 步 骤 如 下 (1) 建 立 应 用 程 序 用 户 界 面 与 设 置 对 象 属 性 单 击 新 建 工 程 命 令, 进 入 窗 体 设 计 器 在 窗 体 上 增 加 1 个 标 签 控 件 数 组 lbllabels 1 个 文 本 控 件 数 组 txtfields 和 1 个 命 令 按 钮 控 件 数 组 Command1 (2) 将 数 组 txtfields 的 DataField 属 性 依 次 设 置 为 : 学 号 姓 名 性 别 专 业 出 生 年 月 其 他 控 件 的 属 性 设 置 参 见 图 11.23 230

(3) 编 写 代 码 首 先 在 窗 体 的 通 用 声 明 段 声 明 对 象 变 量 : Private DBS As New ADODB.Connection Private RST As New ADODB.Recordset 第 11 章 数 据 库 程 序 设 计 231 然 后 在 窗 体 的 Load 事 件 中 建 立 ADO 的 Connection 对 象 和 Recordset 对 象 : Private Sub Form_Load() With DBS If.State = adstateopen Then.Close End If.Provider = "Microsoft.Jet.OLEDB.4.0" 'Access 2000 及 以 上 版 本 创 建 MDB 数 据 库.Provider = "Microsoft.Jet.OLEDB.3.51" 'Access 97 及 以 下 版 本 创 建 MDB 数 据 库.ConnectionString = "E:\Student.mdb" ' 可 以 和 公 用 对 话 框 结 合 起 来 使 用.Open End With With RST If.State = adstateopen Then.Close End If.LockType = adlockoptimistic.activeconnection = DBS.CursorLocation = aduseclient.cursortype = adopenkeyset.open " 学 生 基 本 情 况 表 ", Options:=adCmdTable End With For each aa in txtfields ' 绑 定 所 有 文 本 框 到 记 录 源 Set aa.datasource = RST Next 最 后 编 写 命 令 按 钮 控 件 数 组 Command1( ) 的 Click 事 件 代 码 : Private Sub Command1_Click(Index As Integer) n = Index Select Case n Case 0 RST.MoveFirst Case 1 RST.MovePrevious If RST.BOF Then RST.MoveFirst Case 2 RST.MoveNext If RST.EOF Then RST.MoveLast Case 3 RST.MoveLast End Select 231

232 Visual Basic 程 序 设 计 11.6 小 结 本 章 介 绍 了 数 据 库 的 基 本 概 念 和 在 Visual Basic 中 的 数 据 库 操 作 数 据 库 (Database) 是 指 一 组 排 列 成 易 于 处 理 或 读 取 的 相 关 数 据 的 有 序 集 合, 它 是 由 一 个 或 多 个 表 对 象 组 成 的 集 合 按 数 据 组 织 形 式 可 以 将 数 据 库 分 为 层 次 型 网 状 型 和 关 系 型 结 构, 其 中 最 常 用 的 是 关 系 型 数 据 库 关 系 数 据 库 是 二 维 表 的 集 合,SQL 是 最 重 要 的 关 系 数 据 库 操 作 语 言 Visual Basic 中 可 以 访 问 的 数 据 库 类 型 有 dbase FoxPro Access MS SQL Server Oracle SQL Server 和 Sybase SQL Server 等 Visual Basic 所 支 持 的 不 同 类 型 的 数 据 库 可 以 通 过 相 关 的 数 据 库 管 理 系 统 来 建 立 可 视 化 数 据 管 理 器 (VisData) 是 Visual Basic 的 数 据 库 设 计 工 具, 使 用 这 个 工 具 不 但 能 够 创 建 多 种 格 式 的 数 据 库, 而 且 可 对 它 们 进 行 浏 览 和 其 他 操 作 Visual Basic 提 供 的 数 据 库 访 问 方 法 主 要 有 : 使 用 数 据 (Data) 控 件 或 ADO 数 据 控 件 访 问 数 据 库, 通 过 ODBC 方 式 访 问 远 程 数 据 库 以 及 采 用 ADO 对 象 模 型 访 问 数 据 库 等 11.7 习 题 一 填 空 题 1. 按 数 据 组 织 形 式 可 以 将 数 据 库 分 为 : 和 2. 关 系 型 数 据 库 模 型 是 把 数 据 库 用 来 表 示 3. 数 据 控 件 的 Connect 属 性 的 默 认 属 性 是 连 接 数 据 库 4. VB 中 记 录 集 有 三 种 类 型 5. 数 据 控 件 通 过 它 的 3 个 基 本 属 性 设 置 要 访 问 的 数 据 资 源 6. 常 用 的 数 据 绑 定 控 件 有 : 和 等 二 上 机 操 作 题 1. 使 用 可 视 化 的 数 据 库 管 理 器 建 立 一 个 Access 数 据 库 Mydb.mdb, 包 含 两 张 表 一 张 是 学 生 基 本 信 息 表 (Student), 表 结 构 如 表 11-18 所 示, 一 张 是 课 程 表 (Class), 表 结 构 如 表 11-19 所 示 232

第 11 章 数 据 库 程 序 设 计 233 表 11-18 学 生 基 本 信 息 表 结 构 字 段 名 类 型 宽 度 字 段 名 类 型 宽 度 学 号 Text 12 专 业 Text 20 姓 名 Text 10 出 生 年 月 Date 8 性 别 Logical 家 庭 住 址 Text 30 照 片 Binary 备 注 Memo 表 11-19 学 生 课 程 表 结 构 字 段 名 类 型 宽 度 字 段 名 类 型 宽 度 学 号 Text 12 成 绩 Simple 课 程 名 Text 20 考 核 方 式 Text 6 教 师 Text 12 学 期 Int 当 数 据 库 建 立 后, 使 用 数 据 库 管 理 器 在 各 表 中 输 入 若 干 条 记 录 2. 设 计 2 个 窗 体, 通 过 文 本 框 标 签 图 像 框 等 数 据 绑 定 控 件 分 别 显 示 Student 或 Class 表 内 的 记 录, 显 示 界 面 自 定 对 数 据 控 件 属 性 进 行 设 置, 使 之 可 以 对 记 录 集 直 接 进 行 增 加 修 改 操 作 ( 分 别 使 用 Data 控 件 ADODC 控 件 和 ADO 对 象 模 型 等 3 种 方 式 来 完 成 ) 3. 设 计 一 个 窗 体, 通 过 使 用 数 据 控 件 和 数 据 网 格 控 件 浏 览 Student 表 内 的 记 录 233

参 考 答 案 第 1 章 一 选 择 题 1. C 2. B 3. B 4. C 5. B 6. B 7. D 8. A 二 填 空 题 1..vbp.frm.bas 2. 文 件 (File) 退 出 (Exit) 3. Click 4. 工 程 资 源 管 理 5. 窗 体 布 局 三 编 程 题 ( 略 ) 第 2 章 一 选 择 题 1. A 2. A 3. D 4. C 5. B 6. D 7. A 8. B C 二 填 空 题 1. 289 2. 双 引 号 # 3. ABCDEFGHI bcdefghi 4. BCD123 第 3 章 一 选 择 题 1. C 2. C 3. B 4. C 5. B

参 考 答 案 235 二 填 空 题 1. Rnd() 100 x mod 3 x Next I 2. InputBox(" 输 入 a 值 :") InputBox(" 输 入 b 值 :") InputBox(" 输 入 c 值 :") T = a: a = b: b = T a < c a c 三 编 程 题 ( 略 ) 第 4 章 一 选 择 题 1. C 2. B 3. C 4. D 5. C 6. B 7. B 8. D 9. C 10. D 11. D 12. D 13. A 14. B 15. A 二 填 空 题 1. 文 本 框 列 表 框 2. Clear 3. Value 4. 文 本 框 中 输 入 的 字 符 数 没 有 限 制 5. (1) List1.Additem str(i) (2) List1.Count-1 (3) Val(List1.List(i)) 6. (1) Text1.SelText (2) Text1.SelText (3) Text1.SelText = " " (4) Text1.Text = Clipboard.GetText (5) Text1.SelText = " " (6) " " 三 编 程 题 ( 略 ) 第 5 章 一 选 择 题 1. C 2. C 3. C 4. C 5. B 6. C 7. B 8. A 235

236 Visual Basic 程 序 设 计 二 填 空 题 1. Name Index 2. 变 体 类 型 一 3. (1) arr1(1) (2) min=arr1(i) 4. (1) i+j 1 (2) 7 i (3)print 5. (1) val(inputbox( 请 输 入 一 个 数 据 )) (2) k=i (3) k=j (4) a(i)=a(k) 三 编 程 题 ( 略 ) 第 6 章 一 选 择 题 1. A 2. C 3. B 4. D 5. D 6. A 7. A 8. A 二 填 空 题 1. 9 2. 30 30 10 3. 30 70 4. 21 41 三 编 程 题 ( 略 ) 第 7 章 一 选 择 题 1. A 2. C 3. D 4. C 5. D 6. A 7. D 8.B 9. C 10.(1)C (2)A 236

参 考 答 案 237 二 填 空 题 1. ASCⅡ 码 键 代 码 2. 按 下 鼠 标 拖 动 后 释 放 鼠 标 或 者 双 击 鼠 标 3. MousePointer 99 MouseIcon 4. DragMode 1 0 5. CTRL 键 ALT 键 CTRL 键 + ALT 键 6. 分 三 行 输 出 F65 G66 和 H67 7. DragOver DragDrop 8. DragIcon 9. A a 三 编 程 题 ( 略 ) 第 8 章 一 选 择 题 1. D 2. D 3. D 4. A 5. A 6. D 7.A 二 填 空 题 MouseDown PopupMenu 三 编 程 题 ( 略 ) 第 9 章 一 选 择 题 1. D 2. D 3. C 4. D 5. C 6. A 二 阅 读 程 序, 写 出 运 行 结 果 1. 以 当 前 窗 体 中 心 为 圆 心, 半 径 随 机 的 100 个 不 超 出 窗 体 范 围 的 同 心 圆 2. 窗 体 中 显 示 一 条 正 弦 曲 线 和 一 条 余 弦 曲 线 三 编 程 题 ( 略 ) 237

238 Visual Basic 程 序 设 计 第 10 章 一 填 空 题 1. 系 统 文 件 隐 藏 文 件 只 读 文 件 普 通 文 件 和 存 档 文 件 2. Print 和 Write 3. 打 开 关 闭 4. 驱 动 器 列 表 框 目 录 列 表 框 文 件 列 表 框 5. Microsoft Scripting Runtime 6. MoveFile Move 二 选 择 题 1. B 2. C 3. C 4. A 三 简 答 题 ( 略 ) 四 编 程 题 ( 略 ) 第 11 章 一 填 空 题 1. 层 次 型 网 状 型 关 系 型 2. 表 的 集 合 3. Access 4. Dynaset Snapshot Table 5. Connect DatabaseName RecordSource 6. 文 本 框 (TextBox) 标 签 (Label) 复 选 框 (CheckBox) 图 像 框 (Image) 图 片 框 (PictureBox) 列 表 框 (ListBox) 组 合 框 (ComboBox) 二 上 机 操 作 题 ( 略 ) 238

参 考 文 献 1 郑 阿 奇. Visual Basic 实 用 教 程 ( 第 2 版 ). 北 京 : 电 子 工 业 出 版 社,2004 2 刘 炳 文. Visual Basic 程 序 设 计. 北 京 : 机 械 工 业 出 版 社,2004 3 教 育 部 考 试 中 心. 全 国 计 算 机 等 级 考 试 二 级 教 程 :Visual Basic 语 言 程 序 设 计 ( 修 订 版 ). 北 京 : 高 等 教 育 出 版 社,2003 4 谭 浩 强, 袁 玫, 薛 淑 斌. Visual Basic 程 序 设 计 ( 第 2 版 ). 北 京 : 清 华 大 学 出 版 社,2004 5 钱 雪 忠 等. 新 编 Visual Basic 程 序 设 计 实 用 教 程. 北 京 : 机 械 工 业 出 版 社,2004 6 张 瑾, 刘 开 南. 计 算 机 技 术 基 础 ( 上 册 ). 北 京 : 中 国 矿 业 大 学 出 版 社,2005 7 刘 瑞 新, 王 远 征. Visual Basic 程 序 设 计 教 程. 北 京 : 机 械 工 业 出 版 社,2003 8 李 振 亭. Visual Basic 程 序 设 计 教 程. 北 京 : 北 方 交 通 大 学 出 版 社,2001 9 谢 步 瀛, 龚 沛 曾. Visual Basic 计 算 机 绘 图 实 用 技 术. 北 京 : 电 子 工 业 出 版 社,2004 10 蒋 金 丹. Visual Basic 数 据 库 应 用. 北 京 : 科 学 出 版 社,2004