VB程序设计教程

Size: px
Start display at page:

Download "VB程序设计教程"

Transcription

1 高 等 学 校 教 材 Visual Basic 程 序 设 计 教 程 魏 东 平 郑 立 垠 梁 玉 环 石 油 大 学 出 版 社

2

3 内 容 提 要 本 书 是 按 高 等 学 校 计 算 机 程 序 设 计 课 程 教 学 大 纲 编 写 的 大 学 教 材, 主 要 包 括 VB 基 础 知 识 常 用 程 序 结 构 和 算 法 Windows 用 户 界 面 设 计 基 础 文 件 处 理 和 程 序 调 试 技 术 基 础 等 内 容 本 书 以 简 洁 生 动 的 语 言 和 大 量 形 象 实 用 的 范 例 系 统 介 绍 程 序 设 计 方 法, 侧 重 培 养 读 者 的 程 序 设 计 能 力, 较 少 涉 及 VB 的 扩 展 功 能, 如 图 形 多 媒 体 和 数 据 库 等 本 书 适 用 于 高 等 学 校 本 科 生 专 科 生, 也 可 用 作 全 国 计 算 机 等 级 考 试 的 教 学 用 书, 还 可 以 作 为 从 事 计 算 机 程 序 设 计 工 作 的 广 大 读 者 的 学 习 参 考 书 图 书 在 版 编 目 (CIP) 数 据 Visual Basic 程 序 设 计 教 程 / 魏 东 平 郑 立 垠 梁 玉 环. 东 营 : 石 油 大 学 出 版 社, ISBN Ⅰ. V Ⅱ. 魏 Ⅲ. Basic 语 言 程 序 设 计 教 材 Ⅳ. TP312 中 国 版 本 图 书 馆 CIP 数 据 核 字 (2003) 第 号 Visual Basic 程 序 设 计 教 程 魏 东 平 郑 立 垠 梁 玉 环 出 版 者 : 石 油 大 学 出 版 社 ( 山 东 东 营, 邮 编 ) 印 刷 者 : 石 油 大 学 印 刷 厂 发 行 者 : 石 油 大 学 出 版 社 ( 电 话 ) 开 本 : /16 印 张 :21.25 字 数 :544 千 字 版 次 :2003 年 8 月 第 1 版 2003 年 8 月 第 1 次 印 刷 定 价 :26.80 元 版 权 专 有 侵 权 必 究 举 报 电 话 :

4

5 前 言 最 早 的 BASIC 语 言 是 面 向 广 大 计 算 机 爱 好 者 的 程 序 语 言, 由 于 易 学 易 用, 自 1964 年 问 世 以 来, 深 受 初 学 者 的 厚 爱 1990 年 美 国 Microsoft 公 司 推 出 了 Visual Basic 1.0 版, 全 新 的 界 面, 强 大 的 功 能, 彻 底 改 变 了 人 们 对 Basic 语 言 的 看 法, 进 而 成 为 程 序 设 计, 甚 至 大 型 软 件 开 发 的 主 要 工 具 Visual Basic 是 在 原 来 的 BASIC 语 言 基 础 上 研 制 而 成 的, 保 持 了 BASIC 语 言 简 单 易 学 易 用 的 特 点, 同 时 增 加 了 结 构 化 可 视 化 程 序 设 计 语 言 的 功 能, 具 备 了 面 向 对 象 程 序 设 计 语 言 的 特 征 Visual Basic 语 言 功 能 强 大, 例 如, 采 用 可 视 化 的 界 面 设 计 技 术 面 向 对 象 的 程 序 设 计 方 法 事 件 驱 动 的 编 程 机 制 支 持 快 速 开 发 (RAD) 支 持 动 态 数 据 交 换 (DDE) 技 术 和 对 象 的 连 接 与 嵌 入 (OLE) 技 术 支 持 数 据 库 的 快 速 访 问 等 等 2001 年,Microsoft 推 出 了 Visual Basic.NET, 将 Visual Basic 语 言 提 升 到 了 全 新 的 高 度 作 为 微 软.NET 策 略 的 主 要 工 具 和 编 程 语 言,VB.NET 已 经 可 以 胜 任 任 何 规 模 任 何 种 类 的 软 件 开 发, 特 别 是 Windows 窗 体 应 用 程 序 XML Web 服 务 程 序 和 嵌 入 式 Windows 应 用 程 序 等 为 了 帮 助 读 者 学 习 掌 握 Visual Basic 语 言, 把 握 计 算 机 程 序 设 计 技 术 的 最 新 进 展, 我 们 编 写 了 这 本 教 材 本 教 材 面 向 高 校 非 计 算 机 专 业 学 生, 侧 重 基 础 知 识 和 基 本 能 力, 适 合 作 为 程 序 设 计 语 言 入 门 教 材 使 用 本 书 分 为 16 章, 第 1 章 是 对 程 序 设 计 技 术 的 概 述, 第 2 至 4 章 简 单 介 绍 Visual Basic 程 序 设 计 方 法, 第 5 至 9 章 是 本 书 的 重 点, 包 括 程 序 的 三 个 基 本 结 构 数 组 和 过 程 的 概 念 及 使 用 等, 第 10 至 14 章 围 绕 程 序 的 界 面 设 计 进 行 学 习, 第 15 章 学 习 文 件 处 理 方 法, 第 16 章 是 关 于 错 误 处 理 技 术 的 高 级 课 题 在 本 书 的 附 录 中, 还 向 读 者 简 要 介 绍 了 Visual Basic.NET, 为 读 者 以 后 的 学 习 抛 砖 引 玉 本 书 由 魏 东 平 副 教 授 任 主 编, 编 写 了 第 10 至 16 章 和 附 录, 并 负 责 最 后 的 校 对 修 改 和 定 稿, 郑 立 垠 副 教 授 编 写 了 第 1 至 第 5 章, 梁 玉 环 讲 师 编 写 了 第 6 至 9 章 付 艳 芬 副 教 授 和 郑 立 垠 副 教 授 对 全 书 进 行 了 校 对 由 于 时 间 仓 促, 加 之 作 者 水 平 有 限, 难 免 存 在 不 足 之 处, 恳 请 读 者 批 评 指 正 编 者 2003 年 5 月

6 目 录 第 1 章 概 述 程 序 设 计 语 言 的 发 展 程 序 程 序 设 计 程 序 设 计 语 言 的 概 念 程 序 设 计 语 言 的 发 展 源 程 序 在 计 算 机 上 的 执 行 过 程 程 序 设 计 方 法 结 构 化 程 序 设 计 面 向 对 象 程 序 设 计 算 法 算 法 的 主 要 特 征 算 法 设 计 的 要 求 算 法 的 表 示...5 习 题...7 第 2 章 Visual Basic 程 序 开 发 环 境 Visual Basic 语 言 简 介 Visual Basic 语 言 发 展 简 介 Visual Basic 语 言 的 特 点 Visual Basic 语 言 的 版 本 Visual Basic 6.0 的 安 装 和 启 动 Visual Basic 6.0 的 运 行 环 境 Visual Basic 6.0 的 安 装 Visual Basic 6.0 的 启 动 和 退 出 最 简 单 的 VB 程 序 Visual Basic 集 成 开 发 环 境 主 窗 口 窗 体 窗 口 工 程 资 源 管 理 器 窗 口 属 性 窗 口 代 码 窗 口 工 具 箱 窗 口 窗 体 布 局 窗 口 对 象 浏 览 器 窗 口...21

7 ii Visual Basic 程 序 设 计 教 程 2.5 创 建 一 个 VB 应 用 程 序 的 方 法 和 步 骤 创 建 应 用 程 序 界 面 设 置 界 面 上 各 个 对 象 的 属 性 编 写 对 象 相 应 的 程 序 代 码 保 存 工 程 运 行 和 调 试 程 序 生 成 可 执 行 程 序...22 习 题...22 第 3 章 可 视 化 程 序 设 计 初 步 VB 程 序 设 计 中 的 几 个 基 本 概 念 对 象 对 象 的 属 性 对 象 的 事 件 对 象 的 方 法 窗 体 窗 体 的 结 构 窗 体 的 属 性 窗 体 的 事 件 常 用 控 件 命 令 按 钮 标 签 控 件 文 本 框 控 件 对 象 的 焦 点 焦 点 的 基 本 概 念 对 象 的 GotFocus 事 件 与 LostFocus 事 件 设 置 焦 点 事 件 驱 动 程 序 的 工 作 方 式 事 件 驱 动 简 介 事 件 驱 动 程 序 的 工 作 方 式...43 习 题...43 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 数 据 类 型 基 本 数 据 类 型 自 定 义 数 据 类 型 常 量 和 变 量 常 量 变 量 运 算 符 和 表 达 式 算 术 运 算 符 和 算 术 表 达 式...55

8 目 录 iii 连 接 运 算 符 和 字 符 串 表 达 式 关 系 运 算 符 和 关 系 表 达 式 逻 辑 运 算 符 和 逻 辑 表 达 式 日 期 型 表 达 式 各 种 运 算 符 的 优 先 级 比 较 常 用 内 部 函 数 数 学 函 数 数 据 类 型 转 换 函 数 字 符 处 理 函 数 日 期 时 间 函 数...65 习 题...66 第 5 章 顺 序 结 构 程 序 设 计 语 句 赋 值 语 句 注 释 暂 停 与 程 序 结 束 语 句 数 据 输 出 Print 方 法 与 Print 方 法 有 关 的 标 准 函 数 其 他 方 法 和 属 性 输 出 数 据 的 字 体 控 制 字 体 类 型 和 大 小 其 他 属 性 InputBox 函 数 和 MsgBox 函 数 InputBox 函 数 MsgBox 函 数 应 用 举 例...86 习 题...89 第 6 章 选 择 结 构 程 序 设 计 单 行 格 式 条 件 语 句 块 结 构 条 件 语 句 多 分 支 选 择 结 构 语 句 选 择 结 构 的 嵌 套 IIf 函 数 习 题 第 7 章 循 环 结 构 程 序 设 计 While 循 环 结 构 Do 循 环 结 构 For 循 环 结 构 GoTo 型 循 环...126

9 iv Visual Basic 程 序 设 计 教 程 GoTo 语 句 On GoTo 语 句 多 重 循 环 习 题 第 8 章 数 组 数 组 的 概 念 数 组 的 定 义 静 态 数 组 动 态 数 组 Erase 语 句 数 组 的 基 本 操 作 数 组 元 素 的 引 用 数 组 元 素 的 输 入 数 组 元 素 的 输 出 数 组 元 素 的 复 制 数 组 的 初 始 化 For Each... Next 语 句 控 件 数 组 控 件 数 组 的 概 念 建 立 控 件 数 组 数 组 的 应 用 举 例 习 题 第 9 章 过 程 Sub 过 程 事 件 过 程 与 通 用 过 程 建 立 Sub 过 程 调 用 Sub 过 程 Function 过 程 Function 过 程 的 定 义 调 用 Function 过 程 过 程 中 的 参 数 传 递 形 式 参 数 与 实 际 参 数 实 际 参 数 与 形 式 参 数 的 对 应 关 系 按 值 传 递 与 按 地 址 传 递 数 组 参 数 的 传 递 可 选 参 数 与 可 变 参 数 对 象 参 数 窗 体 参 数 控 件 参 数...183

10 目 录 v 9.6 递 归 过 程 变 量 与 过 程 的 作 用 范 围 变 量 的 作 用 范 围 过 程 的 作 用 范 围 习 题 第 10 章 Visual Basic 的 常 用 控 件 概 述 图 形 控 件 直 线 (Line) 形 状 (Shape) 图 片 框 (PictureBox) 图 像 框 (Image) 框 架 和 选 择 控 件 框 架 (Frame) 复 选 框 (CheckBox) 和 单 选 按 钮 (OptionButton) 列 表 框 (ListBox) 组 合 框 (ComboBox) 滚 动 条 控 件 计 时 器 控 件 文 件 系 统 控 件 驱 动 器 列 表 框 (DriverListBox) 目 录 列 表 框 (DirListBox) 文 件 列 表 框 (FileListBox) 其 他 控 件 OLE 控 件 ActiveX 控 件 习 题 第 11 章 多 重 窗 体 程 序 设 计 概 述 与 窗 体 有 关 的 语 句 和 方 法 窗 体 的 加 载 和 卸 载 窗 体 的 常 用 方 法 多 重 窗 体 程 序 设 计 方 法 MDI 界 面 设 计 标 准 模 块 与 Sub Main 过 程 闲 置 循 环 与 DoEvents 语 句 习 题 第 12 章 菜 单 设 计 与 菜 单 有 关 的 概 念...231

11 vi Visual Basic 程 序 设 计 教 程 下 拉 式 菜 单 弹 出 式 菜 单 菜 单 编 辑 器 菜 单 编 辑 器 的 启 动 菜 单 编 辑 器 的 使 用 下 拉 式 菜 单 设 计 下 拉 式 菜 单 的 设 计 和 编 程 菜 单 项 属 性 的 动 态 设 置 菜 单 项 的 动 态 增 加 和 删 除 弹 出 式 菜 单 设 计 MDI 界 面 程 序 菜 单 设 计 工 具 栏 设 计 习 题 第 13 章 对 话 框 设 计 概 述 预 定 义 对 话 框 InputBox 函 数 MsgBox 函 数 自 定 义 对 话 框 对 话 框 窗 体 的 属 性 对 话 框 窗 体 的 控 件 对 话 框 窗 体 的 显 示 应 用 举 例 通 用 对 话 框 通 用 对 话 框 控 件 文 件 对 话 框 颜 色 对 话 框 字 体 对 话 框 打 印 对 话 框 习 题 第 14 章 键 盘 与 鼠 标 概 述 键 盘 事 件 KeyPress 事 件 KeyDown 事 件 和 KeyUp 事 件 鼠 标 事 件 鼠 标 事 件 鼠 标 指 针 对 象 拖 放...275

12 目 录 vii 控 件 拖 放 OLE 拖 放 习 题 第 15 章 文 件 文 件 概 述 文 件 的 打 开 与 关 闭 顺 序 文 件 的 打 开 随 机 文 件 的 打 开 二 进 制 文 件 的 打 开 文 件 的 关 闭 文 件 指 针 文 件 指 针 的 概 念 文 件 指 针 的 操 作 顺 序 文 件 的 读 写 顺 序 文 件 的 写 操 作 顺 序 文 件 的 读 操 作 随 机 文 件 的 读 写 随 机 文 件 的 读 写 操 作 随 机 文 件 的 增 删 改 二 进 制 文 件 的 读 写 文 件 操 作 FSO 对 象 模 型 FSO 对 象 FSO 模 型 编 程 文 件 操 作 习 题 第 16 章 程 序 调 试 与 错 误 处 理 错 误 类 型 编 译 错 误 逻 辑 错 误 运 行 时 错 误 程 序 调 试 工 具 VB 程 序 调 试 工 具 中 断 模 式 控 制 程 序 的 运 行 调 试 窗 口 错 误 处 理 程 序 Err 对 象 错 误 处 理 程 序...310

13 viii Visual Basic 程 序 设 计 教 程 集 中 化 的 错 误 处 理 调 试 程 序 时 的 错 误 处 理 附 录 A 发 布 VB 应 用 程 序 A.1 打 包 和 展 开 向 导 A.2 安 装 应 用 程 序 附 录 B 从 VB 6.0 到 VB.NET B.1.NET 框 架 B.2 VB.NET 的 新 特 点 B.3 VB.NET 的 语 言 改 进 B.4 VB.NET 程 序 设 计...325

14 第 1 章 概 述 1.1 程 序 设 计 语 言 的 发 展 程 序 程 序 设 计 程 序 设 计 语 言 的 概 念 计 算 机 作 为 信 息 处 理 和 存 储 的 工 具 已 深 入 到 人 类 生 活 的 各 个 领 域 要 学 会 使 用 计 算 机, 使 计 算 机 按 人 的 意 图 工 作, 能 够 接 受 人 向 它 发 出 的 各 种 命 令 和 信 息, 就 必 须 学 会 使 用 计 算 机 的 程 序 设 计 语 言, 把 待 解 决 的 问 题, 按 处 理 步 骤 写 成 一 条 条 计 算 机 能 够 识 别 和 执 行 的 语 句 所 有 语 句 的 集 合 称 之 为 程 序 程 序 员 设 计 编 写 程 序 的 过 程 称 之 为 程 序 设 计 用 来 编 写 程 序 的 语 言 称 之 为 程 序 设 计 语 言 程 序 设 计 语 言 的 发 展 编 写 计 算 机 程 序 所 用 的 语 言 是 人 与 计 算 机 之 间 交 换 信 息 的 工 具, 一 般 可 分 为 机 器 语 言 汇 编 语 言 和 高 级 语 言 1. 机 器 语 言 机 器 语 言 是 计 算 机 系 统 所 能 识 别 的, 不 需 要 翻 译 直 接 供 机 器 使 用 的 程 序 设 计 语 言 由 于 机 器 语 言 是 二 进 制 代 码, 人 们 编 写 或 阅 读 程 序 都 十 分 困 难, 又 容 易 出 错, 并 且 不 同 机 器 的 指 令 系 统 也 不 同, 很 难 进 行 交 流 ( 在 一 种 机 器 上 调 试 通 过 的 程 序 不 能 到 另 外 一 种 机 器 上 运 行 ) 机 器 语 言 程 序 虽 然 其 执 行 效 率 很 高, 但 花 费 在 设 计 程 序 和 调 试 程 序 上 的 时 间 太 多, 整 个 解 决 问 题 的 效 率 就 降 低 了 2. 汇 编 语 言 为 了 解 决 二 进 制 代 码 编 程 带 来 的 困 难, 人 们 采 用 了 助 记 码 和 符 号 地 址 来 代 替 机 器 语 言 中 的 二 进 制 指 令 代 码 和 指 令 地 址, 然 后 通 过 一 个 人 们 预 先 设 计 好 的 叫 做 汇 编 程 序 的 翻 译 程 序 一 对 一 地 翻 译 成 机 器 语 言 程 序, 再 让 计 算 机 执 行 这 种 采 用 助 记 码 和 符 号 地 址 的 语 言 称 为 汇 编 语 言 用 汇 编 语 言 编 写 的 程 序 执 行 效 率 与 机 器 语 言 程 序 一 样 高, 且 其 阅 读 性 提 高 了, 但 由 于 汇 编 指 令 与 机 器 指 令 之 间 是 一 对 一 的, 同 样 不 利 于 交 流, 所 以, 汇 编 语 言 也 是 面 向 机 器 的 语 言 3. 高 级 语 言 从 20 世 纪 50 年 代 中 期 开 始 到 70 年 代 陆 续 产 生 了 许 多 高 级 算 法 语 言, 这 些 高 级 算 法 语 言 中 的 数 据 用 十 进 制 来 表 示, 用 较 为 接 近 自 然 语 言 的 英 文 文 字 来 表 示 语 句 它 们 比 较 接 近 于 人 们 习 惯 用 的 自 然 语 言 和 数 学 表 达 式, 因 此 称 为 高 级 语 言 高 级 语 言 脱 离 了 计 算 机 的 具 体 指 令 系 统, 对 于 非 计 算 机 专 业 人 员 来 说 掌 握 起 来 比 较 容 易, 克 服 了 面 向 机 器 语 言 的 缺 点, 使 得 程 序 易 读 易 维 护 易 交 流 高 级 语 言 发 展 很 快, 已 达 数 百 种 之 多, 常 用 的 高 级 语 言 有 :

15 2 Visual Basic 程 序 设 计 教 程 (1)FORTRAN 语 言 诞 生 于 20 世 纪 50 年 代 中 期, 是 第 一 个 算 法 语 言, 适 应 于 科 学 和 工 程 计 算 (2)BASIC 语 言 诞 生 于 20 世 纪 60 年 代 中 后 期, 该 语 言 简 单 易 学, 是 一 种 会 话 型 语 言, 适 合 初 学 者 学 习 至 今 BASIC 语 言 已 有 许 多 高 级 版 本, 尤 其 Visual Basic For Windows 是 面 向 对 象 的 程 序 设 计 语 言, 给 非 计 算 机 专 业 的 广 大 用 户 在 Windows 环 境 下 开 发 软 件 带 来 了 极 大 的 方 便 (3)ALGOL 语 言 诞 生 于 20 世 纪 60 年 代 初 期, 是 建 立 在 坚 实 理 论 基 础 上 的 程 序 设 计 语 言,60 年 代 曾 被 认 为 是 最 有 前 途 的 程 序 设 计 语 言, 但 现 在 已 经 很 少 有 人 使 用 了 (4)PASCAL 语 言 诞 生 于 20 世 纪 70 年 代 初, 是 一 种 结 构 化 程 序 设 计 语 言, 适 合 于 教 学 科 学 计 算 数 据 处 理 和 系 统 软 件 开 发 等 目 前 逐 步 被 C 语 言 所 取 代 (5)C 语 言 诞 生 于 20 世 纪 70 年 代 初,80 年 代 开 始 风 靡 全 世 界, 适 应 于 系 统 软 件 数 值 计 算 数 据 处 理 等, 目 前 成 为 高 级 语 言 中 使 用 最 多 的 语 言 之 一 现 在 较 常 用 的 C 语 言 Visual C++ 是 面 向 对 象 的 程 序 设 计 语 言 (6)Java 语 言 诞 生 于 20 世 纪 90 年 代, 是 一 种 新 型 的 跨 平 台 分 布 式 程 序 设 计 语 言, 具 有 简 单 安 全 稳 定 可 移 植 性 强 等 特 性, 将 成 为 未 来 网 络 环 境 上 的 世 界 语 Java 语 言 是 基 于 C++ 的, 其 最 大 特 点 是 一 次 编 写, 处 处 运 行 但 Java 语 言 编 写 的 程 序 要 依 靠 一 个 虚 拟 机 (VM,Virtual Machine) 才 能 运 行 一 般 地, 把 用 高 级 语 言 或 汇 编 语 言 编 写 的 程 序 称 为 源 程 序 源 程 序 在 计 算 机 上 的 执 行 过 程 人 们 用 高 级 语 言 编 写 的 源 程 序 计 算 机 并 不 懂, 像 汇 编 语 言 一 样, 必 须 经 过 一 个 翻 译 程 序 将 高 级 语 言 编 写 的 源 程 序 翻 译 成 计 算 机 能 够 识 别 的 二 进 制 代 码 程 序, 才 能 让 计 算 机 执 行 并 得 到 结 果 这 个 翻 译 程 序 一 般 称 为 语 言 处 理 程 序 语 言 处 理 程 序 将 源 程 序 翻 译 成 二 进 制 代 码 的 方 式 通 常 有 两 种, 一 种 称 为 编 译 方 式, 一 种 称 为 解 释 方 式 1. 编 译 方 式 编 译 方 式 将 源 程 序 全 部 翻 译 成 一 个 功 能 等 价 的 机 器 语 言 程 序 ( 一 般 称 为 目 标 程 序 ), 然 后 经 过 一 个 连 接 程 序 将 用 户 的 目 标 程 序 ( 一 个 或 多 个 ) 与 系 统 配 置 好 的 一 些 通 用 程 序 连 接 装 配 在 一 起, 形 成 一 个 可 执 行 程 序, 最 后 让 计 算 机 执 行 并 得 到 结 果 编 译 方 式 经 编 译 连 接 得 到 的 可 执 行 程 序 可 以 重 复 执 行 无 数 次, 其 效 率 很 高 系 统 程 序 用 户 已 调 试 好 的 程 序, 大 都 采 用 编 译 方 式 处 理, 最 终 得 到 可 执 行 程 序 供 用 户 使 用 2. 解 释 方 式 解 释 方 式 是 通 过 解 释 程 序 逐 句 翻 译 执 行 的, 不 产 生 目 标 代 码 程 序, 每 次 执 行 都 要 重 新 翻 译, 所 以 对 那 些 重 复 执 行 的 程 序 效 率 较 低 但 解 释 方 式 对 于 调 试 程 序 很 方 便 目 前, 大 多 数 常 用 的 高 级 语 言 都 采 用 编 译 方 式, 且 输 入 或 修 改 源 程 序 编 译 连 接 执 行 四 个 过 程 均 在 一 个 集 成 环 境 下, 省 去 了 用 户 不 少 的 麻 烦

16 第 1 章 概 述 程 序 设 计 方 法 结 构 化 程 序 设 计 结 构 化 程 序 设 计 的 指 导 思 想 是 : 以 良 好 的 结 构 来 保 证 程 序 容 易 阅 读 和 理 解, 而 良 好 结 构 的 实 现 则 是 靠 把 软 件 的 设 计 作 为 一 项 工 程 ( 即 软 件 工 程 ), 严 格 地 按 规 范 来 设 计 虽 然 说 程 序 的 执 行 效 率 是 衡 量 程 序 质 量 的 一 个 重 要 因 素, 但 随 着 计 算 机 硬 件 的 迅 速 发 展 与 计 算 机 的 迅 速 普 及, 执 行 效 率 已 经 不 是 第 一 个 要 考 虑 的 因 素, 而 程 序 的 易 读 性 上 升 到 了 第 一 位 对 于 复 杂 的 问 题, 人 们 往 往 不 可 能 一 开 始 就 了 解 了 问 题 的 全 部 细 节, 也 就 很 难 一 下 子 写 出 既 详 细 又 清 晰 的 算 法, 应 该 考 虑 将 问 题 进 行 分 块, 这 就 是 所 谓 结 构 化 程 序 设 计 的 问 题 1. 自 顶 向 下 逐 步 细 化 是 结 构 化 程 序 设 计 的 方 法 结 构 化 程 序 设 计 由 三 种 基 本 结 构 ( 顺 序 结 构 选 择 结 构 循 环 结 构 ) 组 成, 实 践 证 明, 用 这 三 种 基 本 结 构 的 组 合 可 以 实 现 任 何 复 杂 的 算 法 那 么 怎 样 设 计 结 构 化 的 算 法 呢? 一 般 采 用 一 种 叫 做 自 顶 向 下 逐 步 细 化 的 方 法 自 顶 向 下 逐 步 细 化 ( 逐 步 求 精 ) 的 基 本 思 想 可 以 概 括 为 : 先 从 最 能 反 映 问 题 的 结 构 出 发, 设 计 出 一 个 粗 略 的 算 法, 然 后 对 每 一 步 进 行 细 化 具 体 化, 逐 步 补 充 细 节 ( 开 始 考 虑 不 到 的 ), 直 到 设 计 出 可 在 计 算 机 上 执 行 的 程 序 这 种 方 法 是 一 种 先 全 局 后 局 部 先 整 体 后 细 节 先 抽 象 后 具 体 的 自 顶 向 下 的 设 计 方 法 显 然, 对 于 大 型 的 程 序, 应 该 采 用 这 种 方 法 进 行 算 法 设 计 首 先 根 据 总 体 要 求 划 分 出 若 干 个 相 对 独 立 的 模 块, 每 个 模 块 根 据 它 的 功 能 可 细 化 为 若 干 子 模 块, 每 个 子 模 块 又 可 根 据 其 功 能 细 化 为 更 小 的 子 模 块, 最 后 对 每 个 小 的 子 模 块 写 出 算 法, 这 种 方 法 由 粗 到 细 由 整 体 设 计 到 具 体 设 计, 是 结 构 化 程 序 设 计 所 提 倡 的 方 法 如 果 拿 到 题 目 就 一 个 语 句 一 个 语 句 地 编 写 程 序, 最 后 会 由 于 考 虑 不 周 全 而 出 现 很 多 问 题 但 又 无 从 下 手 检 查 所 以 作 为 一 个 好 的 程 序 员 应 该 学 会 自 顶 向 下 逐 步 细 化 的 结 构 化 程 序 设 计 方 法 2. 结 构 化 程 序 设 计 的 风 格 (1) 程 序 要 简 单 朴 实, 尽 量 让 读 者 一 看 就 明 白 程 序 的 意 图 (2) 程 序 文 档 化 除 了 程 序 结 构 要 清 晰 易 读 外, 还 可 以 在 程 序 中 加 一 些 注 释, 向 读 者 表 明 程 序 的 功 能 设 计 思 想 及 用 法 等 另 外, 对 程 序 中 用 到 的 变 量 命 名 时 要 见 名 知 义 (3) 书 写 规 范 化 书 写 程 序 时 不 要 把 所 有 的 语 句 对 齐 排 列, 而 要 按 照 程 序 的 不 同 层 次 写 成 锯 齿 状 的 逐 渐 缩 进 格 式, 这 样 可 突 出 程 序 的 逻 辑 层 次 结 构, 又 可 方 便 查 错 (4) 书 写 文 档 对 于 简 单 程 序, 这 一 步 可 能 是 多 余 的, 但 对 于 复 杂 的 程 序 它 是 不 可 缺 少 的, 虽 然 程 序 中 有 注 释, 但 毕 竟 篇 幅 有 限, 作 为 一 个 好 的 程 序 员, 一 定 要 把 你 开 发 软 件 时 的 算 法 说 明 结 构 流 程 图 数 据 结 构 的 定 义 使 用 操 作 说 明 等 资 料 整 理 写 成 文 档, 与 程 序 一 起 交 付 用 户 使 用 作 为 一 个 初 学 者, 你 所 编 写 的 程 序 可 能 不 会 太 复 杂, 也 不 用 交 付 别 人 使 用, 但 作 为 一 个 好 的 习 惯 只 能 逐 步 培 养 训 练 才 能 养 成 面 向 对 象 程 序 设 计 结 构 化 程 序 设 计 对 于 确 定 的 问 题 来 说, 无 疑 是 一 种 很 好 的 方 法, 但 对 于 千 变 万 化 的 世 界, 特 别 是 当 今 信 息 化 的 世 界, 一 个 成 为 产 品 的 软 件 很 难 适 应 形 势 的 变 化, 因 为 在 程 序 的 设 计 阶

17 4 Visual Basic 程 序 设 计 教 程 段 问 题 是 确 定 的, 其 数 据 结 构 数 据 模 型 也 可 以 确 定, 所 以 设 计 出 的 程 序 使 用 操 作 没 有 问 题, 但 当 表 示 问 题 的 数 据 结 构 发 生 变 化 时, 程 序 就 可 能 会 出 现 问 题, 而 维 护 起 来 相 当 困 难, 原 因 就 是 当 初 的 设 计 是 面 向 数 据 进 行 自 顶 向 下 设 计 的, 要 修 改 就 需 要 全 部 修 改 本 来 客 观 世 界 是 由 许 许 多 多 各 种 各 样 的 对 象 组 成 的, 每 个 对 象 都 有 各 自 的 内 部 状 态 ( 属 性 ) 和 运 动 规 律 ( 行 为 方 式 ), 不 同 对 象 的 相 互 作 用 和 联 系 就 构 成 了 各 种 各 样 不 同 的 系 统, 构 成 了 我 们 所 面 对 的 客 观 世 界 如 果 我 们 按 照 客 观 世 界 对 象 的 特 点 进 行 程 序 设 计, 就 会 适 应 形 势 的 发 展, 这 就 是 自 20 世 纪 80 年 代 开 始 流 行 现 已 广 泛 应 用 的 面 向 对 象 的 程 序 设 计 方 法 面 向 对 象 的 程 序 设 计 方 法 吸 取 了 结 构 化 程 序 设 计 的 基 本 思 想 和 主 要 优 点, 将 数 据 与 对 数 据 的 操 作 放 在 一 起 作 为 一 个 相 互 依 存 不 可 分 割 的 整 体 来 处 理 这 个 整 体 称 为 对 象 对 象 的 内 部 状 态 ( 属 性 ) 用 数 据 表 示, 运 动 规 律 用 所 谓 的 方 法 ( 也 称 成 员 函 数 ) 表 示 对 象 是 一 个 整 体, 所 以 我 们 说 把 数 据 隐 藏 在 这 个 整 体 中 了 对 象 之 间 的 相 互 作 用 通 过 所 谓 的 消 息 与 对 象 的 对 外 接 口 ( 成 员 函 数 的 调 用 形 式 ) 实 现 这 个 系 统 就 是 通 过 不 断 地 向 对 象 发 送 消 息 而 使 对 象 从 初 始 状 态 到 达 终 止 状 态, 从 而 实 现 了 问 题 的 求 解 如 果 问 题 的 数 据 结 构 发 生 了 变 化, 只 要 描 述 问 题 的 对 象 的 对 外 接 口 不 变, 所 有 涉 及 这 些 数 据 结 构 的 地 方 都 不 需 要 修 改, 而 只 需 修 改 对 象 中 的 方 法 就 行 了 对 象 有 各 种 各 样 的, 但 总 有 相 似 的 比 如 一 匹 白 马 和 一 匹 黑 马 是 两 个 对 象, 但 它 们 都 具 有 马 的 特 性, 只 是 颜 色 有 点 差 异 而 已 我 们 将 对 象 进 行 抽 象 划 分 便 得 到 了 类 类 描 述 了 属 于 该 类 型 的 所 有 对 象 的 性 质, 包 括 外 部 特 征 和 内 部 实 现, 实 际 上 是 抽 象 数 据 类 型 的 具 体 实 现 反 之, 对 象 是 类 的 具 体 实 例 面 向 对 象 的 程 序 设 计 方 法 是 一 个 新 的 程 序 设 计 方 法, 这 个 方 法 具 有 其 他 方 法 所 不 具 备 的 特 点, 富 有 生 命 力 如 建 立 在 对 象 类 及 其 继 承 性 基 础 上 的 重 用 能 力 可 以 应 付 复 杂 大 型 软 件 开 发 便 于 扩 展 和 维 护, 抽 象 程 度 高, 因 而 具 有 较 高 的 生 产 率 这 种 新 方 法 在 得 到 广 泛 理 解 和 应 用 之 后, 必 将 会 有 力 地 推 动 软 件 开 发 的 新 发 展 1.3 算 法 算 法 的 主 要 特 征 算 法 (Algorithm) 是 对 特 定 问 题 求 解 步 骤 的 一 种 描 述, 它 是 指 令 的 有 限 序 列, 其 中 每 一 条 指 令 表 示 一 个 或 多 个 操 作 一 个 算 法 一 般 具 有 如 下 五 个 主 要 特 征 : (1) 有 穷 性 一 个 算 法 必 须 总 是 ( 对 任 何 合 法 的 输 入 值 ) 在 执 行 有 穷 步 之 后 结 束, 且 每 一 步 都 在 有 穷 时 间 内 完 成 (2) 确 定 性 算 法 中 每 一 条 指 令 必 须 有 确 切 的 含 义, 不 允 许 有 模 棱 两 可 的 解 释, 人 们 理 解 时 不 会 产 生 二 义 性 并 且, 在 任 何 条 件 下, 算 法 只 有 惟 一 的 一 条 执 行 路 径, 即 对 于 相 同 的 输 入 只 能 得 出 相 同 的 输 出 (3) 有 效 性 一 个 算 法 能 有 效 地 完 成 指 定 的 任 务, 就 要 求 算 法 中 描 述 的 操 作 都 可 以 通 过 已 经 实 现 的 基 本 运 算 执 行 有 限 次 来 实 现 (4) 输 入 一 个 算 法 有 零 个 或 多 个 输 入, 这 些 输 入 取 自 于 某 个 特 定 的 对 象 的 集 合 (5) 输 出 一 个 算 法 有 一 个 或 多 个 输 出, 这 些 输 出 是 同 输 入 有 着 某 些 特 定 关 系 的 量

18 第 1 章 概 述 算 法 设 计 的 要 求 通 常 设 计 一 个 好 的 算 法 应 考 虑 达 到 以 下 目 标 : (1) 正 确 性 设 计 或 选 择 的 算 法 能 正 确 地 反 映 具 体 问 题 的 要 求 一 般 来 说, 衡 量 一 个 程 序 是 否 合 格 的 标 准 是 程 序 对 于 精 心 选 择 的 典 型 苛 刻 而 带 有 刁 难 性 的 几 组 输 入 数 据 能 够 得 出 满 足 具 体 问 题 规 格 说 明 的 结 果 (2) 可 读 性 可 读 性 好 有 助 于 读 者 理 解 算 法, 而 晦 涩 难 懂 的 程 序 容 易 隐 藏 较 多 错 误, 给 调 试 和 修 改 程 序 带 来 很 大 的 困 难 (3) 健 壮 性 当 输 入 数 据 非 法 时, 算 法 也 能 适 当 地 做 出 反 应 或 进 行 处 理, 而 不 会 产 生 莫 名 其 妙 的 结 果 (4) 效 率 与 低 存 储 量 需 求 一 般 来 说, 效 率 指 的 是 算 法 执 行 时 间 对 于 同 一 个 问 题 如 果 有 多 个 算 法 可 以 解 决, 执 行 时 间 短 的 算 法 效 率 高 存 储 量 需 求 指 算 法 执 行 过 程 中 所 需 要 的 最 大 存 储 空 间 效 率 与 低 存 储 量 需 求 这 两 者 都 与 问 题 的 规 模 有 关 算 法 的 表 示 把 算 法 用 文 字 或 图 形 方 式 表 示 出 来, 就 是 算 法 的 描 述 下 面 介 绍 几 种 常 见 的 算 法 描 述 方 法 1. 自 然 语 言 采 用 自 然 语 言 描 述 算 法, 通 俗 易 懂, 易 于 人 们 接 受 和 理 解, 但 有 它 的 缺 点 : (1) 不 太 严 格 且 繁 琐 冗 长 ; (2) 用 自 然 语 言 描 述 顺 序 执 行 的 步 骤 比 较 好 懂, 但 如 果 算 法 复 杂 且 包 含 很 多 判 断 转 移 时, 用 自 然 语 言 描 述 就 不 是 那 么 直 观 清 晰 了 2. 算 法 框 图 作 为 算 法 的 表 达 工 具, 在 算 法 设 计 阶 段 人 们 一 般 采 用 图 示 的 方 法 图 示 法 简 单 直 观, 特 别 有 利 于 初 学 者 算 法 的 图 示 法 又 称 为 算 法 框 图 有 两 种 形 式 的 算 法 框 图 : (1) 传 统 的 程 序 流 程 图 : 传 统 的 程 序 流 程 图 通 常 采 用 一 些 几 何 图 形 来 代 表 各 种 类 型 的 操 作, 并 在 图 形 内 标 明 文 字 或 符 号, 表 示 操 作 的 内 容, 用 箭 头 来 表 示 操 作 的 顺 序 (2) 结 构 框 图 N-S 流 程 图 : 传 统 的 流 程 图 是 早 期 的 工 具, 采 用 这 种 方 法 描 述 算 法 比 较 直 观, 但 由 于 流 程 图 允 许 箭 头 随 意 转 移, 对 表 示 算 法 的 层 次 结 构 非 常 不 利, 且 流 程 图 占 的 篇 幅 较 大, 作 图 工 作 量 也 很 大 针 对 这 些 情 况,1973 年 美 国 的 计 算 机 科 学 家 I.Nassi 和 B.Shneiderman 提 出 了 所 谓 的 结 构 化 程 序 设 计 流 程 图, 因 为 他 们 二 人 的 名 字 是 以 N 和 S 开 头 的, 所 以 也 称 为 N-S 图 这 种 图 符 合 结 构 化 程 序 设 计 的 思 想 N-S 图 去 掉 了 传 统 流 程 图 中 引 起 麻 烦 的 箭 头, 全 部 算 法 写 在 一 个 大 的 矩 形 框 内 N-S 图 规 定 了 一 些 图 形 元 素, 用 来 表 示 三 种 基 本 结 构 ( 顺 序 结 构 选 择 结 构 循 环 结 构 ) 一 个 算 法 可 由 若 干 个 代 表 基 本 结 构 的 图 形 元 素 像 搭 积 木 一 样 构 造 而 成 1 顺 序 结 构 : 顺 序 结 构 是 一 系 列 顺 序 执 行 的 运 算 和 处 理, 顺 序 结 构 的 传 统 流 程 图 用 图 1.1(a) 表 示,

19 6 Visual Basic 程 序 设 计 教 程 而 N-S 图 用 图 1.1(b) 表 示 其 中,A 和 B 分 别 代 表 一 个 基 本 的 操 作 (a) (b) 图 1.1 顺 序 结 构 2 选 择 结 构 ( 判 断 结 构 ): 选 择 结 构 通 常 是 根 据 一 个 条 件 P 是 否 成 立 来 选 择 下 一 步 应 该 执 行 哪 一 种 处 理 图 1.2(a) (b) 分 别 表 示 选 择 结 构 的 程 序 流 程 图 和 N-S 图 其 中 T 表 示 条 件 成 立,F 表 示 条 件 不 成 立 T P F T P F A B A B (a) 流 程 图 图 1.2 选 择 结 构 (b)n-s 图 3 循 环 结 构 ( 重 复 结 构 ): 循 环 结 构 根 据 条 件 P 是 否 成 立 来 判 断 是 否 重 复 执 行 某 处 理 框 A 通 常 有 两 种 结 构 形 式, 一 种 是 先 判 后 做, 一 种 是 先 做 后 判 先 判 后 做 称 为 当 型 循 环 : 表 示 当 条 件 P 成 立 时 就 执 行 框 A, 然 后 返 回 再 判 断 P 是 否 成 立, 若 成 立 再 执 行 框 A, 重 复 下 去, 直 到 条 件 P 不 成 立 其 流 程 图 和 N-S 图 如 图 1.3(a) (b) 所 示 P T F 当 P A A (a) 流 程 图 图 1.3 当 型 循 环 结 构 (b)n-s 图 先 做 后 判 称 为 直 到 型 循 环 : 表 示 先 执 行 框 A, 再 判 断 条 件 P 是 否 满 足, 不 满 足 则 重

20 第 1 章 概 述 7 复 执 行 框 A, 直 到 条 件 成 立 其 流 程 图 和 N-S 图 如 图 1.4(a) (b) 所 示 A A F P T 直 到 P (a) 流 程 图 图 1.4 直 到 型 循 环 结 构 (b)n-s 图 习 题 1. 程 序 设 计 语 言 的 发 展 经 历 了 哪 几 个 阶 段? 各 有 什 么 优 缺 点? 2. 用 高 级 语 言 编 写 的 源 程 序 要 让 计 算 机 执 行, 需 经 过 哪 几 步 处 理? 3. 什 么 叫 结 构 化 程 序 设 计 方 法? 结 构 化 程 序 设 计 方 法 由 哪 三 种 基 本 结 构 组 成? 其 特 点 如 何? 4. 面 向 对 象 程 序 设 计 方 法 的 主 要 特 征 是 什 么? 5. 什 么 是 算 法? 描 述 算 法 的 方 法 有 哪 几 种?

21 第 2 章 Visual Basic 程 序 开 发 环 境 2.1 Visual Basic 语 言 简 介 Visual Basic 语 言 发 展 简 介 Visual 意 为 可 视 化 的, 指 的 是 一 种 开 发 图 形 用 户 界 面 (GUI) 的 方 法, 所 以 Visual Basic 是 基 于 Basic 的 可 视 化 的 程 序 设 计 语 言 Basic 指 的 是 BASIC(Beginners All-Purpose Symbolic Instruction Code, 初 学 者 通 用 符 号 指 令 代 码 ) 语 言, 一 种 在 计 算 技 术 发 展 历 史 上 应 用 得 最 为 广 泛 的 语 言 Visual Basic 在 原 有 BASIC 语 言 的 基 础 上 进 一 步 发 展, 包 含 了 数 百 条 语 句 函 数 及 关 键 词, 其 中 很 多 和 Windows GUI 有 直 接 关 系 在 Visual Basic 中, 一 方 面 继 承 了 BASIC 所 具 有 的 程 序 设 计 语 言 简 单 易 用 的 特 点, 另 一 方 面 在 其 编 程 系 统 中 采 用 了 面 向 对 象 事 件 驱 动 的 编 程 机 制, 用 一 种 巧 妙 的 方 法 把 Windows 的 编 程 复 杂 性 封 装 起 来, 提 供 了 一 种 所 见 即 所 得 的 可 视 化 程 序 设 计 方 法 因 此,Visual Basic 被 认 为 是 大 多 数 电 脑 初 学 者 的 首 选 入 门 编 程 语 言 Visual Basic 语 言 的 特 点 1. 具 有 面 向 对 象 的 可 视 化 设 计 工 具 在 VB 中, 应 用 面 向 对 象 的 程 序 设 计 方 法 (OOP), 把 程 序 和 数 据 封 装 起 来 视 为 一 个 对 象, 每 个 对 象 都 是 可 视 的 程 序 员 在 设 计 时 只 需 用 现 有 工 具 根 据 界 面 设 计 要 求, 直 接 在 屏 幕 上 画 出 窗 口 菜 单 按 钮 滚 动 条 等 不 同 类 型 的 对 象, 并 为 每 个 对 象 设 置 属 性 程 序 员 的 编 程 工 作 仅 限 于 编 写 相 关 对 象 要 完 成 的 功 能 程 序, 因 而 程 序 设 计 的 效 率 可 大 大 提 高 2. 事 件 驱 动 的 编 程 机 制 事 件 驱 动 是 非 常 适 合 图 形 用 户 界 面 的 编 程 方 式 在 图 形 用 户 界 面 的 应 用 程 序 中, 是 由 用 户 的 动 作 即 事 件 掌 握 着 程 序 运 行 的 流 向, 每 个 事 件 都 能 驱 动 一 段 程 序 的 运 行 程 序 员 只 需 要 编 写 响 应 用 户 动 作 的 代 码, 而 各 个 动 作 之 间 不 一 定 有 联 系 3. 提 供 了 易 学 易 用 的 应 用 程 序 集 成 开 发 环 境 在 VB 集 成 开 发 环 境 中, 用 户 可 设 计 界 面 编 写 代 码 调 试 程 序, 直 至 把 应 用 程 序 编 译 成 可 执 行 文 件 在 Windows 中 运 行, 使 用 户 在 友 好 的 开 发 环 境 中 工 作 4. 结 构 化 的 程 序 设 计 语 言 VB 具 有 丰 富 的 数 据 类 型 和 结 构 化 程 序 结 构, 作 为 一 种 程 序 设 计 语 言, 它 还 有 如 下 一 些 特 点 : (1) 强 大 的 数 值 和 字 符 串 处 理 功 能 ; (2) 丰 富 的 图 形 指 令, 可 方 便 地 绘 制 各 种 图 形 ;

22 第 2 章 Visual Basic 程 序 开 发 环 境 9 (3) 提 供 静 态 和 动 态 数 组, 有 利 于 简 化 内 存 的 管 理 ; (4) 过 程 可 递 归 调 用, 使 程 序 更 为 简 练 ; (5) 支 持 随 机 文 件 和 顺 序 文 件 的 访 问 ; (6) 提 供 了 一 个 可 供 应 用 程 序 调 用 的 包 含 多 种 类 型 的 图 标 库 ; (7) 具 有 完 善 的 运 行 出 错 处 理 5. 支 持 多 种 数 据 库 系 统 的 访 问 利 用 数 据 控 件 可 访 问 的 数 据 库 系 统 有 :Microsoft Access Btrieve DBase Microsoft FoxPro 和 Paradox 等, 也 可 以 访 问 Microsoft Excel Lotus1-2-3 等 多 种 电 子 表 格 6. 支 持 动 态 数 据 交 换 (DDE) 动 态 链 接 库 (DLL) 和 对 象 的 链 接 与 嵌 入 (OLE) 技 术 7. 完 备 的 HELP 联 机 帮 助 功 能 与 Windows 环 境 下 的 软 件 一 样, 在 VB 中, 利 用 帮 助 菜 单 和 F1 功 能 键, 用 户 可 以 随 时 方 便 地 得 到 所 需 要 的 帮 助 信 息 VB 帮 助 窗 口 中 显 示 了 有 关 的 示 例 代 码, 通 过 复 制 粘 贴 操 作 可 获 取 大 量 的 示 例 代 码, 为 用 户 的 学 习 和 使 用 提 供 了 极 大 的 方 便 Visual Basic 语 言 的 版 本 Microsoft 公 司 于 1991 年 推 出 Visual Basic 1.0 版, 获 得 巨 大 成 功, 直 到 1998 年 推 出 6.0 版, 至 今 已 经 历 了 6 个 版 本 随 着 版 本 的 改 进,Visual Basic 已 逐 渐 成 为 简 单 易 学 功 能 强 大 的 编 程 工 具 Visual Basic 6.0 包 括 三 种 版 本, 它 们 分 别 为 学 习 版 专 业 版 和 企 业 版 这 三 种 版 本 是 在 相 同 的 基 础 上 建 立 起 来 的, 以 满 足 不 同 层 次 的 用 户 需 要 学 习 版 :(Learning Edition) 可 使 用 一 组 工 具 来 创 建 功 能 完 备 的 Windows 应 用 程 序, 它 包 括 所 有 的 内 部 控 件 网 格 控 件 及 数 据 绑 定 等 控 件 专 业 版 :(Professional Edition) 在 学 习 版 的 基 础 上 添 加 了 一 些 专 门 的 工 具 和 一 个 报 表 编 制 工 具 它 主 要 针 对 计 算 机 专 业 开 发 人 员 ( 除 了 具 有 学 习 版 的 全 部 功 能 外, 还 包 括 ActiveX 和 Internet 控 件 开 发 工 具 之 类 的 高 级 特 性 ) 企 业 版 :(Enterprise Edition) 包 括 了 用 于 客 户 / 服 务 器 应 用 程 序 的 工 具 ( 除 了 具 有 专 业 版 的 全 部 功 能 外, 还 包 括 了 一 些 特 殊 的 工 具 ) 本 书 使 用 的 是 Visual Basic 6.0 中 文 企 业 版, 但 其 内 容 可 用 于 专 业 版, 所 有 程 序 可 在 专 业 版 中 运 行, 大 多 数 程 序 可 在 学 习 版 中 运 行 2.2 Visual Basic 6.0 的 安 装 和 启 动 Visual Basic 6.0 的 运 行 环 境 (1)CPU: 最 低 配 置 应 不 低 于 486DX, 一 般 应 选 择 奔 腾 133 或 更 高 主 频 的 CPU (2) 内 存 : 最 低 不 能 少 于 16MB 一 般 应 选 用 32MB, 以 便 能 提 高 运 行 速 度 如 果 用 于 图 形 处 理 或 使 用 ActiveX, 则 内 存 最 好 在 32MB 或 64MB 以 上 如 果 要 处 理 三 维 动 画, 则 内 存 配 置 应 大 于 64MB 或 128MB, 并 相 应 增 大 显 存 容 量

23 10 Visual Basic 程 序 设 计 教 程 (3) 磁 盘 空 间 : 学 习 版 : 典 型 安 装 需 要 48MB, 完 全 安 装 需 要 80MB 专 业 版 : 典 型 安 装 需 要 48MB, 完 全 安 装 需 要 80MB 企 业 版 : 典 型 安 装 需 要 128MB, 完 全 安 装 需 要 147MB MSDN: 若 使 用 VB 帮 助 文 件, 则 必 须 安 装, 至 少 需 要 67MB 另 外, 可 以 根 据 实 际 需 要 安 装 一 些 附 加 控 件 (4) 显 示 设 备 :VGA 或 更 高 分 辨 率 的 显 示 器, 建 议 使 用 Super VGA (5) 读 取 设 备 : 应 配 置 8 倍 速 或 更 高 速 度 的 CD-ROM 驱 动 器 (6) 操 作 系 统 :Windows 9X 或 Windows NT 4.0 以 上 版 本 Visual Basic 6.0 的 安 装 VB 的 安 装 与 安 装 大 多 数 其 他 Windows 应 用 程 序 相 似, 将 带 有 VB 6.0 的 CD 盘 片 放 入 光 驱, 执 行 该 盘 片 中 的 SETUP.EXE, 然 后 按 照 屏 幕 提 示 操 作 即 可 以 下 以 中 文 企 业 版 为 例 介 绍 安 装 过 程 为 了 顺 利 安 装 和 运 行 Visual Basic 6.0 中 文 企 业 版, 要 求 硬 盘 至 少 需 有 200MB 以 上 的 空 闲 空 间 ; 如 果 需 要 安 装 MSDN, 则 可 用 磁 盘 空 间 的 数 量 最 好 在 400MB 以 上 (1) 将 VB 6.0 的 安 装 光 盘 放 入 光 驱, 在 资 源 管 理 器 或 我 的 电 脑 中 执 行 安 装 光 盘 上 的 SETUP.EXE 程 序, 运 行 后 显 示 出 Visual Basic 6.0 中 文 企 业 版 安 装 向 导 对 话 框, 如 图 2.1 所 示 图 2.1 Visual Basic 6.0 中 文 企 业 版 安 装 向 导 对 话 框 (2) 在 图 2.1 所 示 的 对 话 框 中, 单 击 下 一 步 按 钮, 则 打 开 最 终 用 户 许 可 协 议 文 本 框, 选 定 单 选 按 钮 接 受 协 议, 单 击 下 一 步 按 钮 此 时 安 装 程 序 要 求 用 户 输 入 产 品

24 第 2 章 Visual Basic 程 序 开 发 环 境 11 的 ID 号 用 户 的 姓 名 和 公 司 名 称 输 入 完 上 述 内 容 后 单 击 下 一 步 按 钮, 打 开 选 择 安 装 程 序 对 话 框, 如 图 2.2 所 示 图 2.2 选 择 安 装 程 序 对 话 框 (3) 在 图 2.2 中 选 择 安 装 Visual Basic 6.0 中 文 企 业 版 后, 单 击 下 一 步 按 钮 在 完 成 安 装 路 径 选 择 后, 安 装 程 序 将 打 开 选 择 安 装 类 型 对 话 框, 如 图 2.3 所 示 图 2.3 选 择 安 装 类 型 对 话 框 (4) 在 选 择 安 装 类 型 对 话 框 中, 安 装 程 序 为 用 户 提 供 了 两 个 选 择 : 典 型 安 装 和 自 定 义 安 装 前 者 将 安 装 最 典 型 的 组 件, 安 装 过 程 无 需 用 户 干 预 若 用 户 选 择 了 后 者, 将 打 开 自 定 义 安 装 对 话 框, 如 图 2.4 所 示 在 这 时 用 户 可 以 有 选 择 地 安 装 需 要 的 组 件 (5) 单 击 图 2.4 对 话 框 中 的 继 续 按 钮 后, 安 装 程 序 将 复 制 所 选 文 件 到 硬 盘 中, 复 制 结 束 后 将 重 新 启 动 计 算 机 完 成 VB 6.0 的 安 装

25 12 Visual Basic 程 序 设 计 教 程 (6) 计 算 机 重 新 启 动 后, 安 装 程 序 将 自 动 打 开 安 装 MSDN 对 话 框, 询 问 用 户 是 否 需 要 安 装 Microsoft Developer Network Library(MSDN) MSDN Library 是 开 发 人 员 的 重 要 参 考 资 料, 包 含 了 容 量 约 1GB 的 编 程 技 术 资 料 信 息, 包 括 示 例 代 码 文 档 技 术 文 章 Microsoft 开 发 人 员 知 识 库 及 开 发 程 序 时 需 要 的 其 他 资 料 MSDN Library 是 Microsoft Visual Studio 6.0 的 套 件 之 一, 由 两 张 光 盘 组 成 注 意 VB 6.0 的 联 机 帮 助 文 档 只 有 在 安 装 了 MSDN 后 方 可 使 用 图 2.4 自 定 义 安 装 对 话 框 VB 6.0 的 安 装 结 束 后, 用 户 可 以 从 开 始 菜 单 中 启 动 它, 也 可 以 根 据 需 要 在 桌 面 上 建 立 VB 6.0 的 快 捷 方 式 Visual Basic 6.0 的 启 动 和 退 出 1. VB 6.0 的 启 动 VB 的 运 行 就 像 其 他 Windows 应 用 程 序 那 样 运 行, 其 运 行 方 法 为 : (1) 双 击 桌 面 上 的 Visual Basic 图 标 (2) 选 择 开 始 程 序 一 旦 运 行 了 VB 6.0 将 会 弹 出 一 个 新 建 工 程 窗 口, 如 图 2.5 所 示 如 果 只 是 准 备 建 立 普 通 的 Visual Basic 程 序 可 以 直 接 双 击 标 准 EXE 图 标 或 直 接 按 回 车 键, 直 接 进 入 到 Visual Basic 标 准 界 面 中, 如 图 2.6 所 示 2. VB 6.0 的 退 出 (1) 选 择 文 件 退 出 (2) 单 击 窗 口 右 上 角 关 闭 按 钮 (3) 单 击 窗 口 左 上 角 ( 标 题 栏 最 左 端 的 窗 口 控 制 菜 单 框 ) 从 快 捷 菜 单 中 选 择 关 闭

26 第 2 章 Visual Basic 程 序 开 发 环 境 13 图 2.5 新 建 工 程 窗 口 图 2.6 VB 6.0 集 成 开 发 环 境 2.3 最 简 单 的 VB 程 序 例 2.1 所 见 即 所 得 的 欢 迎 使 用 Visual Basic 下 面 将 用 VB 建 立 我 们 的 第 一 个 应 用 程 序 欢 迎 使 用 Visual Basic, 你 将 会 看 到 用 VB 开 发 一 个 应 用 程 序 是 多 么 的 简 单 快 捷 在 这 个 例 子 中 我 们 要 程 序 启 动 后 给 我 们 显 示 一 条 欢 迎 使 用 Visual Basic 的 欢 迎 信 息, 即 使 你 对 编 程 一 无 所 知, 你 也 能 很 快 地 编 写 出 自 己 的 第 一 个 应 用 程 序 通 过 下 面 的 操 作 步 骤, 你 甚 至 可 能 会 觉 得 用 VB 编 程 跟 用 画 笔 画 图 没 什 么

27 14 Visual Basic 程 序 设 计 教 程 两 样 ( 在 编 写 更 复 杂 的 程 序 之 前, 你 可 以 保 留 这 个 看 法 )! 使 用 VB 创 建 我 们 的 第 一 个 应 用 程 序 的 步 骤 如 下 : 首 先 新 建 一 个 工 程 创 建 一 个 工 程 的 步 骤 如 前 面 已 经 介 绍 过 的 图 2.5 和 图 2.6, 工 程 创 建 后 将 会 出 现 形 如 图 2.6 的 界 面, 以 后 所 有 的 工 作 都 将 在 这 个 界 面 中 完 成 让 我 们 继 续 我 们 的 程 序 用 所 见 即 所 得 来 概 括 VB 编 程 的 特 点 是 完 全 可 以 的 你 把 窗 体 画 成 什 么 样, 程 序 运 行 后 就 是 什 么 样! 既 然 我 们 的 任 务 是 窗 体 上 出 现 欢 迎 使 用 Visual Basic, 直 接 把 它 们 画 在 窗 体 上 就 可 以 了 注 意 到 我 在 画 上 加 了 双 引 号, 这 是 因 为 不 能 像 在 画 笔 中 那 样 画, 要 在 窗 体 上 加 文 字, 先 得 往 窗 体 上 加 一 个 控 件 那 么 到 底 哪 些 控 件 可 以 显 示 文 字 呢? 这 得 看 控 件 的 属 性 这 里, 我 们 又 引 入 了 属 性 这 个 概 念, 属 性 这 个 词 本 身 并 不 难 理 解 如 果 把 一 个 人 比 作 控 件, 那 么, 他 的 姓 名 性 别 身 高 体 重 等 便 可 以 看 成 其 属 性 回 到 VB, 控 件 的 名 称 颜 色 大 小 ( 长 度 和 宽 度 ) 等 便 是 它 的 属 性 不 同 的 控 件 属 性 不 完 全 相 同, 也 就 是 说, 各 种 控 件 都 有 自 己 特 有 的 属 性 掌 握 各 个 控 件 的 属 性 是 VB 编 程 中 最 为 关 键 的 一 步, 本 书 将 会 在 后 面 的 章 节 中 对 各 个 控 件 做 详 细 介 绍 现 在 先 回 到 我 们 的 问 题, 哪 些 控 件 可 以 显 示 文 字? 具 有 Text( 文 字 ) 或 Caption( 标 题 ) 属 性 的 控 件 都 可 以 这 样 的 控 件 有 很 多, 常 见 的 有 文 本 框 标 签 命 令 按 钮 单 选 框 复 选 框 可 以 说, 大 部 分 控 件 都 有 一 个 Caption 属 性, 但 基 本 控 件 中 专 门 用 于 显 示 文 本 的 只 有 文 本 框 和 标 签 ( 至 于 两 者 的 区 别 后 面 会 阐 述 ), 在 这 里 我 们 不 妨 选 用 标 签 控 件 现 在 先 把 标 签 控 件 ( 即 工 具 箱 中 的 图 标 ) 拖 进 窗 体 设 计 器 中, 接 下 来 便 要 写 文 字 了 写 文 字 便 是 要 设 置 标 签 控 件 的 Caption 属 性, 看 到 标 签 上 的 Label1 字 样 了 吗? 那 是 标 签 控 件 默 认 的 Caption 属 性, 我 们 得 把 它 改 过 来 窗 体 设 计 器 右 边 有 一 个 表 格 模 样 的 窗 口, 那 就 是 属 性 窗 口, 如 图 2.7 所 示 图 2.7 Label1 属 性 窗 口 表 格 左 边 一 列 是 控 件 属 性 名 称, 右 边 一 列 是 相 应 的 属 性 值 选 定 标 签 控 件, 这 时 属 性 窗 口 最 上 面 的 列 表 框 显 示 Label1 Label,Label1 是 标 签 控 件 默 认 的 名 称 ( 你 也 可 以 改 变 标 签 的 名 称 属 性, 给 它 起 一 个 好 听 的 名 字 ) 请 找 到 Caption 属 性, 把 相 应 的 属 性 值 改 为 欢 迎 使 用 Visual Basic, 看 到 了 吗? 标 签 上 的 文 字 变 成 了 欢 迎 使 用 Visual Basic! 操 作 完 成 后 窗 体 如 图 2.8 所 示

28 第 2 章 Visual Basic 程 序 开 发 环 境 15 图 2.8 设 计 时 窗 体 下 面 请 保 存 文 件 ( 在 运 行 程 序 之 前 保 存 文 件 是 一 个 好 习 惯 ) 使 用 文 件 菜 单 中 的 保 存 工 程 命 令, 在 打 开 的 保 存 窗 体 对 话 框 中 输 入 窗 体 名 ex0201, 单 击 保 存 按 钮 ; 然 后 在 弹 出 的 工 程 另 存 为 对 话 框 中 输 入 工 程 名 ex0201, 单 击 保 存 按 钮, 则 完 成 工 程 的 保 存 现 在 可 以 运 行 程 序 了, 单 击 常 用 工 具 栏 中 的 运 行 按 钮, 观 察 运 行 效 果 图 2.9 就 是 程 序 运 行 后 见 到 的 界 面 图 2.9 运 行 时 窗 体 到 这 里, 我 们 一 句 代 码 也 没 写, 便 编 出 了 一 个 程 序, 这 就 是 VB 的 威 力 我 们 来 总 结 一 下 一 个 简 单 VB 程 序 的 编 制 过 程 : (1) 新 建 工 程 ; (2) 根 据 需 要 往 窗 体 添 加 控 件 ; (3) 设 置 控 件 属 性 ; (4) 保 存 工 程 并 运 行 最 后, 应 该 说 一 说 程 序 的 编 译 发 布 了 为 了 使 应 用 程 序 能 够 脱 离 VB 集 成 开 发 环 境 运 行, 我 们 需 要 把 它 编 译 成 可 执 行 文 件 (*.EXE) VB 中 编 译 一 个 程 序 是 非 常 简 单 的, 在 文 件 菜 单 中 选 择 生 成 EXE 文 件 便 可 以 生 成 你 的 可 执 行 文 件 了 但 是, 用 VB 编 的 应 用 程 序 不 能 脱 离 VB 运 行 库 运 行 要 在 没 有 安 装 VB 运 行 库 的 机 器 上 运 行 用 VB 开 发 的 应 用 程 序, 必 须 先 对 应 用 程 序 进 行 打 包 要 对 应 用 程 序 进 行 打 包, 可 以 使 用 Package and Deployment Wizard( 打 包 和 展 开 向 导 ) 为 程 序 创 建 安 装 文 件 ( 参 见 附 录 ) 一 旦 创 建 了 安 装 文 件, 就 可 以 在 没 有 安 装 Visual Basic 的 机 器 上 运 行 该 应 用 程 序 了 虽 然 我 们 可 以 不 写 一 句 代 码 便 写 出 一 个 程 序, 但 这 个 程 序 实 际 上 很 笨 我 们 不 可 以 向 它 下 达 任 何 命 令 现 在 我 们 需 要 对 例 2.1 进 行 改 进, 即 当 我 们 按 下 某 个 命 令 按 钮 后 再 显

29 16 Visual Basic 程 序 设 计 教 程 示 欢 迎 使 用 Visual Basic, 这 就 需 要 对 程 序 进 行 编 码 要 对 程 序 进 行 编 码 就 离 不 开 代 码 编 辑 器 顾 名 思 义, 代 码 编 辑 器 便 是 编 辑 程 序 代 码 的 地 方, 控 件 只 是 程 序 的 外 表, 代 码 才 是 程 序 的 灵 魂, 离 开 了 代 码, 程 序 基 本 上 是 没 有 意 义 的 例 2.2 善 解 人 意 的 欢 迎 使 用 Visual Basic 本 例 将 对 例 2.1 进 行 改 进, 我 们 将 往 窗 体 中 加 个 按 钮, 让 程 序 在 我 们 按 下 按 钮 之 后 才 显 示 欢 迎 信 息 具 体 创 建 该 应 用 程 序 的 操 作 步 骤 如 下 : 启 动 VB, 在 弹 出 的 对 话 框 中 选 择 现 存, 选 择 我 们 上 面 建 立 的 工 程 ( 当 然 也 可 以 先 选 择 取 消, 进 入 VB 后 再 从 文 件 菜 单 中 选 择 打 开 ), 选 择 确 定 之 后 上 面 的 工 程 会 打 开, 把 工 具 箱 中 的 按 钮 控 件 ( 默 认 的 名 称 为 Command1) 拖 进 窗 体 ( 如 图 2.10 所 示 ), 准 备 添 加 代 码 图 2.10 添 加 Command1 后 工 程 窗 体 在 添 加 代 码 之 前 先 介 绍 一 下 事 件 的 概 念 我 们 不 妨 把 事 件 理 解 为 向 程 序 发 出 的 命 令, 比 如 说, 单 击 鼠 标 按 下 键 盘 都 会 向 程 序 发 出 一 个 命 令, 也 即 产 生 了 一 个 事 件 在 VB 中, 事 件 都 有 统 一 的 命 名, 命 名 规 则 是 : 事 件 作 用 的 对 象 名 _ 事 件, 如 Form_Click, 可 以 把 Form_Click 理 解 为 Click Form( 单 击 Form), 当 我 们 在 Form 上 单 击 时, 便 会 产 生 Form_Click 事 件, 同 理, 在 按 钮 Command1 上 单 击 时, 便 会 产 生 Command1_Click 事 件 每 种 控 件 都 能 响 应 一 些 事 件, 而 不 同 的 控 件 能 响 应 的 事 件 也 是 不 尽 相 同 的 怎 样 才 能 知 道 哪 些 控 件 可 以 响 应 哪 些 事 件? 双 击 Command1 控 件, 此 时 会 出 现 代 码 编 辑 器, 在 代 码 编 辑 器 上 编 辑 代 码 如 图 2.11 所 示 图 2.11 编 写 程 序 代 码 代 码 编 辑 器 上 面 有 两 个 列 表 框, 左 边 一 个 显 示 的 是 所 选 对 象 的 名 称, 右 边 一 个 显 示 的 是

30 第 2 章 Visual Basic 程 序 开 发 环 境 17 对 象 相 应 的 事 件, 要 查 看 某 一 对 象 可 以 响 应 什 么 事 件, 只 需 要 在 左 边 列 表 框 选 定 对 象, 在 右 边 列 表 框 的 下 拉 列 表 中 查 看 即 可, 列 表 框 下 面 的 文 本 框 便 是 输 入 代 码 的 地 方 现 在 里 面 有 两 行 : Private Sub Command1_Click() 这 是 系 统 自 动 为 我 们 生 成 的 代 码, 它 的 具 体 含 义 会 在 后 面 介 绍, 现 在 我 们 只 需 要 往 这 两 个 语 句 间 添 加 Command1_Click() 事 件 发 生 后 要 执 行 的 代 码 在 这 个 例 子 中, 我 们 要 单 击 按 钮 后 显 示 欢 迎 使 用 Visual Basic 的 欢 迎 信 息, 从 编 程 的 角 度 出 发, 可 以 表 述 为 : Command1_Click() 事 件 发 生 后,Label1 的 Caption 属 性 变 为 欢 迎 使 用 Visual Basic 因 此, 要 加 入 的 代 码 的 任 务 是 把 Label1 的 Caption 属 性 变 为 欢 迎 使 用 Visual Basic, 而 这 一 过 程 用 VB 来 表 述 则 是 : Label1.Caption = " 欢 迎 使 用 Visual Basic" 把 这 个 语 句 加 入 程 序 中 : Private Sub Command1_Click() Label1.Caption = " 欢 迎 使 用 Visual Basic" 最 后, 把 Label1 的 Caption 属 性 改 为 空 ( 让 Label1 开 始 时 不 显 示 任 何 字 符 ), 这 样 我 们 的 程 序 便 修 改 完 毕 把 工 程 另 存 为 ex0202.vbp 并 运 行 程 序, 可 以 看 到, 窗 体 中 只 能 看 到 一 个 按 钮, 单 击 按 钮 后 便 出 现 了 欢 迎 使 用 Visual Basic 的 欢 迎 信 息, 如 图 所 示 图 2.12 单 击 按 钮 前 窗 体 状 态 图 2.13 单 击 按 钮 后 窗 体 状 态 尽 管 这 个 程 序 还 很 简 单, 但 它 的 确 能 响 应 我 们 的 命 令 了, 这 是 一 个 不 小 的 飞 跃, 在 后 面 的 章 节 中, 我 们 会 对 这 个 程 序 继 续 进 行 完 善 下 面 我 们 重 新 总 结 一 下 VB 程 序 的 编 制 过 程 :

31 18 Visual Basic 程 序 设 计 教 程 (1) 新 建 工 程 ; (2) 根 据 需 要 往 窗 体 添 加 控 件 ; (3) 设 置 控 件 属 性 ; (4) 添 加 代 码 ; (5) 保 存 工 程 并 运 行 2.4 Visual Basic 集 成 开 发 环 境 Visual Basic 与 其 他 大 多 数 Windows 应 用 程 序 不 同 的 是,Visual Basic 是 由 一 组 独 立 的 窗 口 组 成 ( 它 主 要 包 括 : 主 窗 口 窗 体 窗 口 属 性 窗 口 工 程 资 源 管 理 器 窗 口 代 码 窗 口 窗 体 布 局 窗 口 对 象 浏 览 器 窗 口 工 具 箱 窗 口 立 即 窗 口 ) Visual Basic 的 应 用 程 序 通 过 图 2.6 所 示 的 集 成 环 境 开 发 下 面 介 绍 各 部 分 的 功 能 和 使 用 方 法 主 窗 口 主 窗 口 与 Office 家 族 的 软 件 类 似, 它 由 标 题 栏 菜 单 栏 和 工 具 栏 组 成, 它 含 有 一 个 Windows 应 用 程 序 应 具 有 的 所 有 组 成 元 素, 主 窗 口 主 要 包 括 如 下 内 容 : 1. 标 题 栏 按 照 Windows 的 惯 例, 每 个 窗 口 都 具 有 标 题 栏, 标 题 栏 中 含 有 当 前 工 程 的 名 字, 以 及 最 小 化 最 大 化 及 关 闭 窗 口 的 几 个 常 规 按 钮 在 标 题 栏 中 还 显 示 了 当 前 所 处 的 模 式 ( 工 作 状 态 ) VB 有 三 种 工 作 模 式, 它 们 是 : 设 计 (Design) 模 式 运 行 (Run) 模 式 和 中 断 (Break) 模 式 (1) 设 计 模 式 : 设 计 模 式 可 进 行 用 户 界 面 的 设 计 和 代 码 的 编 制, 以 完 成 应 用 程 序 的 开 发 (2) 运 行 模 式 : 运 行 模 式 是 运 行 应 用 程 序, 这 时 不 可 以 编 辑 代 码, 也 不 可 编 辑 界 面 (3) 中 断 模 式 : 中 断 模 式 是 应 用 程 序 运 行 暂 时 中 断, 这 时 可 以 编 辑 代 码, 但 不 可 以 编 辑 界 面 按 F5 键 或 单 击 继 续 按 钮 程 序 继 续 运 行, 单 击 结 束 按 钮 程 序 停 止 运 行 在 此 模 式 下 会 弹 出 立 即 窗 口, 在 窗 口 内 可 输 入 简 短 的 命 令, 并 立 即 执 行 当 程 序 运 行 过 程 中 出 现 错 误 时, 往 往 需 要 进 行 手 工 调 试, 此 时 要 做 的 就 是 中 断 程 序 运 行 随 后 屏 幕 出 现 调 试 窗 口 以 供 检 查 2. 菜 单 栏 菜 单 是 提 供 给 用 户 设 计 和 调 试 程 序 时 的 必 要 功 能,VB 沿 用 了 Windows 的 菜 单 形 式, 菜 单 栏 中 含 有 13 个 下 拉 菜 单 这 是 程 序 开 发 过 程 中 需 要 的 命 令 3. 工 具 栏 工 具 栏 中 共 有 21 个 功 能 按 钮, 它 们 是 开 发 应 用 程 序 的 工 具, 有 了 工 具 栏, 用 户 可 以 脱 离 菜 单 而 直 接 选 择 功 能 按 钮 进 行 操 作 工 具 栏 提 供 了 VB 常 见 操 作 的 快 捷 方 式 图 标 暗 淡 时 该

32 第 2 章 Visual Basic 程 序 开 发 环 境 19 工 具 无 效 如 图 2.14 所 示 图 2.14 常 用 工 具 栏 (1) 添 加 Standard EXE 工 程 ( ): 用 于 添 加 新 的 工 程 (2) 添 加 窗 体 ( ): 用 于 添 加 新 的 窗 体 到 工 程 中 (3) 菜 单 编 辑 器 ( ): 它 用 于 设 计 窗 口 中 的 菜 单, 这 与 工 具 菜 单 中 的 菜 单 编 辑 器 功 能 相 同 (4) 启 动 ( ): 开 始 运 行 当 前 的 工 程 (5) 中 断 ( ): 暂 时 中 断 当 前 工 程 的 运 行 (6) 结 束 ( ): 结 束 当 前 工 程 的 运 行 (7) 工 程 资 源 管 理 器 ( ): 显 示 正 在 编 写 的 工 程 及 它 们 所 含 的 各 个 窗 体 的 名 字 (8) 属 性 窗 口 ( ): 弹 出 一 个 窗 口, 允 许 用 户 直 接 在 该 窗 口 中 更 改 包 括 窗 体 在 内 的 各 个 控 件 的 属 性 (9) 窗 体 布 局 窗 口 ( ): 显 示 所 编 辑 的 窗 体 的 大 致 外 形, 以 便 可 以 更 改 (10) 对 象 浏 览 器 ( ): 查 看 所 选 成 员 的 定 义 (11) 工 具 箱 ( ): 打 开 工 具 箱 窗 口 其 他 工 具 按 钮 的 使 用 方 法 与 Windows 常 用 工 具 栏 中 工 具 按 钮 的 使 用 方 法 一 致, 在 此 不 再 一 一 赘 述 窗 体 窗 口 屏 幕 中 央 具 有 均 匀 分 布 的 网 点 空 白 窗 体, 这 就 是 用 户 定 制 的 窗 体 窗 体 窗 口 又 称 为 对 象 窗 口, 主 要 用 来 在 窗 体 上 设 计 用 户 应 用 程 序 的 界 面 可 以 利 用 网 格 对 齐 控 件, 以 使 各 个 控 件 排 列 整 齐, 用 户 可 以 将 各 个 控 件 按 自 己 的 意 图, 随 心 所 欲 地 添 加 到 窗 体 的 各 个 位 置 窗 体 可 以 直 接 运 行 用 户 可 以 改 变 窗 体 的 大 小, 重 新 布 局 对 象 ( 控 件 ) 或 者 将 其 删 除, 而 且 可 以 对 每 个 对 象 的 各 个 属 性 窗 口 选 择 该 对 象 的 属 性, 以 调 整 其 行 为 及 外 观 窗 体 是 VB 应 用 程 序 的 主 要 部 分, 用 户 通 过 与 窗 体 的 控 制 部 件 交 互 来 得 到 结 果 每 个 窗 体 窗 口 必 须 有 一 个 惟 一 的 窗 体 名 字, 建 立 窗 体 时 缺 省 名 为 Form1 Form2 等 工 程 资 源 管 理 器 窗 口 在 VB 中, 运 行 一 项 功 能 必 须 依 赖 许 多 程 序 文 件, 为 了 管 理 这 些 文 件,VB 中 使 用 了 工 程 资 源 管 理 器 窗 口 来 管 理 它 们, 工 程 资 源 管 理 器 窗 口 保 存 一 个 应 用 程 序 所 有 属 性 以 及 组 成 这 个 应 用 程 序 所 有 的 文 件 工 程 文 件 的 后 缀 为.Vbp 工 程 窗 口 由 标 题 栏 工 具 栏 窗 口 组 成 : 1. 标 题 栏 它 的 标 题 通 常 是 工 程 1 2. 工 具 栏

33 20 Visual Basic 程 序 设 计 教 程 该 栏 中 有 三 个 按 钮 : (1) 查 看 代 码 : 切 换 到 代 码 窗 口, 对 所 编 辑 的 程 序 的 代 码 进 行 浏 览 (2) 查 看 对 象 : 切 换 到 对 象 窗 口, 对 包 括 窗 体 在 内 的 各 个 控 件 进 行 编 辑 (3) 切 换 文 件 夹 : 对 当 前 窗 体 所 在 文 件 夹 进 行 切 换 通 常 情 况 下, 一 个 工 程 主 要 包 括 如 下 四 个 文 件 : 1 窗 体 文 件 : 它 的 扩 展 名 为.Frm, 主 要 用 途 是 设 计 程 序 窗 体 ( 口 ), 一 个 程 序 至 少 需 要 一 个 窗 体 ; 2 标 准 模 块 文 件 : 它 的 扩 展 名 为.Bas, 程 序 模 块 通 常 是 由 BASIC 语 言 编 写, 在 执 行 工 程 时, 供 其 他 程 序 使 用, 是 一 个 可 共 用 的 子 程 序 一 般 在 一 个 工 程 文 件 中, 可 以 有 若 干 个 标 准 模 块 文 件 ; 3 工 程 文 件 : 它 的 扩 展 名 为.Vbp,VB 中 一 次 只 能 打 开 一 个 工 程 文 件, 它 只 提 供 一 些 相 关 文 件 和 程 序 模 块 的 数 据 ; 4 类 模 块 文 件 : 它 的 扩 展 名 为.Cls,VB 中 提 供 了 大 量 预 定 义 的 类, 同 时 也 允 许 用 户 根 据 需 要 定 义 自 己 的 类, 每 个 类 都 用 一 个 文 件 来 保 存 属 性 窗 口 属 性 窗 口 包 括 了 所 有 窗 体 或 控 件 的 属 性, 如 : 颜 色 字 体 大 小 等 如 果 要 更 改 属 性, 可 以 通 过 该 窗 口 来 修 改 另 外 对 于 只 读 属 性 之 外 的 属 性 可 以 在 程 序 运 行 过 程 中 动 态 设 置 属 性 窗 口 由 以 下 几 个 部 分 组 成 : (1) 标 题 栏 : 包 括 了 窗 体 或 控 件 的 名 称 (2) 对 象 列 表 框 : 其 中 含 有 窗 体 或 控 件 的 名 称, 单 击 它 右 侧 的 箭 头, 可 拉 出 所 选 窗 体 包 含 的 对 象 的 列 表, 可 以 选 择 当 前 窗 体 或 其 他 控 件 (3) 属 性 列 表 框 : 有 按 字 母 序 和 按 分 类 序 两 个 按 钮 选 项 卡, 列 出 所 选 对 象 ( 控 件 ) 的 属 性 左 边 为 对 象 的 属 性, 右 边 是 每 个 属 性 对 应 的 当 前 设 置 对 于 不 同 的 对 象 它 所 列 出 的 属 性 是 不 同 的 用 户 可 以 选 择 某 一 属 性, 然 后 对 该 属 性 值 进 行 设 置 或 修 改 (4) 属 性 含 义 说 明 : 当 在 属 性 列 表 框 选 择 某 一 属 性 时, 在 该 区 域 显 示 所 选 属 性 的 含 义 代 码 窗 口 代 码 窗 口 是 用 来 专 门 进 行 程 序 设 计 的 窗 口, 可 在 其 中 显 示 和 编 辑 程 序 代 码, 用 户 可 以 打 开 多 个 代 码 窗 口, 查 看 不 同 窗 体 标 准 模 块 中 的 代 码, 并 可 在 各 窗 口 间 复 制 代 码 打 开 代 码 窗 口 的 方 法 有 : (1) 从 工 程 窗 口 中 选 择 一 个 窗 体 或 标 准 模 块, 再 选 择 查 看 代 码 按 钮 (2) 可 用 鼠 标 双 击 一 个 控 件 或 窗 体 本 身 即 可 打 开 代 码 窗 口 (3) 从 视 图 菜 单 中 选 择 代 码 窗 口 即 视 图 代 码 窗 口 代 码 窗 口 如 图 2.15 所 示 它 主 要 包 括 : (1) 对 象 列 表 框 : 下 拉 式 列 表 框, 它 存 储 并 显 示 当 前 被 选 中 窗 体 及 所 有 控 件 名 其 中 通 用 表 示 与 特 定 对 象 无 关 的 通 用 代 码 一 般 在 此 声 明 非 局 部 变 量 或 由 用 户 编 写 的 自 定 义 函 数 和 过 程

34 第 2 章 Visual Basic 程 序 开 发 环 境 21 (2) 过 程 列 表 框 : 下 拉 式 列 表 框, 存 储 并 显 示 各 种 事 件 过 程 名 称 在 对 象 列 表 框 中 选 择 对 象 名, 在 过 程 列 表 框 中 选 择 事 件 过 程 名, 即 可 构 成 选 中 对 象 的 事 件 过 程 模 板, 用 户 可 在 模 板 内 输 入 代 码, 其 中 声 明 表 示 声 明 非 局 部 变 量 对 象 的 事 件 过 程 模 板 的 一 般 形 式 : Private Sub 对 象 名 _ 事 件 过 程 名 [( 参 数 列 表 )] ( 用 户 代 码 或 事 件 过 程 代 码 ) 图 2.15 代 码 窗 口 工 具 箱 窗 口 该 窗 口 由 21 个 被 绘 制 成 按 钮 形 式 的 图 标 构 成, 它 们 是 各 种 控 件 的 制 作 工 具 利 用 这 些 工 具, 用 户 可 在 窗 体 上 设 计 各 种 控 件, 这 些 控 件 称 为 标 准 控 件 ( 指 针 不 是 控 件, 它 仅 用 于 对 控 件 的 编 辑 ), 用 户 可 以 通 过 工 程 菜 单 中 的 部 件 命 令 将 系 统 提 供 的 其 他 标 准 控 件 装 入 工 具 箱 工 具 箱 主 要 用 于 应 用 程 序 的 界 面 设 计 在 设 计 阶 段, 首 先 用 工 具 箱 中 的 工 具 ( 即 控 件 ) 在 窗 体 上 建 立 用 户 界 面, 然 后 编 写 程 序 代 码 界 面 的 设 计 完 全 通 过 控 件 来 实 现, 可 以 任 意 改 变 其 大 小, 移 动 到 窗 体 的 任 意 位 置 窗 体 布 局 窗 口 窗 体 布 局 窗 口 用 于 指 定 程 序 运 行 时 的 初 始 位 置 主 要 为 使 所 开 发 的 应 用 程 序 能 在 各 个 不 同 分 辨 率 的 屏 幕 上 正 常 运 行, 在 多 重 窗 体 应 用 程 序 中 较 为 有 用 ( 初 始 位 置 指 屏 幕 的 任 何 位 置 ) 对 象 浏 览 器 窗 口 该 窗 口 可 查 看 在 工 程 中 定 义 的 模 块 或 过 程, 也 可 以 查 看 对 象 库 类 型 库 类 方 法 属 性 事 件 及 可 在 过 程 中 使 用 的 常 量

35 22 Visual Basic 程 序 设 计 教 程 2.5 创 建 一 个 VB 应 用 程 序 的 方 法 和 步 骤 在 Visual Basic 中 创 建 一 个 应 用 程 序 非 常 简 单 一 般 先 设 计 应 用 程 序 的 外 观, 然 后 再 分 别 编 写 各 对 象 事 件 的 程 序 代 码 或 其 他 处 理 程 序 具 体 包 含 以 下 几 个 步 骤 : 1. 创 建 应 用 程 序 界 面 应 用 程 序 界 面 是 用 户 和 程 序 交 互 的 桥 梁, 用 VB 创 建 的 标 准 Windows 应 用 程 序 的 界 面 一 般 由 窗 体 按 钮 菜 单 文 本 框 和 图 像 框 等 对 象 构 成 一 般 应 根 据 程 序 的 功 能 要 求 和 用 户 与 程 序 之 间 的 信 息 交 流 的 需 要 来 确 定 需 要 哪 些 对 象, 进 而 规 划 界 面 的 布 局 2. 设 置 界 面 上 各 个 对 象 的 属 性 根 据 规 划 的 界 面 要 求 设 置 各 个 对 象 的 属 性, 比 如 对 象 的 外 观 名 称 颜 色 大 小 等 大 多 数 属 性 取 值 既 可 以 在 设 计 时 通 过 属 性 窗 口 来 设 置, 也 可 以 在 程 序 代 码 中 通 过 编 程 在 程 序 运 行 时 设 置 修 改 3. 编 写 对 象 相 应 的 程 序 代 码 界 面 仅 仅 决 定 了 程 序 的 外 观, 设 计 完 界 面 后 就 要 通 过 代 码 编 辑 器 窗 口 来 添 加 代 码, 实 现 一 些 在 接 受 外 界 信 息 后 做 出 的 响 应 信 息 处 理 等 任 务 添 加 代 码 如 前 面 的 图 2.15 代 码 窗 口 所 示 4. 保 存 工 程 一 个 VB 程 序 就 是 一 个 工 程, 在 设 计 一 个 应 用 时, 系 统 会 建 立 一 个 扩 展 名 为.Vbp 的 工 程 文 件, 工 程 文 件 包 含 了 该 工 程 所 建 立 的 所 有 文 件 的 相 关 信 息, 保 存 工 程 同 时 就 保 存 了 该 工 程 的 所 有 相 关 文 件 比 如 当 设 计 界 面 时 产 生 的 窗 体 保 存 在 扩 展 名 为.Frm 的 窗 体 文 件 中, 在 打 开 一 个 工 程 ( 文 件 ) 时, 该 工 程 有 关 的 所 有 文 件 同 时 被 装 载 5. 运 行 和 调 试 程 序 通 过 运 行 菜 单 中 的 选 项 来 运 行 程 序, 当 程 序 出 错 时,VB 系 统 可 提 供 信 息 提 示, 也 可 通 过 调 试 和 运 行 菜 单 来 查 找 和 排 除 错 误 6. 生 成 可 执 行 程 序 为 了 使 程 序 可 以 脱 离 VB 环 境, 通 过 文 件 菜 单 中 的 生 成.EXE 命 令 来 生 成 可 执 行 程 序 (.EXE 文 件 ), 此 后 即 可 直 接 执 行 该 文 件 在 生 成 可 执 行 程 序 后, 再 通 过 打 包 和 展 开 向 导 ( 见 附 录 A) 将 所 有 相 关 文 件 打 包, 就 可 以 作 为 一 个 软 件 产 品 在 Windows 9X/2000 等 环 境 下 安 装 后 独 立 运 行 习 题 1. 与 传 统 的 程 序 设 计 语 言 相 比,Visual Basic 语 言 有 什 么 特 点? 2.Visual Basic 6.0 有 几 种 版 本? 其 主 要 区 别 是 什 么? 3. 若 条 件 允 许, 请 你 自 己 安 装 Visual Basic 6.0, 体 会 Visual Basic 6.0 的 安 装 过 程 4. 在 正 确 安 装 了 Visual Basic 6.0 后, 可 以 通 过 几 种 方 法 启 动 和 退 出 Visual Basic 6.0? 5.Visual Basic 6.0 集 成 开 发 环 境 有 哪 些 部 分 组 成? 每 个 部 分 的 主 要 功 能 是 什 么?

36 第 2 章 Visual Basic 程 序 开 发 环 境 23 6.Visual Basic 6.0 的 工 具 箱 窗 口 中 的 常 用 控 件 有 哪 些? 请 你 在 窗 体 设 计 器 上 画 出 常 用 控 件 并 查 看 每 个 控 件 的 属 性 7.Visual Basic 6.0 的 常 用 工 具 栏 共 有 多 少 个 功 能 按 钮? 每 个 功 能 按 钮 的 作 用 是 什 么? 8. 用 Visual Basic 开 发 程 序 有 什 么 特 点? 简 述 创 建 一 个 VB 应 用 程 序 的 方 法 和 步 骤 9. 根 据 本 章 例 2.1 和 例 2.2, 设 计 如 下 窗 体 如 图 2.16, 在 该 窗 体 中 有 两 个 命 令 按 钮 Command1 和 Command2 和 一 个 标 签 控 件 当 运 行 该 应 用 程 序 时, 单 击 命 令 按 钮 Command1, 在 标 签 控 件 中 显 示 我 学 会 使 用 Visual Basic 开 发 应 用 程 序 了! 文 字 信 息 ; 单 击 命 令 按 钮 Command2, 则 在 标 签 控 件 中 不 显 示 任 何 文 字 信 息 图 2.16 设 计 时 窗 体 请 读 者 进 一 步 将 图 2.16 窗 体 中 标 签 控 件 的 Caption 属 性 设 置 为 空, 将 命 令 按 钮 Command1 的 Caption 属 性 设 置 为 确 定, 将 命 令 按 钮 Command2 的 Caption 属 性 设 置 为 清 空

37 第 3 章 可 视 化 程 序 设 计 初 步 3.1 VB 程 序 设 计 中 的 几 个 基 本 概 念 对 象 对 象 是 代 码 和 数 据 的 集 合, 可 以 作 为 一 个 单 位 来 处 理 在 VB 环 境 下, 对 象 可 以 是 应 用 程 序 的 一 部 分, 比 如 可 以 是 控 件 或 窗 体 整 个 应 用 程 序 也 是 一 个 对 象 我 们 上 一 章 提 到 的 窗 体 命 令 按 钮 ( 控 件 ) 标 签 控 件 都 是 对 象 实 际 上 对 象 是 一 个 很 广 泛 的 概 念, 要 理 解 编 程 中 对 象 的 概 念, 我 们 还 必 须 有 一 些 类 的 知 识 Visual Basic 中 的 每 个 对 象 都 是 用 类 定 义 的 用 饼 干 模 子 和 饼 干 之 间 的 关 系 作 比 喻, 就 会 明 白 对 象 和 它 的 类 之 间 的 关 系 饼 干 模 子 是 类, 它 确 定 了 每 块 饼 干 的 特 征, 比 如 大 小 和 形 状 用 类 创 建 对 象, 对 象 就 是 饼 干 在 Visual Basic 的 工 具 箱 上, 控 件 代 表 类 在 创 建 控 件 之 时 也 就 是 在 复 制 控 件 类, 或 建 立 控 件 类 的 实 例, 这 个 类 实 例 就 是 应 用 程 序 中 引 用 的 对 象 在 设 计 时 操 作 的 窗 体 是 类 ; 在 运 行 时,Visual Basic 建 立 窗 体 的 类 实 例 我 们 所 说 的 对 象, 就 是 类 的 实 例 在 VB 编 程 中, 大 多 数 时 候, 我 们 是 在 跟 对 象 打 交 道 我 们 所 要 做 的 工 作 便 是 创 建 对 象 设 置 对 象 属 性 捕 获 并 处 理 来 自 对 象 的 事 件, 而 不 必 去 关 心 对 象 的 底 层 运 作,VB 将 程 序 员 从 繁 琐 的 底 层 程 序 设 计 中 解 救 出 来 这 正 是 VB 易 学 易 用 的 原 因 对 象 的 属 性 VB 中 的 每 个 对 象 都 有 一 组 特 征, 这 组 特 征 称 为 属 性, 不 同 的 对 象 有 不 同 的 属 性 常 见 的 属 性 有 标 题 (Caption) 名 称 (Name) 背 景 颜 色 (Backcolor) 字 体 (Font) 是 否 有 效 (Enabled) 是 否 可 见 (Visible) 等 通 过 修 改 对 象 的 属 性 能 够 控 制 对 象 的 外 观 和 操 作 设 置 或 改 变 对 象 属 性 的 一 般 步 骤 为 : (1) 选 中 要 操 作 的 对 象 ; (2) 在 属 性 窗 口 的 属 性 列 表 框 中 找 到 要 操 作 的 属 性, 此 时 设 置 框 中 为 当 前 控 件 该 属 性 的 当 前 设 置 ; (3) 在 设 置 框 中 键 入 或 选 择 用 户 的 设 置 在 第 二 章 的 示 例 中, 我 们 通 过 设 置 标 签 控 件 的 Caption 属 性 在 标 签 上 显 示 字 符, 通 过 设 置 控 件 的 属 性, 我 们 还 可 以 做 很 多 有 意 思 的 事 : 在 程 序 中 改 变 控 件 的 宽 度 或 高 度 (Width 和 Height 属 性 ) 可 以 使 控 件 变 大 变 小 ; 改 变 控 件 的 位 置 ( Left 和 Top 属 性 ), 可 以 移 动 控 件 ; 连 续 地 改 变 控 件 位 置, 便 可 产 生 动 画 效 果 ; 改 变 控 件 的 前 景 色 或 背 景 色, 可 以 让 控 件 产 生 美 妙 的 色 彩 变 化 等 等 可 见, 属 性 非 常 重 要, 它 是 我 们 与 控 件 之 间 的 桥 梁, 掌 握 控 件 的 属 性 是 VB 编

38 第 3 章 可 视 化 程 序 设 计 初 步 25 程 非 常 重 要 的 一 步 尽 管 VB 中 控 件 很 多, 属 性 也 不 尽 相 同, 但 你 并 不 需 要 死 记 哪 些 控 件 有 哪 些 属 性 在 VB 编 程 环 境 中, 你 能 随 时 获 得 系 统 的 提 示 不 过, 了 解 常 见 属 性 的 含 义 及 其 使 用 还 是 很 有 必 要 的 对 象 的 事 件 事 件 (Event) 就 是 对 象 上 所 发 生 的 事 情 在 VB 中, 事 件 是 预 先 定 义 好 的 能 够 被 对 象 识 别 的 动 作, 如 单 击 (Click) 事 件 双 击 (DblClick) 事 件 装 载 (Load) 事 件 鼠 标 移 动 (MouseMove) 事 件 等, 不 同 的 对 象 能 够 识 别 不 同 的 事 件 对 象 的 事 件 是 固 定 的, 用 户 不 能 建 立 新 的 事 件 当 事 件 由 用 户 触 发 ( 如 单 击, 触 发 Click 事 件 ) 或 由 系 统 触 发 ( 如 装 载, 触 发 Load 事 件 ) 时, 对 象 就 会 对 该 事 件 做 出 响 应, 响 应 某 个 事 件 后 所 执 行 的 程 序 代 码 就 是 事 件 过 程 Windows 下 应 用 程 序 的 执 行 是 由 事 件 驱 动 的, 如 果 说 属 性 是 程 序 员 与 控 件 之 间 的 桥 梁, 那 么 事 件 便 是 用 户 与 程 序 之 间 的 桥 梁 用 户 使 用 程 序 的 过 程, 便 是 不 断 触 发 各 种 事 件, 向 程 序 下 达 指 令 的 过 程 离 开 了 事 件, 程 序 便 难 以 知 道 用 户 在 干 什 么 及 想 干 什 么, 因 此, 程 序 员 一 个 非 常 重 要 的 任 务 就 是 在 用 户 和 程 序 之 间 架 好 桥 梁 不 要 把 这 个 任 务 看 得 太 复 杂, 实 际 上 我 们 在 第 二 章 例 2.2 中 已 经 做 到 了 这 一 点, 而 我 们 所 做 的 不 过 是 在 一 个 事 件 过 程 中 加 了 一 行 代 码 让 我 们 重 温 一 下 那 三 行 起 桥 梁 作 用 的 代 码 : Private Sub Command1_Click() Label1.Caption = " 欢 迎 使 用 Visual Basic" 对 象 的 方 法 一 般 来 说, 方 法 就 是 要 执 行 的 动 作 VB 中 的 方 法 跟 事 件 过 程 类 似, 它 可 能 是 函 数, 也 可 能 是 过 程, 它 用 于 完 成 某 种 特 定 功 能 而 不 能 响 应 某 个 事 件 如 显 示 窗 体 (Show) 方 法 移 动 (Move) 方 法 等 VB 中 方 法 用 得 并 没 有 属 性 和 事 件 多, 但 方 法 也 是 VB 控 件 必 不 可 少 的 一 部 分, 方 法 通 常 用 于 操 作 控 件, 这 跟 属 性 有 点 相 似, 但 方 法 提 供 了 更 为 直 接 的 操 作 控 件 的 途 径, 而 且, 某 些 控 件 操 作 是 必 须 用 控 件 的 方 法 来 完 成 的 方 法 的 引 用 与 属 性 有 点 相 似, 用 控 件 名. 方 法 名 参 数 就 可 以 调 用 控 件 的 方 法 方 法 可 能 会 带 有 参 数, 多 参 数 之 间 用, 分 隔, 参 数 的 具 体 含 义, 要 视 具 体 控 件 具 体 方 法 而 定 3.2 窗 体 在 VB 学 习 之 前, 我 们 应 当 具 备 一 些 Windows 编 程 的 基 本 知 识 我 们 都 知 道 Windows 是 一 个 基 于 图 形 用 户 界 面 (GUI) 的 操 作 系 统, 每 一 个 应 用 程 序 都 至 少 有 一 个 窗 口, 用 于 用 户 与 程 序 进 行 交 互 而 在 VB 中, 要 创 建 的 窗 体, 就 是 Windows 下 的 窗 口 VB 中 的 控 件, 都 包 容 在 窗 体 中 窗 体 是 控 件 界 面 的 基 本 构 造 模 块 窗 体 是 一 种 对 象, 由 属 性 定 义 其 外 观,

39 26 Visual Basic 程 序 设 计 教 程 由 事 件 定 义 与 用 户 的 交 互 通 过 设 置 窗 体 的 属 性 并 编 写 响 应 事 件 的 代 码, 就 能 编 写 出 满 足 要 求 的 各 种 用 户 界 面, 完 成 各 种 不 同 的 任 务 控 件 是 包 括 在 窗 体 中 的 对 象, 我 们 也 可 以 对 其 设 置 属 性, 编 写 响 应 事 件 的 代 码, 以 适 应 用 户 的 需 求 下 面 讲 述 窗 体 的 创 建 过 程, 并 说 明 其 属 性 的 设 置 窗 体 的 结 构 启 动 一 个 新 的 工 程 文 件, 屏 幕 中 间 有 一 个 带 网 点 ( 称 为 网 格 ) 的 窗 口, 这 就 是 用 户 的 窗 体, 一 般 也 是 程 序 运 行 时 的 主 窗 口, 如 图 3.1 所 示 你 可 以 调 整 该 窗 体 的 大 小, 对 该 窗 体 大 小 的 调 整 及 属 性 值 的 改 变 等 操 作 称 为 定 制 窗 体 对 窗 体, 控 件 的 定 制 或 设 计 期 间 称 为 设 计 过 程, 程 序 运 行 期 间 称 为 运 行 过 程 图 3.1 窗 体 的 结 构 窗 体 的 属 性 通 过 修 改 窗 体 的 属 性 可 以 改 变 窗 体 内 在 或 外 在 的 结 构 特 征, 控 制 窗 体 的 外 观 常 用 的 窗 体 属 性 有 : (1)Name 属 性 : 在 VB 中, 窗 体 默 认 的 Name 属 性 为 Form1, 有 多 个 窗 体 时 依 次 类 推, 当 然 我 们 也 可 按 照 自 己 的 需 要 进 行 命 名 (2)Caption 属 性 : 用 于 设 置 窗 口 的 标 题 不 难 看 到, 每 个 应 用 程 序 的 标 题 栏 里 都 有 一 个 用 于 识 别 不 同 应 用 程 序 的 标 题 通 过 在 属 性 窗 口 里 更 改 窗 体 的 Caption 属 性, 来 使 用 我 们 自 己 喜 欢 的 标 题 例 如 我 们 把 自 己 的 大 名 之 类 的 敏 感 名 词 写 上 去, 并 在 运 行 此 程 序 时 显 现 出 来, 这 对 于 初 学 者 来 说, 将 是 一 件 很 有 成 就 感 的 事 情 (3)Icon 属 性 : 正 如 标 题 一 样, 每 一 个 程 序 都 有 一 个 图 标, 可 以 通 过 设 置 Icon 属 性, 将 我 们 喜 爱 的 图 标 放 到 自 己 的 杰 作 里 面 去 具 体 方 法 : 单 击 属 性 窗 口 中 的 Icon 属 性 栏, 此 栏 的 最 右 端 将 出 现 一 个 带 有 三 个 小 点 的 按 钮, 单 击 此 按 钮 ( 记 住 : 以 后 碰 到 这 种 按 钮, 都 是 要 我 们 插 入 一 些 文 件 ), 将 弹 出 一 个 打 开 文 件 的 对 话 框, 选 择 想 使 用 的 图 标 文 件 (.Ico) 即 可 (4)Left,Top 和 Height,Width 属 性 ( 位 置, 大 小 属 性 ): 我 们 不 仅 可 以 在 属 性 窗 口 里 设 置 这 些 属 性, 更 为 简 单 的 方 法 是 : 可 以 用 拖 动 鼠 标 的 方 法 来 改 变 窗 体 的 大 小 ( 正 如 操 作 Windows 窗 口 一 样 ) 而 对 于 位 置 属 性, 可 以 使 用 VB 的 窗 体 布 局 窗 口, 它 位 于 VB 环 境 的 右 下 角, 其 外 观 如 一 个 显 示 器 模 样, 将 鼠 标 移 到 此 小 显 示 器 内 的 窗 体 上, 鼠 标 立 即 变 成 一 个 十 字 形, 此 时 按 住 鼠 标 左 键 拖 动, 即 可 改 变 窗 体 的 位 置 (5)Picture 属 性 : 此 属 性 用 来 设 置 窗 体 的 背 景 图 片, 其 引 入 图 片 的 方 法 同 Icon 引 入 图 标

40 第 3 章 可 视 化 程 序 设 计 初 步 27 一 样, 不 过 此 处 要 用 位 图 文 件 (.BMP), 而 不 是 图 标 文 件 (6)Enabled 属 性 : 此 属 性 用 于 设 置 窗 体 以 及 其 内 部 的 控 件 对 象 是 否 能 响 应 用 户 的 操 作, 其 取 值 为 True 或 False 当 取 True 时, 能 响 应 用 户 操 作 ; 设 置 为 False 时, 不 能 响 应 用 户 操 作 在 编 程 时, 一 般 不 在 属 性 窗 口 中 把 它 设 置 为 False, 而 是 在 程 序 的 执 行 过 程 中, 对 它 进 行 改 变, 用 以 停 止 接 收 用 户 的 操 作 (7)MaxButton 和 MinButton 属 性 : 此 两 属 性 用 于 设 置 窗 体 的 标 题 栏 是 否 具 有 最 大 化 和 最 小 化 按 钮 两 者 的 取 值 皆 为 True 或 False 取 True 时, 有 此 按 钮 ; 取 False 时, 无 此 按 钮 (8)Moveable 属 性 : 此 属 性 用 于 设 置 窗 体 是 否 能 移 动 当 它 被 设 置 为 True 时, 可 以 通 过 鼠 标 拖 动 窗 体 ; 当 设 置 为 False 时, 不 能 拖 动 窗 体 (9)WindowState 属 性 : 此 属 性 用 于 设 置 窗 体 启 动 时 窗 体 的 状 态, 有 三 种 形 式 可 供 选 择 : 1 正 常 显 示 启 动 程 序 时 窗 体 的 大 小 为 设 置 的 大 小, 其 位 置 也 为 我 们 设 置 的 位 置, 此 时 此 属 性 的 取 值 为 Normal 2 最 大 化 显 示 启 动 时 窗 体 布 满 整 个 桌 面, 其 效 果 相 当 于 单 击 最 大 化 按 钮, 此 时 此 属 性 的 取 值 为 Maximized 3 最 小 化 显 示 启 动 时 窗 体 缩 小 为 任 务 栏 里 的 一 个 图 标, 其 效 果 相 当 于 单 击 最 小 化 按 钮, 此 时 此 属 性 的 取 值 为 Minimized (10)Backcolor 属 性 : 此 属 性 用 于 确 定 窗 体 的 背 景 颜 色 窗 体 的 事 件 (1)Load: 此 事 件 在 窗 体 进 行 初 始 化 时 产 生, 我 们 可 以 在 其 中 调 用 函 数 或 方 法 达 到 某 些 效 果, 也 可 以 用 来 对 某 些 变 量 赋 初 值 (2)Unload: 此 事 件 在 窗 体 退 出 时 产 生, 可 执 行 的 操 作 主 要 是 关 闭 已 打 开 的 文 件 等 例 3.1 窗 体 属 性 的 设 置 此 例 中, 我 们 将 看 到 如 何 通 过 改 变 属 性 值 来 改 变 窗 体 的 外 部 形 状 假 设 我 们 已 经 创 建 了 一 个 VB 的 默 认 窗 体, 下 面 我 们 来 看 一 看 属 性 的 设 置 方 法, 设 置 此 窗 体 的 属 性 如 下 : Caption= 我 的 窗 体 Icon=( 图 标 ) Picture=( 背 景 图 片 ) 首 先 来 设 置 窗 体 的 Caption 属 性 : 在 属 性 窗 口 中 选 择 Form1, 然 后 在 属 性 栏 内 选 择 Caption, 并 将 它 更 改 为 我 的 窗 体, 当 然, 也 可 以 把 它 设 置 为 其 他 的 名 字, 其 设 置 的 情 形 如 图 3.2 所 示 我 们 再 来 看 一 看 Icon 属 性 的 设 置, 其 设 置 方 法 与 Caption 的 设 置 有 一 点 不 同 因 为 图 标 是 一 个 文 件, 我 们 需 要 从 列 表 框 中 选 择 一 个 文 件 作 为 图 标, 不 过, 此 属 性 的 设 置 也 是 在 属 性 窗 口 进 行 的 首 先, 我 们 在 属 性 窗 口 中 找 到 Icon 一 栏, 单 击 此 栏, 就 会 发 现 此 栏 的 右 端 将 出 现 一 个 带 有 三 个 小 点 的 按 钮, 如 图 3.3 所 示 单 击 此 按 钮, 将 弹 出 一 个 对 话 框 在 这 里, 我 们 可 以 选 择 一 个 自 己 喜 欢 的 图 标 文 件 作 为 窗 体 的 图 标 Picture 属 性 的 设 置 和 Icon 属 性 的 设 置 方 法 完 全 相 同, 只 不 过 此 时 我 们 是 为 窗 体 选 择 一 个 背 景 图 案, 我 们 会 看 到 加 载 图 片 的 对 话 框 下 面, 我 们 再 来 看 另 一 种 类 型 的 属 性 的 设 置 方 法,

41 28 Visual Basic 程 序 设 计 教 程 这 种 类 型 的 属 性 值 为 有 限 的 几 个, 我 们 可 以 从 列 表 中 选 择, 这 种 类 型 的 典 型 代 表 是 那 些 取 值 为 True 或 False 的 属 性, 下 面 以 MaxButton 属 性 的 设 置 为 例 进 行 讲 述 同 样, 我 们 首 先 在 属 性 窗 口 中 找 到 MaxButton 一 项, 然 后 单 击 此 项, 就 会 发 现 此 栏 的 最 右 端 出 现 一 个 带 有 倒 三 角 的 按 钮, 单 击 此 按 钮, 就 会 出 现 如 图 3.4 所 示 的 对 话 框 图 3.2 Caption 属 性 的 设 置 图 3.3 Icon 属 性 的 设 置 这 里, 我 们 把 MaxButton 属 性 设 置 为 False 进 行 了 此 三 属 性 的 设 置 之 后, 我 们 来 运 行 一 下 程 序, 看 一 看 属 性 更 改 带 来 的 效 果 首 先, 看 一 看 如 何 运 行 此 程 序 运 行 程 序 的 方 法 有 好 几 种, 常 用 的 是 使 用 工 具 条 上 的 按 钮, 如 图 3.5 所 示 图 3.4 设 置 MaxButton 时 的 下 拉 菜 单 图 3.5 工 具 条 上 的 运 行 按 钮 从 图 3.5 中 可 以 看 到 此 工 具 条 上 的 三 个 与 程 序 运 行 有 关 的 按 钮 : 启 动 中 断 结 束, 常 用 的 是 第 一 个 和 第 三 个 其 中, 启 动 用 于 执 行 程 序, 中 断 用 于 暂 停 程 序 的 执 行, 结 束 用 于 结 束 当 前 程 序 的 运 行 此 三 个 按 钮 对 于 调 试 程 序 是 相 当 有 用 的 当 然, 也 可 以 使 用 运 行 菜 单 的 相 应 项, 另 外, 还 可 以 使 用 VB 提 供 给 我 们 的 快 捷 键 F5 现 在 就 可 以 运 行 程 序 了 单 击 启 动 按 钮 或 按 一 下 F5, 可 以 将 看 到 如 图 3.6 所 示 的 窗 体 需 要 注 意 的 是, 图 3.6 中 的 背 景 图 片 来 自 于 一 张 图 片 文 件 同 时, 我 们 也 可 以 看 到, 在 标 题 栏 内, 最 大 化 按 钮 为 灰 色 显 示, 而 且 不 能 响 应 单 击 事 件, 这 就 是 我 们 把 MaxButton 属 性 设 置 为 False 的 结 果 从 此 例 我 们 不 难 看 到, 在 VB 编 程 中, 我 们 可 以 通 过 简 单 的 属 性 的 设 置 就 能 实 现 不 同 的 显 示 效 果, 这 也 正 是 VB 编 程 的 优 势 和 方 便 之 处 所 在 但 是 通 过 属 性 的 设 置 只 能 得 到 显 示 效 果, 而 不 能 增 强 程 序 的 处 理 能 力 在 对 VB 各 个 控 件 进 行 属 性 设 置 的 时 候, 我 们 要 保 持 慎 重,

42 第 3 章 可 视 化 程 序 设 计 初 步 29 因 为 VB 中 各 个 控 件 的 属 性 之 间 有 着 很 大 的 联 系 在 编 程 时, 不 是 特 别 需 要 的 情 况 下, 我 们 一 般 使 用 它 们 的 默 认 属 性, 默 认 属 性 便 是 一 种 标 准 的 属 性 设 置 图 3.6 创 建 的 第 一 个 窗 体 例 3.2 在 例 3.1 的 基 础 上 进 一 步 实 现 使 用 窗 体 的 Load 事 件 此 例 中, 我 们 将 在 Form 的 Load 事 件 中, 加 入 一 个 消 息 显 示 窗 口 其 结 果 是, 在 窗 体 出 现 之 前, 看 到 一 个 消 息 框 这 时, 只 有 在 单 击 确 定 按 钮 之 后, 才 会 显 示 主 窗 体 在 第 四 章 中, 我 们 将 全 面 地 介 绍 消 息 框 的 使 用 方 法 下 面 是 程 序 的 创 建 过 程, 先 来 看 一 看 消 息 框 的 外 形, 如 图 3.7 所 示 图 3.7 消 息 框 的 外 形 我 们 来 看 一 看 如 何 实 现 此 效 果 下 面 就 要 开 始 学 习 代 码 的 编 写 了 首 先, 看 一 看 如 何 在 VB 中 编 写 代 码, 我 们 将 学 习 几 个 技 巧 (1) 在 第 二 章 的 学 习 中, 我 们 已 经 了 解 了 窗 体 窗 口 和 代 码 窗 口 在 创 建 完 图 3.1 中 的 窗 体 后, 双 击 窗 体 中 的 任 意 地 方, 就 可 以 看 到 如 图 3.8 所 示 的 代 码 窗 口 了 此 种 方 法 的 特 点 是, 可 以 直 接 切 换 到 窗 体 的 常 用 事 件 Load 的 代 码 编 写 行 中 这 种 方 法 对 于 其 他 控 件 也 是 有 用 的, 比 如 说, 在 我 们 即 将 学 到 的 按 钮 控 件 中, 可 以 通 过 在 窗 体 窗 口 中 双 击 按 钮 控 件, 直 接 切 换 到 命 令 按 钮 的 常 用 事 件 即 单 击 事 件 的 代 码 编 写 段 中 (2) 在 图 3.8 中, 可 以 看 到 查 看 代 码 和 查 看 对 象 两 个 按 钮, 通 过 此 两 按 钮, 可 以 在 代 码 窗 口 和 窗 体 窗 口 之 间 切 换 但 此 时, 不 会 出 现 如 图 3.8 中 所 示 的 Sub 语 句, 我 们 需 要 用 图 3.9 所 示 的 下 拉 菜 单 来 选 择 对 象 和 事 件

43 30 Visual Basic 程 序 设 计 教 程 图 3.8 代 码 窗 口 图 3.9 如 何 选 择 我 们 想 要 编 写 代 码 的 对 象 和 事 件 在 图 3.9 中, 我 们 在 选 择 对 象 一 栏 中, 可 以 看 到 在 此 菜 单 中, 列 出 了 当 前 程 序 中 所 有 对 象, 而 在 选 择 事 件 一 栏 中, 可 以 看 到 当 前 对 象 的 所 有 可 用 的 事 件, 我 们 可 以 从 中 选 择 自 己 想 要 编 程 的 事 件 我 们 在 窗 体 的 Load 事 件 中, 编 写 如 图 3.10 所 示 的 代 码 图 3.10 在 Load 中 编 写 的 代 码 需 要 注 意 的 是 : (1)VB 中 最 为 常 用 的 对 话 框 是 MsgBox, 它 用 于 以 对 话 框 的 形 式 显 示 信 息 其 具 体 格 式 为 : MsgBox(prompt[, buttons] [, title] ) 其 中 :prompt 为 显 示 的 信 息 buttons 为 此 对 话 框 中 的 按 钮, 默 认 为 只 有 确 定 按 钮 title 为 此 对 话 框 的 标 题 (2) 在 VB 编 程 中, 我 们 可 以 轻 松 地 通 过 改 变 控 件 的 属 性 来 实 现 各 种 各 样 的 图 形 界 面, 这 也 正 是 VB 编 程 的 便 利 之 处 在 Load 事 件 中, 我 们 可 以 做 各 种 初 始 化 操 作 比 如, 我 们 若 想 对 自 己 的 程 序 加 密, 就 可 以 在 Load 事 件 中, 加 入 一 个 密 码 验 证 的 程 序 段 (3) 在 VB 编 程 中, 不 区 分 大 小 写 也 就 是 说,aa 与 AA,aA,Aa 是 同 一 变 量, 并 且, 这

44 第 3 章 可 视 化 程 序 设 计 初 步 31 对 于 语 句 也 是 成 立 的 不 过 在 VB 环 境 中, 系 统 为 了 程 序 的 美 观, 会 自 动 变 换 大 小 写 3.3 常 用 控 件 在 VB 编 程 中, 我 们 经 常 要 用 到 命 令 按 钮 标 签 和 文 本 框 三 个 控 件 命 令 按 钮 用 于 接 收 单 击 事 件, 在 此 事 件 的 响 应 中, 可 以 用 自 己 需 要 的 代 码, 完 成 特 定 的 功 能 ; 标 签 用 于 显 示 提 示 信 息 ; 文 本 框 可 以 用 来 输 入 文 字 ( 当 然, 它 也 可 以 用 来 显 示 文 字 ) 在 介 绍 这 三 种 控 件 之 前, 先 让 我 们 来 看 一 看 此 三 控 件 的 外 形, 如 图 3.11 所 示 标 签 文 本 框 命 令 按 钮 图 3.11 命 令 按 钮 标 签 文 本 框 命 令 按 钮 1. 属 性 命 令 按 钮 的 标 准 属 性 包 括 Caption,Enabled,Name,Visible 等 等, 其 常 用 的 属 性 有 Default, Cancel (1)Name:VB 中 默 认 的 Name 属 性 为 Command1, 有 多 个 时 依 次 类 推 (2)Caption: 此 属 性 用 来 设 置 命 令 按 钮 上 显 示 的 文 本 (3)Enabled: 此 属 性 用 来 设 置 按 钮 是 否 能 够 接 收 单 击 操 作, 其 取 值 为 True 或 False 当 它 被 设 置 为 True 时, 按 钮 能 接 收 单 击 操 作 ; 当 它 被 设 置 为 False 时, 按 钮 不 能 接 收 单 击 操 作, 并 且 按 钮 上 的 文 字 变 灰 (4)Default: 此 属 性 用 来 设 置 按 钮 是 否 等 同 于 按 回 车 键 的 功 能, 其 取 值 为 True 或 False 需 要 注 意 的 是, 在 窗 体 中, 最 多 只 能 有 一 个 按 钮 的 此 属 性 被 设 置 为 True (5)Cancel: 此 属 性 用 来 设 置 按 钮 是 否 等 同 于 按 Esc 键 的 功 能, 其 取 值 为 True 或 False 需 要 注 意 的 是, 在 窗 体 中, 最 多 只 能 有 一 个 按 钮 的 此 属 性 被 设 置 为 True (6)TabStop 和 TabIndex 属 性 :TabStop 属 性 用 来 设 置 是 否 可 用 Tab 键 来 选 定 当 前 按 钮, 其 取 值 为 True 或 False TabIndex 属 性 用 于 定 义 用 Tab 键 移 动 时 的 顺 序, 从 0 开 始, 依 次 增 加 当 然, 我 们 可 以 通 过 改 变 此 属 性 的 值 来 改 变 此 顺 序 (7)Visible: 此 属 性 用 来 设 置 在 运 行 时 该 命 令 按 钮 是 否 可 见 其 取 值 为 True 或 False 当 它 被 设 置 为 False 时, 按 钮 不 可 见 ; 当 它 被 设 置 为 True 时, 按 钮 可 见 2. 事 件 命 令 按 钮 能 接 收 Click 事 件 所 谓 Click 事 件, 就 是 我 们 用 鼠 标 单 击 按 钮 时 发 生 的 事 件,

45 32 Visual Basic 程 序 设 计 教 程 这 是 按 钮 最 为 常 用 的 属 性 编 程 时, 我 们 在 窗 体 窗 口 中 双 击 按 钮, 就 会 直 接 切 换 到 按 钮 的 单 击 事 件 的 代 码 编 辑 器 例 3.3 一 个 最 为 简 单 的 按 钮 演 示 程 序 此 程 序 中, 有 一 按 钮, 单 击 此 按 钮, 则 会 退 出 整 个 程 序 下 面 是 程 序 的 设 计 步 骤, 首 先 来 看 一 看 程 序 设 计 时 的 外 形, 如 图 3.12 所 示 图 3.12 一 个 简 单 的 按 钮 我 们 设 置 按 钮 的 Caption 属 性 为 退 出 在 按 钮 的 单 击 事 件 中 编 写 如 下 的 代 码 : Private Sub Command1_Click() End 在 VB 中, 我 们 用 一 个 简 单 的 End 语 句 就 能 实 现 退 出 程 序, 这 一 语 句 在 编 程 中 将 经 常 用 到, 请 读 者 务 必 记 住 可 以 使 用 Caption 属 性 赋 予 命 令 按 钮 一 个 热 键 ( 也 叫 访 问 键, 显 示 为 带 下 划 线 的 字 母, 程 序 运 行 时 可 响 应 Alt 键 和 该 字 母 的 组 合 ), 例 如, 如 果 将 Caption 设 置 为 退 出 (&X), 则 显 示 为 " 退 出 (X), 以 Alt+X 为 热 键 除 了 命 令 按 钮, 复 选 框 单 选 按 钮 等 也 同 样 可 以 设 置 热 键 例 3.4 一 个 较 为 复 杂 的 按 钮 演 示 程 序 在 此 程 序 中, 我 们 将 运 用 到 按 钮 的 Cancel 和 Default 属 性 下 面 是 程 序 的 设 计 过 程, 先 看 一 看 程 序 的 外 形, 如 图 3.13 所 示 图 3.13 一 个 较 为 复 杂 的 按 钮 各 个 控 件 的 设 置 如 下 : Command1: Caption= " 回 车 键 " Default= -1 'True Command2: Caption= "Esc 键 " Cancel= -1 'True Command3: Caption= " 退 出 " Label1: Caption= " 按 钮 演 示 程 序 " Alignment= 2 'Center 接 着, 在 回 车 键 按 钮 的 单 击 事 件 中 编 写 代 码 ( 注 意 : 此 处 使 用 了 标 签 控 件, 读 者 暂 且 接

46 第 3 章 可 视 化 程 序 设 计 初 步 33 受 之 我 们 下 一 小 节 中 介 绍 其 用 法 ), 按 下 回 车 键 时, 标 签 中 显 示 您 按 了 回 车 键 的 提 示 信 息 Private Sub Command1_Click() Label1.Caption = " 您 按 了 回 车 键 " 在 Esc 键 按 钮 的 单 击 事 件 中 编 写 代 码, 当 按 下 Esc 键 时, 标 签 中 显 示 您 按 了 Esc 键 的 信 息 Private Sub Command2_Click() Label1.Caption = " 您 按 了 Esc 键 " Command1.SetFocus 在 退 出 按 钮 的 单 击 事 件 中 编 写 代 码, 使 用 End 一 句 用 于 退 出 整 个 程 序 : Private Sub Command3_Click() End 注 意 : 此 例 中, 回 车 键 按 钮 的 Default 属 性 被 设 置 为 True, 因 而 用 键 盘 回 车 时, 其 效 果 与 单 击 此 按 钮 的 结 果 时 相 同 ; Esc 键 按 钮 Cancel 属 性 被 设 置 为 True, 因 而 用 键 盘 按 Esc 键 时, 其 效 果 与 单 击 此 按 钮 的 结 果 时 相 同 在 Esc 按 钮 的 响 应 中, 使 用 了 Command1.SetFocus, 它 是 命 令 按 钮 的 一 个 方 法, 用 于 使 此 按 钮 失 去 焦 点, 此 句 的 作 用 在 于 用 鼠 标 单 击 Esc 键 按 钮 后, 回 车 键 按 钮 将 得 到 焦 点 例 3.5 用 Tab 键 选 择 不 同 的 按 钮 在 此 程 序 中, 我 们 将 创 建 多 个 按 钮, 将 它 们 的 TabIndex 属 性 设 置 为 不 同 的 数 值, 以 改 变 它 们 被 选 中 的 顺 序 下 面 是 程 序 的 创 建 过 程, 先 来 看 一 看 程 序 运 行 时 的 外 形, 如 图 3.14 所 示 图 3.14 Tab 键 的 选 择 顺 序 此 例 中, 我 们 创 建 如 图 所 示 的 四 个 按 钮, 把 它 们 的 TabIndex 属 性 分 别 设 置 为 当 然, 你 也 可 以 按 照 自 己 的 需 求 把 它 们 设 置 为 不 同 的 顺 序 按 F5 键 运 行 程 序, 按 Tab 键 移 动 被 选 中 的 焦 点, 然 后, 你 可 以 更 改 此 顺 序, 重 新 测 一 下 在 VB 中, 不 仅 命 令 按 钮 控 件 具 有 Tab 选 择 功 能, 其 他 很 多 控 件 都 具 有 此 属 性, 其 情 形

47 34 Visual Basic 程 序 设 计 教 程 都 是 相 同 的 标 签 控 件 标 签 是 用 来 显 示 文 本 的 控 件, 标 签 中 的 内 容 不 能 被 编 辑, 但 是 我 们 可 以 通 过 修 改 它 的 属 性 来 改 变 标 签 中 显 示 的 文 本 1. 属 性 标 签 的 标 准 属 性 包 括 :Visible,Left,Top,Height,Width 等, 其 常 用 属 性 如 下 : (1)Name:VB 中 标 签 的 默 认 名 字 为 Label1, 有 多 个 时 依 此 类 推 (2)Caption: 此 属 性 用 来 设 置 标 签 中 要 显 示 的 文 本 (3)Alignment: 此 属 性 用 来 设 置 标 签 中 文 本 的 对 齐 方 式 其 取 值 为 0,1 或 2, 分 别 为 左 对 齐, 右 对 齐 和 居 中 (4)BorderStyle: 此 属 性 用 来 设 置 标 签 的 边 框, 其 默 认 值 为 0, 表 示 没 有 边 框 ; 当 此 属 性 被 设 置 为 1 时, 有 一 单 线 边 框 (5)AutoSize: 此 属 性 用 来 设 置 标 签 的 大 小, 其 取 值 为 True 或 False 当 它 取 True 时, 标 签 的 大 小 随 要 显 示 的 文 本 的 大 小 而 发 生 变 化 当 此 属 性 被 设 置 为 False 时, 则 标 签 的 大 小 固 定, 文 字 太 长 时, 只 显 示 其 中 的 一 部 分 (6)Enabled: 此 属 性 用 来 设 置 标 签 是 否 能 接 收 鼠 标 事 件 此 属 性 一 般 设 置 为 True, 表 示 可 以 接 收 鼠 标 事 件 ; 当 此 属 性 被 设 置 为 False 时, 标 签 中 的 文 字 变 灰, 并 且 不 能 接 收 鼠 标 事 件 (7)FontName: 此 属 性 用 来 设 置 标 签 中 文 本 属 于 哪 一 种 字 体 (8)FontSize: 此 属 性 用 来 设 置 标 签 中 文 本 的 字 体 大 小 (9)ForeColor: 此 属 性 用 来 设 置 标 签 中 文 本 的 颜 色,VB 提 供 了 一 些 常 用 颜 色 的 常 量, 如 vbred( 红 色 ),vbgreen( 绿 色 ),vbblack( 黑 色 ), vbblue( 蓝 色 ), vbyellow( 黄 色 ) 等 等 如 果 需 要 更 为 丰 富 的 颜 色, 可 以 使 用 十 六 进 制 的 颜 色 表 2. 事 件 标 签 能 接 收 Click 和 DblClick 事 件 所 谓 DblClick 事 件, 就 是 我 们 双 击 控 件 时 发 生 的 事 件 例 3.6 一 个 简 单 的 标 签 的 演 示 程 序 此 程 序 用 来 验 证 标 签 的 显 示 功 能, 并 且, 我 们 还 将 对 按 钮 的 使 用 进 行 复 习 下 面 是 程 序 设 计 的 过 程, 先 看 一 看 程 序 运 行 时 的 外 形, 如 图 3.15 所 示 设 置 各 控 件 的 属 性 如 下 : 图 3.15 用 标 签 显 示 文 字

48 第 3 章 可 视 化 程 序 设 计 初 步 35 Label1: AutoSize= -1 'True Caption= "Label1" Command1: Caption= " 显 示 " 我 们 在 显 示 按 钮 的 单 击 事 件 中 加 入 如 下 代 码, 通 过 更 改 标 签 的 Caption 属 性 来 更 改 显 示 的 文 字 Private Sub Command1_Click() Label1.Caption = " 验 证 标 签 框 的 显 示 功 能 " 注 意 : 此 例 中, 在 按 钮 的 单 击 事 件 中 改 变 标 签 的 Caption 属 性, 就 可 以 在 程 序 运 行 过 程 中 改 变 标 签 中 显 示 的 内 容 在 程 序 中, 我 们 把 标 签 的 AutoSize 属 性 设 置 为 True, 此 时, 我 们 在 程 序 中 改 变 标 签 中 的 内 容 时, 标 签 的 大 小 就 会 随 着 其 中 的 内 容 而 发 生 变 化 这 对 于 在 程 序 中 改 变 内 容 时 非 常 必 要 例 3.7 一 个 较 为 复 杂 的 标 签 演 示 程 序 此 例 中, 我 们 将 验 证 标 签 的 Click 和 DblClick 事 件 下 面 是 程 序 设 计 的 过 程, 先 来 看 一 看 程 序 运 行 时 的 外 形, 如 图 3.16 所 示 图 3.16 用 标 签 显 示 文 字 各 个 控 件 的 设 置 如 下 : Label1: Alignment= 2 'Center Caption= " 标 签 框 演 示 程 序 " Command1: Caption= " 退 出 " Command2: Caption= " 不 接 收 " 在 退 出 按 钮 的 单 击 事 件 中 编 写 代 码, 我 们 使 用 End 语 句 退 出 程 序 : Private Sub Command1_Click() End 在 不 接 收 按 钮 的 单 击 事 件 中 编 写 代 码, 先 判 断 标 签 的 Enabled 属 性, 并 依 据 此 项 来 设 置 按 钮 的 标 题 在 接 收 和 不 接 收 两 者 之 间 切 换, 同 时, 通 过 设 置 标 签 的 Enabled 属 性 来 决 定 标 签 是 否 能 接 收 用 户 的 操 作 : Private Sub Command2_Click() If Label1.Enabled = False Then Label1.Enabled = True Command2.Caption = " 不 接 收 " Else Label1.Enabled = False

49 36 Visual Basic 程 序 设 计 教 程 Command2.Caption = " 接 收 " End If 在 标 签 的 单 击 事 件 中 编 写 代 码, 当 我 们 单 击 标 签 时, 标 签 中 的 内 容 变 化 为 您 单 击 了 标 签! : Private Sub Label1_Click() Label1.Caption = " 您 单 击 了 标 签 " Label1.Font = " 方 正 舒 体 " Label1.FontSize = 20 Label1.ForeColor = vbred 在 标 签 的 双 击 事 件 中 编 写 代 码, 当 我 们 双 击 标 签 时, 标 签 中 的 内 容 变 化 为 您 双 击 了 标 签 : Private Sub Label1_DblClick() Label1.Caption = " 您 双 击 了 标 签 " Label1.Font = " 隶 书 " Label1.FontSize = 15 Label1.ForeColor = vbred 注 意 : 选 择 语 句 If condition Then [statements][else elsestatements] End If, 其 中,condition 为 决 定 程 序 走 向 的 判 决 条 件 它 可 以 为 数 值 表 达 式 或 字 符 串 表 达 式, 其 运 算 结 果 为 True 或 False 当 结 果 为 True 时, 执 行 对 应 的 代 码, 否 则 跳 过 此 段 代 码, 转 而 去 执 行 Else 或 ElseIf 中 的 代 码 此 例 中, 值 得 分 析 的 在 于 那 个 If...Else... 语 句 Command2 这 个 按 钮 的 功 能 是 : 当 标 签 能 接 收 鼠 标 事 件 时 ( 标 签 的 Enabled 属 性 为 True), 我 们 单 击 此 按 钮, 则 把 标 签 的 Enabled 属 性 设 为 False, 再 单 击, 又 变 为 True; 同 时, 按 钮 上 的 文 字 也 在 随 着 Enabled 属 性 值 的 改 变 而 改 变 : 当 标 签 能 接 收 单 击 事 件 时, 按 钮 上 的 文 字 为 不 接 收, 而 当 标 签 不 能 接 收 单 击 事 件 时, 按 钮 的 名 字 为 接 收, 从 而 按 钮 上 的 文 字 随 着 当 前 状 态 的 不 同 而 不 同, 这 在 程 序 的 设 计 中 是 一 种 相 当 有 用 的 方 法 文 本 框 控 件 文 本 框 是 用 来 输 入 文 本 的 控 件, 当 然, 我 们 也 可 以 把 它 当 成 显 示 文 本 的 地 方 1. 属 性 文 本 框 的 标 准 属 性 包 括 :BorderStyle,Enabled,Name,Visible,Text 等, 其 常 用 属 性 如 下 : (1)Name:VB 中 文 本 框 的 默 认 名 字 为 Text1, 有 多 个 时 依 此 类 推 (2)Text: 此 属 性 用 来 接 收 或 发 送 文 本 框 中 的 内 容 这 是 文 本 框 控 件 中 最 为 常 用 的 属 性 (3)MaxLength: 此 属 性 用 来 设 置 文 本 框 中 的 最 大 的 字 符 数 其 默 认 值 为 0, 表 示 可 以 输

50 第 3 章 可 视 化 程 序 设 计 初 步 37 入 任 意 多 的 字 符 ; 当 此 属 性 被 设 置 为 非 0 值 时, 此 非 0 值 即 为 最 大 的 字 符 数 (4)MultiLine: 此 属 性 用 来 设 置 文 本 框 是 单 行 显 示 还 是 多 行 显 示 此 属 性 被 设 置 为 False 时, 不 管 文 本 框 有 多 大 的 高 度, 只 能 在 文 本 框 中 输 入 单 行 文 字 ; 当 此 属 性 被 设 置 为 True 时, 则 按 回 车 键 可 以 换 行 输 入 (5)ScrollBar: 此 属 性 用 来 设 置 文 本 框 是 否 具 有 滚 动 条, 其 取 值 为 0,1,2 和 3 取 0 时, 没 有 滚 动 条 ; 取 1 时, 只 有 水 平 滚 动 条 ; 取 2 时, 只 有 垂 直 滚 动 条 ; 取 3 时, 既 有 水 平 滚 动 条, 又 有 垂 直 滚 动 条 不 过, 值 得 一 提 的 是, 只 有 当 MultiLine 属 性 为 True 时, 文 本 框 才 能 有 滚 动 条 ; 否 则, 即 使 ScrollBar 设 置 为 非 0 值, 也 没 有 滚 动 条 (6)PasswordChar: 此 属 性 用 来 设 置 文 本 框 是 否 为 一 个 口 令 域, 当 此 属 性 取 值 为 空 时, 创 建 一 个 正 常 的 文 本 框 ; 当 此 属 性 取 值 为 * 时, 用 户 的 输 入 都 用 * 表 示, 但 系 统 接 收 的 仍 为 用 户 输 入 的 密 码 2. 事 件 和 方 法 文 本 框 不 能 接 收 鼠 标 事 件, 其 常 用 的 事 件 为 : Change: 此 事 件 在 用 户 向 文 本 框 输 入 新 的 信 息 或 者 用 户 从 程 序 中 改 变 Text 属 性 时 发 生 用 户 在 文 本 框 中 每 输 入 一 个 字 符, 就 会 产 生 一 次 Change 事 件 文 本 框 的 SetFocus 方 法 用 来 将 光 标 放 置 到 特 定 的 文 本 框 中 其 使 用 方 法 为 : [ 对 象 ].SetFocus 例 3.8 一 个 简 单 的 文 本 输 入 窗 口 此 例 中, 当 我 们 改 变 文 本 框 中 的 文 字 时, 标 签 中 的 内 容 将 随 之 发 生 变 化 下 面 是 程 序 的 设 计 过 程, 先 来 看 一 看 程 序 运 行 时 的 外 形, 如 图 3.17 所 示 图 3.17 文 字 的 输 入 与 显 示 设 置 各 控 件 的 属 性 如 下 : Label1:AutoSize= -1 'True Caption= "" Text1:Text= "" 在 文 本 框 的 Change 事 件 中 编 写 如 下 的 代 码, 当 文 本 框 中 的 内 容 发 生 变 化 时, 标 签 的 内 容 也 跟 着 发 生 变 化 : Private Sub Text1_Change() Label1.Caption = Text1.Text 注 意 : (1) 利 用 文 本 框 的 Change 事 件, 我 们 可 以 监 测 文 本 框 内 容 的 改 变, 这 在 某 些 场 合 下 是 非 常 有 用 的, 比 如 说 密 码 的 验 证

51 38 Visual Basic 程 序 设 计 教 程 (2) 此 例 中, 也 要 把 标 签 的 AutoSize 属 性 设 置 为 True 这 样, 才 能 使 其 中 的 文 字 发 生 变 化 时, 不 致 因 文 字 太 多 而 显 示 不 下 例 3.9 实 现 文 本 框 的 一 个 较 为 复 杂 的 应 用 此 例 中, 将 创 建 两 个 密 码 的 输 入 窗 口, 用 于 验 证 用 户 的 密 码 是 否 正 确 ( 正 确 的 密 码 在 程 序 中 设 定 ) 这 两 个 密 码 框 有 一 点 区 别, 其 中 第 一 个 是 在 用 户 输 入 密 码 按 提 交 按 钮 后, 再 判 断 输 入 的 密 码 是 否 正 确 ; 而 第 二 个 是 用 户 每 输 入 一 个 字 符, 就 判 断 一 次, 一 旦 出 现 不 正 确 的 字 符, 就 给 出 错 误 提 示, 直 到 密 码 输 入 完 全 正 确 时, 才 出 现 密 码 正 确 的 提 示, 可 见, 这 是 一 种 更 为 严 格 的 密 码 验 证 方 式 下 面 是 程 序 设 计 的 过 程, 先 来 看 一 看 程 序 设 计 时 的 外 形, 如 图 3.18 所 示 图 3.18 密 码 验 证 程 序 我 们 先 看 一 看 各 个 控 件 的 属 性 设 置 : Text1:PasswordChar = "*" Text2:PasswordChar = "*" Command1:Caption = " 提 交 " Label1:Caption= " 请 输 入 密 码 :" Label2:Caption = " 请 输 入 密 码 :" 在 确 定 按 钮 的 单 击 事 件 中, 判 断 输 入 的 文 字 是 否 为 正 确 的 密 码, 然 后 依 此 显 示 不 同 的 提 示 信 息 : Private Sub Command1_Click() If Text1.Text = "Visualbasic" Then MsgBox (" 您 输 入 的 密 码 正 确!") Else MsgBox (" 您 输 入 的 密 码 不 正 确 ") End If 在 文 本 框 的 Change 事 件 中, 每 输 入 一 个 字 符, 就 进 行 一 次 验 证, 当 出 现 一 个 错 误 的 字 符 时, 出 现 错 误 的 提 示 信 息, 只 有 当 前 输 入 的 字 符 正 确, 才 能 输 入 下 一 个 字 符 : Private Sub Text2_Change() Dim length As Integer If Text2.Text <> "" Then length = Len(Text2.Text) If Text2.Text <> Mid("Visualbasic", 1, length) Then MsgBox (" 您 输 入 的 密 码 不 正 确!")

52 第 3 章 可 视 化 程 序 设 计 初 步 39 Text2.Text = "" ElseIf Text2.Text = "Visualbasic" Then MsgBox (" 您 输 入 的 密 码 正 确!") End If End If 注 意 : (1)Len 函 数 : 此 函 数 返 回 字 符 串 内 字 符 的 数 目, 其 参 数 可 以 为 字 符 串, 也 可 以 是 字 符 串 变 量 (2)Mid 函 数 : 此 函 数 用 来 从 一 个 字 符 串 中 提 取 其 中 的 一 部 分 其 具 体 的 用 法 为 : Mid(string, start[, length]) 其 中 : string: 必 要 参 数, 字 符 串 表 达 式, 从 中 返 回 字 符 如 果 string 包 含 Null, 将 返 回 Null start: 必 要 参 数, 为 Long 类 型 string 中 被 取 出 部 分 的 字 符 位 置, 从 1 开 始 如 果 start 超 过 string 的 字 符 数,Mid 返 回 零 长 度 字 符 串 ("") length: 可 选 参 数, 为 Variant (Long) 要 返 回 的 字 符 数 如 果 省 略 或 length 超 过 文 本 的 字 符 数 ( 包 括 start 处 的 字 符 ), 将 返 回 字 符 串 中 从 start 到 尾 端 的 所 有 字 符 在 第 二 种 方 案 中, 我 们 必 须 是 用 户 每 输 入 一 个 字 符, 就 验 证 一 次, 因 而 必 须 用 到 以 上 那 些 字 符 处 理 函 数 3.4 对 象 的 焦 点 在 开 发 Windows 标 准 用 户 程 序 时, 焦 点 是 一 个 很 基 本 的 概 念 在 Windows 中, 我 们 可 以 同 时 运 行 多 个 程 序, 但 只 有 在 当 前 的 活 动 窗 口 中, 用 户 才 能 进 行 各 种 用 户 操 作, 此 时, 我 们 称 此 窗 口 具 有 焦 点 焦 点 的 基 本 概 念 焦 点 是 对 象 接 受 鼠 标 和 键 盘 输 入 的 能 力 当 某 一 个 控 件 或 窗 体 具 有 焦 点 时, 它 们 就 可 以 接 受 用 户 的 输 入 例 如, 在 窗 体 中 有 两 个 文 本 框 控 件, 在 程 序 运 行 时 我 们 只 能 在 一 个 文 本 框 中 输 入 文 字, 我 们 称 此 文 本 框 具 有 焦 点 ; 假 如 我 们 需 要 在 另 一 个 文 本 框 中 输 入 文 字, 就 必 须 通 过 鼠 标 单 击 或 用 Tab 键 选 定, 才 能 把 焦 点 移 到 另 一 文 本 框, 在 此 文 本 框 中 进 行 输 入 在 VB 中, 大 多 数 的 控 件 都 是 可 以 接 收 焦 点 的 这 些 控 件 是 否 具 有 焦 点 可 以 从 外 表 看 出 来 比 如, 窗 体 具 有 焦 点 时, 它 会 有 活 动 标 题 栏 ; 命 令 按 钮 具 有 焦 点 时, 标 题 周 围 的 边 框 将 会 突 出 显 示 ; 文 本 框 具 有 焦 点 时, 会 在 文 本 框 中 显 示 光 标 值 得 注 意 的 是, 以 下 的 控 件 不 能 接 收 焦 点 :Frame Label Menu Line Shape Image 和 Timer 对 象 的 GotFocus 事 件 与 LostFocus 事 件 在 VB 中, 我 们 使 用 GotFocus 和 LostFocus 两 事 件 来 处 理 焦 点 其 中,GotFocus 表 示 当

53 40 Visual Basic 程 序 设 计 教 程 对 象 接 受 到 焦 点 时 发 生 该 事 件, 而 LostFocus 表 示 对 象 失 去 了 焦 点 时 发 生 该 事 件 LostFocus 事 件 过 程 主 要 用 于 更 新 输 入 内 容, 或 对 GotFocus 事 件 过 程 建 立 的 内 容 进 行 检 查 修 改 设 置 焦 点 在 VB 中, 我 们 不 仅 可 以 用 Tab 键 或 鼠 标 来 改 变 焦 点, 还 可 以 在 程 序 的 执 行 过 程 中 人 为 地 设 置 焦 点 至 于 用 Tab 选 定 控 件, 已 经 在 命 令 按 钮 一 节 中 有 所 介 绍, 我 们 使 用 TabStop 属 性 来 更 改 控 件 是 否 具 有 Tab 键 选 定 功 能, 用 TabIndex 属 性 设 置 各 控 件 的 选 定 顺 序 在 程 序 运 行 时, 我 们 使 用 对 象 的 SetFocus 方 法 来 设 置 焦 点 : 对 象.SetFocus 同 时, 我 们 必 须 注 意, 以 上 提 到 的 那 些 不 能 接 受 焦 点 的 控 件 是 不 能 设 置 焦 点 的, 并 且, 不 可 见 的 控 件 也 是 不 能 设 置 焦 点 的 例 3.10 实 现 文 字 输 入 的 提 示 和 检 查 功 能 在 此 例 中, 利 用 GotFocus 和 LostFocus 事 件 实 现 简 单 的 提 示 和 验 证 在 窗 体 中 创 建 一 文 本 框 用 于 输 入 学 号, 当 文 本 框 得 到 焦 点 时, 将 出 现 一 个 提 示 信 息, 说 明 学 号 的 长 度 为 3 位 ; 当 文 本 框 失 去 焦 点 时, 进 行 判 断, 若 输 入 的 文 字 不 为 空 且 长 度 不 为 3, 则 出 现 提 示 信 息 下 面 是 程 序 的 创 建 过 程, 看 一 看 程 序 设 计 时 的 外 形, 如 图 3.19 所 示 图 3.19 文 字 输 入 的 提 示 和 验 证 为 了 实 现 在 文 本 框 得 到 焦 点 时 显 示 提 示 信 息, 必 须 使 文 本 框 在 程 序 启 动 时 不 具 备 焦 点 所 以, 我 们 必 须 更 改 命 令 按 钮 的 TabIndex 属 性 为 0, 使 得 程 序 启 动 时 窗 体 的 焦 点 在 命 令 按 钮 上, 而 不 是 在 文 本 框 中 然 后, 我 们 来 编 写 代 码 需 要 注 意 的 是, 此 例 的 目 的 旨 在 说 明 焦 点, 我 们 不 对 文 本 框 以 外 的 控 件 进 行 代 码 编 写 读 者 可 以 对 命 令 按 钮 自 己 进 行 编 码 当 文 本 框 得 到 焦 点 时, 显 示 提 示 信 息, 代 码 如 下 : Private Sub Text1_GotFocus() MsgBox (" 你 输 入 的 学 号 为 3 位!") 当 文 本 框 失 去 焦 点 时, 先 判 断 文 本 框 是 否 为 空 若 不 为 空, 字 符 的 长 度 是 否 为 3, 若 不 是, 显 示 错 误 的 提 示 信 息, 并 且 把 焦 点 重 新 置 到 文 本 框, 代 码 如 下 : Private Sub Text1_LostFocus() If Len(Text1.Text) <> 3 And Text1.Text <> "" Then MsgBox (" 你 输 入 的 学 号 不 是 3 位!") Text1.SetFocus

54 第 3 章 可 视 化 程 序 设 计 初 步 41 End If 注 意 : 此 例 中, 我 们 利 用 文 本 框 的 GotFocus 和 LostFocus 事 件 来 实 现 文 字 输 入 的 提 示 和 验 证, 这 比 传 统 的 文 字 输 入 要 先 进 一 些 因 为 在 填 写 一 个 很 大 的 表 单 时, 往 往 要 到 提 交 时 才 出 现 错 误 的 提 示 信 息, 而 此 例 的 效 果 是 每 输 入 一 项, 提 示 和 校 验 一 次, 效 率 将 大 大 提 高 在 程 序 启 动 时, 必 须 不 把 文 本 框 设 置 为 焦 点, 否 则, 程 序 一 启 动, 就 会 出 现 提 示 信 息 例 3.11 焦 点 的 自 动 跳 转 之 一 此 例 中, 我 们 创 建 一 个 文 本 框, 用 于 输 入 学 号 ; 再 创 建 两 个 按 钮 : 确 定 和 取 消 当 用 户 输 入 学 号 完 毕 后 再 回 车, 窗 体 的 焦 点 将 落 到 确 定 按 钮 上 这 样, 用 户 不 必 使 用 Tab 键 或 鼠 标 就 可 以 通 过 按 回 车 键 进 行 下 一 步 操 作 了, 这 在 一 步 一 步 的 操 作 中 将 很 有 效 下 面 是 程 序 的 创 建 过 程, 先 来 看 一 看 程 序 运 行 时 的 外 形, 如 图 3.20 所 示 图 3.20 用 回 车 键 跳 转 焦 点 在 文 本 框 的 内 容 输 入 完 毕 按 回 车 键 后, 就 会 触 发 键 盘 事 件, 我 们 判 断 当 前 松 开 的 键 是 否 是 回 车 键 (ASCII 值 为 13), 若 为 回 车, 则 把 焦 点 移 动 到 确 定 按 钮 上, 等 待 回 车 或 鼠 标 单 击 ; 若 不 为 回 车, 则 不 进 行 任 何 操 作, 此 时, 焦 点 仍 在 文 本 框 中, 我 们 可 以 继 续 输 入 文 字, 并 显 示 在 文 本 框 中 : Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then Command1.SetFocus End If 在 确 定 按 钮 的 单 击 事 件 中, 我 们 用 一 个 消 息 框 来 代 替 实 际 中 的 下 一 步 操 作 : Private Sub Command1_Click() MsgBox (" 下 一 步!") 在 取 消 按 钮 的 单 击 事 件 中, 用 于 把 文 本 框 清 空, 然 后 把 焦 点 重 新 置 到 文 本 框 上, 等 待 再 一 次 输 入 : Private Sub Command2_Click() Text1.Text = "" Text1.SetFocus

55 42 Visual Basic 程 序 设 计 教 程 例 3.12 焦 点 的 自 动 跳 转 之 二 安 装 过 Windows 98 的 人 都 知 道 有 这 么 一 回 事 : 在 我 们 输 入 完 7 位 密 码 后, 窗 体 的 焦 点 将 自 动 跳 转 到 下 一 步 按 钮 上, 用 户 敲 回 车 键 后, 直 接 跳 到 下 一 步 开 始 继 续 执 行 下 面 是 程 序 的 创 建 过 程, 先 来 看 一 看 程 序 运 行 时 的 外 形, 如 图 3.21 图 3.22 所 示 图 3.21 未 输 入 注 册 码 时 的 窗 体 图 3.22 输 入 完 注 册 码 后 焦 点 的 自 动 跳 转 首 先 创 建 如 图 所 示 的 控 件, 并 使 用 各 个 控 件 的 属 性 默 认 值 然 后 编 写 代 码 在 文 本 框 的 改 变 事 件 中, 我 们 使 用 Len 函 数 来 判 断 输 入 的 字 符 是 否 为 7 位, 若 是, 首 先 将 下 一 步 按 钮 激 活, 然 后 将 焦 点 移 动 到 此 按 钮 上 Private Sub Text1_Change() If Len(Text1.Text) = 7 Then Command2.Enabled = True Command2.SetFocus End If 因 为 在 输 入 注 册 码 之 前, 下 一 步 按 钮 应 该 是 不 能 接 受 单 击 的, 所 以 在 窗 体 的 引 导 过 程 中, 先 要 将 下 一 步 按 钮 处 于 不 被 激 活 状 态 : Private Sub Form_Load() Command2.Enabled = False 在 下 一 步 按 钮 的 单 击 事 件 中, 我 们 用 消 息 框 来 代 替 实 际 中 的 下 一 步 操 作 : Private Sub Command2_Click()

56 第 3 章 可 视 化 程 序 设 计 初 步 43 MsgBox (" 下 一 步!") 3.5 事 件 驱 动 程 序 的 工 作 方 式 事 件 驱 动 简 介 事 件 驱 动 程 序 的 概 念 对 读 者 来 说 可 能 还 有 点 陌 生, 但 是, 响 应 事 件 的 概 念 就 应 该 不 很 陌 生 了 许 多 地 方 都 可 以 称 之 为 事 件 驱 动 例 如, 你 在 打 开 电 视 机 看 电 视 时, 你 可 以 随 时 通 过 遥 控 器 更 换 频 道, 你 也 可 以 通 过 按 静 音 按 钮 完 全 消 除 声 音 这 种 控 制 事 件 怎 样 发 生 以 及 何 时 发 生 的 控 制 类 型 与 事 件 驱 动 编 程 相 似 你 ( 电 视 用 户 ) 引 发 一 个 事 件 ( 按 一 个 按 钮 ), 它 使 电 视 对 发 生 的 事 件 采 取 响 应 的 操 作, 还 可 以 控 制 这 些 事 件 何 时 发 生 事 件 驱 动 的 另 一 优 点 是 可 以 用 事 件 提 供 及 时 的 反 馈 例 如, 可 以 编 写 事 件 程 序 验 证 刚 输 入 完 内 容 时 用 户 的 输 入 然 后, 如 果 用 户 输 入 的 内 容 有 问 题, 他 能 立 即 知 道 并 可 以 修 改 它 这 种 反 馈 有 代 码 控 制, 它 保 证 用 户 在 文 本 框 中 输 入 所 需 的 信 息 事 件 驱 动 程 序 的 工 作 方 式 Visual Basic 的 每 个 窗 体 和 控 件 都 有 一 个 预 定 义 的 事 件 集, 当 其 中 的 某 个 事 件 发 生, 并 且 在 相 关 联 的 事 件 过 程 中 存 在 代 码 时,Visual Basic 将 执 行 这 些 代 码 对 象 所 能 识 别 的 事 件 类 型 有 多 种, 但 多 数 类 型 为 大 多 数 对 象 所 共 有 例 如, 大 多 数 对 象 都 能 识 别 Click 事 件, 即 单 击 事 件 ; 如 果 单 击 窗 体, 则 执 行 窗 体 的 单 击 事 件 过 程 中 的 代 码 ; 如 果 单 击 命 令 按 钮, 则 执 行 命 令 按 钮 的 单 击 事 件 过 程 中 的 代 码 事 件 驱 动 程 序 的 工 作 方 式 为 : (1) 启 动 应 用 程 序, 装 载 和 显 示 窗 体 ; (2) 窗 体 或 窗 体 上 的 控 件 接 受 事 件 事 件 可 以 由 用 户 引 发 ( 例 如 键 盘 操 作 ), 可 以 由 系 统 引 发 ( 例 如 定 时 器 事 件 ), 也 可 以 由 代 码 间 接 引 发 ( 当 代 码 装 载 窗 体 时 的 Load 事 件 ); (3) 如 果 相 应 的 事 件 过 程 中 存 在 代 码, 则 执 行 该 代 码 ; (4) 应 用 程 序 等 待 下 一 次 事 件 要 想 使 用 Visual Basic 编 写 的 应 用 程 序 能 够 正 常 运 行, 读 者 可 以 通 过 后 面 章 节 的 学 习 逐 步 搞 清 楚 事 件 的 发 生 时 间 有 多 少 事 件 发 生 事 件 发 生 的 先 后 次 序 等 内 容, 然 后 对 相 应 的 事 件 逐 个 编 码 习 题 1. 什 么 是 对 象 事 件 和 方 法? 对 象 事 件 和 方 法 三 者 之 间 的 关 系 如 何? 请 举 例 说 明 2. 窗 体 的 属 性 主 要 有 哪 些?Caption 属 性 和 Name 属 性 有 什 么 区 别? 3. 文 本 框 控 件 (TextBox) 和 标 签 控 件 (Label) 有 什 么 不 同? 各 有 什 么 作 用? 如 何 在 属 性 窗 口 中 和 在 代

57 44 Visual Basic 程 序 设 计 教 程 码 中 添 加 要 显 示 的 文 本? 4. 在 窗 体 上 画 一 个 命 令 按 钮, 然 后 通 过 属 性 窗 口 设 置 下 列 属 性 : Name:CmdOk Caption: 确 定 Font: 隶 书 粗 体 四 号 Default:True Left:1000 Top:1000 Height:500 Width: 在 窗 体 上 的 某 一 行 位 置 画 两 个 文 本 框 控 件, 在 另 一 行 画 两 个 命 令 按 钮 控 件, 然 后 选 定 这 四 个 控 件, 将 它 们 移 动 到 窗 体 的 右 下 部, 然 后 使 左 边 的 一 个 文 本 框 控 件 和 一 个 命 令 按 钮 控 件 左 对 齐 且 高 度 与 宽 度 都 相 同, 使 右 边 的 一 个 文 本 框 控 件 和 一 个 命 令 按 钮 控 件 右 对 齐 且 高 度 与 宽 度 都 相 同 6. 什 么 是 对 象 的 焦 点? 如 何 设 置 对 象 的 焦 点? 使 用 GotFocus 和 LostFocus 两 事 件 来 处 理 焦 点 时 有 什 么 区 别? 7. 简 述 事 件 驱 动 程 序 的 工 作 方 式 8. 在 窗 体 上 建 立 一 个 标 签 控 件 和 两 个 命 令 按 钮 控 件 当 程 序 运 行 后, 单 击 命 令 按 钮 英 文 时 标 签 控 件 显 示 Visual Basic, 单 击 命 令 按 钮 中 文 时 标 签 控 件 显 示 可 视 化 Basic 9. 在 窗 体 上 建 立 两 个 文 本 框 控 件 (Name 属 性 分 别 为 Txt1 和 Txt2) 和 一 个 命 令 按 钮 控 件 (Name 属 性 为 CmdOk) 当 程 序 运 行 后, 单 击 命 令 按 钮, 在 第 一 个 文 本 框 中 显 示 由 CmdOk_Click 事 件 过 程 设 定 的 内 容 ( 例 如 : 中 国 将 于 2003 年 下 半 年 发 射 载 人 飞 船 ), 同 时 在 第 二 个 文 本 框 中 显 示 第 一 个 文 本 框 中 的 内 容 读 者 可 以 使 用 多 种 方 式 编 程 请 读 者 考 虑, 如 何 用 第 一 个 文 本 框 的 Change 事 件 过 程 在 第 二 个 文 本 框 中 显 示 指 定 的 内 容 10. 设 计 一 个 计 算 某 同 学 三 门 课 平 均 成 绩 的 程 序, 利 用 文 本 框 作 为 数 据 的 输 入 和 输 出 程 序 的 界 面 如 图 3.23 所 示 图 3.23 程 序 运 行 时 的 界 面 请 读 者 自 己 设 计 出 一 个 灵 活 的 程 序 例 如, 在 程 序 开 始 运 行 时, 命 令 按 钮 计 算 不 可 以 点 击, 只 有 在 全 部 输 入 完 数 据 后 才 可 以 点 击 计 算 按 钮, 并 且 在 输 入 每 一 个 文 本 框 的 内 容 时 要 有 提 示 等 内 容

58 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 Visual Basic 是 在 BASIC 语 言 的 基 础 上 发 展 起 来 的, 它 保 留 了 原 来 BASIC 版 本 中 的 数 据 类 型 和 语 法, 对 其 中 的 某 些 语 句 和 函 数 的 功 能 作 了 修 改 或 扩 展, 并 根 据 语 言 的 可 视 化 要 求 增 加 了 一 些 新 的 操 作 在 本 章 中, 我 们 将 学 习 构 成 Visual Basic 应 用 程 序 的 基 本 元 素, 包 括 数 据 类 型 常 量 变 量 运 算 符 表 达 式 和 函 数 等 内 容 4.1 数 据 类 型 数 据 类 型 是 数 据 的 表 示 和 存 储 形 式 VB 的 数 据 类 型 分 为 基 本 数 据 类 型 和 自 定 义 数 据 类 型 两 种 基 本 数 据 类 型 VB 变 量 的 基 本 数 据 类 型 有 11 种, 如 表 4.1 所 示 表 4.1 VB 的 基 本 数 据 类 型 数 据 类 型 类 型 描 述 类 型 说 所 占 数 据 范 围 明 后 缀 字 节 数 Integer 整 型 % ~ Long 长 整 型 & ~ Single 单 精 度 浮 点 型! E38~ E E-45~ E38 4 Double 双 精 度 浮 点 型 # E308~ E E324~ E308 8 Currency 货 币 ~ String 字 符 串 型 $ Byte 字 节 型 0~255 1 Boolean 布 尔 型 True False 2 Date 日 期 型 100 年 1 月 1 日 ~9999 年 12 月 31 日 8 Object 对 象 型 任 何 Object 4 Variant 变 体 型 1. 数 值 数 据 类 型 Integer( 整 型 ) Long( 长 整 型 ) Single( 单 精 度 浮 点 型 ) Double( 双 精 度 浮 点 型 )

59 46 Visual Basic 程 序 设 计 教 程 及 Currency( 货 币 型 ) 均 为 数 值 数 据 类 型 其 中 整 型 是 16 位 的 整 数, 长 整 型 是 32 位 的 整 数 单 精 度 及 双 精 度 浮 点 型 表 示 实 数, 常 被 用 于 表 示 数 量 较 大 的 数 字 Currency 数 据 类 型 是 定 点 数 据 类 型, 适 用 于 货 币 计 算 2. Byte 数 据 类 型 Byte 数 据 类 型 表 示 0 到 255 之 间 的 数, 常 用 于 访 问 二 进 制 文 件 图 形 和 声 音 文 件 等 当 需 要 把 数 据 存 放 成 字 节, 必 须 访 问 各 字 节 时 可 采 用 Byte 类 型 3. String 数 据 类 型 String 数 据 类 型 存 放 文 本, 是 一 个 字 符 序 列, 称 为 字 符 串, 它 的 每 一 个 字 符 用 ASCII 码 表 示 不 包 含 任 何 字 符 的 串 称 为 空 串 字 符 串 有 变 长 和 定 长 两 种, 分 别 表 示 声 明 为 固 定 长 度 和 可 变 长 度 4. Boolean 数 据 类 型 取 值 仅 为 True 或 False 的 类 型 称 为 Boolean( 布 尔 ) 型, 缺 省 值 为 False 5. Date 数 据 类 型 Date 数 据 类 型 用 于 以 特 殊 方 式 存 放 日 期 和 时 间 日 期 文 字 必 须 以 一 对 # 括 起 来 6. Object 数 据 类 型 Object 用 于 表 示 任 何 类 型 的 对 象, 可 引 用 应 用 程 序 中 或 某 些 其 他 应 用 程 序 中 的 对 象 必 须 使 用 Set 语 句 先 对 对 象 引 用 赋 值, 其 后 才 能 引 用 对 象 7. Variant 数 据 类 型 VB 缺 省 规 定, 如 果 在 声 明 中 没 有 说 明 数 据 类 型, 则 变 量 的 数 据 类 型 为 Variant( 变 体 ) Variant 数 据 类 型 还 包 含 三 种 特 定 值 :Empty Null Error Empty 值 用 于 确 定 是 否 已 将 一 个 值 赋 予 所 创 建 的 变 量 赋 值 之 前,Variant 变 量 具 有 值 Empty Null 常 用 于 数 据 库 应 用 程 序, 表 示 未 知 或 丢 失 为 空 的 数 据 Error 值 是 指 已 发 生 的 过 程 中 的 错 误 状 态 Variant 数 据 类 型 是 最 为 灵 活 的 数 据 类 型, 可 以 依 据 不 同 的 需 要 进 行 各 种 数 据 类 型 的 转 换 它 实 际 上 包 含 两 部 分 信 息, 一 部 分 是 数 据 类 型 的 信 息, 一 部 分 是 表 示 数 据 值 的 信 息 但 正 是 由 于 它 的 灵 活 性, 又 使 得 它 存 在 着 一 个 明 显 的 缺 点,Variant 数 据 类 型 比 其 他 类 型 的 数 据 占 有 更 多 的 内 存 空 间 自 定 义 数 据 类 型 用 户 可 以 利 用 Type 语 句 定 义 自 己 的 数 据 类 型 其 格 式 如 下 : Type 数 据 类 型 名 数 据 类 型 元 素 名 As 类 型 名 数 据 类 型 元 素 名 As 类 型 名 End Type 其 中 : (1) 数 据 类 型 名 是 要 定 义 的 数 据 类 型 名, 其 命 名 规 则 与 变 量 的 命 名 规 则 相 同 ( 下 一 节 介 绍 变 量 的 命 名 规 则 ); (2) 数 据 类 型 元 素 名 也 遵 循 同 样 的 规 则 ;

60 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 47 (3) 类 型 名 可 以 是 任 何 基 本 数 据 类 型, 也 可 以 是 用 户 自 定 义 的 数 据 类 型 用 Type 语 句 可 以 定 义 类 似 于 Pascal 语 言 中 的 记 录 类 型 或 C 语 言 中 结 构 体 类 型 的 数 据, 因 而 通 常 把 用 Type 语 句 定 义 的 类 型 称 为 记 录 类 型 例 如 : Type Student Num As Integer Name As String*10 Age As Integer Score As Single End Type 这 里 的 Student 是 一 个 用 户 定 义 的 类 型, 它 由 四 个 元 素 组 成 :Num Name Age 和 Score 其 中,Num 和 Age 是 整 型,Score 是 单 精 度 浮 点 型,Name 是 定 长 字 符 串, 由 10 个 字 符 组 成 应 注 意, 在 使 用 记 录 类 型 之 前, 必 须 用 Type 语 句 加 以 定 义 记 录 类 型 通 常 在 标 准 模 块 中 定 义, 缺 省 是 可 共 享 的, 具 有 Public 属 性, 可 以 用 来 在 工 程 的 任 何 地 方 定 义 变 量 也 可 以 用 Private 关 键 字 将 记 录 类 型 定 义 为 私 有 的, 只 能 用 在 定 义 它 的 模 块 中 如 果 在 窗 体 模 块 中 定 义 记 录 类 型, 则 必 须 在 前 面 加 上 Private, 也 就 是 说 在 窗 体 模 块 中 定 义 的 记 录 类 型 只 能 是 私 有 的 4.2 常 量 和 变 量 上 一 节 介 绍 了 VB 中 使 用 的 数 据 类 型 在 程 序 中, 不 同 类 型 的 数 据 既 可 以 以 常 量 的 形 式 出 现, 也 可 以 以 变 量 的 形 式 出 现 常 量 是 指 在 整 个 应 用 程 序 运 行 期 间 值 不 会 发 生 变 化 的 量, 而 变 量 则 是 指 在 整 个 应 用 程 序 运 行 期 间 值 可 能 发 生 变 化 的 量 常 量 VB 中 的 常 量 分 为 两 种, 一 种 是 文 字 常 量, 一 种 是 符 号 常 量 1. 文 字 常 量 文 字 常 量 也 称 为 字 面 常 量 (Literal), 它 分 为 字 符 串 数 值 布 尔 值 和 日 期 文 字 等, 这 里 先 介 绍 前 两 种 常 量 (1) 字 符 串 常 量 : 字 符 串 常 量 由 字 符 组 成, 可 以 是 除 双 引 号 和 回 车 符 之 外 的 任 何 ASCII 字 符, 其 长 度 不 能 超 过 个 字 符 ( 定 长 字 符 串 ) 或 20 亿 个 字 符 ( 变 长 字 符 串 ) 例 如 :" petroleum university "," 25.00", 注 意, 双 引 号 是 字 符 串 常 量 的 定 界 符, 不 是 字 符 串 的 一 部 分 (2) 数 值 常 量 : 数 值 常 量 共 有 四 种 表 示 方 式, 即 整 型 数 长 整 型 数 货 币 型 数 和 浮 点 型 数 1 整 型 数 : 十 进 制 整 型 数 : 由 一 个 或 几 个 十 进 制 数 字 (0~9) 组 成, 可 以 带 有 正 负 号, 其 取 值 范 围 为 ~32 767

61 48 Visual Basic 程 序 设 计 教 程 十 六 进 制 整 型 数 : 由 一 个 或 几 个 十 六 进 制 数 字 (0~9 及 a~f 或 A~F) 组 成, 前 面 冠 以 &H( 或 &h), 其 取 值 范 围 为 &H0~&HFF FF 八 进 制 整 型 数 : 由 一 个 或 几 个 八 进 制 数 字 (0~7) 组 成, 前 面 冠 以 &( 或 &O), 其 取 值 范 围 为 &O 0~&O 长 整 型 数 : 十 进 制 长 整 型 数 : 其 组 成 与 十 进 制 整 型 数 相 同, 其 取 值 范 围 为 ~ 十 六 进 制 长 整 型 数 : 由 十 六 进 制 数 字 组 成, 以 &H( 或 &h) 开 头, 以 & 结 尾, 其 取 值 范 围 为 &H0&~&HFF FF FF FF& 八 进 制 长 整 型 数 : 由 八 进 制 数 字 组 成, 以 &( 或 &O) 开 头, 以 & 结 尾, 其 取 值 范 围 为 &O0&~ &O & 3 货 币 型 数 : 也 称 为 定 点 数, 取 值 范 围 见 表 浮 点 型 数 : 也 称 为 实 数, 分 为 单 精 度 浮 点 数 和 双 精 度 浮 点 数 Visual Basic 在 判 断 常 量 类 型 时 有 时 存 在 多 义 性 例 如, 值 8.67 可 能 是 单 精 度 浮 点 数, 也 可 能 是 双 精 度 浮 点 数 或 货 币 类 型 在 缺 省 情 况 下,Visual Basic 将 选 择 需 要 内 存 容 量 最 小 的 表 示 方 法 所 以, 值 8.67 通 常 被 作 为 单 精 度 浮 点 数 处 理 为 了 显 式 地 指 明 常 数 类 型, 可 以 在 常 数 后 面 加 上 类 型 说 明 符, 这 些 说 明 符 分 别 为 : % 整 型 & 长 整 型! 单 精 度 浮 点 数 # 双 精 度 浮 点 货 币 型 $ 字 符 串 型 字 节 布 尔 日 期 对 象 及 变 体 类 型 没 有 类 型 说 明 符 2. 符 号 常 量 (1) 定 义 常 量 : 在 应 用 程 序 的 代 码 编 辑 中, 常 会 遇 到 一 些 反 复 出 现 的 数 值, 这 些 数 值 在 程 序 执 行 过 程 中 保 持 不 变, 为 了 便 于 记 忆 并 改 进 代 码 的 可 读 性, 减 少 不 必 要 的 重 复 工 作, 用 一 些 具 有 一 定 意 义 的 名 字 来 代 替 这 些 不 变 的 数 值 或 字 符 串, 即 称 为 常 量 比 如 数 学 计 算 常 用 的 , 如 果 在 程 序 中 反 复 输 入 这 个 数 值, 不 仅 非 常 麻 烦, 而 且 极 易 出 错 所 以 通 常 先 定 义 一 个 常 量 Pi, 用 它 来 代 替 , 在 接 下 来 的 程 序 中 就 可 以 简 单 地 采 用 Pi 这 个 常 量 了 例 1: Const Pi = Area = Pi * Radius * Radius ' 求 面 积 Circumference = 2 * Pi * Radius ' 求 周 长 例 2: Area = * Radius * Radius

62 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 49 Circumference = 2 * * Radius 对 比 例 1 和 例 2 可 以 看 出, 在 例 1 中 多 了 一 个 赋 值 语 句 Pi = , 但 在 进 行 面 积 和 周 长 的 计 算 时, 可 直 接 引 用 Pi, 而 不 必 进 行 如 例 2 中 的 数 值 重 复 书 写 的 枯 燥 工 作 在 大 型 的 程 序 中, 常 数 的 这 种 优 越 性 会 更 加 明 显 (2) 常 量 赋 值 : 符 号 常 量 声 明 的 语 法 规 则 为 : Const ConstantName [As Type] = value 常 量 的 声 明 类 似 于 变 量 的 声 明 ( 后 面 介 绍 ), 但 常 量 声 明 需 有 关 键 字 Const, 且 需 提 供 常 数 值 声 明 语 句 中 的 As Type 为 可 选 项 当 省 略 As Type 时, 常 量 的 类 型 由 其 后 赋 给 的 值 决 定 符 号 常 量 一 般 用 大 写 字 母 定 义 Const 语 句 可 表 示 数 量 或 Date/Time 量, 也 可 以 用 Const 语 句 定 义 字 符 串 常 数 : Const Temp As Integer = 100 ' 表 示 数 量 Const NextDate = #9/6/2002# ' 表 示 日 期 Const String1 ="abcde" ' 表 示 字 符 串 若 要 在 一 行 中 放 置 多 个 常 数 声 明, 可 用 逗 号 分 隔 如 下 : Const Temp1 = 100,Temp2 = 200,Temp3 = 300 在 Const 声 明 语 句 中, 等 号 右 边 的 表 达 式 可 以 包 括 其 他 常 量 如 : Public Const Temp1 As Integer = 100 Public Const Temp2 As Integer = 2 * Temp1 注 意 : 虽 然 常 量 定 义 中 可 以 包 含 其 他 常 量, 但 必 须 注 意 不 能 出 现 循 环, 否 则 将 导 致 程 序 出 错 例 如 : Public Const Temp1 = Temp2/2 Public Const Temp2 = Temp1*2 (3) 常 量 的 域 : 常 量 具 有 一 定 的 使 用 范 围, 常 量 具 有 域 声 明 常 量 时, 可 以 用 关 键 字 Public 或 Private 来 定 义 一 常 量 在 模 块 内 部 使 用 的 常 量 用 Private 关 键 字 来 定 义, 在 模 块 之 间 公 用 的 常 量 用 Public 来 定 义, 此 时 声 明 常 量 的 语 法 为 : [Public/Private] Const ConstName [As type] = Expression 例 如 : Public Const Pi As Double = Private Const Pi As Double = 在 第 一 个 语 句 中,Pi 被 声 明 为 模 块 间 公 用 的 常 量, 而 第 二 个 语 句 中 的 Pi 被 声 明 为 模 块 内 的 常 量 变 量 变 量 代 表 数 据 的 一 个 名 称, 其 内 容 可 随 程 序 的 运 行 而 不 断 变 化 在 VB 执 行 应 用 程 序 期 间, 用 变 量 来 临 时 存 储 数 据, 变 量 的 值 也 随 程 序 的 运 行 而 发 生 变 化 VB 的 变 量 名 最 多 可 以 有

63 50 Visual Basic 程 序 设 计 教 程 255 个 字 符, 首 字 符 必 须 为 英 文 字 母, 其 后 可 以 接 任 意 字 母 数 字 和 下 划 线 的 组 合 在 选 用 变 量 名 时 应 注 意 不 要 使 用 VB 中 的 保 留 字 及. 符 号, 因 为. 符 号 是 专 用 于 引 用 属 性 方 法 及 用 户 定 义 的 类 型 此 外,VB 中 变 量 名 的 大 小 写 无 关 紧 要,VB 总 是 把 变 量 名 的 形 式 统 一 为 最 近 一 次 所 使 用 的 大 写 模 式 另 外,VB 中 变 量 名 的 取 法 最 好 用 全 称 的 英 文 单 词 或 汉 语 拼 音 来 代 替, 即 见 名 知 义 描 述 一 个 变 量 通 常 用 变 量 的 类 型 声 明 变 量 变 量 的 作 用 域 以 及 变 量 的 生 存 期 这 四 个 因 素 以 下 将 就 变 量 的 四 个 因 素 进 行 介 绍 1. 变 量 的 类 型 作 为 VB 数 据 的 一 个 元 素, 变 量 类 型 有 数 值 型 变 量 字 符 串 变 量 布 尔 变 量 日 期 变 量 对 象 变 量 和 变 体 变 量 等 几 种 类 型 在 上 一 节 中, 已 对 它 们 进 行 了 介 绍, 这 里 不 再 重 复 2. 声 明 变 量 在 大 多 数 的 编 程 语 言 中, 变 量 只 有 先 声 明 以 后 才 能 使 用 声 明 变 量 事 先 将 变 量 通 知 给 程 序, 告 诉 编 译 器 准 备 使 用 的 变 量, 使 编 译 器 产 生 优 化 代 码, 因 而 速 度 提 高 Visual Basic6.0 中 可 以 不 事 先 声 明 所 有 变 量 这 是 Visual Basic 语 言 的 一 个 优 点 Visual Basic 中 声 明 变 量 分 为 显 式 声 明 和 隐 式 声 明 两 种 : (1) 显 式 声 明 : 显 式 声 明 变 量 时,Dim 语 句 后 接 变 量 名 及 类 型 语 法 如 下 : Dim 变 量 名 [As type] Dim 语 句 中 的 As type 用 以 定 义 变 量 的 数 据 类 型, 如 Integer Double Currency 等 等, 它 们 可 以 是 VB 的 任 何 一 种 类 型, 包 括 自 定 义 类 型 如 果 缺 省, 默 认 为 Variant 类 型 例 如 : Dim Count As Single ' 定 义 Count 为 单 精 度 浮 点 数 Dim PutIn As String ' 定 义 PutIn 为 字 符 串 型 变 量 Dim Var ' 定 义 Var 为 缺 省 的 Variant 类 型 可 在 同 一 个 Dim 语 句 中 声 明 若 干 不 同 的 变 量, 各 变 量 之 间 用 逗 号 隔 开, 但 必 须 指 定 每 个 变 量 的 数 据 类 型 例 如 : Dim i As Integer, j As Integer, k As Integer ' 定 义 i j k 为 整 型 变 量 缺 省 数 据 类 型 说 明 的 变 量 默 认 为 Variant 类 型 例 如 : Dim x, y As Double ' 定 义 y 为 双 精 度 实 型 变 量,x 为 Variant 类 型 变 量 用 Dim 语 句 声 明 变 量 时,VB 根 据 语 句 中 的 指 定 生 成 新 变 量, 在 内 存 中 保 留 出 空 间 并 为 新 变 量 命 名, 以 后 再 使 用 该 名 称 时,VB 会 自 动 在 该 内 存 中 读 取 变 量 的 值 在 过 程 内 部 用 Dim 语 句 声 明 的 变 量, 只 有 在 该 过 程 执 行 时 才 存 在 过 程 结 束, 该 变 量 的 值 也 就 消 失, 因 此 在 不 同 过 程 中 可 使 用 相 同 的 变 量 名, 而 不 会 发 生 冲 突 和 混 乱 此 外, 用 Public 关 键 字 可 以 声 明 一 个 全 局 变 量, 用 Static 关 键 字 可 以 声 明 一 个 静 态 局 部 变 量, 它 们 的 用 法 会 在 变 量 作 用 域 和 生 存 期 中 介 绍 (2) 隐 式 声 明 : 变 量 的 隐 式 声 明 就 是 在 程 序 开 始 时 不 特 意 声 明 变 量 Visual Basic 允 许 程 序 员 在 编 写 应 用 程 序 时, 不 在 开 始 声 明 所 有 变 量 当 遇 到 新 的 变 量 时,Visual Basic 临 时 生 成 新 的 变 量 并 使 用 它, 它 的 类 型 是 一 般 数 据 类 型, 可 以 放 置 任 何 类 型 的 数 据 在 程 序 中 使 用 新 的 变 量 等 价 于 不

64 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 51 带 类 型 的 变 量 声 明,Visual Basic 根 据 程 序 中 赋 予 变 量 的 值 来 自 动 调 整 变 量 的 类 型 隐 式 声 明 使 用 方 法 如 下 : 程 序 中 不 显 式 地 用 Dim 语 句 等 定 义 变 量, 而 直 接 使 用 变 量, 给 定 变 量 的 值 例 如 : sub MySub() Var1 = 999 Var2 = "The number is 999" Var3 = 32.5 在 以 上 程 序 段 中, 没 有 使 用 Dim 语 句 定 义 变 量 Varl Var2 Var3 等, 因 而 使 用 了 隐 式 声 明, 通 过 分 别 给 每 个 变 量 赋 值, 确 定 变 量 的 类 型 Var1 是 一 整 型 变 量,Var2 是 一 字 符 串 变 量, Var3 是 一 单 精 度 浮 点 型 变 量 一 般 地 说, 变 量 应 该 先 声 明 后 使 用, 这 样 可 以 提 高 程 序 的 效 率, 同 时 也 使 程 序 易 于 调 试 Visual Basic 中 可 以 强 制 显 式 声 明, 它 能 够 自 动 检 测 程 序 中 的 变 量 名 称 是 否 有 拼 写 错 误 采 用 隐 式 声 明 有 一 个 弱 点 : 如 果 变 量 名 书 写 错 误, 程 序 便 会 生 成 一 个 新 的 变 量, 而 不 会 产 生 错 误 信 息, 这 对 于 程 序 的 调 试 是 非 常 不 利 的, 为 了 避 免 这 种 情 况 的 发 生, 我 们 可 以 在 类 模 块 窗 体 模 块 和 标 准 模 块 的 声 明 段 中 加 入 语 句 : Option Explicit 或 者 在 工 具 菜 单 中 选 取 选 项, 单 击 编 辑 器 选 项 卡, 再 复 选 要 求 变 量 声 明 选 项 这 样 就 可 以 在 新 模 块 中 自 动 插 入 Option Explicit 语 句 当 在 插 入 了 Option Explicit 的 模 块 中 编 写 代 码 后, 一 旦 发 现 未 经 显 式 声 明 的 变 量 名,Visual Basic 会 自 动 发 出 错 误 警 告 3. 变 量 的 作 用 域 变 量 的 作 用 域 定 义 了 变 量 的 有 效 作 用 区 间, 只 有 在 该 有 效 范 围 内, 变 量 才 能 被 程 序 访 问 通 常 变 量 的 作 用 范 围 都 是 局 部 的, 为 了 使 变 量 适 用 于 整 个 模 块 或 工 程,VB 可 以 在 声 明 变 量 时 指 定 它 的 使 用 范 围, 使 它 可 以 作 为 窗 体 级 变 量, 也 可 作 为 模 块 级 变 量 变 量 的 有 效 范 围 可 分 为 过 程 级 变 量 和 模 块 级 变 量, 其 中 过 程 级 变 量 专 用 于 所 属 的 过 程, 不 可 公 用, 也 不 能 在 一 个 过 程 中 声 明 公 用 变 量 模 块 级 变 量 可 以 被 公 用, 适 用 于 所 有 模 块 下 面 将 分 别 介 绍 这 几 种 不 同 的 变 量 及 其 用 法 (1) 局 部 (Local) 变 量 : 局 部 变 量 在 过 程 内 部 声 明, 只 有 在 该 过 程 中 的 代 码 才 能 访 问, 不 能 用 于 应 用 程 序 的 其 他 部 分 局 部 变 量 用 Dim 或 Static 关 键 字 来 声 明 例 如 :Dim i As Integer 或 Static i As Integer Dim 和 Static 声 明 变 量 的 区 别 在 于 : 在 整 个 应 用 程 序 运 行 时,Dim 声 明 的 变 量 只 在 过 程 运 行 期 间 才 存 在, 而 Static 声 明 的 变 量 的 值 在 整 个 运 行 期 间 一 直 存 在 在 应 用 程 序 的 编 写 中, 为 了 防 止 程 序 中 变 量 的 干 扰, 应 尽 量 采 用 局 部 变 量, 因 为 在 不 同 过 程 中 同 名 的 局 部 变 量 之 间 是 不 会 互 相 影 响 的 (2) 模 块 / 窗 体 (Module/Form) 级 变 量 : 模 块 / 窗 体 级 变 量 在 模 块 或 窗 体 声 明, 在 声 明 它 的 模 块 或 窗 体 中 的 所 有 过 程 中 可 见 声 明 模 块 / 窗 体 级 变 量 用 Private 关 键 字, 例 如 :Private WaterValue As Single 模 块 级 变 量 中 Private 和 Dim 关 键 字 无 区 别

65 52 Visual Basic 程 序 设 计 教 程 (3) 公 有 (Public) 变 量 : 在 模 块 中 声 明, 在 所 有 项 目 的 任 何 过 程 中 都 可 见 声 明 公 有 变 量 用 Public 关 键 字, 例 如 :Public WaterValue As Single 注 意 : 在 过 程 中 不 能 声 明 公 有 变 量 例 4.1 变 量 的 作 用 域 测 试 本 例 中 将 分 别 定 义 上 述 三 种 变 量, 并 在 程 序 中 不 同 的 位 置 观 测 它 们 的 值 编 写 应 用 程 序 的 方 法 如 下 : (1) 创 建 工 程 ex0401.vbp, 往 工 程 中 添 加 一 个 窗 体 form2 及 一 个 模 块 添 加 一 个 模 块 与 添 加 窗 体 的 方 法 相 似 : 从 工 程 菜 单 中 选 择 添 加 模 块 即 可 ( 如 图 4.1 所 示 ) 添 加 操 作 完 成 后 的 工 程 资 源 管 理 器 如 图 4.2 所 示 图 4.1 添 加 模 块 图 4.2 工 程 资 源 管 理 器 (2) 分 别 往 两 个 窗 体 中 加 入 四 个 命 令 按 钮, 设 计 阶 段 的 form1 窗 体 如 图 4.3 所 示,form2 窗 体 与 form1 相 似 图 4.3 设 计 期 间 的 窗 体 (3) 添 加 代 码 : 为 了 对 三 种 不 同 作 用 域 的 变 量 进 行 比 较, 我 们 定 义 了 四 个 字 符 串 型 变 量 : var1: 局 部 变 量, 在 form1 的 Form_Load 过 程 中 声 明 var2: 窗 体 级 变 量, 在 form1 的 通 用 声 明 中 声 明, 使 用 private 关 键 字 var3: 窗 体 级 变 量, 在 form1 的 通 用 声 明 中 声 明, 使 用 public 关 键 字 var4: 全 局 变 量, 在 模 块 module1 中 声 明, 使 用 public 关 键 字 为 了 测 试 各 个 变 量, 我 们 分 别 在 form1 及 form2 四 个 命 令 按 钮 的 click 事 件 过 程 中 用 MsgBox 语 句 显 示 变 量 的 值 模 块 module1 代 码 : Public var4 As String 窗 体 Form1 代 码 :

66 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 53 Private var2 As String Public var3 As String Private Sub Command1_Click() MsgBox var1 Private Sub Command2_Click() MsgBox var2 Private Sub Command3_Click() MsgBox var3 Private Sub Command4_Click() MsgBox var4 Private Sub Form_Load() Dim var1 As String Form2.Show ' 显 示 窗 体 form2 var1 = " 这 是 过 程 级 局 部 变 量 " var2 = " 这 是 模 块 级 私 有 变 量 " var3 = " 这 是 模 块 级 公 有 变 量 " var4 = " 这 是 工 程 级 公 有 变 量 " 窗 体 form2 代 码 : Private Sub Command1_Click() MsgBox var1 Private Sub Command2_Click() MsgBox var2 Private Sub Command3_Click() MsgBox var3 Private Sub Command4_Click() MsgBox var4 (4) 运 行 程 序 运 行 程 序 后 将 同 时 显 示 两 个 窗 体 form1 及 form2, 在 两 窗 体 中 分 别 单 击 各 命 令 按 钮, 若 MsgBox 显 示 的 字 符 串 值 不 为 空, 则 变 量 在 当 前 事 件 过 程 有 效 请 读 者 分 析 程 序 的 运 行 结 果 注 意 :

67 54 Visual Basic 程 序 设 计 教 程 (1) 本 例 中 尽 管 var3 在 声 明 中 使 用 了 public 关 键 字, 但 由 于 是 在 form1 的 通 用 声 明 中 声 明 的, 它 依 然 只 能 在 form1 中 起 作 用 (2) 如 果 往 程 序 中 添 加 了 Option Explicit 语 句, 即 采 用 强 制 显 式 声 明, 上 述 程 序 会 产 生 出 错 信 息, 原 因 是 部 分 事 件 过 程 中 未 经 声 明 便 使 用 某 个 变 量 4. 变 量 的 生 存 期 变 量 的 生 存 期 是 指 变 量 在 一 定 的 期 限 内 可 以 维 持 其 数 值 的 周 期 声 明 为 Public 的 变 量 在 整 个 应 用 程 序 的 运 行 期 间 都 有 效, 而 用 Dim 或 Private 声 明 的 局 部 变 量, 只 有 在 声 明 的 过 程 存 活 期 间 存 在, 过 程 结 束 时, 局 部 变 量 即 消 失 当 再 次 调 用 过 程 时, 该 局 部 变 量 重 新 生 成 并 初 始 化 用 Private 生 成 的 模 块 级 变 量 只 在 模 块 存 活 期 有 效 当 需 要 保 留 局 部 变 量 的 值 时, 可 将 其 定 义 为 静 态 的 采 用 Static 关 键 字 来 定 义 静 态 变 量 为 了 使 过 程 中 所 有 的 局 部 变 量 为 静 态 变 量, 可 在 过 程 的 起 始 处 加 上 Static 关 键 字, 例 如 : Static Sub NumAdd() Static Function Calcular(InputDate As Double)As Double 定 义 了 过 程 的 静 态 变 量 之 后, 过 程 中 的 所 有 局 部 变 量 都 成 为 静 态 局 部 变 量, 而 不 管 在 过 程 中 它 们 是 如 何 声 明 的 例 4.2 变 量 的 生 存 期 测 试 本 例 旨 在 比 较 静 态 局 部 变 量 与 非 静 态 局 部 变 量 的 异 同 编 写 应 用 程 序 的 方 法 如 下 : (1) 新 建 工 程, 设 计 窗 体 往 窗 体 中 添 加 一 个 命 令 按 钮 两 个 文 本 框 及 两 个 标 签 控 件, 设 计 时 窗 体 如 图 4.4 所 示 图 4.4 设 计 阶 段 窗 体 (2) 编 写 Command1 的 click 事 件 过 程 : Private Sub Command1_Click() Static var1 As Integer Dim var2 As Integer var1 = var1 + 1 var2 = var2 + 1 Text1.Text = var1 ' 显 示 var1 的 值 Text2.Text = var2 ' 显 示 var2 的 值 (3) 运 行 程 序, 对 比 单 击 Command1 后 var1 var2 变 化 的 不 同, 图 4.5 及 图 4.6 反 映 了 它 们 的 相 异 之 处 : 第 一 次 单 击 Command1 的 时 候,var1 var2 同 为 1, 再 次 单 击 Command1 后 var1 变 成 2, 而 var2 不 变 这 说 明 了 var1 的 值 可 以 累 加 下 去, 每 次 单 击 Command1 时 将

68 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 55 以 前 的 值 加 1; 而 var2 的 值 每 次 单 击 Command1 时 先 清 0 再 加 1 图 4.5 程 序 运 行 界 面 1 图 4.6 程 序 运 行 界 面 运 算 符 和 表 达 式 表 达 式 是 常 量 变 量 函 数 等 运 算 对 象 和 运 算 符 以 及 括 号 的 有 意 义 组 合 VB 的 运 算 符 有 算 术 运 算 符 连 接 运 算 符 关 系 运 算 符 和 逻 辑 运 算 符 表 达 式 按 其 所 含 运 算 符 和 运 算 对 象 的 不 同, 可 分 为 算 术 表 达 式 关 系 表 达 式 逻 辑 表 达 式 和 字 符 串 表 达 式 等 算 术 运 算 符 和 算 术 表 达 式 1. 算 术 运 算 符 算 术 运 算 符 是 常 用 的 运 算 符, 用 来 执 行 简 单 的 算 术 运 算 VB 中 的 算 术 运 算 符 有 如 下 几 种 : + 加 - 减 * 乘 / 除 ^ 幂 运 算 - 负 号 \ 整 除 Mod 取 模 根 据 参 与 运 算 的 运 算 对 象 ( 运 算 数 ) 的 多 少, 把 运 算 符 分 为 单 目 运 算 符 双 目 运 算 符 和 多 目 运 算 符 等 在 算 术 运 算 符 中, 除 负 号 ( -) 是 单 目 运 算 符 外, 其 他 均 为 双 目 运 算 符 加 (+) 减 (-) 乘 (*) 负 号 (-) 等 几 个 运 算 符 的 含 义 与 数 学 中 表 示 的 基 本 相 同, 下 面 介 绍 其 他 几 个 运 算 符 的 操 作 (1) 浮 点 数 除 法 : 浮 点 数 除 法 运 算 符 (/) 执 行 标 准 除 法 运 算, 其 结 果 为 浮 点 数 例 如, 表 达 式 3/2 的 结 果 为 1.5, 与 数 学 中 的 除 法 一 样 (2) 整 数 除 法 : 整 数 除 法 运 算 符 (\) 执 行 整 除 运 算, 其 结 果 为 整 型 值 例 如, 表 达 式 3\2 的 结 果 为 1 整 除 的 操 作 数 一 般 为 整 型 值 当 操 作 数 带 有 小 数 时, 将 首 先 对 其 四 舍 五 入 为 整 型 数, 然 后 进 行 整 除 运 算 例 如,28.72\7.83 的 结 果 为 3 (3) 取 模 运 算 : 取 模 运 算 符 Mod 用 于 求 余 数, 其 结 果 为 第 一 个 操 作 数 整 除 第 二 个 操 作 数 所 得 的 余 数 当 操 作 数 为 实 数 时, 将 首 先 对 其 四 舍 五 入 为 整 型 数 后 再 进 行 求 余 数 例 如,7 Mod 4 的 结 果 为 3,

69 56 Visual Basic 程 序 设 计 教 程 Mod 6.99 的 结 果 为 5 (4) 幂 运 算 : 幂 运 算 用 来 计 算 指 数 和 方 根, 其 运 算 符 为 ^ 例 如,2^3=8,25^(1/2)=5 注 意, 当 指 数 是 一 个 表 达 式 时, 必 须 加 上 括 号 例 如,x 的 a+b 次 方, 必 须 写 作 x^(a+b), 不 能 写 成 x^a+b, 因 为 ^ 的 优 先 级 比 + 高 2. 算 术 表 达 式 算 术 表 达 式 由 算 术 型 常 数 变 量 函 数 算 术 运 算 符 及 圆 括 号 组 成 在 计 算 算 术 表 达 式 的 值 时, 因 为 算 术 表 达 式 中 包 含 各 种 算 术 运 算 符, 所 以 规 定 各 个 算 术 运 算 符 的 先 后 次 序, 即 算 术 运 算 符 的 优 先 级 VB 中 的 算 术 运 算 符 的 优 先 级 见 表 4.2 表 4.2 算 术 运 算 符 的 优 先 级 ( 从 高 到 低 ) 优 先 级 运 算 符 名 称 运 算 符 说 明 1 括 号 ( ) 2 指 数 运 算 符 ^ 3 负 号 运 算 符 - 4 乘 除 运 算 符 * / 同 级 运 算, 运 算 次 序 从 左 到 右 5 整 除 运 算 符 \ 6 取 模 运 算 符 Mod 7 加 减 运 算 符 + - 同 级 运 算, 运 算 次 序 从 左 到 右 例 如,10 Mod 6/2 的 运 算 顺 序 为 : 先 做 6/2, 结 果 为 3, 然 后 再 做 10 Mod 3, 结 果 为 1 因 为 除 法 运 算 符 / 高 于 取 模 运 算 符 Mod 另 外, 在 书 写 算 术 表 达 式 时, 还 应 注 意 如 下 书 写 规 则 : (1) 将 一 个 数 学 算 式 书 写 为 一 个 算 术 表 达 式 时, 应 将 数 学 算 式 中 的 所 有 符 号 写 在 同 一 行 上, 必 要 时 加 圆 括 号 ; (2) 在 一 个 算 术 表 达 式 中 出 现 的 括 号 应 全 部 是 圆 括 号, 且 必 须 配 对 使 用 ; (3) 在 一 个 算 术 表 达 式 中, 乘 号 * 既 不 能 省 略, 也 不 能 用 代 替 ; (4) 将 一 个 数 学 算 式 写 成 算 术 表 达 式 时, 应 将 数 学 算 式 中 的 某 些 符 号 ( 比 如 π θ ω 等 ) 用 VB 中 认 可 的 其 他 变 量 名 来 代 替 例 如, 应 将 π 改 写 成 pi 或 其 他 变 量 名,θ 改 写 成 theta 或 其 他 变 量 名 b + 例 如, 数 学 算 式 b 2 4ac 应 写 成 (-b+sqr(b*b-4*a*c))/(2*a), 其 中 Sqr 为 求 平 方 根 的 2a 函 数 名 连 接 运 算 符 和 字 符 串 表 达 式 1. 字 符 串 连 接 运 算 符 将 两 个 或 多 个 字 符 串 连 接 起 来 可 以 用 字 符 串 连 接 运 算 符 & 或 +, 生 成 一 个 新 的 字 符 串 例 如,"Visual" & " Basic" + " 6.0" 的 结 果 为 "Visual Basic 6.0" 2. 字 符 串 表 达 式

70 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 57 字 符 串 表 达 式 由 字 符 型 常 数 变 量 函 数 和 字 符 串 运 算 符 组 成 他 们 可 以 是 一 个 简 单 字 符 串 常 量, 也 可 以 是 若 干 个 字 符 串 常 量 或 字 符 串 变 量 等 的 组 合 关 系 运 算 符 和 关 系 表 达 式 1. 关 系 运 算 符 VB 中 的 关 系 运 算 符 有 如 下 六 种 : = ( 等 于 ) > ( 大 于 ) < ( 小 于 ) <> ( 不 等 于 ) <= ( 小 于 等 于 ) >= ( 大 于 等 于 ) 2. 关 系 表 达 式 用 关 系 运 算 符 连 接 两 个 算 术 表 达 式 所 组 成 的 有 意 义 的 式 子 称 为 关 系 表 达 式 例 如, "Basic">" BasIC",a-b=0 等 3. 运 算 结 果 关 系 表 达 式 的 运 算 结 果 是 一 个 Boolean 类 型 的 值, 即 True 或 False VB 把 任 何 非 零 值 都 认 为 是 真, 但 一 般 以 -1 表 示 真,0 表 示 假 例 如, 对 于 a-b=0, 当 a=b 时, 结 果 为 True(-1), 否 则 为 False(0) 4. 说 明 (1) 用 关 系 运 算 符 既 可 以 进 行 数 值 的 比 较, 也 可 以 进 行 字 符 串 的 比 较 (2) 当 对 单 精 度 数 或 双 精 度 数 使 用 比 较 运 算 符 时, 必 须 特 别 小 心, 运 算 可 能 会 给 出 非 常 接 近 但 不 相 等 的 结 果 例 如,1.0/3.0*3.0=1.0, 在 数 学 上 显 然 是 一 个 恒 等 式, 但 在 计 算 机 上 执 行 时 可 能 会 给 出 一 个 假 值 (0) 因 此, 应 避 免 对 两 个 浮 点 数 作 相 等 或 不 相 等 的 判 别 上 式 可 改 为 : Abs(1.0/3.0* )<ε (Abs 是 求 绝 对 值 函 数,ε 可 取 1e-5) 只 要 它 们 的 差 小 于 一 个 很 小 的 数 ε, 就 认 为 1.0/3.0*3.0 与 1.0 相 等 (3) 数 学 上 判 断 x 是 否 在 区 间 [a,b] 时, 习 惯 上 写 成 a x b, 但 在 Visual Basic 中 不 能 写 成 a<=x<=b, 应 写 成 x>=a And x<=b, 其 中 And 是 下 面 将 要 介 绍 到 的 逻 辑 运 算 符 逻 辑 运 算 符 和 逻 辑 表 达 式 1. 逻 辑 运 算 符 逻 辑 运 算 也 称 布 尔 运 算 VB 中 的 逻 辑 运 算 符 有 如 下 六 种 : Not ( 非 ) And ( 与 ) Or ( 或 ) Xor ( 异 或 ) Eqv ( 等 价 ) Imp ( 蕴 含 ) 以 下 分 别 介 绍 这 几 种 运 算 符 : (1)Not: 逻 辑 非, 即 对 逻 辑 值 取 反 例 如 : 3<5 ' 表 达 式 值 为 真 Not 3<5 ' 取 反, 表 达 式 值 为 假 (2)And: 逻 辑 与 两 个 表 达 式 的 值 均 为 真, 则 结 果 为 真, 如 果 有 任 一 个 表 达 式 值 为 假, 则 结 果 为 假 其 运 算 规 则 如 表 4.3

71 58 Visual Basic 程 序 设 计 教 程 表 4.3 And 运 算 规 则 表 例 如 :3<5 And 4<3 第 一 操 作 符 第 二 操 作 符 操 作 结 果 True True True True False False False True False False False False 第 一 个 表 达 式 结 果 为 真, 第 二 个 表 达 式 结 果 为 假, 则 And 操 作 结 果 为 假 (3)Or: 逻 辑 或 当 两 个 表 达 式 中 至 少 一 个 为 真 时, 结 果 为 真 运 算 规 则 如 表 4.4 表 4.4 Or 运 算 规 则 表 例 如 :3<5 Or 4<3 第 一 操 作 符 第 二 操 作 符 操 作 结 果 True True True True False True False True True False False False 第 一 个 表 达 式 结 果 为 真, 第 二 个 表 达 式 结 果 为 假, 则 Or 操 作 结 果 为 真 (4)Xor: 逻 辑 异 或 当 两 个 表 达 式 值 相 反 时, 结 果 为 真 运 算 规 则 如 表 4.5 表 4.5 Xor 运 算 规 则 表 例 如 :5/3>1 Xor 1<0 第 一 操 作 符 第 二 操 作 符 操 作 结 果 True True False True False True False True True False False False 第 一 个 表 达 式 结 果 为 真, 第 二 个 表 达 式 结 果 为 假, 则 Xor 操 作 结 果 为 真 (5)Eqv: 两 个 表 达 式 的 值 相 同 时, 结 果 为 真 运 算 规 则 如 表 4.6 表 4.6 Eqv 运 算 规 则 表 第 一 操 作 符 第 二 操 作 符 操 作 结 果 例 如 :3<2 Eqv(3-1)<0 True True True True False False False True False False False True 第 一 个 表 达 式 结 果 为 假, 第 二 个 表 达 式 结 果 也 为 假, 则 Eqv 操 作 结 果 为 真 (6)Imp: 比 较 两 个 表 达 式 当 第 一 个 表 达 式 为 假 或 第 二 个 表 达 式 为 真 时 操 作 结 果 为 真

72 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 59 运 算 规 则 如 表 4.7 表 4.7 Imp 运 算 规 则 表 例 如 :3<2 Imp 3>0 第 一 操 作 符 第 二 操 作 符 操 作 结 果 True True True True False False False True True False False True 第 一 个 表 达 式 结 果 为 假, 第 二 个 表 达 式 结 果 为 真, 则 Imp 操 作 结 果 为 真 逻 辑 运 算 符 的 优 先 级 由 高 到 低 如 下 : Not And Or Xor Eqv Imp 2. 逻 辑 表 达 式 用 逻 辑 运 算 符 连 接 两 个 或 多 个 关 系 式 组 成 一 个 逻 辑 表 达 式 例 如,x>=a And x<=b 就 是 一 个 逻 辑 表 达 式 3. 运 算 结 果 逻 辑 表 达 式 的 运 算 结 果 也 是 一 个 Boolean 类 型 的 值, 即 True 或 False VB 把 任 何 非 零 值 都 认 为 是 真, 但 一 般 以 -1 表 示 真,0 表 示 假 日 期 型 表 达 式 日 期 型 表 达 式 由 日 期 型 常 数 变 量 函 数 算 术 运 算 符 + - 和 算 术 表 达 式 组 成 日 期 型 数 据 之 间 只 能 进 行 加 减 运 算 由 数 字 符 号 (#) 所 包 围 的 具 有 有 效 格 式 的 字 符 序 列 为 日 期 文 字 有 效 的 格 式 包 括 区 域 设 置 中 指 定 的 日 期 格 式 或 国 际 日 期 格 式 例 如,#12/9/2002# 表 示 2002 年 12 月 9 日 有 两 种 情 况 : (1) 两 个 日 期 型 数 据 相 减, 结 果 是 一 个 数 值 型 数 据 ( 两 个 日 期 相 差 的 天 数 ) 例 如, #12/20/2002# - #12/10/2002# 的 结 果 为 数 值 型 数 据 10 (2) 一 个 表 示 天 数 的 数 值 型 数 据 与 日 期 型 数 据 相 加 减, 结 果 仍 为 日 期 型 数 据 例 如, #12/10/2002# +10 的 结 果 为 日 期 型 数 据 #12/20/2002#( 在 VB 中, 实 际 输 出 结 果 的 格 式 与 系 统 设 置 有 关 ) 各 种 运 算 符 的 优 先 级 比 较 一 个 表 达 式 可 能 含 有 多 种 运 算, 计 算 机 按 一 定 的 顺 序 对 表 达 式 求 值 一 般 顺 序 见 表 4.8 表 4.8 各 种 运 算 的 优 先 级 优 先 级 运 算 类 型 1 函 数 运 算 2 算 术 运 算 3 关 系 运 算 4 逻 辑 运 算

73 60 Visual Basic 程 序 设 计 教 程 需 要 说 明 的 是, 对 每 一 级 运 算 都 按 照 前 面 讲 到 的 运 算 符 的 运 算 次 序 进 行 运 算 所 有 同 一 级 运 算 符 都 是 从 左 到 右 进 行 的, 括 号 内 的 运 算 符 优 先 执 行, 有 多 层 括 号 时, 从 内 层 括 号 往 外 层 括 号 计 算 4.4 常 用 内 部 函 数 在 VB 中, 为 了 增 强 程 序 的 功 能, 我 们 经 常 要 调 用 系 统 提 供 的 函 数 这 些 函 数 可 以 分 为 以 下 几 类 : 数 学 函 数 数 据 类 型 转 换 函 数 字 符 处 理 函 数 和 日 期 时 间 函 数 下 面 我 们 就 来 分 门 别 类 地 介 绍 一 些 常 用 的 函 数 需 要 说 明 的 是,VB 为 我 们 提 供 了 不 少 内 部 函 数, 熟 记 几 个 常 用 的 函 数 是 很 有 必 要 的, 但 并 非 本 节 列 出 的 所 有 函 数 都 有 熟 记 的 必 要 更 多 的 时 候, 我 们 可 以 使 用 帮 助 系 统 或 语 言 参 考 手 册 查 找 所 需 要 的 函 数 数 学 函 数 在 这 一 节 中, 我 们 将 介 绍 一 些 常 用 的 数 学 函 数 :Int,Fix,Sqr,Abs,Rnd,Sgn,Hex, Oct,Exp,Sin,Cos,Tan,Atn 1. Int(x) 函 数 用 于 返 回 小 于 或 等 于 x 的 最 大 整 数 例 如, 当 x=97.33 时,Int(x)=97; 当 x= 时,Int(x)=23 它 具 有 以 下 的 作 用 : (1) 可 实 现 四 舍 五 入 ; (2) 决 定 两 个 数 是 否 能 够 整 除 ; (3) 求 商 和 余 数 ; (4) 判 断 一 个 数 是 否 为 整 数 2. Fix(x) 函 数 此 函 数 的 作 用 与 Int 函 数 类 似 当 x 为 正 数 时, 无 条 件 地 把 小 数 部 分 舍 掉 ; 当 x 为 负 数 时, 结 果 与 Int(x) 函 数 不 太 一 样 例 如, 当 x= 时,Int(x)=-24,Fix(x)= Abs(x) 函 数 此 函 数 可 用 来 求 x 的 绝 对 值 例 如, 当 x=123 时,Abs(x)=123; 当 x=-123 时,Abs(x)= Sqr(x) 函 数 此 函 数 用 来 求 x 的 平 方 根 注 意 :x 必 须 为 正 数, 否 则 就 会 产 生 语 法 错 误 5. Rnd(number) 函 数 此 函 数 用 来 返 回 0 和 1 之 间 的 随 机 数 参 数 number 的 取 值 可 以 小 于 0 大 于 0 和 等 于 0 当 number 小 于 0 时,Rnd 函 数 每 次 都 使 用 number 作 为 随 机 种 子, 得 到 相 同 的 结 果 ; 当 number 大 于 0 时,Rnd 函 数 形 成 随 机 序 列, 每 次 调 用 都 返 回 一 个 随 机 变 化 的 数 ; 当 number 等 于 0 时,Rnd 函 数 返 回 上 次 调 用 此 函 数 的 结

74 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 61 果 如 果 我 们 要 返 回 介 于 两 个 数 之 间 的 随 机 数, 可 用 如 下 的 语 句 : Int((upperbound - lowerbound + 1) * Rnd + lowerbound) 这 里,upperbound 是 随 机 数 范 围 的 上 限, 而 lowerbound 则 是 随 机 数 范 围 的 下 限 6. Sgn(x) 函 数 此 函 数 的 作 用 : 当 x 大 于 0 时, 返 回 1; 当 x 等 于 0 时, 返 回 0; 当 x 小 于 0 时, 返 回 Hex(x) 和 Hex$(x) 函 数 此 函 数 的 作 用 : (1) 传 回 x 所 代 表 的 16 进 制 数 ; (2)Hex(x) 返 回 数 值 类 型,Hex$(x) 返 回 字 符 串 类 型 8. Oct(x) 和 Oct$(x) 此 函 数 返 回 8 进 制 数 其 功 能 说 明 与 Hex(x) 完 全 相 同 9. Exp(x) 函 数 此 函 数 用 来 返 回 以 e 为 底 的 x 幂 值 10. Sin(x),Cos(x),Tan(x),Atn(x) 分 别 用 于 返 回 x 的 正 弦, 余 弦, 正 切, 反 正 切 值 例 4.3 用 数 学 函 数 实 现 四 舍 五 入 功 能 在 此 例 中, 我 们 将 创 建 两 个 文 本 框 在 一 个 文 本 框 中, 我 们 输 入 一 个 带 小 数 点 的 数 字, 在 另 一 个 文 本 框 中, 我 们 输 入 在 哪 一 位 进 行 舍 入 单 击 计 算 按 钮, 就 会 把 舍 入 后 的 结 果 显 示 在 Text1 中 在 此 例 中, 我 们 将 用 到 一 个 类 型 转 换 函 数 Val, 其 功 能 为 将 数 字 字 符 串 转 换 为 数 值 下 面 是 程 序 的 创 建 过 程 先 来 看 一 看 程 序 的 外 形, 如 图 4.7 所 示 在 计 算 按 钮 的 单 击 事 件 中, 先 判 断 各 个 文 本 框 是 否 都 输 入 了 必 要 的 数 据, 如 没 有, 显 示 提 示 信 息 若 输 入 完 整, 执 行 舍 入 操 作 计 算 按 钮 的 Click 过 程 如 下 : Private Sub Command1_Click() Dim num1 As Long Dim num2 As Integer If Text1.Text <> "" And Text2.Text <> "" Then num1 = Val(Text1.Text) num2 = Val(Text2.Text) Text1.Text = (Int(num1 * 10 ^ num )) / 10 ^ num2 Else MsgBox (" 请 输 入 所 有 的 数 值 ") End If 此 例 的 技 巧 在 于 : 先 把 要 舍 入 的 那 一 位 变 换 为 小 数 点 后 的 第 一 位, 将 此 数 加 上 0.5 实 质 为 四 舍 五 入, 因 为 我 们 接 着 使 用 Int 函 数 将 此 数 的 小 数 部 分 舍 掉, 然 后 再 还 原 成 原 数

75 62 Visual Basic 程 序 设 计 教 程 图 4.7 四 舍 五 入 数 据 类 型 转 换 函 数 在 VB 编 程 中, 经 常 要 进 行 数 据 类 型 的 转 换, 我 们 可 以 利 用 表 4.9 所 示 的 函 数 表 4.9 数 据 类 型 转 换 函 数 函 数 说 明 函 数 说 明 CCur( 表 达 式 ) 转 为 Current 类 型 CSng( 表 达 式 ) 转 为 Single 类 型 CDbl( 表 达 式 ) 转 为 Double 类 型 CStr( 表 达 式 ) 转 为 String 类 型 CInt( 表 达 式 ) 转 为 Integer 类 型 CVar( 表 达 式 ) 转 为 Variant 类 型 CLng( 表 达 式 ) 转 为 Long 类 型 我 们 再 来 介 绍 一 个 有 用 的 函 数 VarType 此 函 数 用 来 返 回 变 体 类 型 变 量 所 存 放 数 据 的 数 据 类 型 变 量 类 型 值 如 表 4.10 所 示 表 4.10 变 量 的 数 据 类 型 的 值 类 型 值 类 型 值 Empty 0 Double 5 Null 1 Currency 6 Integer 2 Date 7 Long 3 String 8 Single 字 符 处 理 函 数 在 这 里, 我 们 将 介 绍 一 系 列 的 字 符 处 理 函 数 :Chr,Asc,String,Len,Left,Right,Mid, Lcase,Ucase,Ltrim,Rtrim,Trim,Str,Val,InStr,StrComp 1. Chr[$]( 数 值 ) 函 数 此 函 数 返 回 ANSI 码 的 对 应 字 符 说 明 : (1) 数 值 范 围 在 0 到 255 之 间 ; (2)Chr() 返 回 的 是 数 值 类 型, 而 Chr$() 则 返 回 字 符 类 型 ; (3)ANSI 码 是 ASCII 码 的 扩 充, 其 前 128 个 字 符 都 与 ASCII 码 相 同 例 如, 我 们 常 用 以 下 的 表 达 式 组 成 回 车 换 行 符 :

76 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 63 Chr(13)+Chr(10) 2. Asc( 字 符 ) 函 数 此 函 数 用 来 返 回 字 符 的 ANSI 码 值 说 明 : 若 输 入 为 一 字 符 串, 则 只 返 回 第 一 个 字 符 的 ASCII 码 值 例 如, 当 x=asc( a ) 时,x=97; 当 x=asc( ab ) 时,x=97 3. String[$]( 个 数, 字 符 ) 此 函 数 用 于 重 复 某 一 个 字 符 说 明 : (1) 个 数 用 来 指 定 重 复 的 次 数 ; (2) 若 字 符 为 一 字 符 串, 则 只 重 复 复 制 第 一 个 字 符 例 如, 当 x= String$(5, "abc") 时, 则 x="aaaaa" 4. Len( 字 符 串 ) 此 函 数 用 于 返 回 字 符 串 的 长 度 5. Left[$]( 字 符 串, 字 符 个 数 ) 此 函 数 用 于 返 回 字 符 串 最 左 边 的 长 度 为 字 符 个 数 的 字 符 串 例 如 : Dim substr As String substr=left("visual Basic",6) 则 substr="visual" 6. Right[$]( 字 符 串, 字 符 个 数 ) 此 函 数 用 于 返 回 字 符 串 最 右 边 的 长 度 为 字 符 个 数 的 字 符 串 例 如 : Dim substr As String substr=right("visual Basic",5) 则 substr="basic" 7. Mid[$]( 字 符 串, 起 始 位 置,[ 字 符 个 数 ]) 此 函 数 用 于 返 回 一 个 子 字 符 串 说 明 : (1) 子 字 符 串 从 起 始 位 置 开 始, 以 字 符 个 数 为 长 度 ; (2) 若 省 略 字 符 个 数, 则 从 起 始 位 置 到 字 符 串 的 结 尾 8. Lcase( 字 符 串 ) 和 Ucase( 字 符 串 ) Lcase: 不 论 字 符 串 中 的 字 符 为 大 写 还 是 小 写, 一 律 输 出 为 小 写 Ucase: 不 论 字 符 串 中 的 字 符 为 大 写 还 是 小 写, 一 律 输 出 为 大 写 9. Ltrim( 字 符 串 ) Rtrim( 字 符 串 ) Trim( 字 符 串 ) Ltrim( 字 符 串 ): 用 于 去 掉 字 符 串 中 左 边 的 空 格 Rtrim( 字 符 串 ): 用 于 去 掉 字 符 串 中 右 边 的 空 格 Trim( 字 符 串 ): 用 于 去 掉 字 符 串 中 左 右 两 边 的 空 格 10. Str( 数 值 ) 和 Val( 字 符 串 ) Str( 数 值 ): 用 于 将 数 字 转 化 为 字 符 串

77 64 Visual Basic 程 序 设 计 教 程 Val( 字 符 串 ): 用 于 将 字 符 串 转 化 为 数 值 例 如 : Dim a As String Dim b As Long a=str(34.56) b=val("234.56") 则 a= 34.56,b= InStr([ 起 始 位 置,] 字 符 串 1, 字 符 串 2 [, 比 较 模 式 ]) 此 函 数 用 来 在 字 符 串 1 中 查 找 字 符 串 2 说 明 : (1) 从 字 符 串 1 的 起 始 位 置 处 开 始 查 找 字 符 串 2, 如 果 找 到 字 符 串 2, 则 返 回 字 符 串 2 在 字 符 串 1 中 的 起 始 位 置 ; (2) 比 较 模 式 可 以 为 0 或 1, 为 1 时, 比 较 时 不 区 分 大 小 写 ; 为 0 时, 区 分 大 小 写 VB 的 默 认 设 置 为 0 (3) 若 指 定 了 比 较 模 式, 则 必 须 指 定 起 始 位 置, 否 则 就 会 出 现 语 法 错 误 12. StrComp( 字 符 串 1, 字 符 串 2, 比 较 模 式 ) 此 函 数 用 于 对 两 个 字 符 串 进 行 比 较 说 明 : (1) 若 字 符 串 1 小 于 字 符 串 2, 则 返 回 -1; (2) 若 字 符 串 1 大 于 字 符 串 2, 则 返 回 1; (3) 若 字 符 串 1 等 于 字 符 串 2, 则 返 回 0; (4) 比 较 模 式 可 以 为 0 或 1 为 1 时, 比 较 不 区 分 大 小 写 ; 为 0 时, 区 分 大 小 写 VB 的 默 认 设 置 为 0 (5) 字 符 的 比 较 是 从 第 一 个 字 符 开 始 逐 一 比 较, 若 出 现 不 匹 配 字 符, 则 终 止 比 较, 返 回 比 较 的 结 果 例 4.4 用 字 符 处 理 函 数 实 现 替 换 功 能 在 此 例 中, 我 们 创 建 一 个 文 本 框 和 一 个 命 令 按 钮 替 换 单 击 此 按 钮, 将 弹 出 两 个 对 话 框, 分 别 用 于 输 入 要 在 文 本 框 中 搜 索 的 内 容 和 要 用 于 替 换 的 内 容, 然 后 执 行 替 换 操 作, 此 操 作 为 全 部 替 换, 并 且 不 区 分 大 小 写 下 面 是 程 序 的 过 程, 先 来 看 一 看 程 序 的 外 形, 如 图 4.8 图 4.8 替 换 我 们 创 建 一 文 本 框, 具 有 多 行 能 力 和 垂 直 滚 动 条 然 后 在 替 换 按 钮 的 单 击 事 件 中,

78 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 65 首 先 显 示 两 个 输 入 对 话 框, 分 别 用 于 输 入 查 找 的 内 容 和 替 换 的 内 容, 当 输 入 的 查 找 内 容 为 空 时, 用 Exit Sub 语 句 提 前 跳 出 过 程, 不 再 执 行 以 下 的 语 句 ( 这 也 是 一 项 保 护 措 施 ) 然 后, 利 用 VB 提 供 的 查 找 函 数 InStr 进 行 查 找 若 找 到 匹 配 的 字 符, 则 使 用 Left 和 Mid 函 数 将 Text1 的 文 字 除 当 前 被 找 到 的 字 符 在 外 的 字 符 提 取 出 来, 再 和 替 换 字 符 进 行 合 并 ( 使 用 &) 然 后, 再 利 用 Goto 语 句 继 续 下 一 次 查 找, 直 到 文 字 的 结 尾 Private Sub Command1_Click() Dim num As Integer str1 = InputBox(" 请 输 入 查 找 内 容 :") If str1 = "" Then Exit Sub str2 = InputBox(" 请 输 入 替 换 内 容 :") num = 1 zly: num = InStr(num, Text1.Text, str1) If num <> 0 Then txt = Left(Text1.Text, num) & str2 & Mid(Text1.Text, num + Len(str1)) Text1.Text = txt num = num + Len(str2) GoTo zly End If 说 明 : (1) 此 例 中, 我 们 巧 妙 地 利 用 num 值 在 查 找 前 后 的 变 化, 实 现 了 继 续 查 找 和 全 部 替 换 ; (2) 在 使 用 InStr 函 数 设 置 起 始 字 符 时, 切 记 是 从 1 开 始, 而 不 是 从 0 开 始 日 期 时 间 函 数 在 这 里, 我 们 将 介 绍 一 些 常 用 的 时 间 函 数 :Now,Date,Time,Timer,DateSerial,TimeSerial, DateValue,TimeValue,Year,Month,Day,Hour,Minute,Second,DatePart,DateAdd, DateDiff 1. Now 函 数 此 函 数 用 来 返 回 目 前 的 时 间 和 日 期 例 如 : Dim now_ As String now_=now 则 now_ 的 结 果 为 :35:14 2. Date 函 数 此 函 数 可 以 返 回 目 前 的 日 期 例 如 : Dim date_ As String date_=date

79 66 Visual Basic 程 序 设 计 教 程 则 会 返 回 当 前 的 日 期 我 们 用 以 下 的 形 式 设 置 当 前 的 日 期 (Date 语 句 ): Date =# 字 符 串 # 其 中, 字 符 串 的 格 式 为 mm-dd-yy,mm-dd-yyyy,mm/dd/yy 和 mm/dd/yyyy 等, 其 中 mm 表 示 月 份, 从 01 到 12,dd 表 示 日 期, 从 01 到 31,yyyy 表 示 年 份, 若 为 yy, 则 从 00 到 Time 函 数 此 函 数 可 以 返 回 目 前 的 时 间, 其 使 用 的 方 法 与 Date 函 数 相 同 也 可 以 使 用 Time 语 句 设 置 系 统 的 时 间, 设 置 当 前 时 间 的 字 符 串 的 格 式 为 : hh:mm[am PM] 或 hh:mm:ss[am PM] 4. Timer 函 数 此 函 数 用 来 返 回 从 午 夜 12:00 到 现 在 所 经 历 的 时 间, 以 秒 数 计 通 过 计 算 程 序 执 行 前 后 的 时 间 差, 我 们 可 以 计 算 程 序 执 行 所 需 的 秒 数 5. DateSerial 函 数 此 函 数 用 来 返 回 相 对 日 期, 并 且 系 统 会 自 动 考 虑 闰 年, 其 具 体 用 法 为 : DateSerial(year, month, day) 例 如, 我 们 要 计 算 2002 年 11 月 11 日 的 前 100 天 的 日 期, 可 用 如 下 的 语 句 : DateSerial(2002, 11, ) 6. TimeSerial 函 数 此 函 数 用 来 返 回 相 对 时 间, 其 使 用 方 法 与 DateSerial 相 同 7. DateValue( 字 符 串 ) 此 函 数 返 回 一 个 日 期 型 的 变 量 例 如 : Dim mm As Date Mm=DateValue("11/11/02") 则 mm 的 结 果 为 ( 为 一 个 日 期 型 变 量 ) 8. TimeValue( 字 符 串 ) 此 函 数 返 回 一 个 时 间 型 的 变 量, 其 用 法 与 DateValue 的 用 法 相 同 9. Year,Month,Day,Hour,Minute,Second 分 别 用 于 返 回 日 期 参 数 的 年 月 日 小 时 分 钟 秒 其 中 小 时 使 用 24 小 时 制 例 如 : Dim MyTime, MyHour MyTime = #4:35:17 PM# ' 指 定 一 时 间 MyHour = Hour(MyTime) ' MyHour 的 值 为 16 习 题 1. VB 变 量 的 基 本 数 据 类 型 有 几 种? 如 何 定 义 变 量 的 数 据 类 型? 用 户 如 何 定 义 自 己 所 需 要 的 数 据 类 型? 2. 符 号 常 量 与 变 量 有 何 区 别? 如 何 定 义 符 号 常 量? 一 般 在 什 么 情 况 下 使 用 符 号 常 量? 3. 下 面 列 出 的 字 符 串 中, 哪 些 可 以 作 为 VB 的 变 量 名, 哪 些 不 行?

80 第 4 章 VB 数 据 类 型 运 算 符 和 表 达 式 67 VisualBasic 1ABC Legend Y2003 X.1 Print Pi+π α β LY_zheng Abs Read$ Epson 4. 下 列 各 数 中 哪 些 是 符 合 VB 标 准 的 常 数, 它 们 各 属 于 哪 种 类 型? 255 "upc" e # &HFF &O 377& 67.83e D+100 1EO True #1/1/2000# 5. 写 出 下 列 算 式 的 VB 表 达 式 : 2 (1) π θ 2 c d (2) a x + b x+ 2 b (3) sin( x + π)(cos x 1) (4)( 2x a)(3y + b) 2 (5)( a + b) β (6) ae x ln y a+ b (7) b c 1 2d (8) 3 2 x + x 用 VB 表 达 式 表 示 下 列 各 题 : (1)A+B 大 于 5.0 且 A 不 大 于 B; (2) 整 数 A 和 B 之 一 为 0, 但 不 同 时 为 0; (3)A,B 均 大 于 0; (4)A 不 能 被 B 整 除 ; (5)A 为 非 负 数,B 为 整 数 ; (6)A,B,C 中 任 意 两 个 数 的 和 大 于 第 三 个 数 ; (7) 产 生 一 个 介 于 [10,40] 间 的 随 机 整 数 ; (8) 将 一 个 两 位 整 数 的 个 位 数 和 十 位 数 互 换 ; (9) 将 一 个 单 精 度 浮 点 型 变 量 A 的 值 留 取 三 位 小 数 ; (10) 将 一 个 字 符 串 Visual Basic 右 边 的 5 个 字 符 取 出 来 合 并 到 字 符 串 Visual 的 后 面 7. 计 算 下 列 表 达 式 的 值 : (1)4/2*3.5/3.5 (2)2.75 * 2 \ 3.45 (3)6\3*2.0^2/0.8 (4)(6\3)*2.0^2/0.8 (5)30 / 3 Mod 4 \ 2 * Int(2.5) (6)" Visual"+" Basic" (7)2>3 And 4<=5 Or 4>4 (8)True Or Not (5>=5) (9)3>2*2 Or 2=4 And 3<>4 Or 7>8 (10)Not 2<=3 Or 3*4=4^2 And 2<> 假 设 a,b,c 为 Boolean 型 变 量, 其 值 依 次 为 :-1,-1,0 计 算 下 列 表 达 式 的 值 : (1)a Or b And c (2)Not a And Not b (3)Not a Eqv Not b (4)a Xor b Or c (5)(Not a Or b) And (b Or c) (6)Not a And b Imp c

81 第 5 章 顺 序 结 构 程 序 设 计 在 学 习 了 Visual Basic 的 常 用 控 件 数 据 类 型 和 表 达 式 的 内 容 之 后, 我 们 已 经 知 道 Visual Basic 是 靠 事 件 驱 动 程 序 的 工 作 方 式 来 完 成 指 定 的 任 务 不 管 每 个 控 件 所 对 应 事 件 过 程 的 代 码 是 简 单 还 是 复 杂, 其 编 程 思 路 仍 遵 循 结 构 化 程 序 设 计 的 方 法 结 构 化 程 序 设 计 方 法 有 三 种 基 本 结 构, 它 们 是 顺 序 结 构 选 择 结 构 和 循 环 结 构 这 三 种 基 本 结 构 具 有 单 入 口 单 出 口 的 特 点, 各 种 不 同 的 程 序 结 构 就 是 由 若 干 基 本 结 构 构 成 的 本 章 和 后 续 几 章 将 介 绍 与 三 种 基 本 结 构 有 关 的 语 句 和 方 法 5.1 语 句 赋 值 语 句 1. 赋 值 语 句 的 格 式 [Let] 变 量 或 属 性 名 = 变 量 或 属 性 的 值 例 如, 给 整 型 变 量 x 赋 值 67: Dim x As Integer Let x = 67 例 如, 给 文 本 框 的 Text 属 性 赋 值 " 欢 迎 使 用 Visual Basic6.0!": Text1.Text = " 欢 迎 使 用 Visual Basic6.0!" 2. 赋 值 语 句 的 功 能 赋 值 语 句 用 于 将 = 右 边 表 达 式 的 值 赋 给 左 边 的 变 量 或 属 性 名 3. 注 意 事 项 (1) 在 赋 值 语 句 中, = 是 赋 值 号, 要 把 数 学 上 的 等 号 与 逻 辑 运 算 符 中 的 = 区 分 开 ; (2) 赋 值 语 句 兼 有 计 算 和 赋 值 双 重 功 能, 首 先 计 算 = 右 边 表 达 式 的 值, 然 后 把 结 果 赋 给 左 边 的 变 量 或 属 性 名 ; (3) = 右 边 表 达 式 的 值 的 类 型 与 = 左 边 的 变 量 或 属 性 名 的 类 型 必 须 一 致, 否 则 会 强 制 将 = 右 边 表 达 式 的 值 转 换 为 = 左 边 的 变 量 或 属 性 名 的 数 值 类 型 ; (4) 不 能 将 字 符 串 表 达 式 的 值 赋 给 数 值 变 量, 否 则 在 编 译 时 会 出 现 错 误, 反 之 亦 然 但 是 可 以 将 字 符 串 或 数 值 表 达 式 赋 给 Variant 变 量 ; (5) 如 前 所 述,Visual Basic 的 语 句 通 常 按 一 行 一 句 的 规 则 书 写, 但 也 允 许 多 个 语 句 放 在 一 行 中 在 这 种 情 况 下, 各 语 句 之 间 必 须 用 冒 号 隔 开 例 如 : a=3:b=2:c=1 在 一 行 中 有 三 个 语 句 这 样 的 语 句 行 称 为 复 合 语 句 行 复 合 语 句 行 中 的 语 句 可 以 是 赋 值 语 句, 也 可 以 是 其 他 任 何 有 效 的 Visual Basic 语 句 但 是, 如 果 含 有 注 释 语 句, 则 它 必 须 是 复 合 语 句 行 的 最 后 一 个 语 句

82 第 5 章 顺 序 结 构 程 序 设 计 69 VB 允 许 用 续 行 符 ( 空 格 后 面 跟 一 个 下 划 线 ) 将 一 个 较 长 的 语 句 分 成 若 干 行, 例 如 : Msg = "This is Visual " _ "Basic" 例 5.1 已 知 弓 形 的 面 积 计 算 公 式 : s = 1 r 2 ( θ sin ) 2 θ 其 中,r 为 半 径,θ 为 圆 心 角 ( 弧 度 ) 请 计 算 半 径 为 5cm 圆 心 角 为 70 度 的 弓 形 的 面 积 分 析 : 由 于 字 符 集 中 没 有 θ 字 符, 所 以 应 该 为 公 式 中 的 θ 定 义 一 个 标 识 符 根 据 θ 的 发 音 定 义 标 识 符 为 theta 此 例 中, 我 们 创 建 三 个 文 本 框,Text1 用 于 输 入 半 径 的 值,Text2 用 于 输 入 圆 心 角 的 值, Text3 用 于 输 出 面 积 的 值 ; 再 创 建 一 个 命 令 按 钮 : 计 算 当 用 户 输 入 半 径 完 毕 后 再 回 车, 窗 体 的 焦 点 将 落 到 Text2 文 本 框 内 ; 当 用 户 输 入 圆 心 角 完 毕 后 再 回 车, 窗 体 的 焦 点 将 落 到 命 令 按 钮 计 算 上 这 样, 用 户 不 必 使 用 Tab 键 或 鼠 标 就 可 以 通 过 按 回 车 键 进 行 下 一 步 操 作 了, 这 在 一 步 一 步 的 操 作 中 将 很 有 效 当 对 命 令 按 钮 计 算 按 回 车 键, 就 会 看 到 计 算 出 的 面 积 显 示 在 Text3 文 本 框 内 需 要 注 意 的 是, 当 程 序 运 行 时, 应 使 命 令 按 钮 计 算 的 Enabled 属 性 设 置 为 False, 读 者 可 以 体 会 这 样 做 的 目 的 下 面 是 程 序 的 创 建 过 程, 先 来 看 一 看 程 序 设 计 和 初 始 运 行 时 的 外 形, 如 图 5.1 图 5.2 所 示 图 5.1 程 序 设 计 时 的 外 形 图 5.2 程 序 初 始 运 行 时 的 外 形 设 置 各 控 件 的 属 性 如 下 : Label1: AutoSize= -1 'True Caption= " 请 输 入 半 径 r 的 值 :" Label2: AutoSize= -1 'True Caption= " 请 输 入 θ 的 值 :" Label3: AutoSize= -1 'True Caption= " 计 算 结 果 为 :" Command1: Caption= " 计 算 " 根 据 题 目 要 求, 编 写 各 控 件 的 编 码 如 下 : Private Sub Form_Load() Command1.Enabled = False ' 初 始 状 态 设 置 命 令 按 钮 为 不 可 用 Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then

83 70 Visual Basic 程 序 设 计 教 程 Text2.SetFocus End If Private Sub Text2_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then Command1.Enabled = True Command1.SetFocus End If Private Sub Command1_Click() Dim theta, s As Single theta = * Text2.Text / 180# s = 0.5 * Text1.Text * Text1.Text * (theta - Sin(theta)) Text3.Text = s 当 程 序 输 入 完 数 据 和 按 计 算 按 钮 时 的 外 形 如 图 所 示 图 5.3 程 序 输 入 数 据 未 计 算 时 的 外 形 图 5.4 按 计 算 按 钮 后 的 外 形 注 意 : 本 程 序 在 运 行 时 窗 体 的 焦 点 将 落 到 Text1 文 本 框 内, 当 用 户 输 入 半 径 完 毕 后, 如 果 直 接 将 鼠 标 点 在 Text2 文 本 框 内 而 不 按 回 车 键, 则 当 用 户 输 入 圆 心 角 后, 窗 体 的 焦 点 将 不 会 落 到 命 令 按 钮 计 算 上 ( 即 计 算 按 钮 呈 现 灰 色 显 示 ), 请 读 者 考 虑 如 何 修 改 上 述 代 码 来 实 现 该 功 能 注 释 暂 停 与 程 序 结 束 语 句 1. 注 释 语 句 为 了 提 高 程 序 的 可 读 性, 通 常 应 在 程 序 的 适 当 位 置 加 上 必 要 的 注 释 VB 提 供 了 两 种 方 法 来 添 加 注 释 (1)Rem 语 句 : 例 如 : Private Sub Form_Load()

84 第 5 章 顺 序 结 构 程 序 设 计 71 Command1.Enabled = False :Rem 初 始 状 态 设 置 命 令 按 钮 为 不 可 用 或 者 : Private Sub Form_Load() Rem 初 始 状 态 设 置 命 令 按 钮 为 不 可 用 Command1.Enabled = False (2) 单 引 号 ': 例 如 : Private Sub Form_Load() Command1.Enabled = False ' 初 始 状 态 设 置 命 令 按 钮 为 不 可 用 或 者 : Private Sub Form_Load() ' 初 始 状 态 设 置 命 令 按 钮 为 不 可 用 Command1.Enabled = False 2. 暂 停 语 句 (1) 一 般 形 式 : Stop (2) 说 明 : Stop 语 句 用 于 暂 停 程 序 的 执 行, 它 的 作 用 类 似 于 执 行 Run 菜 单 中 的 Break 命 令 当 执 行 Stop 语 句 时, 将 自 动 打 开 立 即 窗 口 该 语 句 不 清 除 内 存, 也 不 关 闭 任 何 文 件 Stop 语 句 的 主 要 作 用 是 把 解 释 程 序 设 置 为 中 断 (Break) 模 式, 以 便 对 程 序 进 行 检 查 和 调 试 一 旦 VB 应 用 程 序 通 过 编 译 并 能 运 行, 则 不 再 需 要 解 释 程 序 的 辅 助, 也 不 需 要 进 入 中 断 模 式 因 此, 程 序 调 试 结 束 后, 生 成 可 执 行 文 件 之 前, 应 删 去 代 码 中 的 所 有 Stop 语 句 3. 程 序 结 束 语 句 (1) 一 般 形 式 : End (2) 说 明 : End 语 句 通 常 用 来 结 束 一 个 程 序 的 执 行 当 在 程 序 中 执 行 End 语 句 时, 将 终 止 当 前 程 序, 重 置 所 有 变 量, 并 关 闭 所 有 已 打 开 的 文 件 一 个 程 序 有 没 有 End 语 句, 对 程 序 的 执 行 没 有 什 么 影 响 但 是, 如 果 没 有 End 语 句, 或 者 虽 有 但 没 有 执 行, 则 程 序 不 能 正 常 结 束, 必 须 执 行 运 行 菜 单 中 的 结 束 命 令 或 单 击 工 具 栏 中 的 结 束 按 钮 为 了 保 持 程 序 的 完 整 性, 应 当 在 程 序 中 含 有 End 语 句, 并 且 通 过 End 语 句 结 束 程 序

85 72 Visual Basic 程 序 设 计 教 程 5.2 数 据 输 出 在 前 面 的 章 节 中, 我 们 可 以 看 到 用 标 签 文 本 框 等 控 件 来 显 示 数 据 Visual Basic 也 可 以 用 Print 来 输 出 数 据, 但 它 是 作 为 方 法 来 使 用 的 Print 方 法 用 于 在 窗 体 图 片 框 和 打 印 机 上 显 示 数 据 Print 方 法 1. 一 般 形 式 [ 对 象 名 称.] Print [ 表 达 式 列 表 ] 其 中, 表 达 式 列 表 是 显 示 或 打 印 的 输 出 项 如 果 省 略, 则 显 示 ( 输 出 ) 一 个 空 行 2. 说 明 (1) 对 象 名 称 可 以 是 窗 体 (Form) 图 片 框 (PictureBox) 或 打 印 机 如 果 省 略 对 象 名 称, 则 在 当 前 窗 体 上 输 出 例 如 : Picture1. Print Visual Basic 6.0 则 把 字 符 串 Visual Basic 6.0 在 图 片 框 中 显 示 出 来 再 如 : Print Visual Basic 6.0 则 直 接 把 字 符 串 Visual Basic 6.0 在 当 前 窗 体 上 显 示 出 来 而 在 : Printer. Print Visual Basic 6.0 中, 则 把 字 符 串 Visual Basic 6.0 输 出 到 打 印 机 上 (2) 表 达 式 列 表 为 要 输 出 的 常 量 变 量 函 数 或 表 达 式 各 输 出 项 之 间 用 分 隔 符 ( 空 格 分 号 或 逗 号 ) 隔 开 若 各 输 出 项 之 间 以 分 号 或 空 格 作 分 隔 符, 则 按 紧 凑 格 式 输 出 数 据 若 各 输 出 项 之 间 以 逗 号 作 分 隔 符, 则 按 标 准 格 式 ( 以 14 个 字 符 位 置 为 单 位 把 一 个 输 出 行 分 为 若 干 个 区 段 ) 输 出 数 据 例 如, 在 当 前 窗 体 上 显 示 数 据 如 下 图 5.5 所 示 图 5.5 使 用 不 同 分 隔 符 显 示 数 据 其 窗 体 的 单 击 事 件 过 程 如 下 : Private Sub Form_Click() x = 5: y = 6: z = 7 Print "x="; x, "y="; y, "z="; z Print

86 第 5 章 顺 序 结 构 程 序 设 计 73 Print x; y; z; "Visual Basic 6.0" (3) 要 控 制 输 出 格 式, 可 利 用 Spc(n) 或 Tab(n) 函 数 与 Print 方 法 有 关 的 标 准 函 数 为 了 使 信 息 按 指 定 的 格 式 输 出,Visual Basic 提 供 了 几 个 与 Print 方 法 配 合 使 用 的 函 数, 包 括 Tab Spc Format 等 下 面 具 体 介 绍 这 三 个 函 数 的 使 用 方 法 1. Tab 函 数 (1) 一 般 形 式 : Tab(n) Tab 函 数 把 光 标 移 到 由 参 数 n 指 定 的 位 置, 并 从 该 位 置 输 出 信 息 要 输 出 的 信 息 放 在 Tab 函 数 的 后 面, 并 用 分 号 隔 开 例 如 : Print Tab(15); 6783 将 在 第 15 个 位 置 输 出 数 值 6783 (2) 说 明 : 1 参 数 n 为 一 数 值 表 达 式, 其 值 为 整 型 值, 它 表 示 下 一 个 输 出 位 置 的 列 号 通 常 最 左 边 的 列 号 为 1, 如 果 当 前 的 显 示 位 置 已 经 超 过 n, 则 自 动 下 移 一 行, 输 出 的 数 据 从 当 前 的 显 示 位 置 开 始 移 动 n 列 输 出 数 据 2 当 在 一 个 Print 方 法 中 有 多 个 Tab 函 数 时, 每 个 Tab 函 数 对 应 一 个 输 出 项, 各 输 出 项 之 间 用 分 号 隔 开 例 5.2 设 有 某 班 级 的 部 分 学 生 名 单 如 下 : 姓 名 年 龄 籍 贯 班 级 张 一 18 北 京 环 境 -1 王 二 17 上 海 环 境 -1 李 三 19 重 庆 环 境 -1 编 程 序 显 示 上 面 表 格 中 的 数 据 程 序 如 下 : Private Sub Form_Click() FontName = " 楷 体 _GB2312" ' 显 示 输 出 何 种 字 体 FontSize = 22 ' 显 示 输 出 字 体 大 小 Print " 姓 名 "; Tab(8); " 年 龄 "; Tab(16); " 籍 贯 "; Print Tab(24); " 班 级 " Print Print " 张 一 "; Tab(8); 18; Tab(16); " 北 京 "; Tab(24); " 环 境 -1" Print " 王 二 "; Tab(8); 17; Tab(16); " 上 海 "; Tab(24); " 环 境 -1" Print " 李 三 "; Tab(8); 19; Tab(16); " 重 庆 "; Tab(24); " 环 境 -1" 程 序 运 行 后, 单 击 窗 体 内 任 一 位 置, 将 显 示 如 图 5.6 所 示 的 运 行 结 果

87 74 Visual Basic 程 序 设 计 教 程 图 5.6 程 序 的 运 行 结 果 2. Spc 函 数 (1) 一 般 形 式 : Spc(n) 在 Print 的 输 出 中,Spc 函 数 是 在 输 出 下 一 个 表 达 式 之 前 首 先 跳 过 n 个 空 格 (2) 说 明 : 1 参 数 n 为 一 数 值 表 达 式, 其 取 值 范 围 为 0~32767 之 间 的 整 数 Spc 函 数 与 输 出 项 之 间 用 分 号 隔 开 例 如 : Private Sub Form_Click() Print "Petroleum"; Spc(5); "University" 将 首 先 在 窗 体 上 输 出 "Petroleum", 然 后 跳 过 5 个 空 格, 再 输 出 "University" 2 Spc 函 数 与 Tab 函 数 可 以 相 互 替 代 但 需 要 读 者 注 意 的 是,Spc 函 数 只 表 示 两 个 输 出 项 之 间 的 间 隔, 而 Tab 函 数 则 需 要 从 该 行 的 最 左 端 开 始 计 数 3. Format 函 数 (1) 一 般 形 式 : Format( 表 达 式 [, 格 式 串 ]) (2) 说 明 : Format 函 数 根 据 格 式 串 来 显 示 表 达 式 的 文 本 例 5.3 本 示 例 显 示 用 Format 函 数 做 格 式 化 输 出 的 不 同 用 法 Private Sub Form_Click() Dim MyTime, MyDate, MyStr MyTime = #5:04:23 PM# MyDate = #1/1/2003# ' 以 系 统 设 置 的 长 时 间 格 式 返 回 当 前 系 统 时 间 MyStr = Format(Time, "Long Time") Print MyStr ' 以 系 统 设 置 的 长 日 期 格 式 返 回 当 前 系 统 日 期 MyStr = Format(Date, "Long Date") Print MyStr MyStr = Format(MyTime, "h:m:s") ' 返 回 "17:4:23" Print MyStr MyStr = Format(MyTime, "hh:mm:ss AMPM") ' 返 回 "05:04:23 PM"

88 第 5 章 顺 序 结 构 程 序 设 计 75 Print MyStr MyStr = Format(MyDate, "dddd, mmm d yyyy") ' 返 回 "Wednesday, Jan " Print MyStr ' 如 果 没 有 指 定 格 式, 则 返 回 字 符 串 MyStr = Format(23) ' 返 回 "23" Print MyStr ' 用 户 自 定 义 的 格 式 MyStr = Format(5459.4, "##,##0.00") ' 返 回 "5,459.40" Print MyStr MyStr = Format(334.9, "###0.00") ' 返 回 "334.90" Print MyStr MyStr = Format(5, "0.00%") ' 返 回 "500.00%" Print MyStr MyStr = Format("HELLO", "<") ' 返 回 "hello" Print MyStr MyStr = Format("This is it", ">") ' 返 回 "THIS IS IT" Print MyStr 程 序 运 行 后, 单 击 窗 体 内 任 一 位 置, 将 显 示 如 图 5.7 所 示 的 运 行 结 果 图 5.7 程 序 的 运 行 结 果 其 他 方 法 和 属 性 1. Move 方 法 (1) 一 般 形 式 : [ 对 象.] Move 左 边 距 离 [, 上 边 距 离 [, 宽 度 [, 高 度 ]]] (2) 说 明 : Move 方 法 用 来 移 动 窗 体 和 控 件, 并 可 改 变 其 大 小 其 中, 对 象 可 以 是 窗 体 及 除 计 时 器 (Timer) 菜 单 (Menu) 之 外 的 所 有 控 件, 如 果 省 略 对 象, 则 表 示 移 动 的 是 窗 体

89 76 Visual Basic 程 序 设 计 教 程 左 边 距 离 上 边 距 离 及 宽 度 高 度 均 以 twip( 缇, 一 个 与 屏 幕 无 关 的 单 位, 用 来 保 证 屏 幕 应 用 程 序 对 屏 幕 元 素 的 定 位 和 比 例 在 所 有 的 显 示 系 统 上 的 一 致 性 一 缇 等 价 于 1/20 个 打 印 机 的 磅 一 逻 辑 英 寸 大 约 有 1440 缇, 一 逻 辑 厘 米 约 567 缇 ) 为 单 位 如 果 对 象 是 窗 体, 则 左 边 距 离 和 上 边 距 离 均 以 屏 幕 左 边 界 和 上 边 界 为 准 ; 如 果 对 象 是 控 件, 则 以 窗 体 的 左 边 界 和 上 边 界 为 准 例 5.4 在 窗 体 的 任 意 位 置 画 一 个 文 本 框, 编 写 程 序 移 动 其 位 置 并 改 变 其 大 小 运 行 程 序 时 窗 体 中 文 本 框 的 初 始 位 置 和 单 击 窗 体 任 意 位 置 时 文 本 框 移 动 到 新 位 置 时 的 状 态 如 图 5.8 图 5.9 所 示 图 5.8 运 行 程 序 时 窗 体 中 文 本 框 的 初 始 位 置 图 5.9 文 本 框 移 动 到 新 位 置 时 的 状 态 程 序 如 下 : Private Sub Form_Click() Move 800, 800, 4500, 2500 Text1.Move 200, 200, 3500, 1000 Text1.Text = " 利 用 Move 方 法 来 移 动 文 本 框 " 2. TextHeight 和 TextWidth 方 法 (1) 一 般 形 式 :

90 第 5 章 顺 序 结 构 程 序 设 计 77 [ 对 象.] TextHeight( 字 符 串 ) [ 对 象.] TextWidth( 字 符 串 ) (2) 说 明 : 这 两 个 方 法 用 来 辅 助 设 置 坐 标 其 中,TextHeight 返 回 一 个 文 本 字 符 串 的 高 度 值, 而 TextWidth 则 返 回 一 个 文 本 字 符 串 的 宽 度 值, 其 单 位 均 为 缇 (twip) 当 字 符 串 的 字 形 和 大 小 不 同 时, 所 返 回 的 值 也 不 一 样 对 象 包 括 窗 体 和 图 片 框, 如 果 省 略 对 象, 则 用 来 测 试 当 前 窗 体 中 的 字 符 串 例 5.5 本 例 用 来 对 TextHeight 和 TextWidth 方 法 进 行 测 试 程 序 如 下 : Private Sub Form_Click() CurrentX = 0 CurrentY = TextHeight("Microsoft") * 6 Print "Microsoft Visual Basic 6.0" Print Text$ = "Microsoft" Print Text$ Print TextHeight(Text$), TextWidth(Text$) FontSize = 16 Print Print Text$ Print TextHeight(Text$), TextWidth(Text$) 程 序 运 行 后 的 结 果 如 图 5.10 所 示 图 5.10 程 序 运 行 后 的 结 果 请 读 者 自 行 分 析 上 述 程 序 及 运 行 结 果 在 上 述 程 序 中,CurrentX 和 CurrentY 是 窗 体 的 属 性, 分 别 用 来 返 回 或 设 置 下 一 次 输 出 位 置 的 横 (CurrentX) 坐 标 和 纵 (CurrentY) 坐 标 这 两 个 属 性 只 能 在 程 序 代 码 中 使 用, 不 能 在 设 计 时 使 用 坐 标 从 对 象 的 左 上 角 (0,0) 算 起 另 外, 为 使 字 符 串 在 窗 体 中 居 中 显 示, 可 以 将 属 性 ScaleWidth 和 ScaleHeigth 与 TextHeight 和 TextWidth 方 法 结 合 起 来 使 用 ScaleWidth 和 ScaleHeigth 分 别 用 来 表 示 对 象 的 宽 度 和 高 度

91 78 Visual Basic 程 序 设 计 教 程 值 例 5.6 字 符 串 在 窗 体 中 居 中 显 示 示 例 程 序 如 下 : Private Sub Form_Click() FontSize = 16 FontName = " 隶 书 " Text$ = " 神 州 四 号 卫 星 发 射 成 功!" CurrentX = (ScaleWidth - TextWidth(Text$)) / 2 CurrentY = (ScaleHeight - TextHeight(Text$)) / 2 Print Text$ 程 序 运 行 后 的 结 果 如 图 5.11 所 示 图 5.11 程 序 运 行 后 的 结 果 说 明 : 在 上 述 程 序 中, 用 窗 体 宽 度 减 去 字 符 串 的 宽 度 然 后 除 以 2 作 为 字 符 串 输 出 时 的 横 坐 标, 用 窗 体 高 度 减 去 字 符 串 的 高 度 然 后 除 以 2 作 为 字 符 串 输 出 时 的 纵 坐 标, 从 而 使 字 符 串 在 窗 体 中 居 中 显 示 例 5.7 编 写 程 序, 使 窗 体 位 于 屏 幕 中 心 位 置 显 示, 文 本 框 位 于 窗 体 中 心 位 置 显 示 首 先 在 窗 体 上 画 一 个 文 本 框 ( 位 置 大 小 自 定 ), 然 后 在 窗 体 的 单 击 事 件 中 输 入 如 下 代 码 : Private Sub Form_Click() Text1.Text = "Visual Basic 6.0" Width = Screen.Width / 2 ' 取 屏 幕 宽 度 的 一 半 Height = Screen.Height / 2 ' 取 屏 幕 高 度 的 一 半 Left = (Screen.Width - Width) / 2 ' 使 窗 体 居 于 屏 幕 中 心 Top = (Screen.Height - Height) / 2 Text1.Width = Width / 2 Text1.Height = Height / 2 Text1.Left = (Width - Text1.Width) / 2 ' 使 文 本 框 居 于 窗 体 中 心 Text1.Top = (Height - Text1.Height) / 2 程 序 运 行 后 的 初 始 状 态 及 单 击 窗 体 任 一 位 置 后 的 结 果 如 图 5.12 图 5.13 所 示

92 第 5 章 顺 序 结 构 程 序 设 计 79 图 5.12 程 序 运 行 后 的 初 始 状 态 图 5.13 执 行 单 击 窗 体 后 的 运 行 结 果 说 明 :Height 和 Width 属 性 可 用 来 返 回 或 设 置 窗 体 控 件 打 印 机 及 屏 幕 的 高 度 和 宽 度, 而 Left 和 Top 属 性 则 分 别 用 来 返 回 或 设 置 窗 体 控 件 与 其 左 边 界 和 顶 边 界 的 距 离, 其 单 位 均 为 twip 上 述 程 序 把 窗 体 的 高 度 和 宽 度 设 置 为 屏 幕 高 度 和 宽 度 的 二 分 之 一, 把 文 本 框 的 高 度 和 宽 度 设 置 为 窗 体 高 度 和 宽 度 的 二 分 之 一 从 而 使 窗 体 位 于 屏 幕 中 心 位 置 显 示, 文 本 框 位 于 窗 体 中 心 位 置 显 示 5.3 输 出 数 据 的 字 体 控 制 字 体 类 型 和 大 小 Visual Basic 可 以 输 出 各 种 英 文 字 体 和 汉 字 字 体, 并 可 通 过 设 置 字 形 的 属 性 改 变 字 体 的 大 小 笔 划 的 粗 细 和 显 示 方 向, 以 及 加 下 划 线 重 叠 等 其 实, 我 们 在 上 面 的 例 子 中 已 经 用 到 了 字 体 类 型 和 字 体 大 小, 下 面 详 细 介 绍 这 些 属 性

93 80 Visual Basic 程 序 设 计 教 程 1. 字 体 类 型 (1) 一 般 形 式 : [ 窗 体 ] [ 控 件 ] [Printer].FontName[=" 字 体 类 型 "] (2) 说 明 : FontName 可 作 为 窗 体 控 件 或 打 印 机 的 属 性, 用 来 设 置 在 这 些 对 象 上 输 出 的 字 体 类 型 这 里 的 字 体 类 型 指 的 是 可 以 在 Visual Basic 中 使 用 的 英 文 字 体 或 中 文 字 体 对 于 中 文 来 说, 可 以 使 用 的 字 体 数 量 取 决 于 Windows 的 汉 字 环 境 用 FontName=" 字 体 类 型 " 可 以 设 置 英 文 或 中 文 的 字 体 类 型, 如 果 省 略 =" 字 体 类 型 ", 则 返 回 当 前 正 在 使 用 的 字 体 类 型 2. 字 体 大 小 (1) 一 般 形 式 : FontSize[= 点 数 ] (2) 说 明 : 这 里 的 点 数 用 来 设 置 字 体 的 大 小 在 缺 省 情 况 下, 系 统 使 用 最 小 的 字 体, 点 数 为 8.25 如 果 省 略 = 点 数, 则 返 回 当 前 正 在 使 用 的 字 体 大 小 例 5.8 本 例 用 来 设 置 字 体 类 型 和 字 体 大 小 程 序 如 下 : Private Sub Form_Click() test1$ = "Visual Basic 6.0" test2$ = " 程 序 设 计 方 法 " FontSize = 16 FontName = "system" Print test1$ FontName = "Times new roman" Print test1$ FontSize = 20 FontName = " 宋 体 " Print " 宋 体 --->"; test2$ FontName = " 楷 体 _GB2312" Print " 楷 体 _GB >"; test2$ FontName = " 幼 圆 " Print " 幼 圆 --->"; test2$ FontName = " 隶 书 " Print " 隶 书 --->"; test2$ FontName = " 方 正 舒 体 " Print " 方 正 舒 体 --->"; test2$ FontName = " 仿 宋 _GB2312" Print " 仿 宋 _GB >"; test2$

94 程 序 运 行 结 果 如 图 5.14 所 示 第 5 章 顺 序 结 构 程 序 设 计 81 图 5.14 程 序 运 行 结 果 其 他 属 性 1. 粗 体 字 (1) 一 般 形 式 : FontBold[=Boolean] (2) 说 明 : 该 属 性 取 两 个 值, 即 True 和 False 当 FontBold 属 性 为 True 时, 文 本 以 粗 体 字 输 出, 否 则 按 正 常 字 输 出 缺 省 为 False 2. 斜 体 字 (1) 一 般 形 式 : FontItalic[=Boolean] (2) 说 明 : 该 属 性 取 两 个 值, 即 True 和 False 当 FontItalic 属 性 为 True 时, 文 本 以 斜 体 字 输 出 缺 省 为 False 3. 加 下 划 线 (1) 一 般 形 式 : FontUnderline[=Boolean] (2) 说 明 : 该 属 性 取 两 个 值, 即 True 和 False 当 FontUnderline 属 性 为 True 时, 则 可 使 输 出 的 文 本 加 下 划 线 缺 省 为 False 4. 加 中 划 线 (1) 一 般 形 式 : FontStrikethru[=Boolean] (2) 说 明 : 该 属 性 取 两 个 值, 即 True 和 False 当 FontStrikethru 属 性 为 True 时, 则 可 使 输 出 的 文 本 加 中 划 线 缺 省 为 False

95 82 Visual Basic 程 序 设 计 教 程 例 5.9 本 例 用 来 设 置 字 体 的 格 式 程 序 如 下 : Private Sub Form_Click() Text1.Text = "Visual Basic 6.0" Text1.FontSize = 16 Text1.FontName = "system" Text1.FontUnderline = True Print Text1.Text Text2.Text = " 程 序 设 计 方 法 " Text2.FontName = " 隶 书 " Text2.FontSize = 24 Text2.FontItalic = True Text2.FontStrikethru = True Print Text2.Text 程 序 运 行 结 果 如 图 5.15 所 示 图 5.15 程 序 运 行 结 果 5.4 InputBox 函 数 和 MsgBox 函 数 前 面 介 绍 了 窗 体 的 输 出 操 作, 它 主 要 由 Print 方 法 实 现 在 与 用 户 进 行 交 互 方 面,Visual Basic 是 非 常 方 便 的 下 面 介 绍 用 InputBox 和 MsgBox 函 数 来 创 建 预 定 义 对 话 框 进 行 输 入 和 输 出 InputBox 函 数 1. 一 般 形 式 InputBox[$](prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) 其 中 :

96 第 5 章 顺 序 结 构 程 序 设 计 83 (1)prompt 是 必 要 参 数, 是 一 个 字 符 串 表 达 式, 作 为 显 示 在 对 话 框 中 的 消 息, 用 于 提 示 用 户 输 入 prompt 的 最 大 长 度 不 能 超 过 1024 个 字 符, 由 所 用 字 符 的 宽 度 决 定 如 果 prompt 的 内 容 超 过 一 行, 则 可 以 在 每 一 行 之 间 用 回 车 符 (Chr(13)) 换 行 符 (Chr(10)) 或 是 回 车 与 换 行 符 的 组 合 (Chr(13)+Chr(10)) 将 各 行 分 隔 开 来 (2)title 是 可 选 项, 是 一 个 字 符 串 表 达 式, 它 是 对 话 框 的 标 题, 显 示 在 对 话 框 顶 部 的 标 题 区 (3)default 是 可 选 项, 显 示 文 本 框 中 的 字 符 串 表 达 式, 在 没 有 其 他 输 入 时 作 为 缺 省 值 如 果 省 略 default, 则 文 本 框 为 空 (4)xpos 是 可 选 项, 是 一 个 数 值 表 达 式 与 ypos 成 对 出 现, 指 定 对 话 框 的 左 边 与 屏 幕 左 边 的 水 平 距 离 如 果 省 略 xpos, 则 对 话 框 会 在 水 平 方 向 居 中 (5)ypos 是 可 选 项, 是 一 个 数 值 表 达 式 与 xpos 成 对 出 现, 指 定 对 话 框 的 上 边 与 屏 幕 上 边 的 距 离 如 果 省 略 ypos, 则 对 话 框 被 放 置 在 屏 幕 垂 直 方 向 距 下 边 大 约 三 分 之 一 的 位 置 (6)helpfile 是 可 选 项, 字 符 串 表 达 式 识 别 用 来 向 对 话 框 提 供 上 下 文 相 关 帮 助 的 帮 助 文 件 如 果 提 供 了 helpfile, 则 也 必 须 提 供 context (7)context 是 可 选 项, 数 值 表 达 式 由 帮 助 文 件 的 作 者 指 定 给 适 当 的 帮 助 主 题 的 帮 助 上 下 文 编 号 如 果 提 供 了 context, 则 也 必 须 提 供 helpfile 2. 说 明 此 函 数 的 作 用 是 显 示 一 提 示 窗 口, 等 待 用 户 输 入 正 文 或 按 下 按 钮, 并 返 回 所 输 入 的 内 容 InputBox 返 回 Variant 类 型, 而 InputBox$ 则 用 于 返 回 String 类 型 例 5.10 测 试 InputBox 函 数 的 使 用 方 法 Private Sub Form_Load() str1$ = Chr$(13) + Chr$(10) msg1$ = " 请 输 入 学 生 姓 名 :" msg2$ = " 输 入 后 按 回 车 键 " msg3$ = " 或 单 击 确 定 按 钮 " msg$ = msg1$ + str1$ + msg2$ + str1$ + msg3$ stu$ = InputBox$(msg$, " 测 试 InputBox 函 数 ", "Regan") Print stu$ 该 程 序 的 执 行 结 果 如 图 5.16 所 示 图 5.16 程 序 运 行 结 果

97 84 Visual Basic 程 序 设 计 教 程 例 5.11 请 读 者 上 机 测 试 下 列 程 序, 并 分 析 执 行 结 果, 体 会 InputBox 函 数 的 使 用 方 法 Private Sub Form_Load() msg1$ = " 请 输 入 姓 名 " msg2$ = " 请 输 入 年 龄 " msg3$ = " 请 输 入 性 别 " msg4$ = " 请 输 入 籍 贯 " msgtitle$ = " 学 生 情 况 登 记 " stuname$ = InputBox$(msg1$, " 姓 名 ", msgtitle$) stuage$ = InputBox$(msg2$, " 年 龄 ", msgtitle$) stusex$ = InputBox$(msg3$, " 性 别 ", msgtitle$) stuhome$ = InputBox$(msg4$, " 籍 贯 ", msgtitle$) Print stuname$; ","; stuage$; " 岁 "; ","; Print stusex$; ","; stuhome$; " 人 " 3. 注 意 (1) 在 执 行 InputBox 函 数 所 产 生 的 对 话 框 中, 有 两 个 按 钮, 即 确 定 和 取 消 在 文 本 框 输 入 数 据 后, 单 击 确 定 按 钮 ( 或 按 回 车 键 ) 表 示 确 认, 并 返 回 在 文 本 框 中 输 入 的 数 据 ; 而 如 果 单 击 取 消 按 钮 ( 或 按 Esc 键 ), 则 使 当 前 的 输 入 作 废, 在 这 种 情 况 下, 将 返 回 一 个 空 字 符 串 ; (2) 每 执 行 一 次 InputBox 函 数 只 能 输 入 一 个 值, 如 果 需 要 输 入 多 个 值, 则 必 须 多 次 调 用 InputBox 函 数 输 入 数 据 并 按 回 车 键 或 单 击 确 定 按 钮 后, 对 话 框 消 失, 输 入 的 数 据 必 须 作 为 函 数 的 返 回 值 赋 给 一 个 变 量, 否 则 输 入 的 数 据 不 能 保 留 在 实 际 应 用 中,InputBox 函 数 通 常 与 循 环 语 句 数 组 结 合 使 用, 这 样 可 以 连 续 输 入 多 个 值, 并 把 输 入 的 数 据 赋 给 数 组 中 各 元 素 MsgBox 函 数 1. 一 般 形 式 MsgBox(prompt[, buttons] [, title] [, helpfile, context]) 其 中 : (1)prompt 为 必 要 参 数, 同 InputBox 函 数 (2)buttons 为 可 选 参 数, 指 定 显 示 按 钮 的 数 目 及 形 式 使 用 的 图 标 样 式 缺 省 按 钮 是 什 么 以 及 消 息 框 的 强 制 回 应 等 其 取 值 如 表 5.1 所 示 如 果 省 略, 则 buttons 的 缺 省 值 为 0 不 同 分 组 的 取 值 可 以 用 + 或 or 运 算 符 连 接 起 来 使 用 (3)title helpfile context 为 可 选 参 数, 同 InputBox 函 数 我 们 再 来 看 一 看 函 数 的 返 回 值, 如 表 5.2 所 示 2. 说 明 MsgBox 函 数 用 于 向 用 户 发 布 提 示 信 息, 要 求 用 户 做 出 必 要 的 响 应, 也 称 为 消 息 框 MsgBox 函 数 在 对 话 框 中 显 示 消 息, 对 话 框 中 包 含 命 令 按 钮, 由 用 户 单 击 按 钮

98 第 5 章 顺 序 结 构 程 序 设 计 85 表 5.1 MsgBox 函 数 的 参 数 类 型 值 VB 对 应 常 数 描 述 0 VbOKOnly 出 现 确 定 按 钮 1 VbOKCancel 出 现 确 定 取 消 按 钮 功 能 按 钮 种 类 图 标 预 设 按 钮 等 待 模 式 2 VbAbortRetryIgnore 出 现 结 束 (A) 重 试 忽 略 按 钮 3 VbYesNoCancel 出 现 是 否 取 消 按 钮 4 VbYesNo 出 现 是 否 按 钮 5 VbRetryCancel 出 现 重 试 取 消 按 钮 16 VbCritical 出 现 图 标 32 VbQuestion 出 现 图 标? 48 VbExclamation 出 现 图 标! 64 VbInformation 出 现 图 标 i 0 VbDefautButton1 第 一 个 按 钮 为 预 设 按 钮 256 VbDefaultButton2 第 二 个 按 钮 为 预 设 按 钮 512 VbDefautButton3 第 三 个 按 钮 为 预 设 按 钮 768 VbDefautButton4 第 四 个 按 钮 为 预 设 按 钮 应 用 程 序 强 制 返 回, 程 序 一 直 等 待, 直 到 用 0 VbApplicationModal 户 对 消 息 框 作 出 响 应 才 继 续 运 行 系 统 强 制 返 回, 全 部 应 用 程 序 都 被 挂 起, 直 4096 VbSystemModal 到 用 户 对 消 息 框 作 出 响 应 才 继 续 运 行 表 5.2 MsgBox 函 数 的 返 回 值 返 回 值 VB 对 应 常 数 对 应 的 被 单 击 按 钮 1 VbOK 确 定 2 VbCancel 取 消 3 VbAbort 结 束 4 VbRetry 重 试 5 VbIgnore 忽 略 6 VbYes 是 7 VbNo 否 例 5.12 在 单 击 退 出 按 钮 后 显 示 消 息 框 如 图 5.17 所 示, 当 单 击 消 息 框 的 确 定 按 钮 时 退 出 系 统, 当 单 击 消 息 框 的 取 消 按 钮 时 取 消 操 作 图 5.17 MsgBox 函 数 对 话 框

99 86 Visual Basic 程 序 设 计 教 程 说 明 : 程 序 的 窗 体 中 只 包 含 一 个 退 出 按 钮, 其 名 称 为 CmdEnd,Caption 为 退 出 程 序 如 下 : Private Sub CmdEnd_Click() Dim Response Response = MsgBox(" 是 否 退 出 系 统?", vbokcancel + vbquestion, " 退 出 ") If Response = 1 Then End End If 注 意 : 程 序 中 的 If 语 句 是 一 个 条 件 判 断 语 句, 将 在 后 面 章 节 中 介 绍 用 变 量 Response 存 放 MsgBox 的 返 回 值, 当 单 击 图 5.17 中 的 确 定 按 钮 时,Response=1, 程 序 执 行 End 语 句, 结 束 运 行 5.5 应 用 举 例 例 5.13 已 知 直 角 三 角 形 的 两 条 直 角 边, 求 斜 边 长 度 和 两 个 锐 角 ( 以 度 为 单 位 ) 分 析 : 两 条 直 角 边 虽 然 是 已 知 条 件, 但 题 目 中 并 没 有 给 出 具 体 值, 因 此 需 要 从 键 盘 输 入 我 们 可 以 将 两 条 直 角 边 定 义 为 a b, 将 斜 边 定 义 为 c, 两 个 锐 角 定 义 为 angle1 和 angle2 下 面 是 程 序 的 设 计 过 程, 先 看 一 看 程 序 的 外 形, 如 图 5.18 所 示 图 5.18 程 序 的 外 形 在 该 窗 体 中, 由 一 个 命 令 按 钮 计 算 五 个 文 本 框 和 五 个 标 签 组 成 设 置 各 控 件 的 属 性 如 下 : Command1:Caption= " 计 算 " Text1:Text=" " Text2:Text=" " Text3:Text=" " Text4:Text=" " Text5:Text=" " Label1:AutoSize= -1 'True Label2:AutoSize= -1 'True Caption= " 直 角 边 a" Caption= " 直 角 边 b" Label3:AutoSize= -1 'True Label4:AutoSize= -1 'True

100 第 5 章 顺 序 结 构 程 序 设 计 87 Caption= " 斜 边 c" Caption= " 锐 角 1" Label5:AutoSize= -1 'True Caption= " 锐 角 2" 根 据 题 目 要 求, 编 写 各 控 件 的 编 码 如 下 : Private Sub Command1_Click() Dim a, b, c, x As Single Dim angle1, angle2 As Single a = Val(Text1.Text) b = Val(Text2.Text) c = Sqr(a * a + b * b) x = a / b angle1 = 180# * Atn(x) / ' 计 算 锐 角 angle1 angle2 = 90# - angle1 ' 计 算 锐 角 angle2 Text3.Text = c Text4.Text = angle1 Text5.Text = angle2 Private Sub Text1_Click() Dim a As Single msg1$ = " 请 输 入 直 角 边 a 的 值 :" msgtitle$ = " 输 入 值 " a = InputBox(msg1$, msgtitle$) Text1.Text = a Private Sub Text2_Click() Dim b As Single msg1$ = " 请 输 入 直 角 边 b 的 值 :" msgtitle$ = " 输 入 值 " b = InputBox(msg1$, msgtitle$) Text2.Text = b 当 程 序 输 入 完 数 据 和 按 计 算 按 钮 时 的 外 形 如 图 5.19 所 示 注 意 : 程 序 中 两 条 直 角 边 a b 的 输 入 方 法 既 可 采 用 本 章 例 5.1 的 方 法, 也 可 利 用 InputBox 函 数 来 输 入 数 据, 本 例 采 用 后 一 种 方 法 程 序 中 计 算 锐 角 时 要 使 用 反 正 弦 函 数, 因 VB 系 统 没 有 提 供, 所 以 使 用 了 求 反 正 弦 函 数 的 公 式, 详 细 内 容 请 读 者 查 阅 VB 帮 助 文 件

101 88 Visual Basic 程 序 设 计 教 程 图 5.19 程 序 的 运 行 结 果 例 5.14 输 入 输 出 函 数 的 综 合 应 用 此 例 中, 我 们 单 击 某 按 钮, 就 会 弹 出 一 个 InputBox, 用 于 输 入 文 字 如 果 输 入 的 文 字 为 空, 则 弹 出 一 个 对 话 框, 显 示 提 示 信 息, 并 继 续 显 示 InputBox; 若 输 入 不 为 空, 则 在 窗 体 中 显 示 出 来, 同 时, 我 们 还 可 以 利 用 RGB 函 数 进 行 文 字 的 颜 色 设 置 下 面 是 程 序 的 创 建 过 程, 先 来 看 一 看 程 序 的 外 形, 如 图 5.20 所 示 图 5.20 输 入 输 出 函 数 的 综 合 举 例 创 建 如 图 所 示 的 控 件, 然 后 编 写 代 码 在 输 入 文 字 按 钮 的 单 击 事 件 中, 先 通 过 InputBox 的 返 回 值 进 行 判 断, 然 后 将 文 字 显 示 在 窗 体 中 : Private Sub Command1_Click() Dim str1 As String again: str1 = InputBox(" 请 输 入 文 字 :") If str1 = "" Then tt = MsgBox(" 要 输 入 文 字 吗 :", 2) If tt = 1 Then GoTo again End If Label1.Caption = str1 在 生 效 按 钮 的 单 击 事 件 中, 使 用 RGB 函 数 将 红 绿 蓝 基 色 组 成 的 颜 色 设 置 为 标 签 的 前

102 第 5 章 顺 序 结 构 程 序 设 计 89 景 颜 色 : Private Sub Command2_Click() Label1.ForeColor = RGB(Val(Text1.Text), Val(Text2.Text), Val(Text3.Text)) 说 明 : (1) 在 此 例 中, 我 们 使 用 了 强 行 跳 转 语 句 Goto, 这 是 一 个 在 编 程 界 不 怎 么 受 欢 迎 的 语 句, 因 为 它 会 使 程 序 的 结 构 混 乱, 使 程 序 的 效 率 下 降 (2) 本 例 中 使 用 了 RGB 函 数, 此 函 数 的 作 用 在 于 送 入 红 绿 蓝 三 种 基 色 的 分 量, 返 回 一 个 长 整 型 的 合 成 颜 色 值, 其 使 用 格 式 为 :RGB( 红, 绿, 蓝 ) 习 题 1. 指 出 下 列 语 句 中 的 错 误 并 改 正 : (1)A+B=C (2)A=5,B=6,C=7 (3)A$=CPU (4)InputBox(" 请 输 入 正 整 数 m:",) (5)Print a=1 (6)Print "a=":1 2. 阅 读 程 序, 写 出 该 程 序 的 功 能 : Private Sub Form_Click() Form1.Width = 7000 Form1.Height = 3000 Form1.Caption = "Visual Basic 6.0 Window" Form1.FontName = " 幼 圆 " Form1.FontSize = 12 Form1.Print Form1.Print " 欢 迎 使 用 Visual Basic 6.0 中 文 企 业 版!" 3. 阅 读 程 序, 写 出 该 程 序 的 执 行 结 果, 然 后 上 机 调 试 该 程 序, 比 较 执 行 结 果 : Private Sub Form_Click() Print " 建 立 一 个 窗 体, 运 行 时 单 击 窗 体 就 能 得 到 运 行 结 果 " a = 1: b = 2: c = 3 Print " " Print a, b, c Print a; Spc(5); b; Spc(7); c Print a; Space$(8); b; Space$(5); c Print a; "*"; b; Print "="; Spc(3); a *b 4. 已 知 矩 形 的 长 和 宽 分 别 是 30 和 20, 请 编 写 计 算 其 周 长 和 面 积 的 程 序

103 90 Visual Basic 程 序 设 计 教 程 如 下 : 5. 输 入 三 角 形 的 三 条 边 的 边 长, 试 编 写 求 其 面 积 的 程 序 6. 鸡 兔 同 笼, 已 知 笼 中 头 H 个 脚 F 条, 问 笼 中 鸡 兔 各 有 多 少? 7. 从 键 盘 输 入 一 个 大 写 字 母, 试 编 写 改 用 小 写 字 母 输 出 的 程 序 8. 输 入 一 个 华 氏 温 度, 要 求 输 出 摄 氏 温 度 输 入 要 有 提 示, 输 出 要 有 文 字 说 明, 并 取 两 位 小 数 其 公 式 5 c = ( f 32 ) 9 9. 已 知 圆 半 径 和 圆 柱 高, 求 圆 周 长 圆 面 积 圆 球 表 面 积 圆 球 体 积 和 圆 柱 体 积 输 入 要 有 提 示, 输 出 要 有 文 字 说 明, 并 取 两 位 小 数 10. 编 写 程 序, 要 求 用 户 输 入 下 列 信 息 : 身 份 证 号 姓 名 性 别 联 系 电 话, 然 后 将 输 入 的 数 据 以 适 当 的 格 式 在 窗 体 上 显 示 出 来 11. 倒 计 时 程 序 程 序 一 运 行 即 用 对 话 框 提 示 用 户 输 入 日 期 输 入 格 式 为 mm/dd/yy 当 用 户 输 入 指 定 日 期 后, 计 算 机 将 算 出 距 离 2008 年 9 月 13 日 北 京 奥 运 会 开 幕 式 还 有 多 少 天 ( 假 定 2008 年 9 月 13 日 为 北 京 奥 运 会 开 幕 式 的 日 期 )

104 第 6 章 选 择 结 构 程 序 设 计 选 择 结 构 是 一 种 分 支 结 构, 它 是 结 构 化 程 序 设 计 方 法 中 三 种 基 本 控 制 结 构 之 一, 它 根 据 选 择 条 件 是 否 为 真, 在 多 个 分 支 中 选 择 与 条 件 相 匹 配 的 一 个 分 支, 比 如 我 们 在 飞 机 场, 有 飞 往 世 界 各 地 的 飞 机, 如 果 想 去 巴 黎, 我 们 必 须 买 去 巴 黎 的 机 票, 在 众 多 的 飞 机 中 我 们 要 登 上 的 是 飞 往 巴 黎 的 飞 机 在 Visual Basic 中, 实 现 选 择 结 构 的 语 句 有 : 单 行 格 式 If 语 句 块 If 语 句 和 多 分 支 Select Case 语 句 这 些 条 件 语 句 的 功 能 都 是 根 据 表 达 式 的 值 有 条 件 地 执 行 一 组 语 句 另 外, 在 Visual Basic 中 还 有 一 些 实 现 选 择 功 能 的 函 数 如 IIf() Choose() Switch() 等 6.1 单 行 格 式 条 件 语 句 单 行 格 式 条 件 语 句 是 最 简 单 的 双 分 支 选 择 结 构 根 据 给 定 的 条 件 进 行 判 断, 在 两 个 分 支 中 选 择 其 中 一 个 执 行 单 行 If 语 句 一 般 形 式 的 流 程 图 如 图 6.1 所 示 True 条 件 False 语 句 组 2 语 句 组 1 图 6.1 单 行 If 语 句 的 流 程 图 单 行 格 式 If 语 句 的 语 法 为 : If 条 件 Then 语 句 组 1 [ Else 语 句 组 2 ] 说 明 : (1) 条 件 : 可 以 是 关 系 表 达 式 或 逻 辑 表 达 式, 其 运 算 结 果 是 True 或 False, 若 条 件 是 数 值 表 达 式, 则 数 值 表 达 式 的 值 为 零 时 表 示 False, 而 任 何 非 零 数 值 都 看 做 True (2) 语 句 组 1: 是 当 条 件 为 True 时 执 行 的 语 句, 它 可 以 是 单 一 的 语 句 或 者 用 : 分 开 的 一 组 语 句 (3)Else 语 句 组 2: 也 称 为 Else 子 句 部 分, 它 只 能 与 If then 子 句 配 对 使 用, 不 能 单 独 出 现 表 示 当 条 件 为 False 时 系 统 执 行 语 句 组 2 语 句 组 2 同 样 可 以 是 单 一 的 语 句 或 者 用 : 分 开 的 一 组 语 句 Else 子 句 为 可 选 项, 根 据 实 际 情 况 决 定 是 否 选 用 Else 子 句 部 分 单 行 If 语 句 的 执 行 顺 序 是 : 系 统 首 先 判 断 单 行 If 语 句 的 条 件, 如 果 条 件 值 为 True, 则 执 行 语 句 组 1 部 分, 之 后 该 行 If 语 句 结 束, 系 统 自 动 执 行 单 行 If 语 句 后 面 的 下 一 条 语 句 ; 如 果 条 件 值 为 False, 则 执 行 语 句 组 2 部 分, 之 后 该 行 If 语 句 结 束 语 句 组 2 部 分 可 以 为 空, 此 时 可 去 掉 Else 子 句 部 分 其 流 程 图 如 图 6.2 所 示

105 92 Visual Basic 程 序 设 计 教 程 条 件 False True 语 句 组 1 图 6.2 无 Else 子 句 的 单 行 If 语 句 的 流 程 图 注 意 : (1) 构 成 单 行 If 语 句 的 各 部 分 必 须 书 写 在 同 一 行 上 (2) 语 句 组 中 允 许 有 多 条 语 句, 但 各 语 句 之 间 要 用 : 分 开 如 下 面 行 If 语 句 : If x > y Then max = x :min = y Else max = y :min = x 其 中 Then 子 句 中 语 句 组 1 包 含 两 条 赋 值 语 句,Else 子 句 中 语 句 组 2 也 包 含 两 条 赋 值 语 句 该 条 行 If 语 句 表 示 如 果 x 值 比 y 大 时, 把 x 赋 值 给 变 量 max, 把 y 赋 值 给 变 量 min; 否 则, 把 y 赋 值 给 变 量 max, 把 x 赋 值 给 变 量 min 例 6.1 输 入 x, 计 算 y 的 值 2x+ 1 ( x 0) y = x ( x= 0) 问 题 分 析 : 这 是 数 学 中 的 一 个 分 段 函 数, 它 表 示 当 x<>0 时, 用 公 式 y=2x+1 计 算 得 到 y 值 ; 当 x=0 时, 用 公 式 y=x 计 算 得 到 y 值 我 们 既 可 以 把 x<>0 作 为 选 择 条 件, 也 可 以 把 x=0 作 为 选 择 条 件, 下 面 我 们 以 x<>0 作 为 选 择 条 件, 首 先 定 义 两 个 Single 类 型 的 变 量 x y, 输 入 x 的 值 可 通 过 从 应 用 程 序 窗 体 界 面 的 文 本 框 Text1 输 入 数 字, 利 用 Val(Text1.text) 函 数 获 得 该 数 值 后, 赋 值 给 变 量 x, 然 后 用 单 行 If 语 句 对 x<>0 进 行 判 断, 当 x<>0 为 True 时, 执 行 y=2x+1; 为 False 时, 执 行 y=x 最 后 输 出, 利 用 文 本 框 显 示 结 果 y 的 值 程 序 流 程 图 如 图 6.3 所 示 输 入 x True x < > 0 False y =x y = 2x+1 输 出 y Visual Basic 应 用 程 序 设 计 步 骤 如 下 : 图 6.3 例 6.1 计 算 y 值 的 流 程 图

106 第 6 章 选 择 结 构 程 序 设 计 93 (1) 建 立 应 用 程 序 窗 体 界 面 : 新 建 一 个 标 准 EXE 工 程, 添 加 一 个 窗 体 Form1, 在 Form1 上 添 加 五 个 控 件, 分 别 是 两 个 标 签 (Label1 Label2) 两 个 文 本 框 (Text1 Text2) 和 一 个 命 令 按 钮 (Command1) Label1 作 为 输 入 数 据 的 提 示 信 息,Label2 作 为 输 出 数 据 的 提 示 信 息,Text1 作 为 x 的 输 入 界 面,Text2 作 为 y 值 的 输 出 界 面, 通 过 Command1 引 发 单 击 事 件, 编 写 按 钮 单 击 事 件 代 码, 实 现 本 程 序 的 计 算 功 能 用 户 界 面 如 图 6.4 所 示 图 6.4 例 6.1 用 户 界 面 及 运 行 结 果 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 6.1 表 6.1 例 6.1 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 计 算 Y 值 Label1 Caption 输 入 x Label2 Caption 结 果 y Text1 Text 置 空 Text2 Text 置 空 Command1 Caption 计 算 (3) 编 写 程 序 代 码 : 在 Form1 窗 体 中, 双 击 窗 体 界 面 中 命 令 按 钮 Command1 对 象, 进 入 Form1 代 码 窗 口, 编 写 Command1 的 单 击 (Click) 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Command1_Click() Dim x As Single, y As Single x = Val(Text1.Text) If x <> 0 Then y = 2 * x + 1 Else y = x Text2.Text = y 该 程 序 段 中 行 If 语 句 的 条 件 为 x<>0, 也 可 以 直 接 用 x 作 条 件, 即 x 为 数 值 表 达 式, 其 值 为 零 时 表 示 False; 而 为 任 何 非 零 数 值 都 看 做 True 则 If 语 句 可 以 改 为 如 下 方 式 : If x Then y = 2 * x + 1 Else y = x (4) 运 行 程 序 :

107 94 Visual Basic 程 序 设 计 教 程 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 比 如 在 Text1 文 本 框 内 输 入 数 字 3 后, 鼠 标 点 击 计 算 按 钮, 运 行 结 果 如 图 6.4 所 示 例 6.2 输 入 三 个 数, 找 出 其 中 最 大 的 数 输 出 问 题 分 析 : 可 利 用 两 两 相 比 取 其 大 者 方 法, 即 先 找 出 前 两 个 数 中 较 大 的 数, 再 拿 此 大 数 与 第 三 个 数 比 较 就 可 得 最 大 的 数 程 序 流 程 图 如 图 6.5 输 入 a,b,c a > b False max = b True max = a c >max False True max = c 输 出 max 图 6.5 求 三 个 数 最 大 值 的 流 程 图 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 七 个 控 件 组 成, 分 别 是 两 个 标 签 (Label1 Label2) 四 个 文 本 框 (Text1 Text2 Text3 Text4) 和 一 个 命 令 按 钮 (Command1) Label1 作 为 输 入 数 据 的 提 示 信 息, Label2 作 为 输 出 数 据 的 提 示 信 息,Text1 Text2 Text3 作 为 三 个 数 的 输 入 界 面,Text4 作 为 结 果 显 示 界 面, 通 过 Command1 引 发 单 击 事 件, 实 现 本 程 序 的 找 最 大 值 功 能 用 户 界 面 如 图 6.6 所 示 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 6.2 图 6.6 例 6.2 用 户 界 面

108 第 6 章 选 择 结 构 程 序 设 计 95 表 6.2 例 6.2 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 求 最 大 值 Label1 Caption 请 输 入 三 个 数 Label2 Caption 最 大 值 为 : Text1 Text 置 空 Text2 Text 置 空 Text3 Text 置 空 Text4 Text 置 空 Command1 Caption 找 最 大 值 (3) 编 写 程 序 代 码 : 在 Form1 窗 体 中, 双 击 窗 体 界 面 中 命 令 按 钮 Command1 对 象, 进 入 Form1 代 码 窗 口, 编 写 Command1 的 单 击 (Click) 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Command1_Click() Dim a, b, c As Single, max As Single a = Val(Text1.Text): b = Val(Text2.Text): c = Val(Text3.Text) If a > b Then max = a Else max = b If c > max Then max = c Text4.Text = max 程 序 中 首 先 定 义 四 个 Single 类 型 的 变 量 a b c max, 其 中 a b c 用 来 存 放 输 入 的 三 个 数 ( 可 利 用 文 本 框 或 输 入 框 获 得 ), 用 行 If 语 句 对 条 件 a>b 进 行 判 断, 若 为 True, 则 令 max = a; 若 为 False, 则 令 max = b 经 过 第 一 次 比 较 后,max 中 必 然 存 放 的 是 a 和 b 两 个 数 中 较 大 的 一 个 数 然 后 再 用 行 If 语 句 对 c>max 进 行 判 断, 若 为 True, 则 令 max = c; 若 为 False 则 说 明 c 小 于 或 等 于 max, 即 max 已 经 是 最 大 的 数 了, 因 此 第 二 条 行 If 语 句 不 需 要 Else 子 句 部 分 经 过 第 二 次 比 较 后,max 中 肯 定 存 放 的 是 a b c 三 个 数 中 最 大 的 一 个 数 最 后 在 Text4 文 本 框 中 输 出 max 的 值 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 三 个 文 本 框 内 输 入 三 个 数 后, 鼠 标 单 击 找 最 大 值 按 钮, 运 行 结 果 如 图 6.6 所 示 6.2 块 结 构 条 件 语 句 由 于 行 If 语 句 必 须 书 写 在 同 一 行 上, 当 遇 到 选 择 条 件 比 较 复 杂 或 某 条 件 下 有 较 多 要 处 理 的 问 题 时, 使 用 行 If 语 句 会 不 方 便, 此 时 可 使 用 块 If 语 句 实 现, 块 If 语 句 也 称 为 多 行 格 式 If 语 句 块 If 语 句 一 般 形 式 的 流 程 图 如 图 6.7 所 示

109 96 Visual Basic 程 序 设 计 教 程 条 件 1 False True 语 句 组 1 True 条 件 2 语 句 组 2 False True 条 件 N-1 语 句 组 N-1 False 语 句 组 N 图 6.7 块 If 语 句 的 流 程 图 块 If 语 句 的 语 法 为 : If 条 件 1 Then 语 句 组 1 [ ElseIf 条 件 2 Then 语 句 组 2 ] [ ElseIf 条 件 i Then 语 句 组 i ] [ ElseIf 条 件 N-1 Then 语 句 组 N-1 ] [ Else 语 句 组 N ] End If 说 明 : (1) 块 If 结 构 必 须 以 If 开 头, 以 End If 结 束 (2)ElseIf 条 件 i Then: 为 ElseIf 子 句, 如 果 条 件 i 值 为 True 则 执 行 该 子 句 中 的 语 句 组 i ElseIf 子 句 为 可 选 项, 根 据 程 序 的 需 要 可 以 有 任 意 多 个 ( 也 可 为 零 个 ), 若 有 则 必 须 放 在 Then 语 句 组 1 和 Else 子 句 之 间 (3)Else 语 句 组 N: 是 Else 子 句, 当 前 面 所 有 的 条 件 均 取 值 为 False 时, 执 行 该 子 句 的 语 句 组 N Else 子 句 也 为 可 选 项, 根 据 程 序 的 需 要 可 有 可 无 块 If 语 句 的 执 行 顺 序 是 : 系 统 首 先 判 断 条 件 1, 若 为 True, 则 执 行 完 语 句 组 1 后, 该 块 If 语 句 结 束, 系 统 继 续 执 行 End If 语 句 后 面 的 内 容 ; 若 为 False, 则 再 判 断 条 件 2, 若 条 件 2 为 True, 则 执 行 语 句 组 2 后, 该 块 If 语 句 也 结 束 了 ; 若 条 件 2 为 False, 则 继 续 判 断 后 面 的 条 件 i, 只 要 有 某 条 件 为 True, 就 执 行 该 条 件 对 应 的 Then 后 面 的 语 句 组, 若 块 If 语 句 中 列 出 的 所 有 条 件 都 为 False, 则 执 行 Else 子 句 的 语 句 组 N 之 后, 该 块

110 第 6 章 选 择 结 构 程 序 设 计 97 If 语 句 结 束 块 If 语 句 比 单 行 If 语 句 更 具 有 结 构 化 和 灵 活 性, 可 以 对 复 杂 的 条 件 进 行 判 断, 判 断 分 支 结 构 清 晰, 程 序 的 可 读 性 强, 便 于 维 护 和 调 试 例 6.3 有 如 下 函 数, 输 入 x, 计 算 y 的 值 x ( x< 0) y = 2x+ 3 (0 x< 5) 3x 1 ( x 5) 问 题 分 析 : 这 是 数 学 中 的 一 个 分 段 函 数,x 有 三 个 区 间 段,0 和 5 是 它 的 分 界 点, 我 们 可 以 让 x 分 别 与 0 和 5 进 行 比 较, 以 此 作 为 块 If 语 句 的 判 断 条 件, 先 与 0 比 较, 若 x<0 为 True 时, 执 行 y= -x; 若 x<0 为 False, 则 可 以 肯 定 x 0, 再 判 断 x<5, 若 x<5 为 True 时, 执 行 y= 2x+3; 若 x<5 为 False, 则 可 以 肯 定 x 5, 因 此 不 用 再 判 断, 只 要 执 行 y= 3x-1 就 可 以 了 首 先 定 义 两 个 Single 类 型 的 变 量 x y, 输 入 x 的 值 可 通 过 从 应 用 程 序 窗 体 界 面 的 文 本 框 Text1 输 入 数 字, 利 用 Val(Text1.text) 函 数 获 得 该 数 值 后, 赋 值 给 变 量 x, 然 后 用 块 If 语 句 对 x 进 行 判 断, 执 行 相 应 的 y 值 计 算 最 后 利 用 窗 体 界 面 文 本 框 显 示 结 果 y 的 值 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 五 个 控 件 组 成, 分 别 是 两 个 标 签 (Label1 Label2) 两 个 文 本 框 (Text1 Text2) 和 一 个 命 令 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 : 界 面 中 各 对 象 的 属 性 与 例 6.1 中 表 6.1 相 同 (3) 编 写 程 序 代 码 : 在 Form1 窗 体 中, 双 击 窗 体 界 面 中 命 令 按 钮 Command1 对 象, 进 入 Form1 代 码 窗 口, 编 写 Command1 的 单 击 (Click) 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Command1_Click() Dim x As Single, y As Single x = Val(Text1.Text) If x < 0 Then y = - x ElseIf x < 5 Then y = 2 * x + 3 Else y = 3 * x - 1 End If Text2.Text = y 该 程 序 段 中 块 If 语 句 也 可 先 用 x 5 为 条 件, 再 用 x 0 作 条 件, 则 块 If 语 句 可 以 改 为 如 下 方 式 : If x >= 5 Then

111 98 Visual Basic 程 序 设 计 教 程 y = 3 * x - 1 ElseIf x >= 0 Then y = 2 * x +3 Else y = - x End If (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 Text1 文 本 框 内 输 入 数 字 - 4 后, 鼠 标 点 击 计 算 按 钮 由 于 y 值 的 计 算 与 x 所 在 区 间 段 有 关, 为 了 验 证 程 序 的 正 确 性, 应 至 少 运 行 三 次 该 程 序,x 应 分 别 取 三 个 区 间 段 的 数 进 行 测 试, 运 行 结 果 如 图 6.8 所 示 图 6.8 例 6.3 运 行 结 果 例 6.4 输 入 某 学 生 成 绩 ( 百 分 制 ), 若 是 100 成 绩 90 输 出 优 秀 ; 若 是 90> 成 绩 80 输 出 良 好 ; 若 是 80> 成 绩 70 输 出 中 等 ; 若 是 70> 成 绩 60 输 出 及 格 ; 若 是 60> 成 绩 0, 输 出 不 及 格 ; 若 是 其 他 数 则 输 出 error 信 息 问 题 分 析 : 这 是 一 个 分 段 比 较 的 程 序, 可 用 块 If 语 句 输 入 成 绩 x, 先 把 错 误 的 数 值 排 除, 即 先 判 断 x>100 或 者 x<0, 若 为 True, 输 出 error 信 息 ; 若 为 False 则 说 明 输 入 的 成 绩 有 效, 然 后 从 90 到 逐 级 进 行 判 断 首 先 定 义 一 个 Single 类 型 的 变 量 x, 从 应 用 程 序 窗 体 界 面 的 文 本 框 Text1 输 入 数 字, 利 用 Val(Text1.text) 函 数 获 得 该 数 值 后, 赋 值 给 变 量 x, 然 后 用 块 If 语 句 对 x 进 行 判 断, 利 用 窗 体 界 面 文 本 框 Text2 显 示 相 应 的 信 息 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 四 个 控 件 组 成, 分 别 是 一 个 标 签 (Label1) 两 个 文 本 框 (Text1 Text2) 和 一 个 命 令 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 6.3 表 6.3 例 6.2 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 判 断 学 生 成 绩 Label1 Caption 输 入 成 绩 : Text1 Text 置 空 Text2 Text 置 空 Command1 Caption 判 断 级 别

112 第 6 章 选 择 结 构 程 序 设 计 99 (3) 编 写 程 序 代 码 : 在 Form1 窗 体 中, 双 击 窗 体 界 面 中 命 令 按 钮 Command1 对 象, 进 入 Form1 代 码 窗 口, 编 写 Command1 的 单 击 (Click) 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Command1_Click() Dim x As Single x = Val(Text1.Text) If x > 100 Or x < 0 Then Text2.Text = "error" ElseIf x < 60 Then Text2.Text = " 不 及 格 " ElseIf x < 70 Then Text2.Text = " 及 格 " ElseIf x < 80 Then Text2.Text = " 中 等 " ElseIf x < 90 Then Text2.Text = " 良 好 " Else Text2.Text = " 优 秀 " End If (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 比 如 在 Text1 文 本 框 内 输 入 成 绩 80 后, 鼠 标 点 击 判 断 级 别 按 钮, 运 行 结 果 如 图 6.9 所 示 为 了 验 证 程 序 的 正 确 性, 应 多 运 行 几 次 该 程 序, 成 绩 应 分 别 取 各 个 区 间 段 的 数 进 行 测 试 图 6.9 例 6.4 运 行 结 果 6.3 多 分 支 选 择 结 构 语 句 多 分 支 选 择 结 构 是 从 多 个 选 择 结 构 中, 选 择 第 一 个 条 件 为 True 的 路 线 作 为 执 行 的 路 线 对 于 条 件 复 杂 的 多 分 支 选 择 结 构, 用 Select Case 语 句 实 现 比 用 块 If 语 句 实 现 更 容 易, 且 代 码 效 率 高, 可 读 性 强 Select Case 语 句 的 语 法 格 式 为 : Select Case 表 达 式

113 100 Visual Basic 程 序 设 计 教 程 Case 值 列 表 1 语 句 组 1 [ Case 值 列 表 i 语 句 组 i ] [ Case Else 语 句 组 N ] End Select 说 明 : (1) 表 达 式 : 可 以 是 一 个 数 值 表 达 式 或 字 符 串 表 达 式, 通 常 使 用 一 个 数 值 类 型 或 字 符 串 类 型 的 变 量 (2)Case 值 列 表 i: 是 Case 子 句, 如 果 表 达 式 与 某 个 Case 子 句 的 值 列 表 i 相 匹 配, 则 执 行 该 Case 子 句 中 的 语 句 组 i Case 子 句 中 的 值 列 表 i 可 以 有 三 种 表 示 形 式 : 1 一 个 或 多 个 常 量, 多 个 常 量 之 间 用, 分 开 ; 2 使 用 To 关 键 字, 用 以 指 定 一 个 数 值 范 围, 要 求 小 的 数 在 To 之 前, 如 1 To 10; 3 Is 关 键 字 与 比 较 运 算 符 配 合 使 用, 用 以 指 定 一 个 数 值 范 围, 如 Is >20 在 每 个 Case 子 句 的 < 值 列 表 > 中, 以 上 三 种 形 式 可 以 任 意 组 合 使 用 如 : Case 3,5,7 To 9,Is < 2 (3)Case Else: 当 表 达 式 的 值 与 前 面 所 有 的 Case 子 句 的 值 列 表 都 不 匹 配 时 的 情 况 下 执 行 语 句 组 N (4)End Select: 为 多 分 支 结 构 语 句 的 结 束 标 志 (5) 多 分 支 结 构 语 句 要 求 必 须 以 Select Case 开 头, 中 间 可 有 任 意 个 Case 子 句,Case Else 子 句 只 能 有 一 个 或 者 没 有, 最 后 必 须 以 End Select 结 束 注 意 :Select Case 语 句 只 计 算 一 次 表 达 式 的 值, 然 后 将 该 值 与 该 结 构 中 的 每 个 Case 子 句 中 的 值 列 表 进 行 比 较, 可 能 有 下 列 四 种 情 况 : (1) 如 果 某 个 值 列 表 i 与 表 达 式 的 值 相 匹 配, 就 执 行 该 Case 子 句 中 的 语 句 组 i, 之 后 该 Select Case 语 句 结 束 程 序 继 续 执 行 End Select 子 句 后 面 的 其 他 语 句 (2) 如 果 有 多 个 值 列 表 与 表 达 式 的 值 相 匹 配 时, 只 有 第 一 个 匹 配 的 Case 子 句 被 执 行, 然 后 该 Select Case 语 句 结 束 (3) 如 果 没 有 一 个 值 列 表 与 表 达 式 的 值 相 匹 配, 就 执 行 Case Else 子 句 中 的 语 句 组 N, 之 后 该 Select Case 语 句 结 束 (4) 如 果 实 际 编 写 的 程 序 中 既 没 有 一 个 值 列 表 与 表 达 式 的 值 相 匹 配, 又 没 有 Case Else 子 句, 则 该 Select Case 语 句 不 执 行 任 何 语 句 就 结 束 例 6.5 用 Select Case 语 句 实 现 例 6.4 判 断 学 生 成 绩 问 题 分 析 : 判 断 学 生 的 成 绩 级 别 时, 其 实 主 要 是 看 成 绩 的 十 位 数 和 百 位 数, 我 们 可 以 利 用 整 除 运 算 符 \, 把 成 绩 整 除 10, 即 去 掉 个 位 数, 如 之 间 任 何 一 个 数, 整 除 10 后, 都 是 7, 其 相 应 的 的 成 绩 级 别 应 是 中 等 假 设 定 义 Score 变 量 用 来 存 放 学 生 成 绩, 我 们 就 可 用

114 第 6 章 选 择 结 构 程 序 设 计 101 Score\10 作 为 Select case 语 句 的 < 表 达 式 >, Score\10 的 值 与 几 个 数 字 相 匹 配 进 行 判 断 级 别 即 可 Visual Basic 应 用 程 序 设 计 步 骤 与 例 6.4 相 同, 下 面 只 给 出 按 钮 单 击 事 件 的 代 码 部 分 : Private Sub Command1_Click() Dim score As Single score = Val(Text1.Text) If score > 100 Or score < 0 Then Text2.Text = "error" : End Select Case score \ 10 Case 9, 10 Text2.Text = " 优 秀 " Case 8 Text2.Text = " 良 好 " Case 7 Text2.Text = " 中 等 " Case 6 Text2.Text = " 及 格 " Case 0 To 5 Text2.Text = " 不 及 格 " End Select 在 判 别 成 绩 级 别 之 前, 先 用 一 个 行 If 语 句 判 断 输 入 数 据 是 否 合 法, 如 果 输 入 的 数 据 不 在 0~100 之 内, 则 为 非 法 数 据, 给 出 error 信 息 后, 执 行 End 语 句, 即 该 应 用 程 序 立 即 结 束, 后 面 的 判 断 不 再 进 行 ; 如 果 输 入 的 数 据 合 法 ( 在 0~100 之 内 ), 则 执 行 Select Case 语 句, 根 据 Score\10 的 值 对 成 绩 进 行 区 间 判 断, 在 Text2 文 本 框 中 显 示 结 果 信 息 上 述 代 码 中 Select Case 语 句 中 前 四 个 Case 子 句 已 经 列 出 了 及 格 以 上 的 所 有 情 况, 则 剩 下 的 情 况 只 有 不 及 格 了, 因 此 最 后 一 个 Case 子 句 可 换 成 Case Else 子 句, 即 : Case 0 To 5 Text2.Text = " 不 及 格 " 替 换 为 : Case Else Text2.Text = " 不 及 格 " 例 6.6 某 商 店 为 搞 促 销 推 出 打 折 消 费 活 动, 顾 客 如 果 消 费 的 商 品 在 100 元 以 内, 可 享 受 1% 的 优 惠, 如 果 消 费 的 商 品 在 100 元 以 上,500 以 内 可 享 受 5% 的 优 惠, 如 果 消 费 的 商 品 在 500 元 以 上,1000 以 内 可 享 受 10% 的 优 惠, 如 果 消 费 的 商 品 在 1000 元 以 上,5000 以 内 可 享 受 15% 的 优 惠, 如 果 消 费 商 品 的 价 格 在 5000 元 以 上, 可 享 受 20% 的 优 惠 从 键 盘 输 入 顾 客 消 费 商 品 的 费 用, 计 算 出 可 获 得 的 优 惠, 及 实 际 应 付 的 金 额 问 题 分 析 : 设 消 费 的 商 品 为 x 元, 可 获 得 的 优 惠 为 y, 实 付 的 金 额 为 z 则 z=x-y,x 与 y 关 系 如 下 :

115 102 Visual Basic 程 序 设 计 教 程 x 0.01 (x<100) x 0.05 (100 x<500) y = x 0.1 (500 x<1000) x 0.15 (1000 x<5000) x 0.2 (5000 x) Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 七 个 控 件 组 成, 分 别 是 三 个 标 签 (Label1 Label2 Label3) 三 个 文 本 框 (Text1 Text2 Text3) 和 一 个 命 令 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 6.4 表 6.4 例 6.6 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 商 品 优 惠 Label1 Caption 消 费 商 品 : Label2 Caption 优 惠 : Label3 Caption 实 付 金 额 : Text1 Text 置 空 Text2 Text 置 空 Text3 Text 置 空 Command1 Caption 计 算 (3) 编 写 程 序 代 码 : 双 击 窗 体 界 面 中 命 令 按 钮 Command1 对 象 进 入 代 码 编 辑 器, 编 写 Command1 的 单 击 (Click) 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Command1_Click() Dim x, y, z As Single x = Val(Text1.Text) Select Case x Case Is < 0 Text3.Text = " 输 入 错 误!": End Case Is < 100 y = x * 0.01 Case Is < 500 y = x * 0.05 Case Is < 1000 y = x * 0.1 Case Is < 5000 y = x * 0.15

116 第 6 章 选 择 结 构 程 序 设 计 103 Case Else y = x * 0.2 End Select z = x - y Text2.Text = y: Text3.Text = z (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 Text1 文 本 框 内 输 入 金 额, 鼠 标 点 击 计 算 按 钮 运 行 结 果 如 图 6.10 所 示 图 6.10 例 6.6 运 行 结 果 6.4 选 择 结 构 的 嵌 套 嵌 套 是 一 个 控 制 结 构 内 又 包 含 另 一 个 控 制 结 构, 选 择 结 构 的 嵌 套 就 是 在 一 个 选 择 结 构 中 又 包 含 另 一 个 选 择 结 构 可 以 有 两 层 嵌 套 或 多 层 ( 三 层 以 上 ) 嵌 套 选 择 结 构 嵌 套 方 式 有 多 种, 常 用 的 选 择 结 构 嵌 套 方 式 有 块 If 语 句 嵌 套 行 If 语 句 ; 块 If 语 句 嵌 套 块 If 语 句 ; 块 If 语 句 嵌 套 Select Case 语 句 ;Select Case 语 句 嵌 套 行 If 或 块 If 语 句 等 等 例 6.7 输 入 一 年 号, 判 断 它 是 否 闰 年 问 题 分 析 : 判 断 是 否 闰 年, 根 据 以 下 三 种 情 况 : (1) 如 果 此 年 号 能 被 400 整 除 则 它 是 闰 年 (2) 如 果 此 年 号 不 能 被 400 除 尽, 也 不 能 被 100 除 尽, 但 能 被 4 整 除, 则 它 是 闰 年 (3) 其 他 都 不 是 闰 年 定 义 一 个 变 量 Year 用 来 存 放 输 入 的 年 份, 如 果 Year 除 以 400 得 余 数 为 零 则 属 于 第 (1) 种 情 况 ; 否 则, 若 Year 除 以 4 得 余 数 为 零 并 且 Year 除 以 100 得 余 数 不 为 零 两 者 同 时 成 立, 则 属 于 第 (2) 种 情 况 ; 再 否 则 就 属 于 第 (3) 种 情 况 了 根 据 以 上 判 断 的 顺 序 可 知, 使 用 两 层 嵌 套 的 块 If 语 句 就 可 实 现 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 四 个 控 件 组 成, 分 别 是 两 个 标 签 (Label1 Label2) 一 个 文 本 框 (Text1) 和 一 个 命 令 按 钮 (Command1) 程 序 界 面 见 图 6.11 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 6.5

117 104 Visual Basic 程 序 设 计 教 程 表 6.5 例 6.7 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 闰 年 否 Label1 Caption 输 入 年 号 Label2 Caption 置 空 Text1 Text 置 空 Command1 Caption 判 断 (3) 编 写 程 序 代 码 : Private Sub Command1_Click() Dim year, x As Integer year = Val(Text1.Text) If year Mod 400 = 0 Then Label2.Caption = " 是 闰 年 " Else ' 下 面 是 嵌 套 块 If 语 句 If year Mod 4 = 0 And year Mod 100 <> 0 Then Label2.Caption = " 是 闰 年 " Else Label2.Caption = " 不 是 闰 年 " End If End If 该 程 序 中 使 用 的 是 块 If 语 句 嵌 套 块 If 语 句 结 构, 内 层 的 块 If 语 句 需 放 置 在 外 层 块 If 语 句 的 Else 子 句 部 分 程 序 的 执 行 过 程 是 外 层 的 块 If 语 句 先 对 条 件 year Mod 400 = 0 进 行 判 断, 若 为 True, 即 属 于 前 面 问 题 分 析 中 第 (1) 种 情 况, 则 执 行 Then 子 句, 输 出 是 闰 年 后, 该 外 层 的 块 If 语 句 结 束, 不 再 执 行 其 Else 子 句 部 分 ( 即 内 层 块 If 语 句 将 不 被 执 行 ); 若 为 False, 则 执 行 Else 子 句, 在 Else 子 句 中 执 行 内 层 的 块 If 语 句, 若 条 件 year Mod 4 = 0 And year Mod 100 <> 0 为 True, 即 属 于 前 面 问 题 分 析 中 第 (2) 种 情 况, 则 执 行 内 层 块 If 语 句 的 Then 子 句, 也 输 出 是 闰 年 后, 内 层 的 块 If 语 句 结 束 ; 若 条 件 为 False, 则 执 行 内 层 块 If 语 句 的 Else 子 句, 输 出 不 是 闰 年 后, 内 层 的 块 If 语 句 结 束 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 文 本 框 内 输 入 一 个 年 号, 鼠 标 点 击 判 断 按 钮 运 行 结 果 如 图 6.11 所 示 图 6.11 例 6.7 运 行 结 果

118 第 6 章 选 择 结 构 程 序 设 计 105 例 6.8 求 一 元 二 次 方 程 ax 2 + bx + c = 0 的 根 ( 包 括 实 根 和 复 根 ) 问 题 分 析 : 一 元 二 次 方 程 的 根 与 三 个 系 数 (a b c) 密 切 相 关, 对 输 入 的 三 个 系 数 进 行 判 别, 有 以 下 四 种 情 况 出 现 : (1) 若 a = 0, 是 一 元 一 次 方 程, 若 b 0, 有 一 根 x = - c/b (2) 若 b 2-4ac = 0, 有 两 个 相 等 的 实 根 (3) 若 b 2-4ac > 0, 有 两 个 不 等 的 实 根 (4) 若 b 2-4ac < 0, 有 两 个 共 轭 复 根 由 于 (2) (3) (4) 三 种 情 况 都 是 对 表 达 式 b 2-4ac 的 值 进 行 判 断, 则 编 程 时 可 设 一 个 变 量 delt, 令 delt=b 2-4ac 在 这 四 种 情 况 中 应 先 对 第 (1) 种 情 况 进 行 判 断, 即 如 果 条 件 a=0 的 值 为 True, 则 应 输 出 是 一 元 一 次 方 程 的 信 息 及 其 根 的 值, 之 后 程 序 结 束 ; 只 有 条 件 a=0 的 值 为 False 时, 才 对 delt 值 再 进 行 三 种 情 况 的 判 断, 因 此 需 用 两 层 嵌 套 的 选 择 结 构 实 现 该 功 能 外 层 是 对 条 件 a=0 进 行 判 断, 内 层 是 对 delt 进 行 判 断 当 delt<0 为 True 时, 有 两 个 共 轭 复 根 可 定 义 两 个 变 量 realpart,imagpart 分 别 表 示 复 根 的 实 部 和 虚 部, 分 别 计 算 出 realpart,imagpart 的 值 后, 输 出 两 个 复 根 的 值 为 : x1 = realpart + imagpart i x2 = realpart - imagpart i Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 七 个 控 件 组 成, 分 别 是 两 个 标 签 (Label1 Label2) 五 个 文 本 框 (Text1 Text2 Text3 Text4 Text5) 和 一 个 命 令 按 钮 (Command1) 如 图 6.12 所 示 图 6.12 例 6.8 运 行 结 果 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 6.6 表 6.6 例 6.8 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 一 元 二 次 方 程 Text3 Text 置 空 Label1 Caption 输 入 三 个 系 数 Text4 Text 置 空 Label2 Caption 置 空 Text5 Text 置 空 Text1 Text 置 空 Command1 Caption 求 根 Text2 Text 置 空 (3) 编 写 程 序 代 码 :

119 106 Visual Basic 程 序 设 计 教 程 Private Sub Command1_Click() Dim a, b, c, delt, realpart, imagpart As Single a = Val(Text1.Text): b = Val(Text2.Text): c = Val(Text3.Text): delt = b * b - 4 * a * c If a = 0 Then Label2.Caption = " 是 一 元 一 次 方 程 :" If b<>0 then Text4.Text = "x1=" & -c / b Else If c=0 then Text4.Text = " 有 无 穷 根 " Else Text4.Text = " 无 根 " End if End if Else ' 下 面 是 嵌 套 块 If 语 句 If delt = 0 Then Label2.Caption = " 有 两 个 相 等 的 实 根 :" Text4.Text = "x1=" & -b / 2 / a Text5.Text = "x2=" & -b / 2 / a ElseIf delt > 0 Then Label2.Caption = " 有 两 个 不 等 的 实 根 :" Text4.Text = "x1=" & (-b + Sqr(delt)) / (2 * a) Text5.Text = "x2=" & (-b - Sqr(delt)) / (2 * a) Else Label2.Caption = " 有 两 个 共 轭 复 根 :" realpart = -b / (2 * a) imagpart = Sqr(-delt) / (2 * a) Text4.Text = "x1=" & realpart & "+" & imagpart & "i" Text5.Text = "x2=" & realpart & "-" & imagpart & "i" End If ' 此 行 的 End If 与 内 层 的 块 If 语 句 对 应 End If ' 此 行 的 End If 与 外 层 的 块 If 语 句 对 应 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 前 三 个 文 本 框 内 输 入 三 个 系 数 所 对 应 的 数 据, 鼠 标 单 击 求 根 按 钮 运 行 结 果 如 图 6.12 所 示 上 述 代 码 中 使 用 的 是 块 If 语 句 嵌 套 块 If 语 句 结 构, 由 于 内 层 的 条 件 是 对 delt 值 的 三 个 区 间 段 进 行 判 断, 因 此 也 可 用 块 If 语 句 嵌 套 Select Case 语 句 结 构 实 现, 代 码 如 下 :

120 第 6 章 选 择 结 构 程 序 设 计 107 Private Sub Command1_Click() Dim a, b, c, delt, realpart, imagpart As Single a = Val(Text1.Text): b = Val(Text2.Text): c = Val(Text3.Text): delt = b * b - 4 * a * c If a = 0 Then Label2.Caption = " 是 一 元 一 次 方 程 :" If b<>0 then Text4.Text = "x1=" & -c / b Else If c=0 then Text4.Text = " 有 无 穷 根 " Else Text4.Text = " 无 根 " End if End if Else ' 嵌 套 Select Case 语 句 Select Case delt Case 0 Label2.Caption = " 有 两 个 相 等 的 实 根 :" Text4.Text = "x1=" & -b / 2 / a Text5.Text = "x2=" & -b / 2 / a Case Is > 0 Label2.Caption = " 有 两 个 不 等 的 实 根 :" Text4.Text = "x1=" & (-b + Sqr(delt)) / (2 * a) Text5.Text = "x2=" & (-b - Sqr(delt)) / (2 * a) Case Is < 0 Label2.Caption = " 有 两 个 共 轭 复 根 :" realpart = -b / (2 * a) imagpart = Sqr(-delt) / (2 * a) Text4.Text = "x1=" & realpart & "+" & imagpart & "i" Text5.Text = "x2=" & realpart & "-" & imagpart & "i" End Select End If 在 前 面 的 例 6.5 用 Select Case 语 句 实 现 判 断 学 生 成 绩 的 程 序 代 码 中, 当 输 入 的 数 据 非 法 时, 应 用 程 序 立 即 结 束 用 户 可 能 还 没 有 看 清 error 信 息, 应 用 程 序 窗 口 就 已 关 闭, 无 法 再 进 行 其 他 数 据 的 判 断 了 因 此 也 可 用 块 If 语 句 中 嵌 套 Select Case 语 句 进 行 改 进 例 6.5 改 进 的 代 码 如 下 :

121 108 Visual Basic 程 序 设 计 教 程 Private Sub Command1_Click() Dim score As Single score = Val(Text1.Text) If score > 100 Or score < 0 Then Text2.Text = "error" Else Select Case score \ 10 Case 9, 10 Text2.Text = " 优 秀 " Case 8 Text2.Text = " 良 好 " Case 7 Text2.Text = " 中 等 " Case 6 Text2.Text = " 及 格 " Case 0 To 5 Text2.Text = " 不 及 格 " End Select End If 无 论 是 块 If 语 句 的 多 层 嵌 套, 还 是 Select Case 语 句 的 多 层 嵌 套, 都 要 注 意 每 一 层 选 择 结 构 中 的 结 束 部 分 不 能 缺 少 End if 子 句 或 End Select 子 句 每 个 End if 子 句 或 End Select 子 句 自 动 与 最 靠 近 的 前 一 个 if 语 句 或 Select Case 语 句 配 对 多 层 嵌 套 中 要 注 意 代 码 的 缩 格 书 写 方 式 6.5 IIf 函 数 该 函 数 有 三 个 参 数, 根 据 条 件 表 达 式 的 值, 返 回 可 供 选 择 的 两 部 分 中 的 一 个 IIf 函 数 的 语 法 :IIf( 条 件, 语 句 1, 语 句 2) 函 数 先 判 断 条 件 的 值, 若 为 True, 则 函 数 返 回 语 句 1 的 值 ; 若 为 False, 则 函 数 返 回 语 句 2 的 值 可 改 写 例 6.1 的 Command1 的 单 击 事 件 代 码 如 下 : Private Sub Command1_Click() Dim x As Single, y As Single x = Val(Text1.Text) Text2.Text = IIf(x <> 0, 2 * x + 1, x) 当 x <> 0 为 True, 则 函 数 返 回 2 * x + 1 的 值, 相 当 于 Text2.Text =2 * x + 1; 若 为 False, 则 函 数 返 回 x 的 值, 相 当 于 Text2.Text = x

122 第 6 章 选 择 结 构 程 序 设 计 109 IIf 函 数 允 许 嵌 套 调 用 可 改 写 例 6.4 的 Command1 的 单 击 事 件 代 码 如 下 : Private Sub Command1_Click() Dim x As Single x = Val(Text1.Text) Text2.Text =IIf( x > 100 Or x < 0,"error",IIf( x < 60," 不 及 格 ",_ IIf(x < 70," 及 格 ",IIf( x < 80," 中 等 ",IIf( x < 90," 良 好 "," 优 秀 "))))) 该 程 序 中 有 五 次 调 用 IIf 函 数, 当 第 一 次 调 用 IIf 时, 若 x > 100 Or x < 0 为 True 时, 函 数 返 回 error,iif 函 数 调 用 结 束 ; 若 为 False, 执 行 嵌 套 调 用 IIf 函 数, 再 判 断 x < 60, 若 为 True 时, 函 数 返 回 不 及 格,IIf 函 数 调 用 结 束 ; 若 为 False, 再 次 执 行 嵌 套 调 用 IIf 函 数, 依 此 类 推 习 题 1. 输 入 一 个 整 数, 编 程 判 断 该 数 是 奇 数 还 是 偶 数 2. 输 入 三 角 形 的 三 个 边 a b c, 判 断 是 否 构 成 三 角 形 如 果 是 三 角 形, 计 算 出 三 角 形 的 面 积 提 示 : 计 算 面 积 公 式 为 S = 0.5 *(a+b+c) area = sqr(s *(S-a)* (S-b)*(S-c)) 3. 输 入 三 个 数, 输 出 最 小 的 数 4. 某 幼 儿 园 只 收 2~6 岁 的 小 孩,2 岁 入 小 班,3~4 岁 入 中 班,5~6 岁 入 大 班 输 入 小 孩 岁 数, 输 出 入 哪 类 班 5. 分 别 用 行 If 块 If 和 Select Case 语 句 实 现 如 下 计 算 功 能 : -2x+1 (x < 0 ) y = x 2 (0 x< 10 ) 4x-4 (x 10 ) 6. 输 入 三 个 整 数, 按 从 大 到 小 输 出 提 示 : 假 设 用 a b c 三 个 变 量 来 存 放 读 入 的 三 个 数, 经 过 几 次 判 断 后, 让 a 存 放 最 大 的 数,b 存 放 中 间 的 数,c 存 放 最 小 的 数 7. 输 入 三 个 数, 求 其 平 均 值, 输 出 大 于 平 均 值 的 数

123 第 7 章 循 环 结 构 程 序 设 计 在 程 序 设 计 中, 为 解 决 某 问 题, 可 能 某 一 段 代 码 需 要 有 条 件 地 连 续 重 复 执 行 许 多 次, 这 时 就 要 用 到 循 环 程 序 结 构 如 统 计 超 过 平 均 成 绩 的 学 生 人 数 求 1 至 100 的 累 加 和 对 数 据 进 行 排 序 等 问 题, 用 循 环 程 序 结 构 来 实 现 是 很 容 易 解 决 的 循 环 程 序 结 构 也 是 结 构 化 程 序 设 计 三 大 基 本 结 构 之 一, 它 可 以 简 化 程 序, 节 约 内 存, 提 高 效 率 需 重 复 执 行 的 一 段 代 码, 我 们 称 之 为 循 环 体, 程 序 中 的 循 环 体 不 可 能 永 无 止 境 地 执 行, 它 需 要 有 结 束 执 行 的 条 件, 根 据 条 件 是 先 判 断 还 是 后 判 断, 可 把 循 环 结 构 分 为 当 型 循 环 ( 如 图 7.1) 和 直 到 型 循 环 ( 如 图 7.2) False/True 循 环 体 条 件 循 环 体 True/False False/True 条 件 True/False 图 7.1 当 型 循 环 图 7.2 直 到 型 循 环 当 型 循 环 是 先 判 断 条 件, 再 执 行 循 环 体, 然 后 再 返 回 判 断 条 件 当 型 循 环 结 构 中, 循 环 体 有 可 能 一 遍 也 不 执 行 直 到 型 循 环 是 先 执 行 一 遍 循 环 体, 再 判 断 条 件 直 到 型 循 环 结 构 中, 循 环 体 至 少 执 行 一 遍 Visual Basic 提 供 了 丰 富 的 实 现 循 环 结 构 的 语 句 :While Wend 语 句 Do 语 句 For 语 句 Goto 语 句 等 等 7.1 While 循 环 结 构 While 循 环 结 构 由 While Wend 语 句 实 现, 它 属 于 当 型 循 环 结 构 While 循 环 结 构 语 法 格 式 : While 条 件 表 达 式 [ 语 句 组 ] Wend 说 明 : (1) 条 件 表 达 式 : 可 以 是 关 系 表 达 式 或 逻 辑 表 达 式, 其 取 值 为 True 或 False (2) 语 句 组 : 循 环 结 构 中 需 重 复 执 行 的 循 环 体 部 分, 它 可 由 若 干 条 语 句 组 成 (3)Wend: 与 While 语 句 匹 配 使 用 的 循 环 结 束 语 句, 它 不 能 单 独 出 现

124 第 7 章 循 环 结 构 程 序 设 计 111 While 循 环 结 构 的 执 行 顺 序 是 : 首 先 判 断 条 件 表 达 式, 如 果 条 件 表 达 式 的 值 为 False 就 不 执 行 循 环 体, 循 环 结 构 结 束, 应 用 程 序 继 续 往 后 执 行 Wend 后 面 的 语 句 ; 如 果 条 件 表 达 式 的 值 为 True 就 执 行 循 环 体, 然 后 再 返 回 判 断 条 件 例 7.1 计 算 的 和 并 输 出 问 题 分 析 : 我 们 假 设 用 变 量 Sum 来 存 放 累 加 的 和 ( 初 始 值 为 0), 该 问 题 中 一 共 有 100 个 数 要 加 到 Sum 中, 这 是 一 个 循 环 过 程 还 需 设 计 一 个 计 数 器 变 量 Count, 它 要 从 1 变 化 到 100, 它 有 两 个 作 用 : 一 是 作 为 循 环 控 制 变 量, 控 制 循 环 体 执 行 100 次 ; 二 是 把 它 每 次 变 化 的 值 加 到 Sum 中 当 循 环 结 束 时,Sum 中 存 放 的 正 好 就 是 1 至 100 的 累 加 和 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 两 个 控 件 组 成, 一 个 标 签 (Label1) 和 一 个 文 本 框 (Text1) 如 图 7.3 所 示 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.1 图 7.3 例 7.1 的 程 序 界 面 表 7.1 例 7.1 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 累 加 和 Label1 Caption = Text1 Text 置 空 (3) 编 写 程 序 代 码 : 由 于 该 程 序 不 需 要 输 入, 可 以 在 窗 体 (Form1) 载 入 时 输 出 计 算 结 果 双 击 窗 体 Form1 界 面 中 的 空 白 部 分, 进 入 代 码 编 辑 器, 编 写 Form_Load 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Form_Load() Dim Sum, Count As Integer Sum = 0: Count = 1 While Count < 101 Sum = Sum + Count Count = Count + 1 Wend Text1.Text = Sum (4) 运 行 程 序 :

125 112 Visual Basic 程 序 设 计 教 程 按 F5 功 能 键 或 单 击 工 具 栏 上 的 ( 见 图 7.3) 通 过 此 例 应 当 注 意 : 按 钮 运 行 该 程 序, 立 刻 就 能 在 窗 体 界 面 中 看 到 计 算 结 果 (1) 已 知 该 循 环 体 需 要 执 行 100 次, 循 环 条 件 是 Count<101, 在 While 循 环 语 句 之 前 应 有 循 环 控 制 变 量 Count 赋 初 值 的 语 句, 如 Count = 1, 它 使 循 环 条 件 第 一 次 取 值 为 True, 从 而 开 始 执 行 循 环 体 (2) 循 环 体 是 有 条 件 地 被 重 复 执 行, 在 循 环 体 中 一 定 要 有 使 循 环 控 制 变 量 改 变 的 语 句, 即 Count = Count + 1 当 循 环 达 到 所 需 的 次 数 后, 能 使 循 环 条 件 取 值 为 False, 从 而 退 出 循 环 (3) 循 环 控 制 变 量 的 初 值 与 循 环 条 件 以 及 循 环 体 中 循 环 控 制 变 量 值 的 改 变 是 相 互 对 应 的, 在 上 面 的 程 序 中 Sum 是 从 小 (1) 到 大 (100) 累 加, 当 然 也 可 以 从 大 到 小 累 加 程 序 可 变 换 如 下 : Private Sub Form_Load() Dim Sum, Count As Integer Sum = 0: Count = 100 While Count >0 Wend Sum = Sum + Count Count = Count - 1 Text1.Text = Sum 例 7.2 利 用 格 里 高 利 公 式 求 π π = LL 问 题 分 析 : 可 以 把 格 里 高 利 公 式 = 右 边 的 式 子 当 作 求 累 加 和 问 题, 每 次 要 加 的 项 是 一 个 带 符 号 的 分 数, 该 分 数 的 分 子 为 1, 分 母 为 1,3,5,, 每 次 增 加 2, 其 符 号 的 规 律 是, 第 奇 数 次 要 加 的 项 是 正 数, 第 偶 数 次 要 加 的 项 是 负 数 因 此 可 以 在 程 序 中 设 置 一 个 符 号 变 量 s( 初 值 为 1), 每 次 在 循 环 体 中 都 与 -1 相 乘, 以 决 定 要 累 加 的 某 项 的 符 号 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 仅 由 两 个 标 签 (Label1 Label2) 组 成 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.2 (3) 编 写 程 序 代 码 : 表 7.2 例 7.2 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption π Label1 Caption π 的 近 似 值 为 : Label2 Caption 置 空

126 第 7 章 循 环 结 构 程 序 设 计 113 该 程 序 不 需 要 输 入, 直 接 在 窗 体 (Form1) 载 入 时 输 出 计 算 结 果 双 击 窗 体 Form1 界 面 中 的 空 白 部 分, 进 入 代 码 编 辑 器, 编 写 Form_Load 事 件, 该 事 件 代 码 如 下 : Private Sub Form_Load() Dim Pi, Sum, s, i As Double Sum = 0: i = 1: s = 1 While Abs(s / i) > Sum = Sum + s / i i = i + 2 s = -1 * s Wend Pi = Sum * 4 Label2.Caption = Pi (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 立 刻 就 能 在 窗 体 界 面 中 看 到 计 算 结 果 如 图 7.4 所 示 通 过 此 例 应 当 注 意 : 图 7.4 例 7.2 运 行 结 果 (1) 因 为 计 算 机 的 计 算 精 度 有 限, 我 们 只 能 求 π 的 一 个 近 似 值 而 这 个 近 似 值 具 体 精 确 到 第 几 位, 又 与 Visual Basic 中 变 量 的 数 据 类 型 有 关, 这 里 我 们 这 里 所 使 用 的 变 量 都 是 Double 类 型 (2) 根 据 格 里 高 利 公 式, 在 该 公 式 的 = 右 侧 是 有 规 律 的 无 穷 的 分 数 项 相 加 在 程 序 中, 循 环 体 具 体 要 执 行 的 次 数 是 未 知 的, 我 们 通 过 在 循 环 体 中 计 算 表 达 式 s / i 来 得 到 每 一 个 分 数 项, 计 算 机 不 能 无 穷 地 计 算 下 去, 因 此 当 我 们 计 算 得 到 某 一 个 分 数 项 非 常 小 时, 就 应 该 退 出 循 环 这 里 当 s / i > 10-7 为 True 时 就 继 续 循 环, 当 s / i > 10-7 为 False 时 循 环 结 束 (3) 循 环 体 中 s 作 为 分 数 项 的 分 子 其 绝 对 值 永 远 为 1, 但 其 符 号 应 是 每 循 环 一 次, 符 号 就 变 一 次, 用 s = -1 * s 就 可 实 现 分 数 项 的 分 母 用 变 量 i 表 示, 它 每 循 环 一 次 其 值 增 加 2, 可 用 i = i +2 实 现 7.2 Do 循 环 结 构 Do 循 环 结 构 一 般 由 Do Loop 语 句 与 While 语 句 或 Until 语 句 配 合 使 用 构 成 根 据 While 语 句 或 Until 语 句 在 Do Loop 中 所 处 的 位 置 不 同, 既 可 以 构 成 当 型 循 环, 又 可 以 构 成 直 到 型 循 环

127 114 Visual Basic 程 序 设 计 教 程 1. 当 型 循 环 当 型 循 环 有 两 种 格 式 如 表 7.3 所 示 表 7.3 当 型 循 环 的 两 种 格 式 语 法 格 式 1 Do [ While 条 件 表 达 式 ] 循 环 体 Loop 格 式 2 Do [ Until 条 件 表 达 式 ] 循 环 体 Loop 流 程 图 True 条 件 循 环 体 False False 条 件 循 环 体 True 格 式 1 是 先 判 断 条 件, 若 条 件 表 达 式 的 值 为 True, 则 执 行 循 环 体, 然 后 再 返 回 判 断 条 件 ; 若 条 件 为 False, 则 结 束 循 环 格 式 2 也 是 先 判 断 条 件, 若 条 件 表 达 式 的 值 为 False, 则 执 行 循 环 体, 然 后 再 返 回 判 断 条 件 ; 若 条 件 为 True 则 结 束 循 环 说 明 : (1) 循 环 体 : 由 若 干 条 语 句 组 成, 并 可 包 含 Exit Do 语 句 (2)Exit Do 语 句 : 表 示 无 条 件 退 出 Do Loop 循 环 Exit Do 语 句 经 常 与 If 语 句 一 起 配 合 使 用, 表 示 当 某 条 件 满 足 时 退 出 循 环 如 If sum>100 Then Exit Do Exit Do 语 句 允 许 在 循 环 体 内 多 次 出 现 2. 直 到 型 循 环 直 到 型 循 环 也 有 两 种 格 式 如 表 7.4 所 示 格 式 3 是 先 执 行 循 环 体, 然 后 判 断 条 件 若 条 件 表 达 式 的 值 为 True 时, 再 返 回 执 行 循 环 体 ; 若 条 件 为 False 则 结 束 循 环 格 式 4 也 是 先 执 行 循 环 体, 然 后 判 断 条 件 若 条 件 表 达 式 的 值 为 False 时, 再 返 回 执 行 循 环 体 ; 若 条 件 为 True 则 结 束 循 环 例 7.3 输 入 一 个 正 整 数 n, 计 算 出 n! 并 输 出 问 题 分 析 : 应 对 输 入 的 数 据 进 行 判 断, 可 能 会 出 现 以 下 情 况 : (1) 如 果 n<0, 应 输 出 错 误 信 息 ; (2) 如 果 n=0, 则 0!=1; (3) 如 果 n 1, 则 n!=1 2 3 n 对 于 n 1 的 情 况, 求 n! 是 一 个 不 断 累 乘 的 过 程, 我 们 定 义 一 个 变 量 t( 初 始 值 为 1), 用 t 来 存 放 累 乘 的 积, 再 定 义 一 个 变 量 i,i 的 值 从 1 变 化 到 n,i 每 变 化 一 次, 就 令 t = t i, 则 t 中 保 存 的 就 是 i!, 因 此 当 i 值 变 为 n 时,t 的 值 就 是 n!

128 第 7 章 循 环 结 构 程 序 设 计 115 表 7.4 直 到 型 循 环 的 两 种 格 式 语 法 格 式 3 Do 循 环 体 Loop [ While 条 件 表 达 式 ] 格 式 4 Do 循 环 体 Loop [ Until 条 件 表 达 式 ] 流 循 环 体 循 环 体 程 图 条 件 False 条 件 True True False Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 四 个 控 件 组 成, 两 个 标 签 (Label1 Label2) 一 个 文 本 框 (Text1) 一 个 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.5 表 7.5 例 7.3 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 计 算 n! Label1 Caption 输 入 正 整 数 Label2 Caption 置 空 Text1 Text 置 空 Command1 Caption 计 算 (3) 编 写 程 序 代 码 : 双 击 窗 体 Form1 中 Command1 按 钮 进 入 代 码 编 辑 器, 编 写 Command1_Click() 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Command1_Click() Dim n, i, t As Long n = Val(Text1.Text) i = 1: t = 1 If n < 0 Then Label2.Caption = "error" ElseIf n = 0 Then Label2.Caption = "0!=1" Else

129 116 Visual Basic 程 序 设 计 教 程 Do While i <= n t = t * i i = i + 1 Loop Label2.Caption = n & "!=" & t End If (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 Text1 文 本 框 中 输 入 一 个 数 字, 鼠 标 单 击 计 算 按 钮, 就 可 看 到 计 算 结 果 三 种 情 况 的 运 行 结 果 如 图 7.5 所 示 图 7.5 例 7.3 运 行 结 果 上 面 的 程 序 代 码 中 对 于 n 1 情 况 使 用 的 是 Do 循 环 的 格 式 1 来 得 到 n!, 如 果 使 用 格 式 2 方 式, 循 环 部 分 的 代 码 改 写 如 下 : Do Until i > n t = t * i i = i + 1 Loop 如 果 使 用 格 式 3 方 式, 循 环 部 分 的 代 码 改 写 如 下 : Do t = t * i i = i + 1 Loop While i <= n 如 果 使 用 格 式 4 方 式, 循 环 部 分 的 代 码 改 写 如 下 : Do t = t * i i = i + 1 Loop Until i > n 也 可 在 循 环 体 中 使 用 Exit Do 方 式, 循 环 部 分 的 代 码 改 写 如 下 : Do t = t * i i = i + 1 If i > n Then Exit Do Loop

130 第 7 章 循 环 结 构 程 序 设 计 117 例 7.4 输 入 两 个 正 整 数 m n, 求 m 和 n 的 最 大 公 约 数 问 题 分 析 : 假 设 m>n 则 最 大 公 约 数 应 小 于 或 等 于 n, 可 使 用 辗 转 相 除 法 实 现, 流 程 图 如 图 7.6, 辗 转 相 除 法 道 理 如 下 : (1) 如 果 有 m > n, 则 m 可 表 示 成 x n + r ( 其 中 x 为 m/n 的 商,r 为 m/n 的 余 数 ) 如 果 余 数 r 为 0, 表 示 m 能 整 除 n, 则 n 就 是 最 大 公 约 数 (2) 如 果 r 不 为 0, 则 最 大 公 约 数 与 n 和 r 有 关, 因 为 r 为 m/n 的 余 数, 则 n>r, 所 以 n 与 r 的 最 大 公 约 数 就 是 m 与 n 的 最 大 公 约 数 令 m=n,n=r, 再 返 回 (1) 开 始 输 入 m,n r=m mod n True r = 0 输 出 n False m=n,n=r 结 束 图 7.6 辗 转 相 除 法 求 最 大 公 约 数 的 流 程 图 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 五 个 控 件 组 成, 两 个 标 签 (Label1 Label2) 两 个 文 本 框 (Text1 Text2) 和 一 个 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.6 表 7. 6 例 7.4 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 求 最 大 公 约 数 Label1 Caption 输 入 两 正 整 数 : Label2 Caption 置 空 Text1 Text 置 空 Text2 Text 置 空 Commond1 Caption 计 算 (3) 编 写 程 序 代 码 : 双 击 窗 体 Form1 中 Command1 按 钮 进 入 代 码 编 辑 器, 编 写 Command1_Click() 事 件 代 码,

131 118 Visual Basic 程 序 设 计 教 程 该 事 件 代 码 如 下 : Private Sub Command1_Click() Dim m, n, r As Integer m = Val ( Text1.Text ) n = Val ( Text2.Text ) If m < 0 Or n < 0 Then ' 若 判 断 为 非 法 数 据,Then 子 句 输 出 相 应 信 息 Label2.Caption = " 输 入 数 据 有 错!" Else ' 若 判 断 为 合 法 数 据,Else 子 句 用 辗 转 相 除 法 求 余 数 r = m Mod n Do While r <> 0 m = n n = r r = m Mod n Loop ' 循 环 结 束 后 n 中 存 放 的 就 是 最 大 公 约 数, 输 出 n 值 Label2.Caption = " 最 大 公 约 数 为 :" & n End If (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 两 个 文 本 框 中 输 入 两 个 数 字, 鼠 标 单 击 计 算 按 钮, 就 可 看 到 计 算 结 果, 两 种 运 行 结 果 如 图 7.7 所 示 (a) 图 7.7 例 7.4 运 行 结 果 注 意, 本 例 的 循 环 体 中 m=n 和 n=r 两 条 语 句 的 顺 序 不 能 颠 倒, 否 则 将 无 法 得 到 正 确 的 结 果 想 想 看, 为 什 么? 上 述 程 序 中 的 Do 循 环 部 分 采 用 的 是 格 式 1 方 式, 读 者 也 可 用 Do 循 环 的 其 他 格 式 实 现, 这 里 不 再 赘 述 在 编 程 的 过 程 中, 为 保 证 程 序 的 严 密 性, 应 注 意 对 输 入 的 数 据 进 行 判 断, 对 于 不 符 合 要 求 的 数 据 应 给 予 相 应 的 警 告 信 息 例 7.5 用 牛 顿 迭 代 法 求 方 程 3x 3-6x 2 +2x-4=0 在 1.5 附 近 的 根 问 题 分 析 : 牛 顿 迭 代 法 又 称 牛 顿 切 线 法, 如 图 7.8 所 示, 令 f(x)= 3x 3-6x 2 +2x-4, 则 求 原 方 程 的 根 相 当 于 求 曲 线 f(x) 与 x 轴 交 点 处 x* 的 值 先 任 意 设 定 一 个 与 真 实 根 接 近 的 值 x 0, 把 x 0 代 入 上 式 可 得 到 f(x 0 ), 在 曲 线 f(x) 上 通 过 点 (x 0,f(x 0 )) 作 f(x) 的 切 线, 该 切 线 与 x 轴 相 交 于 点 (b)

132 第 7 章 循 环 结 构 程 序 设 计 119 x 1, 再 由 x 1 可 得 到 f(x 1 ), 通 过 点 (x 1,f(x 1 )) 作 f(x) 的 切 线 与 x 轴 相 交 于 点 x 2, 依 此 方 法 进 行 下 去 直 到 相 交 点 x k 足 够 接 近 真 正 的 根 x* 为 止 由 图 7.8 可 以 看 出 : f '(x 上 式 变 换 后 可 得 x n n f(x n ) ) = x x n 图 7.8 牛 顿 迭 代 法 n+ 1 f(x n ) + 1 = x n, 这 就 是 牛 顿 迭 代 公 式 f '(x ) n 重 复 利 用 该 公 式, 就 可 由 x 0 得 到 x 1,x 2, x k-1,x k, 当 x k-1 - x k 小 于 某 个 较 小 的 数 时, 我 们 就 可 把 x k 当 做 方 程 的 近 似 根 由 f ( x ) = 3 x 3-6 x 2 +2 x - 4 可 得 f ' ( x ) = 9 x 2-12 x +2 上 面 两 式 中 有 多 次 指 数 运 算, 为 了 节 省 运 算 时 间 可 转 换 为 : f ( x ) = ( ( 3 x - 6 ) x + 2 ) x - 4 和 f ' ( x ) =(9 x - 12 )x +2 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 五 个 控 件 组 成, 三 个 标 签 (Label1 Label2 Label3) 一 个 文 本 框 (Text1) 和 一 个 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.7 (3) 编 写 程 序 代 码 : 表 7.7 例 7.5 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 牛 顿 迭 代 法 Label1 Caption 输 入 x 的 初 值 Label2 Caption ( ( 3 x - 6 ) x + 2 ) x - 4=0 的 根 是 Label3 Caption 置 空 Text1 Text 置 空 Command1 Caption 计 算 双 击 窗 体 Form1 中 Command1 按 钮 进 入 代 码 编 辑 器, 编 写 Command1_Click() 事 件, 该 事

133 120 Visual Basic 程 序 设 计 教 程 件 代 码 如 下 : Private Sub Command1_Click() Dim x, x0, f, f1 As Double x = Val(Text1.Text) Do x0 = x f = ((3 * x0-6) * x0 + 2) * x0-4 f1 = (9 * x0-12) * x0 + 2 x = x0 - f / f1 Loop Until Abs(x - x0) < Label3.Caption = x (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 文 本 框 中 输 入 数 字, 鼠 标 单 击 计 算 按 钮, 就 可 看 到 计 算 结 果 如 图 7.9 所 示 图 7.9 例 7.5 运 行 结 果 在 上 面 的 程 序 中, 用 变 量 f 和 f1 代 表 f(x) 和 f ' (x), 变 量 x0 代 表 每 次 迭 代 时 x 的 初 始 值, 变 量 x 表 示 每 迭 代 一 次 后 曲 线 f(x) 在 点 (x0,f(x0)) 处 作 切 线 与 x 轴 相 交 产 生 的 新 的 交 点 Do 循 环 的 循 环 次 数 不 定, 直 到 两 个 相 邻 的 交 点 距 离 非 常 小 时 ( 这 里 用 10-6 表 示 ), 结 束 循 环, 最 后 一 次 迭 代 产 生 的 交 点 x 作 为 方 程 的 根 对 于 循 环 次 数 不 确 定 的 循 环 适 宜 用 While 循 环 或 Do 循 环 实 现 使 用 While 循 环 或 Do 循 环 时 都 要 注 意 : (1) 在 循 环 语 句 前 要 有 与 循 环 条 件 相 互 对 应 的 循 环 控 制 变 量 的 赋 初 值 语 句 ; (2) 在 循 环 体 内 要 有 使 循 环 控 制 变 量 变 化 的 语 句 上 述 两 条, 对 于 初 学 编 程 的 人 员 来 说, 非 常 重 要! 如 有 遗 漏, 极 有 可 能 会 造 成 死 循 环 对 于 循 环 次 数 确 定 的 循 环 结 构, 可 以 采 用 下 一 节 将 讲 述 的 For 循 环 实 现 7.3 For 循 环 结 构 在 循 环 结 构 中, 如 果 我 们 能 够 确 定 循 环 体 执 行 的 次 数, 那 么 使 用 For 循 环 结 构 比 使 用 While 循 环 结 构 或 Do 循 环 结 构 更 加 清 晰 简 洁 方 便 For 循 环 结 构 由 For Next 语 句 实 现 For Next 语 句 的 语 法 为 :

134 第 7 章 循 环 结 构 程 序 设 计 121 For 循 环 变 量 = 初 值 To 终 值 [ Step 增 量 ] 循 环 体 Next [ 循 环 变 量 ] 说 明 : (1) 循 环 变 量 : 也 称 作 计 数 器, 是 一 个 变 量, 专 门 用 于 控 制 循 环 体 执 行 的 次 数 (2) 初 值 : 循 环 变 量 的 第 一 次 取 值 (3) 终 值 : 循 环 变 量 与 之 比 较 以 决 定 是 否 结 束 循 环 (4) 增 量 : 也 称 作 步 长, 循 环 变 量 每 次 变 化 时 需 增 加 的 数 据 值, 增 量 可 为 正 数 也 可 为 负 数 如 果 增 量 为 正 数, 则 终 值 应 大 于 或 等 于 初 值 ; 如 果 增 量 为 负 数, 则 终 值 应 小 于 或 等 于 初 值 Step: 为 Visual Basic 保 留 字, 若 书 写 For 循 环 时 没 设 置 Step 部 分, 则 程 序 自 动 把 增 量 默 认 为 1 处 理 (5) 循 环 体 : 由 若 干 条 语 句 组 成, 并 可 有 Exit For 语 句 Exit For 语 句 表 示 无 条 件 退 出 For 循 环 Exit For 语 句 经 常 与 If 语 句 一 起 配 合 使 用, 表 示 当 某 条 件 满 足 时 退 出 循 环 如 If num<0 Then Exit For Exit For 语 句 允 许 在 循 环 体 内 多 次 出 现 (6)Next [ 循 环 变 量 ]: 循 环 体 每 执 行 一 遍 后, 循 环 变 量 的 值 就 变 化 一 次 For 循 环 的 流 程 图 ( 以 增 量 为 正 为 例 ) 如 图 7.10 所 示 循 环 变 量 = 初 值 条 件 T 循 环 变 量 > 终 值 循 环 体 循 环 变 量 = 循 环 变 量 + 增 量 图 7.10 For 循 环 流 程 图 For 循 环 的 执 行 步 骤 是 : (1) 计 算 初 值, 然 后 将 其 赋 值 给 循 环 变 量 (2) 如 果 增 量 为 正, 判 断 循 环 变 量 > 终 值 为 True 时 结 束 循 环 ; 如 果 增 量 为 负, 判 断 循 环 变 量 < 终 值 为 True 时 结 束 循 环 若 判 断 的 结 果 为 False 时, 继 续 第 (3) 步 (3) 执 行 一 遍 循 环 体 (4) 令 循 环 变 量 = 循 环 变 量 + 增 量, 然 后 再 转 到 第 (2) 步 例 7.6 求 100 以 内 所 有 偶 数 的 和 问 题 分 析 : 这 是 一 个 求 累 加 和 问 题 循 环 次 数 已 确 定, 我 们 采 用 For 循 环 实 现 假 设 循 环 变 量 为 i, 则 i 的 初 值 应 为 2, 终 值 应 为 100, 增 量 为 2 用 变 量 Sum 来 存 放 累 加 和, 在 For 循 环 中 i 每 变 化 一 次 就 累 加 到 Sum 中 Visual Basic 应 用 程 序 设 计 步 骤 如 下 :

135 122 Visual Basic 程 序 设 计 教 程 (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 两 个 标 签 (Label1 Label2) 组 成 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.8 表 7.8 例 7.6 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 偶 数 求 和 Label1 Caption 100 以 内 所 有 的 偶 数 和 是 : Label2 Caption 置 空 (3) 编 写 程 序 代 码 : 双 击 窗 体 空 白 处 进 入 代 码 编 辑 器, 编 写 Form_Load() 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Form_Load() Dim i, Sum As Long Sum = 0 For i = 2 To 100 Step 2 Sum = Sum + i Next i Label2.Caption = Sum (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 就 可 看 到 运 算 结 果 如 图 7.11 所 示 图 7.11 例 7.6 运 行 结 果 例 7.7 在 窗 体 中 对 比 显 示 从 16 号 字 型 到 9 号 字 型 问 题 分 析 : 窗 体 的 字 型 大 小 是 通 过 窗 体 的 FontSize 属 性 进 行 设 置, 它 既 可 以 在 属 性 窗 口 中 直 接 进 行 设 置, 也 可 以 在 程 序 的 代 码 中 进 行 设 置 这 里 我 们 一 共 要 连 续 设 置 8 次 字 型 大 小, 需 要 利 用 代 码 进 行 设 置 字 号 从 16 到 9 是 固 定 且 连 续 的, 我 们 可 用 For 循 环 实 现 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 用 户 界 面 只 需 一 个 窗 体 (Form1) 即 可 (2) 设 置 界 面 中 对 象 的 属 性 : 只 需 将 Form1 的 Caption 属 性 设 为 字 号 大 小 即 可 (3) 编 写 程 序 代 码 : 双 击 窗 体 空 白 处 进 入 代 码 编 辑 器, 编 写 Form_Load() 事 件, 该 事 件 代 码 如 下 :

136 第 7 章 循 环 结 构 程 序 设 计 123 Private Sub Form_Load() Dim i As Integer Show ' 使 输 出 可 见 Form1.Font = " 新 宋 体 " For i = 16 To 9 Step -1 Form1.FontSize = i Print i; " 号 字 型 " Next i (4) 运 行 程 序 : 按 F5 功 能 键 运 行 该 程 序, 就 可 看 到 运 行 结 果 如 图 7.12 所 示 图 7.12 例 7.7 运 行 结 果 循 环 控 制 变 量 i 的 初 值 为 16, 终 值 为 9, 增 量 是 -1, 为 负 增 长 窗 体 中 字 体 的 设 置 在 这 里 是 通 过 代 码 进 行 的, 也 可 以 在 属 性 窗 体 中 直 接 设 置 例 7.8 Faibonacci 数 列 为 0,1,1,2,3,5,8,13,, 计 算 并 输 出 第 20 项 以 及 前 20 项 的 和 问 题 分 析 :Faibonacci 数 列 的 规 律 是 : F 1 =0 (n=0) F 2 =1 (n=1) F n =F n-1 +F n-2 (n 3) 由 于 从 第 3 项 开 始, 每 一 项 等 于 前 两 项 的 和, 因 此 可 用 循 环 计 算 出 第 3 项 到 第 20 项, 由 于 循 环 次 数 是 18 次 已 确 定, 因 此 使 用 For 循 环 实 现 再 用 一 个 变 量 Sum 来 累 加 循 环 过 程 中 计 算 出 的 每 一 项 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : Form1 窗 体 界 面 由 两 个 标 签 (Label1 Label2) 组 成 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.9 表 7.9 例 7.8 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption Faibonacci Label1 Caption 置 空

137 124 Visual Basic 程 序 设 计 教 程 Label2 Caption 置 空 (3) 编 写 程 序 代 码 : 双 击 窗 体 空 白 处 进 入 代 码 编 辑 器, 编 写 Form_Load() 事 件 代 码, 该 事 件 代 码 如 下 : Private Sub Form_Load() Dim Prev, Last, NewOne, sum As Long Dim i As Integer Prev = 0: Last = 1: sum = Prev + Last For i = 3 To 20 NewOne = Prev + Last sum = sum + NewOne Prev = Last Last = NewOne Next i Label1.Caption = " 第 20 项 为 " & NewOne Label2.Caption = " 前 20 项 的 和 为 " & sum (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 就 可 看 到 计 算 结 果 如 图 7.13 所 示 图 7.13 例 7.8 运 行 结 果 在 该 例 中, 变 量 NewOne 代 表 需 计 算 的 某 一 项,NewOne 之 前 的 两 项 由 Prev 和 Last 表 示 (Prev 初 值 为 0,Last 初 值 为 1) 循 环 控 制 变 量 i 只 用 来 控 制 循 环 体 执 行 的 次 数 ( 共 18 次 ), i 的 初 值 为 3, 终 值 为 20, 因 为 增 量 值 为 1, 所 以 在 For 语 句 中 省 略 了 Step 1 子 句 在 循 环 体 内,Prev 和 Last 相 加 就 可 得 到 新 的 项 NewOne, 把 NewOne 加 入 Sum 之 后,Prev 和 Last 值 需 要 更 新, 即 令 Prev = Last 和 Last = NewOne, 为 下 次 循 环 顺 序 计 算 出 下 一 项 作 好 准 备 For 循 环 结 束 后,NewOne 中 存 放 的 恰 好 就 是 第 20 项 输 出 结 果 即 可 例 7.9 从 键 盘 输 入 一 个 大 于 2 的 正 整 数, 判 断 该 数 是 否 是 素 数 问 题 分 析 : 如 果 一 个 数 不 能 被 所 有 比 它 自 身 小 的 数 ( 除 1 外 ) 整 除, 则 该 数 就 是 素 数 假 设 输 入 的 数 是 m, 依 次 用 2~k(k 最 大 值 为 m + 1 即 可 ) 去 除 m 得 余 数 y, 如 果 有 一 次 y 值 为 0, 则 可 判 定 m 不 是 素 数 如 果 每 次 y 值 都 不 为 0, 则 可 判 定 m 是 素 数 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 :

138 第 7 章 循 环 结 构 程 序 设 计 125 Form1 窗 体 界 面 由 四 个 控 件 组 成, 两 个 标 签 (Label1 Label2) 一 个 文 本 框 (Text1) 和 一 个 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 7.10 表 7.10 例 7.9 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 素 数 否 Label1 Caption 输 入 >2 的 整 数 Label2 Caption 置 空 Text1 Text 置 空 Command1 Caption 判 断 (3) 编 写 程 序 代 码 : Private Sub Command1_Click() Dim m, i, y As Integer m = Val(Text1.Text) If m <= 2 Then Label2.Caption = " 输 入 数 据 有 错 " Else k = Sqr(m) + 1 For i = 2 To k y = m Mod i If y = 0 Then Exit For Next i If y = 0 Then Label2.Caption = m & " 不 是 素 数 " Else Label2.Caption = m & " 是 素 数 " End If End If (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 在 Text1 文 本 框 中 输 入 一 个 整 数, 鼠 标 单 击 判 断 按 钮, 就 可 看 到 计 算 结 果, 运 行 结 果 如 图 7.14 所 示

139 126 Visual Basic 程 序 设 计 教 程 (a) (b) 图 7.14 例 7.9 运 行 结 果 在 该 例 中, 先 对 输 入 的 数 据 的 合 法 性 进 行 判 断, 然 后 在 判 断 m 是 否 素 数 的 For 循 环 中, 循 环 控 制 变 量 i 的 初 值 为 2, 终 值 为 Sqr(m)+1, 在 循 环 体 中 有 一 条 判 断 y=0 的 语 句, 当 y =0 为 True 时, 说 明 m 除 以 i 的 余 数 为 0, 可 以 肯 定 m 不 是 素 数, 执 行 Exit For 语 句, 退 出 循 环 ; 当 y=0 为 False 时, 还 不 能 确 定 m 是 否 素 数, 应 让 i 增 加 一 个 增 量 值 1, 继 续 循 环 在 For 循 环 结 构 的 后 面 利 用 块 If 语 句, 又 一 次 判 断 y=0, 当 y=0 为 True 时, 输 出 m 不 是 素 数 ; 当 y=0 为 False 时, 说 明 经 过 循 环 之 后,m 除 以 2 至 Sqr(m)+1 之 间 的 所 有 数 得 的 所 有 余 数 都 不 为 0, 则 可 以 肯 定 m 是 素 数, 输 出 m 是 素 数 的 结 果 7.4 GoTo 型 循 环 Visual Basic 中 保 留 了 GoTo 语 句 和 On GoTo 语 句, 它 们 都 可 控 制 程 序 的 执 行 方 向, 虽 然 现 在 不 提 倡 使 用, 但 在 某 些 特 殊 情 况 下, 也 是 有 用 的 GoTo 语 句 GoTo 语 句 为 无 条 件 转 移 语 句 GoTo 语 句 的 语 法 格 式 为 : GoTo 标 号 行 号 说 明 : (1) 标 号 : 是 以 英 文 字 母 开 头 的 标 识 符, 此 标 识 符 可 以 出 现 在 GoTo 语 句 之 前 或 之 后, 但 要 以 : 结 尾, 并 且 与 GoTo 语 句 在 同 一 个 过 程 中 存 在 比 如 : Start: GoTo Start (2) 行 号 : 是 一 个 整 型 数 字, 位 于 语 句 行 的 最 前 面 行 号 可 以 出 现 在 GoTo 语 句 之 前 或 之 后, 必 须 与 GoTo 语 句 在 同 一 个 过 程 中 存 在 如 : GoTo GoTo 语 句 能 改 变 程 序 的 执 行 顺 序, 它 可 以 跳 过 某 一 段 程 序 转 到 标 号 或 行 号 处 继 续 执 行 把 标 号 或 行 号 置 前,GoTo 语 句 与 If 语 句 配 合 使 用 可 实 现 有 条 件 地 重 复 执 行 某 程 序 段, 从 而 构 成 GoTo 型 循 环 如 前 面 的 例 7.6 偶 数 求 和 问 题 代 码 可 修 改 如 下 : Private Sub Form_Load() Dim i, Sum As Long Sum = 0:i = 0 Start: i = i + 2 Sum = Sum + i

140 第 7 章 循 环 结 构 程 序 设 计 127 If i < 100 Then GoTo Start Label2.Caption = Sum 上 述 代 码 中 循 环 体 为 i = i + 2 和 Sum = Sum + i, 它 们 每 执 行 一 遍 后, 行 If 语 句 就 判 断 条 件 i < 100, 如 果 i < 100 为 True 就 执 行 GoTo 语 句 跳 转 到 Start: 标 号 处 再 执 行 循 环 体 ; 如 果 i < 100 为 False 就 不 执 行 GoTo 语 句, 循 环 结 束 该 程 序 中 的 标 号 也 可 用 行 号 替 换, 代 码 如 下 : Private Sub Form_Load() Dim i, Sum As Long Sum = 0:i = 0 20 i = i + 2 Sum = Sum + i If i < 100 Then GoTo 20 Label2.Caption = Sum 上 述 代 码 中 的 20 是 行 号, 无 论 是 标 号 还 是 行 号 只 能 在 一 个 过 程 中 使 用 一 次, 不 能 有 重 复 出 现, 但 是 在 一 个 过 程 中 可 以 有 多 个 不 同 的 标 号 和 行 号 因 为 GoTo 语 句 破 坏 程 序 结 构, 不 符 合 结 构 化 编 程 的 要 求, 现 在 已 经 不 提 倡 使 用 On GoTo 语 句 On GoTo 语 句 可 以 根 据 不 同 的 条 件 从 多 个 出 口 选 择 一 个 其 语 法 格 式 为 : On 数 值 表 达 式 GoTo 标 号 表 列 行 号 表 列 说 明 : (1) 标 号 表 列 : 是 程 序 中 存 在 的 多 个 标 号, 多 个 标 号 之 间 用, 分 隔 (2) 行 号 表 列 : 是 程 序 中 存 在 的 多 个 行 号, 多 个 行 号 之 间 也 用, 分 隔 标 号 和 行 号 可 以 同 时 使 用 On GoTo 语 句 的 执 行 顺 序 是 : 先 计 算 数 值 表 达 式 的 值 后 取 整, 如 果 此 整 数 范 围 在 所 提 供 的 标 号 及 行 号 的 总 个 数 之 内, 其 值 为 几 就 按 顺 序 找 到 对 应 的 第 几 个 标 号 或 行 号, 转 到 该 标 号 或 行 号 处 执 行 如 果 此 整 数 范 围 不 在 所 提 供 的 标 号 及 行 号 的 总 个 数 之 内, 则 执 行 On GoTo 语 句 之 后 的 下 一 条 语 句 例 如 : On x+1 GoTo R1,20,50 y = 10 : Print y : End R1: y = 0 : Print y : End 20 y = 1: Print y : End 50 y = 2 : Print y : End

141 128 Visual Basic 程 序 设 计 教 程 在 上 述 代 码 中 先 计 算 x+1 的 值, 如 果 为 1, 在 标 号 表 列 及 行 号 表 列 中 排 第 一 位 的 是 R1, 则 转 到 R1 标 号 处 执 行 y=0 后, 输 出 y 值 结 束 ; 如 果 为 2, 在 标 号 表 列 及 行 号 表 列 中 排 第 二 位 的 是 20, 则 转 到 20 行 号 处 执 行 y=1 后, 输 出 y 值 结 束 ; 如 果 为 3, 在 标 号 表 列 及 行 号 表 列 中 排 第 三 位 的 是 50, 则 转 到 50 行 号 处 执 行 y=2 后, 输 出 y 值 结 束 ; 如 果 x +1 的 值 是 除 之 外 的 其 他 数, 则 执 行 On GoTo 语 句 后 的 y=10 语 句, 然 后 输 出 y 值 结 束 由 于 On GoTo 语 句 十 分 类 似 于 Select Case 语 句, 需 要 时 可 用 Select Case 语 句 代 替, 现 在 编 程 中 也 很 少 使 用 On GoTo 语 句 了 7.5 多 重 循 环 在 前 面 所 讲 的 循 环 结 构 中, 如 果 循 环 体 中 又 包 含 循 环 结 构, 则 构 成 了 多 重 循 环 多 重 循 环 也 称 为 循 环 嵌 套 由 于 能 构 成 循 环 结 构 的 语 句 有 多 种, 它 们 之 间 可 以 互 相 嵌 套, 所 以 多 重 循 环 的 形 式 多 种 多 样 但 要 注 意 : (1) 每 一 种 循 环 语 句 中 的 开 始 部 分 与 结 束 部 分 的 配 对 使 用 ; (2) 多 层 循 环 的 循 环 体 可 以 一 层 套 一 层, 但 不 能 互 相 交 叉 例 7.10 打 印 九 九 乘 法 口 诀 问 题 分 析 : 因 为 乘 法 口 诀 中 相 乘 的 两 个 因 子 都 是 不 断 变 化 的, 因 此 该 问 题 需 要 有 两 重 循 环 才 能 实 现, 外 层 循 环 控 制 一 个 因 子 的 变 化, 内 层 循 环 控 制 另 一 个 因 子 的 变 化 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 该 界 面 只 有 一 个 Form1 窗 体 即 可, 适 当 调 整 窗 口 大 小 (2) 设 置 界 面 中 Form1 窗 体 的 属 性 : 只 需 将 Form1 的 Caption 属 性 设 为 九 九 乘 法 口 诀 即 可 (3) 编 写 程 序 代 码 : Private Sub Form_Load() Dim i, j As Single Show ' 使 输 出 可 见 FontSize = 8 For i = 1 To 9 For j = 1 To i Print j ; " * " ; i ; " = " ; i * j ; Next j Print ' 控 制 换 行 Next i 程 序 中 外 层 循 环 控 制 变 量 i 从 1 变 化 到 9, 控 制 循 环 执 行 9 次, 内 层 循 环 控 制 变 量 j 的 初 值 为 1, 但 终 值 是 随 外 层 循 环 控 制 变 量 i 的 变 化 而 变 化 的 比 如 当 i 值 为 5 时,j 要 从 1 变 化

142 第 7 章 循 环 结 构 程 序 设 计 129 到 5,j 每 变 化 一 次, 内 层 循 环 的 循 环 体 Print j i*j; 语 句 就 要 执 行 1 次 即 输 出 从 1*5=5 变 化 到 5*5=25 当 内 层 循 环 体 执 行 完 5 次 后, 应 输 出 一 个 换 行, 即 在 内 循 环 语 句 之 后 应 有 一 个 print 语 句 然 后 外 循 环 控 制 变 量 i 再 增 加 一 个 增 量 1,i 变 为 6, 之 后 内 循 环 的 j 又 要 从 1 变 化 到 6 继 续 新 一 轮 的 循 环 因 此 在 此 例 中 对 于 内 循 环 的 循 环 体 Print j i*j; 语 句 总 计 要 执 行 =45 次 (4) 运 行 程 序 如 图 7.15 图 7.15 例 7.10 运 行 结 果 例 7.11 找 出 所 有 的 水 仙 花 数 问 题 分 析 : 水 仙 花 数 是 个 三 位 数, 它 的 各 位 数 字 的 立 方 和 等 于 这 个 三 位 数 本 身 例 如 371 = , 则 371 是 水 仙 花 数 对 于 这 种 寻 找 特 殊 数 字 的 问 题, 我 们 这 里 提 供 两 种 类 型 的 解 决 方 法 : (1) 数 字 组 合 法 : 水 仙 花 数 是 由 百 位 数 字 十 位 数 字 和 个 位 数 字 组 合 构 成 的, 我 们 用 三 重 循 环 的 三 个 循 环 控 制 变 量 i,j,k 分 别 表 示 这 三 个 位 上 的 数 字, 除 百 位 上 的 数 字 是 可 从 1 变 化 到 9 外, 十 位 和 个 位 上 的 数 字 都 可 从 0 变 化 到 9 只 要 在 最 内 层 的 循 环 中 判 断 一 下 这 三 个 数 字 组 成 的 数 是 否 等 于 它 们 各 自 立 方 的 和 即 可 (2) 数 字 拆 分 法 : 既 然 水 仙 花 数 是 个 三 位 数, 那 么 可 以 确 定 查 找 它 的 范 围 是 在 100 到 999 之 间 我 们 可 用 一 个 循 环 控 制 变 量 Flower 来 表 示 把 Flower 所 表 示 的 这 个 数 与 100 相 除 取 整 就 可 得 到 它 的 百 位 上 的 数 字,Flower 与 10 相 除 取 余 数 就 可 得 到 个 位 上 的 数 字 用 类 似 方 法 再 得 到 十 位 上 的 数 字 最 后 再 判 断 这 三 个 数 字 的 立 方 和 是 否 与 Flower 相 等 即 可 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 该 界 面 只 有 一 个 Form1 窗 体 即 可 (2) 设 置 界 面 中 Form1 窗 体 的 属 性 : 只 需 将 Form1 的 Caption 属 性 设 为 水 仙 花 数 即 可 (3) 编 写 程 序 代 码 : 1 数 字 组 合 法 实 现 代 码 为 : Private Sub Form_Load() Dim i, j, k, Flower As Integer Show

143 130 Visual Basic 程 序 设 计 教 程 For i = 1 To 9 For j = 0 To 9 For k = 0 To 9 Flower = i * j * 10 + k If Flower = i ^ 3 + j ^ 3 + k ^ 3 Then Print Flower ; " 是 水 仙 花 数 " Next k Next j Next i 2 数 字 拆 分 法 实 现 代 码 为 : Private Sub Form_Load() Dim Flower, i, j, k As Integer Show For Flower = 100 To 999 i = Flower \ 100 ' 得 百 位 数 字 k = Flower Mod 10 ' 得 个 位 数 字 j = (Flower \ 10) Mod 10 ' 得 十 位 数 字 If Flower = i ^ 3 + j ^ 3 + k ^ 3 Then Print Flower; " 是 水 仙 花 数 " Next Flower (4) 运 行 程 序 如 图 7.16 图 7.16 例 7.11 运 行 结 果 习 题 1. 求 100 以 内 所 有 奇 数 的 和 ( 分 别 用 While 循 环 Do 循 环 和 For 循 环 实 现 ) 2. 求 n= 20 2 n 求 e = L +, 用 两 种 方 法 实 现 : 2! 3! n! (1) 计 算 到 n 值 为 10; (2) 计 算 到 最 后 一 项 的 值 小 于 10-6

144 4. 输 入 两 个 正 整 数, 求 它 们 的 最 小 公 倍 数 第 7 章 循 环 结 构 程 序 设 计 用 牛 顿 迭 代 法 求 2x 3-4x 2 +3x-6=0 在 1.6 附 近 的 根, 要 求 误 差 小 于 计 算 下 列 分 数 系 列 的 前 30 项 的 和 : 1, 2 2, 3 3, 5 5, 8 8, 13 13, 输 出 100~200 间 所 有 不 能 被 3 和 4 整 除 的 数 L 8. 假 设 有 一 张 足 够 大 的 纸, 输 入 纸 的 厚 度 为 x 毫 米, 将 该 纸 不 断 对 折 问 该 纸 对 折 多 少 次 可 达 珠 穆 朗 玛 峰 的 高 度 (8848 米 )? 9. 求 200~300 间 所 有 的 素 数 10. 找 出 1000 以 内 所 有 的 完 全 数 完 全 数 是 指 等 于 其 所 有 因 子 和 ( 包 括 1 但 不 包 括 这 个 数 本 身 ) 的 数 例 如 6 的 因 子 分 别 是 并 且 6=1+2+3, 则 6 是 完 全 数 11. 求 解 张 丘 建 的 百 鸡 问 题 : 鸡 翁 一 值 钱 五, 鸡 母 一 值 钱 三, 鸡 雏 三 值 钱 一 百 钱 买 百 鸡, 问 鸡 翁 母 雏 各 几 何? 12. 找 出 100~200 间 有 多 少 数 满 足 其 各 位 数 字 之 和 等 于 6

145 第 8 章 数 组 生 活 中 经 常 会 遇 到 处 理 批 量 数 据, 比 如 要 排 序 的 某 个 班 的 学 生 成 绩 要 分 类 的 商 场 内 的 商 品 等 这 批 需 要 处 理 的 数 据 的 类 型 相 同, 所 有 的 学 生 成 绩 都 是 数 值 类 型 的, 所 有 的 商 品 名 称 都 是 字 符 串 类 型 的 如 果 这 些 数 据 用 简 单 变 量 来 存 储 的 话, 那 么 一 个 班 有 多 少 个 人 就 要 开 辟 多 少 个 变 量 来 表 示 各 自 的 成 绩, 显 然 不 利 于 对 这 些 数 据 进 行 某 种 操 作, 如 按 成 绩 排 序 如 果 采 用 数 组, 这 批 数 据 就 有 了 一 个 共 同 的 名 字 且 数 据 在 内 存 里 连 续 存 放, 只 需 通 过 这 个 名 字 和 编 号 就 可 访 问 任 意 一 个 数 8.1 数 组 的 概 念 将 一 组 排 列 有 序 个 数 有 限 的 变 量 作 为 一 个 整 体, 用 一 个 统 一 的 名 字 来 表 示, 这 些 同 类 型 的 有 序 变 量 的 集 合 称 为 一 个 数 组, 这 个 统 一 的 名 字 就 是 数 组 名 数 组 名 的 命 名 规 则 与 简 单 变 量 的 命 名 规 则 相 同 数 组 中 所 包 含 的 每 一 个 单 元 就 是 一 个 数 组 元 素 ( 或 称 数 组 分 量 ) 每 个 数 组 元 素 根 据 其 在 整 个 数 组 中 顺 序 的 位 置 都 有 一 个 惟 一 的 编 号 ( 下 标 ) 数 组 元 素 由 数 组 名 一 对 括 号 和 下 标 来 表 示 数 组 的 大 小 决 定 了 数 组 元 素 的 个 数 假 设 定 义 了 一 个 包 含 5 人 成 绩 的 student 数 组, 则 student 数 组 由 5 个 元 素 构 成, 这 5 个 元 素 可 以 表 示 为 : student(0),student(1),student(2),student(3),student(4) 数 组 中 所 包 含 的 数 据 与 数 组 元 素 一 一 对 应, 因 此 通 过 数 组 元 素 就 可 以 访 问 数 组 中 的 所 有 数 据 因 此 数 组 含 有 以 下 特 性 : (1) 数 组 元 素 按 顺 序 排 列 ; (2) 引 用 某 个 数 组 元 素 即 是 直 接 访 问 数 组 中 的 某 个 数 据 8.2 数 组 的 定 义 数 组 要 先 定 义 ( 声 明 ) 后 使 用 在 计 算 机 中, 数 组 占 用 一 块 内 存 区 域, 数 组 名 是 这 个 区 域 的 名 称, 区 域 的 每 个 单 元 都 有 自 己 的 地 址, 该 地 址 用 下 标 表 示 定 义 数 组 的 目 的 就 是 通 知 计 算 机 为 其 留 出 所 需 的 内 存 空 间 在 Visual Basic 中 定 义 数 组 的 语 法 为 : Public Private Dim Static 数 组 名 ( [ 数 组 的 上 下 界 声 明 ] )[ As 数 据 类 型 ] 说 明 : (1)Public: 用 于 建 立 公 用 数 组, 在 模 块 的 声 明 段 用 Public 声 明 数 组, 此 类 数 组 可 在 多 个 模 块 中 被 调 用 (2)Private 与 Dim: 都 可 用 于 建 立 模 块 级 数 组 或 局 部 数 组 (3)Static: 只 能 用 于 建 立 局 部 数 组, 在 过 程 内 部 使 用 (4)As 数 据 类 型 : 说 明 数 组 元 素 是 什 么 类 型 可 以 是 Byte Boolean Integer Long

146 第 8 章 数 组 133 Currency Single Double Date String Object Variant 对 象 类 型 或 用 户 自 定 义 类 型 只 有 当 数 组 类 型 说 明 为 Variant 类 型 时, 该 数 组 元 素 能 够 包 含 不 同 类 型 的 数 据 其 他 类 型 的 数 组 其 数 组 元 素 都 具 有 相 同 的 数 据 类 型 当 在 定 义 某 数 组 时, 如 缺 省 As 子 句, 则 该 数 组 的 类 型 为 Variant (5) 数 组 的 上 下 界 声 明 : 决 定 了 数 组 的 维 数 和 各 维 下 标 值 的 取 值 范 围 如 果 定 义 数 组 时 有 数 组 的 上 下 界 声 明 部 分, 则 定 义 了 一 个 静 态 数 组 ; 而 缺 省 了 数 组 的 上 下 界 声 明 部 分, 则 定 义 了 一 个 动 态 数 组 数 组 的 上 下 界 声 明 语 法 格 式 为 : [ [ 下 界 1 TO ] 上 界 1 ] [,[ 下 界 2 TO ] 上 界 2 ] 说 明 : (1) 下 界 n 和 上 界 n 为 整 型 常 数 或 符 号 常 量, 其 取 值 范 围 在 Long 数 据 类 型 的 范 围 ( 到 ) 之 内 (2) 若 是 下 界 n TO 省 略 时, 系 统 默 认 下 界 n 为 0, 但 Option Base 语 句 可 改 变 系 统 的 缺 省 下 界 值 如 在 Option Base 1 之 后 定 义 数 组, 则 此 数 组 的 缺 省 下 界 为 1 (3) 成 对 出 现 的 下 界 n 和 上 界 n 中, 下 界 n 必 须 小 于 上 界 n (4) 数 组 的 元 素 在 上 下 界 内 是 连 续 的 (5) 有 几 对 上 下 界 就 说 明 数 组 是 几 维, 详 细 情 况 如 下 : 1 如 果 声 明 中 只 有 一 对 上 下 界, 表 示 该 数 组 是 一 维 数 组 一 维 数 组 的 数 组 元 素 只 有 一 个 下 标 变 量, 该 下 标 变 量 取 下 界 1 到 上 界 1 之 间 的 连 续 的 数 值 下 界 1 的 值 决 定 了 该 下 标 变 量 的 最 小 值, 上 界 1 的 值 决 定 了 该 下 标 变 量 的 最 大 值, 如 果 下 界 1 TO 缺 省 不 写, 则 表 示 下 标 的 最 小 值 为 0 一 维 数 组 经 常 用 于 表 示 线 性 队 列 的 数 据 例 如 : Dim Student ( 3 To 5 ) As Integer 定 义 了 一 个 存 放 3 个 整 型 数 据 的 数 组, 该 数 组 有 三 个 数 组 元 素, 分 别 是 Student(3) Student(4) Student(5) 而 : Dim Student ( 3 ) As Integer 定 义 了 一 个 存 放 4 个 整 型 数 据 的 数 组, 该 数 组 有 四 个 数 组 元 素, 分 别 是 Student(0) Student(1) Student(2) Student(3) 2 如 果 有 两 对 上 下 界 声 明, 则 表 示 该 数 组 是 二 维 数 组 二 维 数 组 的 数 组 元 素 有 两 个 下 标 变 量 两 个 上 下 界 声 明 的 实 际 值 决 定 了 两 个 下 标 变 量 的 取 值 范 围 该 类 数 组 可 表 示 矩 阵 数 据 屏 幕 上 的 像 素 点 等 例 如 : Dim a(2,2) As Long 定 义 了 一 个 3 行 3 列 的 数 组 a,a 含 有 3 3 共 9 个 Long 类 型 的 数 组 元 素, 这 9 个 元 素 在 内 存 中 按 行 顺 序 存 放 如 表 8.1 所 示 通 常 称 二 维 数 组 元 素 的 第 一 个 下 标 为 行 标, 第 二 个 下 标 为 列 标 而 :Dim b(1to2, 3To4) As Long 定 义 了 一 个 2 行 2 列 的 数 组 b,b 含 有 2 2 共 4 个 Long 类 型 的 数 组 元 素, 这 4 个 元 素 是 b(1,3) b(1,4) b(2,3) b(2,4)

147 134 Visual Basic 程 序 设 计 教 程 表 8.1 二 维 数 组 的 数 组 元 素 第 0 列 的 元 素 第 1 列 的 元 素 第 2 列 的 元 素 第 0 行 的 元 素 a(0,0) a(0,1) a(0,2) 第 1 行 的 元 素 a(1,0) a(1,1) a(1,2) 第 2 行 的 元 素 a(2,0) a(2,1) a(2,2) 3 如 果 想 表 示 三 维 立 体 空 间, 则 需 要 有 三 对 上 下 界 声 明, 是 三 维 数 组 如 : Dim c ( 1 To 2,1 To 3,1 To 4 ) As Single 定 义 了 一 个 2 层 3 行 4 列 的 三 维 数 组 c,c 含 有 共 24 个 Single 类 型 的 数 组 元 素 我 们 称 含 两 对 以 上 的 上 下 界 声 明 的 数 组 为 多 维 数 组 随 着 维 数 的 增 加, 数 组 所 占 的 存 储 空 间 会 急 速 扩 大, 存 储 空 间 为 各 维 下 标 值 范 围 相 乘 的 积 因 此, 在 定 义 数 组 时, 要 根 据 实 际 需 要 确 定 恰 当 的 数 组 维 数 和 大 小 编 程 时, 如 果 一 开 始 就 能 预 测 出 数 组 元 素 个 数, 可 以 采 用 静 态 数 组 声 明 方 式, 若 需 要 在 程 序 运 行 某 些 操 作 之 后 才 能 确 定 数 组 大 小, 可 以 采 用 动 态 数 组 声 明 方 式 静 态 数 组 静 态 数 组 是 指 大 小 固 定 的 数 组, 它 所 包 含 的 数 组 元 素 个 数 固 定 不 变 在 应 用 程 序 中, 静 态 数 组 在 定 义 时 就 说 明 了 数 组 的 维 数 及 大 小, 此 后 不 再 有 改 变 数 组 大 小 的 语 句 应 用 程 序 执 行 前, 系 统 在 进 行 编 译 时, 根 据 数 组 声 明 语 句 开 辟 固 定 的 存 储 空 间, 数 组 元 素 按 顺 序 存 放, 直 到 程 序 执 行 完 毕, 在 整 个 过 程 中 此 存 储 空 间 不 能 作 其 他 用 途 例 8.1 自 动 产 生 10 个 50 以 内 的 随 机 数, 然 后 输 出 这 些 数 问 题 分 析 :Visual Basic 有 个 常 用 的 内 部 函 数 Rnd,Rnd 能 返 回 一 个 小 于 1 但 大 于 或 等 于 0 的 值 因 此 可 利 用 50*Rnd 来 产 生 一 个 50 以 内 的 随 机 数, 需 要 10 个 随 机 数, 则 可 用 一 个 循 环 结 构 来 实 现, 每 循 环 一 次, 产 生 一 个 随 机 数 既 然 数 据 个 数 已 确 定, 则 可 用 一 个 含 10 个 元 素 的 静 态 数 组 来 存 放 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 只 需 一 个 Form1 窗 体 即 可 (2) 设 置 界 面 中 对 象 的 属 性 : 只 需 将 Form1 的 Caption 属 性 设 为 10 个 随 机 数 即 可 (3) 编 写 程 序 代 码 : 编 写 Form_Load() 事 件 代 码, 代 码 如 下 : ' 产 生 10 个 50 以 内 的 随 机 数, Private Sub Form_Load() Dim i As Integer ' i 变 量 既 控 制 循 环 体 执 行 次 数 又 作 为 数 组 元 素 的 下 标 值 Dim a(1 To 10) As Integer ' 定 义 a 为 静 态 数 组 Show ' 显 示 该 窗 体 For i = 1 To 10 ' i 从 1 变 化 到 10 a(i) = Int(50 * Rnd ) ' Rnd 函 数 产 生 一 个 随 机 数 存 放 到 数 组 元 素 a(i) 中

148 第 8 章 数 组 135 Print a(i); ' 输 出 数 组 元 素 a(i) Next i (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 运 行 结 果 如 图 8.1 所 示 图 8.1 例 8.1 运 行 结 果 其 中,Int(number) 是 删 除 number 的 小 数 部 份 而 返 回 剩 下 的 整 数 Show 是 窗 体 显 示 方 法, 其 一 般 格 式 为 : [ 窗 体 名. ]Show 如 果 不 指 定 窗 体 名 称 ( 缺 省 ) 则 为 显 示 当 前 窗 体 动 态 数 组 有 时 在 程 序 运 行 前 无 法 确 定 一 个 数 组 的 大 小, 则 在 一 开 始 定 义 该 数 组 时, 其 上 下 界 声 明 处 可 为 空, 在 程 序 运 行 中 获 得 了 一 定 的 参 数 后, 才 能 确 定 此 数 组 的 大 小, 再 重 新 定 义 该 数 组, 则 此 数 组 为 动 态 数 组 创 建 动 态 数 组 的 过 程 如 下 : (1) 在 窗 体 层 标 准 模 块 或 过 程 中 先 声 明 一 个 数 组 ( 无 下 标 值 ) 在 Visual Basic 中 声 明 动 态 数 组 的 一 般 格 式 为 : Public Private Dim 数 组 名 ( )[ As 数 据 类 型 ] (2) 在 某 过 程 中 用 ReDim 再 次 定 义 已 声 明 过 的 动 态 数 组 ReDim 使 用 的 一 般 格 式 为 : ReDim [ Preserve ] 数 组 名 ( [ 数 组 的 上 下 界 声 明 ] ) 说 明 : (1)ReDim: 用 来 重 新 定 义 动 态 数 组, 按 定 义 的 上 下 界 重 新 分 配 存 储 单 元, 可 以 对 一 个 数 组 进 行 多 次 重 定 义 (2)Preserve: 为 可 选 项, 用 于 保 留 动 态 数 组 原 来 的 内 容 如 果 动 态 数 组 内 已 存 有 数 据, 用 ReDim 改 变 数 组 的 大 小 后, 则 数 组 元 素 中 的 数 据 会 丢 失 但 如 果 在 ReDim 语 句 中 使 用 了 Preserve 选 项, 则 保 留 数 组 原 来 的 内 容, 若 是 数 组 变 小 了, 则 只 丢 失 被 删 除 部 分 数 组 元 素 中 的 数 据 例 8.2 多 次 使 用 ReDim 语 句 在 窗 体 层 声 明 如 下 数 组 : Option Base 1 ' 规 定 数 组 默 认 下 界 值 为 1 Dim sname() As String ' sname 为 变 长 字 符 串 类 型 数 组 然 后 编 写 如 下 事 件 过 程 : Private Sub Form_Click()

149 136 Visual Basic 程 序 设 计 教 程 ReDim sname(2) ' 第 一 次 重 定 义 含 2 个 元 素 sname(1) = " 赵 阳 ": sname(2) = " 张 明 " Print sname(1); sname(2) ReDim Preserve sname(3) ' 第 二 次 重 定 义 含 3 个 元 素, 使 用 Preserve 选 项 sname(3) = " 李 好 " Print sname(1); sname(2); sname(3) ReDim sname(4) ' 第 三 次 重 定 义 含 4 个 元 素, 不 使 用 Preserve 选 项 sname(4) = " 王 华 " Print sname(1); sname(2); sname(3); sname(4) 上 述 程 序 的 运 行 结 果 如 图 8.2, 在 第 二 次 重 定 义 中, 使 用 了 Preserve 选 项, 因 此 在 第 二 行 可 以 看 到 原 有 的 数 据 元 素 内 容 不 变 由 于 在 第 三 次 重 定 义 sname 数 组 时, 没 有 使 用 Preserve 选 项,sName 数 组 原 先 已 有 的 数 据 都 丢 失, 只 有 sname(4) 数 组 元 素 有 赋 值 语 句, 所 以 第 三 行 的 输 出 结 果 只 有 sname(4) 数 组 元 素 有 内 容 图 8.2 多 次 使 用 ReDim 语 句 例 8.3 由 键 盘 输 入 n 值 后, 自 动 产 生 n 个 20 以 内 的 随 机 数, 然 后 输 出 这 些 数 问 题 分 析 : 由 于 程 序 在 运 行 前, 不 能 确 定 产 生 多 少 个 随 机 数, 因 此 需 要 一 个 动 态 数 组 a, 在 窗 体 界 面 中, 通 过 一 个 文 本 框 输 入 一 个 数 值 n, 用 n 值 决 定 动 态 数 组 a 的 大 小 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 在 Form1 窗 体 界 面 中 建 立 两 个 标 签 (Label1 Label2) 和 一 个 文 本 框 (Text1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 8.2 表 8.2 例 8.3 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 产 生 n 个 随 机 数 Label1 Caption 输 入 n 值 Label2 Caption 置 空 Text1 Text 置 空 (3) 编 写 程 序 代 码 : 编 写 代 码 过 程 如 下 : 1 从 视 图 菜 单 栏 选 择 代 码 窗 口, 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 ( 通 用 ), 在 事 件 程 序 下 拉 列 表 框 中 选 择 ( 声 明 ), 输 入 下 面 两 行 代 码 : Option Base 1 ' 规 定 数 组 默 认 下 界 值 为 1 Dim a() As Integer ' 在 标 准 模 块 中 定 义 a 为 动 态 数 组

150 第 8 章 数 组 在 运 行 时, 当 文 本 框 中 输 入 数 字 后, 用 鼠 标 点 击 文 本 框 时, 产 生 Text1_Click 事 件 产 生 随 机 数 的 程 序 代 码 可 以 写 到 Text1_Click 事 件 中 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 Text1, 在 事 件 程 序 下 拉 列 表 框 中 选 择 Click, 输 入 下 面 的 代 码 : Private Sub Text1_Click() Dim i, n As Integer n = Text1.Text ReDim a(n) As Integer ' 重 定 义 动 态 数 组 a 含 有 n 个 元 素 For i = 1 To n ' For 循 环,i 从 1 变 化 到 n a(i) = Int(20 * Rnd ) ' 每 产 生 一 个 随 机 数 就 存 放 到 数 组 元 素 a(i) 中 Label2.Caption = Label2.Caption & a(i) & "," ' 把 a(i) 追 加 到 Label2 上 显 示 Next i 3 在 运 行 时, 当 文 本 框 中 的 数 字 改 变 时, 为 了 看 到 不 同 的 运 行 结 果, 需 要 重 置 标 签 Label2 的 显 示 信 息, 所 以 要 编 写 Text1_Change() 事 件 代 码 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 Text1, 在 事 件 程 序 下 拉 列 表 框 中 选 择 Change, 输 入 下 面 的 代 码 : Private Sub Text1_Change() Label2.Caption = " 随 机 数 是 :" ' 重 置 Label2 的 Caption 值 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 比 如 在 Text1 文 本 框 内 输 入 一 个 数 字 6 后, 用 鼠 标 单 击 该 文 本 框, 可 看 到 Label2 位 置 处 显 示 产 生 的 6 个 随 机 数 序 列 运 行 结 果 如 图 8.3 所 示 图 8.3 例 8.3 运 行 结 果 动 态 数 组 在 程 序 运 行 的 任 何 时 间 内 都 可 改 变 数 组 大 小, 它 使 用 灵 活 方 便 有 助 于 高 效 率 地 管 理 内 存 动 态 数 组 在 运 行 时 才 分 配 存 储 空 间, 不 用 时 也 可 以 用 Erase 语 句 释 放 存 储 空 间, 需 要 时 再 用 ReDim 语 句 再 次 分 配 存 储 空 间 这 样 就 避 免 了 静 态 数 组 在 一 开 始 时 定 义 的 数 组 大 小 固 定, 运 行 时 用 不 了 时, 会 浪 费 存 储 空 间, 不 够 用 时 又 无 法 再 增 加 的 弊 端 Erase 语 句 Erase 语 句 的 格 式 为 : Erase 数 组 名 [, 数 组 名 ] 说 明 :

151 138 Visual Basic 程 序 设 计 教 程 (1) 如 果 作 用 于 动 态 数 组,Erase 语 句 释 放 数 组 所 使 用 的 内 存, 也 就 是 说, 动 态 数 组 经 过 Erase 操 作 后 将 不 复 存 在 在 下 次 引 用 该 动 态 数 组 之 前, 必 须 使 用 ReDim 语 句 来 重 新 定 义 该 数 组 (2) 如 果 作 用 于 静 态 数 组,Erase 语 句 只 是 重 新 初 始 化 数 组 元 素 的 取 值, 也 就 是 说, 数 组 元 素 被 初 始 化, 但 仍 然 存 在 8.3 数 组 的 基 本 操 作 数 组 的 基 本 操 作 包 括 数 组 元 素 的 输 入 输 出 和 复 制, 以 及 数 组 的 初 始 化 数 组 定 义 之 后, 可 以 对 整 个 数 组 赋 初 值 或 对 部 分 数 组 元 素 赋 值, 也 可 以 用 键 盘 输 入 的 方 式 或 从 文 件 中 读 取 的 方 式 获 得 数 据 这 些 数 据 在 参 加 运 算 时, 要 通 过 引 用 数 组 元 素 进 行 输 出 数 组 的 全 部 数 据 时, 需 要 输 出 数 组 的 所 有 元 素 当 对 数 组 的 所 有 元 素 进 行 统 一 的 操 作 时, 使 用 Visual Basic 提 供 的 For Each Next 语 句 会 非 常 方 便 数 组 元 素 的 引 用 数 组 的 引 用 通 常 是 指 对 数 组 中 的 元 素 的 引 用 数 组 元 素 的 格 式 为 : 数 组 名 ( 下 标 [, 下 标 ] ) 其 中, 下 标 可 以 是 常 量 变 量 或 表 达 式, 但 表 达 式 的 值 必 须 介 于 定 义 数 组 时 指 定 的 下 标 下 界 和 上 界 之 间, 否 则 将 导 致 下 标 越 界 的 错 误 可 以 使 用 LBound 和 UBound 函 数 获 得 数 组 下 标 的 下 界 和 上 界, 格 式 为 : LBound ( 数 组 名 [, 维 数 ] ) UBound ( 数 组 名 [, 维 数 ] ) 可 选 参 数 维 数 用 来 指 定 要 返 回 的 是 第 几 维 的 下 标 的 下 界 或 上 界, 缺 省 时 为 1, 例 如 对 于 : Dim A(1 To 100, 0 To 3, -3 To 4) LBound(A, 3) 结 果 为 -3,UBound(A, 1) 结 果 为 数 组 元 素 的 输 入 在 定 义 数 组 时, 数 组 元 素 的 输 入 方 式 有 多 种, 既 可 以 用 InputBox 函 数, 也 可 以 用 赋 值 语 句, 或 者 通 过 使 用 文 本 框 等 控 件 实 现 这 里 我 们 用 InputBox 函 数 或 赋 值 语 句 来 实 现 数 组 元 素 的 输 入 1. 用 InputBox 函 数 用 InputBox 函 数 可 以 实 现 数 据 的 输 入 应 用 程 序 中, 如 果 数 组 元 素 的 值 由 用 户 通 过 交 互 提 交 时, 可 以 利 用 For 循 环 或 Do While 等 循 环 语 句, 在 循 环 体 中 调 用 InputBox 函 数 来 实 现 数 据 的 输 入 在 循 环 结 构 中, 每 循 环 一 次 调 用 一 次 InputBox 函 数, 可 以 实 现 一 个 数 组 元 素 的 输 入, 那 么 依 据 数 组 元 素 的 个 数 决 定 循 环 的 次 数, 可 实 现 所 有 数 组 元 素 的 输 入 例 如 利 用 InputBox 函 数 输 入 3 人 姓 名, 可 编 写 如 下 事 件 过 程 : Option Base 1 ' 规 定 数 组 默 认 下 界 值 为 1

152 第 8 章 数 组 139 Private Sub Form_Load() Dim sname(3) As String ' sname 为 变 长 字 符 串 类 型 数 组 Dim i As Integer For i = 1 To 3 ' i 变 化 3 次 sname(i) = InputBox(" 输 入 姓 名 :") ' 输 入 的 姓 名 存 放 到 sname(i) 中 Next i ' 输 出 部 分 此 程 序 的 输 出 部 分 的 代 码 见 下 一 节 数 组 的 输 出 2. 用 赋 值 语 句 输 入 如 果 数 组 初 始 数 据 已 知 或 要 对 指 定 的 部 分 数 组 元 素 赋 值 时, 可 以 使 用 赋 值 语 句 来 实 现 数 组 元 素 的 输 入 如 上 面 代 码 中 的 For 循 环 可 以 改 为 三 条 赋 值 语 句 : sname(1) = " 王 丽 " sname(2) = " 赵 丹 " sname(3) = " 李 好 " 对 于 二 维 数 组 元 素 的 输 入 也 常 用 赋 值 语 句 与 For 循 环 一 起 配 合 实 现 例 如 对 矩 阵 a(5,5) 的 上 三 角 置 1, 主 对 角 线 置 2, 下 三 角 置 3 如 图 8.4 所 示 图 8.4 设 置 二 维 矩 阵 的 上 下 三 角 及 主 对 角 线 元 素 值 及 程 序 运 行 结 果 代 码 如 下 : Option Base 1 Private Sub Form_Load() Show Dim a(5, 5) As Integer Dim i, j As Integer ' 先 置 上 三 角 元 素 为 1 For i = 1 To 5 ' i 控 制 行 标 的 变 化 For j = i + 1 To 5 ' j 控 制 列 标 的 变 化 a(i, j) = 1 ' 上 三 角 的 每 个 元 素 其 列 标 值 都 比 行 标 值 大 Next j Next I ' 再 置 下 三 角 元 素 为 3

153 140 Visual Basic 程 序 设 计 教 程 For i = 2 To 5 ' 下 三 角 只 需 从 第 二 行 开 始 设 置 For j = 1 To i - 1 ' 下 三 角 的 每 个 元 素 其 列 标 值 都 比 行 标 值 小 a(i, j) = 3 Next j Next I ' 最 后 置 主 对 角 线 元 素 为 2 For i = 1 To 5 ' 主 对 角 线 元 素 的 列 标 值 与 行 标 值 相 同, 用 一 个 变 量 控 制 即 可 a(i, i) = 2 Next I ' 输 出 部 分 从 上 例 中 可 以 看 出, 对 多 维 数 组 元 素 赋 值 时, 一 般 是 有 几 维 数 组, 就 需 要 有 几 重 嵌 套 循 环, 每 一 重 循 环 的 循 环 控 制 变 量 都 控 制 多 维 数 组 元 素 某 个 下 标 的 变 化 一 个 应 用 程 序 处 理 完 所 需 处 理 或 计 算 的 任 务 后, 一 定 要 有 输 出 部 分, 让 用 户 看 到 运 算 后 或 处 理 事 件 后 的 结 果 对 数 组 的 操 作 也 一 样, 数 组 输 入 后 或 经 过 计 算 后 结 果 如 何? 只 有 输 出 出 来, 我 们 才 可 以 看 到 计 算 或 赋 值 是 否 正 确 下 一 节 就 是 关 于 数 组 的 输 出 数 组 元 素 的 输 出 数 组 的 输 出 实 际 上 就 是 输 出 所 有 的 数 组 元 素, 而 每 个 数 组 元 素 都 是 一 个 数 据, 所 以 输 出 数 组 元 素 同 输 出 其 他 的 数 据 一 样, 可 以 使 用 Label 控 件 的 Caption 属 性 显 示 或 用 TextBox 控 件 的 Text 属 性 显 示, 这 里 用 Print 方 法 直 接 输 出 到 窗 体 上 在 上 一 节 第 一 个 例 子 中, 利 用 InputBox 函 数 输 入 了 3 个 人 的 姓 名, 输 入 的 姓 名 都 存 放 到 数 组 sname 中, 输 出 三 人 姓 名 时, 只 需 输 出 sname 数 组 的 每 个 元 素, 可 用 一 个 循 环 来 实 现 在 输 出 部 分 的 位 置 处 可 增 加 如 下 代 码 : For i = 1 To 3 ' 输 出 数 组 所 有 元 素 Print sname(i) ' 每 输 出 一 个 数 组 元 素 换 一 行 Next I 下 面 写 出 完 整 的 程 序 实 例 例 8.4 用 数 组 存 放 InputBox 函 数 输 入 的 3 人 姓 名, 然 后 再 输 出 数 组 内 容 问 题 分 析 : 将 前 面 讲 述 的 两 部 分 合 并, 在 一 开 始 输 入 数 据 时, 可 使 用 Hide 方 法 将 主 窗 体 隐 藏, 在 输 出 数 据 时 再 用 Show 方 法 显 示 窗 体 内 容 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 只 需 建 立 一 个 Form1 窗 体 界 面 (2) 设 置 界 面 中 对 象 的 属 性 ( 略 ) (3) 编 写 程 序 代 码 : 编 写 Form_Load() 事 件 代 码, 该 事 件 代 码 如 下 : Option Base 1 ' 规 定 数 组 默 认 下 界 值 为 1 Private Sub Form_Load()

154 第 8 章 数 组 141 Dim sname(3) As String ' sname 为 变 长 字 符 串 类 型 数 组 Dim i As Integer Hide ' 隐 藏 Form1 窗 体 ' 输 入 部 分 For i = 1 To 3 ' i 变 化 3 次 sname(i) = InputBox(" 输 入 姓 名 :") ' 输 入 的 姓 名 存 放 到 sname(i) 中 Next i ' 输 出 部 分 Show ' 显 示 Form1 窗 体 Print ' 输 出 一 个 换 行 Print " 输 入 的 三 人 姓 名 是 :" ' 输 出 提 示 信 息 For i = 1 To 3 ' 输 出 数 组 所 有 元 素 Print sname(i) ' 每 输 出 一 个 数 组 元 素 换 一 行 Next i (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 在 InputBox 输 入 对 话 框 中 输 入 三 次 姓 名 后, 运 行 结 果 如 图 8.5 所 示 图 8.5 例 8.4 运 行 结 果 输 出 一 维 数 组 的 所 有 元 素, 只 需 一 个 For 循 环 就 可 实 现, 而 输 出 二 维 数 组 的 所 有 元 素 时 则 需 要 两 个 For 循 环, 如 上 节 第 二 个 例 子 中, 输 出 部 分 代 码 如 下 : For i = 1 To 5 ' 输 出 二 维 数 组 所 有 元 素, 外 循 环 i 控 制 行 号 变 化 For j = 1 To 5 ' 内 循 环 j 控 制 列 号 变 化 Print a(i, j); Next j Print ' 内 循 环 执 行 一 遍 后, 已 输 出 了 一 行 5 个 元 素, 此 时 应 输 出 一 个 换 行 Next i 将 这 段 代 码 增 加 到 上 一 节 第 二 个 程 序 的 输 出 部 分 位 置 处, 可 组 成 完 整 的 事 件 代 码, 具 体 实 现 时, 只 需 建 立 一 个 Form1 窗 体, 然 后 编 写 完 整 的 Form_Load() 事 件 代 码 后, 即 可 看 到 运 行 结 果 如 图 8.4 所 示 请 读 者 自 己 完 成 该 程 序

155 142 Visual Basic 程 序 设 计 教 程 数 组 元 素 的 复 制 引 用 单 个 数 组 元 素 与 引 用 简 单 变 量 一 样, 可 以 对 其 赋 值, 也 可 以 把 它 的 值 赋 给 其 他 的 变 量 或 数 组 元 素 即 数 组 元 素 之 间 可 以 互 相 复 制, 无 论 它 们 是 否 属 于 同 一 个 数 组 或 维 数 是 否 相 同, 但 数 组 类 型 要 相 容 例 如 : Dim a(3,3) As Integer, b(6)as Integer b(1) = 3; b(2) = 8; b(3) = b(1) a(1, 2) = b(1); a(2, 3) = b(2) b(4) =a (1, 2) 这 段 代 码 中 用 到 的 只 是 部 分 元 素 的 复 制, 如 果 数 组 的 全 部 元 素 都 需 要 复 制 时, 用 循 环 实 现 会 更 方 便 例 8.5 两 个 数 组 存 放 相 同 的 数 据, 但 是 顺 序 相 反 问 题 分 析 : 假 设 两 个 数 组 a 和 b 都 含 10 个 元 素, 则 a(1) 与 b(10) 相 同,a(2) 与 b(9) 相 同, 依 此 类 推 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 建 立 Form1 窗 体 界 面 (2) 设 置 界 面 中 各 对 象 的 属 性 : 设 置 Form1 的 Caption 为 数 组 元 素 复 制 (3) 编 写 程 序 代 码 : Option Base 1 Private Sub Form_Load() Const N = 10 Dim a(n), b(n) As Integer Show For i = 1 To N ' For 循 环 i 从 1 变 化 到 N a(i) = Int(100 * Rnd) ' 每 产 生 一 个 随 机 数 就 存 放 到 数 组 元 素 a(i) 中 b(n - i + 1) = a(i) ' 数 组 元 素 复 制 Next i ' 输 出 部 分 Print " 数 组 a 的 内 容 是 :" ' 输 出 提 示 信 息 For i = 1 To N Print a(i); ' 输 出 a 数 组 所 有 元 素 Next i Print ' 换 行 Print " 数 组 b 的 内 容 是 :" For i = 1 To N ' 输 出 b 数 组 所 有 元 素

156 第 8 章 数 组 143 Print b(i); Next i (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 运 行 结 果 如 图 8.6 所 示 图 8.6 例 8.5 运 行 结 果 代 码 中 定 义 了 常 量 N,N 作 为 定 义 两 个 数 组 a 和 b 的 上 界 值, 即 a 和 b 的 大 小 相 同, 在 For 循 环 中, 通 过 Rnd 函 数 获 得 的 数 据 赋 值 给 a 数 组 的 元 素, 再 通 过 赋 值 语 句 把 a 数 组 的 内 容 复 制 给 数 组 b 由 于 两 数 组 存 放 数 据 的 顺 序 相 反, 即 a(1) 元 素 应 与 b(n-1+1) 对 应,a(2) 与 b(n-2+1) 对 应, 可 得 出 规 律 即 循 环 变 量 i 取 1~N 间 的 所 有 数 时, 都 有 a(i) 与 b(n-i+1) 对 应 数 组 的 初 始 化 数 组 的 初 始 化 就 是 给 数 组 的 各 元 素 赋 初 值 前 面 虽 已 讲 过 可 用 InputBox 函 数 和 赋 值 语 句 给 数 组 元 素 赋 初 值, 但 这 两 种 方 法 都 需 要 占 用 运 行 时 间, 影 响 效 率 利 用 Visual Basic 提 供 的 Array 函 数 可 以 使 数 组 在 程 序 运 行 之 前 初 始 化, 数 组 元 素 得 到 初 值 使 用 Array 函 数 的 语 法 格 式 为 : 数 组 变 量 名 =Array( [ 数 组 元 素 值 列 表 ] ) 说 明 : (1) 数 组 变 量 名 : 是 在 使 用 Array 之 前 已 定 义 过 的 数 组 名, 但 在 定 义 该 数 组 时 像 定 义 变 量 一 样, 既 没 有 维 数 也 没 有 上 下 界, 并 且 数 组 类 型 必 须 是 Variant 类 型 在 数 组 变 量 名 之 后 没 有 括 号 定 义 数 组 变 量 的 方 式 有 三 种 : 1 显 式 定 义 为 Variant 类 型 例 如 : Dim a As Variant 2 因 为 Visual Basic 默 认 的 缺 省 数 据 类 型 就 是 Variant, 所 以 定 义 时 不 指 明 类 型 例 如 : Dim b 3 如 果 程 序 中 没 有 Option Explicit 语 句 ( 强 制 变 量 声 明 ) 可 以 不 定 义 数 组 变 量, 直 接 使 用 就 行 (2) 数 组 元 素 值 列 表 : 给 数 组 元 素 赋 初 值 的 数 据 列 表, 数 据 之 间 用, 分 隔 数 据 的 个 数 决 定 了 数 组 的 大 小 如 果 无 此 列 表, 则 创 建 了 一 个 0 长 度 的 数 组 例 如 : Dim styletv As Variant styletv = Array(" 长 虹 ", " 松 下 ", "TCL", " 东 芝 ", " 索 尼 ", " 海 信 ", " 海 尔 ") 数 组 styletv 含 七 个 元 素 在 系 统 缺 省 情 况 下 数 组 元 素 的 下 标 从 0 开 始, 所 以 第 一 个 元

157 144 Visual Basic 程 序 设 计 教 程 素 styletv(0) 的 值 是 " 长 虹 ", 第 二 个 元 素 styletv(1) 的 值 是 " 松 下 ", 依 此 类 堆, 第 七 个 元 素 styletv(6) 的 值 是 " 海 尔 " 当 然, 在 程 序 前 面 如 果 有 Option Base 1 语 句, 则 数 组 下 标 从 1 开 始 例 8.6 有 学 生 信 息 如 表 8.3 所 示, 编 程 输 出 学 生 的 信 息 表 8.3 学 生 信 息 表 姓 名 单 珊 于 峰 万 立 王 红 李 杨 韩 雷 方 芳 宁 凝 成 绩 问 题 分 析 : 学 生 姓 名 和 成 绩 已 知, 则 定 义 两 个 数 组 变 量 Name 和 Score, 用 Array 函 数 分 别 给 两 个 数 组 元 素 赋 初 值 然 后 用 两 个 For 循 环 分 别 输 出 两 个 数 组 的 元 素 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 建 立 Form1 窗 体 界 面 (2) 设 置 界 面 中 各 对 象 的 属 性 : 设 置 Form1 的 Caption 为 学 生 信 息 (3) 编 写 程 序 代 码 : Option Base 1 Private Sub Form_Load() Dim Name, Score As Variant ' 定 义 数 组 变 量 Name 和 Score Dim i As Integer ' i 为 循 环 控 制 变 量, 输 出 时 For 循 环 使 用 Show Name = Array(" 单 珊 ", " 于 峰 ", " 万 立 ", " 王 红 ", " 李 杨 ", " 韩 雷 ", " 方 芳 ", " 宁 凝 ") Score = Array(78, 85, 90, 67, 88, 53, 77, 73) Print " 学 生 姓 名 :"; ' 输 出 提 示 信 息 For i = 1 To 8 ' For 循 环 输 出 每 个 学 生 的 姓 名 Print Name(i); " "; Next i Print : Print " 学 生 成 绩 :"; ' 输 出 提 示 信 息 For i = 1 To 8 ' For 循 环 输 出 每 个 学 生 的 成 绩 Print Score(i); " "; Next i (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 运 行 结 果 如 图 8.7 所 示 注 意 : Array 函 数 只 适 用 于 对 一 维 数 组 进 行 初 始 化, 不 能 对 二 维 数 组 或 多 维 数 组 进 行 初 始 化

158 第 8 章 数 组 145 图 8.7 例 8.6 运 行 结 果 8.4 For Each... Next 语 句 For Each Next 语 句 与 For Next 语 句 类 似, 都 是 实 现 循 环 结 构 的 语 句 但 For Each Next 语 句 是 专 用 于 数 组 和 对 象 集 合 的 其 语 法 规 则 是 : For Each 成 员 In 数 组 循 环 体 [ Exit For ] Next 成 员 说 明 : (1) 成 员 : 为 一 个 Variant 变 量, 是 为 循 环 提 供 的, 在 For Each Next 语 句 中 代 表 数 组 中 的 每 个 元 素, 数 组 中 有 几 个 元 素, 此 成 员 就 重 复 使 用 几 次, 循 环 体 就 执 行 几 遍 (2) 数 组 : 在 此 之 前 经 过 定 义 的 数 组, 用 在 此 处 时 仅 仅 是 一 个 数 组 名, 没 有 括 号 和 上 下 界 For Each Next 语 句 可 以 对 数 组 元 素 进 行 读 取 查 询 输 出 等 操 作 例 如 : Dim Test(1 To 20) For Each t In Test Print t ; Next t 此 段 For Each Next 代 码 中 因 为 数 组 Test 有 20 个 元 素, 循 环 体 (Print 语 句 ) 将 执 行 20 次, 即 要 输 出 20 次, 但 每 次 t 的 值 都 不 同,t 每 次 代 表 Test 数 组 中 的 一 个 元 素 所 以 这 段 代 码 的 功 能 就 是 输 出 Test 数 组 的 所 有 元 素 (3)Exit For: 退 出 For Each Next 循 环 在 循 环 体 中 可 以 有 任 意 多 个 Exit For 子 句 但 Exit For 子 句 通 常 都 与 If 语 句 配 合 使 用 例 如 : Dim Test(1 To 20) For Each t In Test If t<0 Then Exit For Print t ; Sum=Sum+t If Sum>100 Then Exit For

159 146 Visual Basic 程 序 设 计 教 程 Next t 此 段 For Each Next 语 句 中, 循 环 体 有 两 个 行 If 语 句 和 两 个 Exit For 子 句, 首 先 判 断 t 的 值, 如 果 Test 数 组 中 的 某 一 个 元 素 值 小 于 0( 即 t<0 为 True), 就 执 行 Exit For 子 句 退 出 循 环 ; 否 则 继 续 往 下 执 行 输 出 t 的 值, 再 把 t 的 值 累 加 到 变 量 Sum 中 然 后 再 判 断 Sum 值 : 如 果 Sum 大 于 100, 也 要 执 行 Exit For 子 句 退 出 循 环 ; 否 则 继 续 下 一 轮 的 循 环, 即 取 数 组 的 下 一 个 元 素 再 进 行 一 轮 判 断 通 常 在 对 数 组 的 元 素 赋 过 初 值 以 后, 再 用 For Each Next 语 句, 对 所 有 数 组 元 素 进 行 再 进 一 步 的 计 算 或 处 理 例 8.7 统 计 成 绩 高 于 80 分 的 学 生 人 数 问 题 分 析 : 假 设 有 N 个 学 生, 学 生 成 绩 已 知, 则 定 义 一 个 数 组 变 量 Score, 用 Array 函 数 给 数 组 元 素 赋 初 值 在 For Each Next 循 环 体 内 用 行 If 语 句 检 查 每 一 个 元 素 的 值, 如 果 大 于 80 就 进 行 统 计 ( 设 Count 为 统 计 人 数 的 变 量 ) Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 建 立 Form1 窗 体 界 面 (2) 设 置 界 面 中 各 对 象 的 属 性 : 设 置 Form1 的 Caption 为 统 计 成 绩 大 于 80 的 人 数 (3) 编 写 程 序 代 码 : Option Base 1 Private Sub Form_Load() Show Const N = 10 Dim Count As Integer ' Count 变 量 用 于 统 计 人 数 Dim one, Score ' one 和 Score 都 是 Variant 类 型 Score = Array(67, 78, 45, 90, 85, 63, 93, 82, 48, 88) ' 数 组 初 始 化 Count = 0 For Each one In Score If one > 80 Then Count = Count + 1 ' 若 有 成 绩 >80 的 数,Count 值 增 1 Next one ' 输 出 部 分 Print " 成 绩 分 别 是 :" For Each one In Score Print one; ' 输 出 每 个 元 素 Next one Print ' 输 出 换 行 Print " 成 绩 >80 的 人 数 有 "; Count; " 个 " (4) 运 行 程 序 :

160 第 8 章 数 组 147 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 运 行 结 果 如 图 8.8 所 示 图 8.8 例 8.7 运 行 结 果 当 需 访 问 数 组 的 所 有 元 素 时, 用 For Each Next 语 句 比 使 用 For Next 语 句 更 加 方 便 它 不 需 要 知 道 数 组 的 上 下 界 就 能 对 数 组 的 所 有 元 素 进 行 统 一 的 操 作 而 用 For Next 语 句 时, 必 须 用 一 个 循 环 控 制 变 量, 要 给 该 变 量 赋 初 值, 并 给 出 循 环 结 束 的 条 件 以 及 循 环 变 量 每 次 变 化 的 步 长 值 ( 缺 省 时 为 1) 8.5 控 件 数 组 前 面 所 讲 述 的 数 组 是 普 通 数 组, 它 的 类 型 可 以 是 Visual Basic 中 规 定 的 所 有 数 据 类 型, 也 可 以 是 用 户 自 定 义 类 型 由 于 Visual Basic 是 一 种 面 向 对 象 的 程 序 设 计 语 言, 在 设 计 应 用 程 序 界 面 时 会 用 到 许 多 控 件 对 象, 当 需 要 对 多 个 控 件 对 象 进 行 统 一 管 理 时, 可 以 把 它 们 当 做 一 个 整 体 即 控 件 数 组 来 处 理 控 件 数 组 的 概 念 控 件 数 组 由 一 组 相 同 类 型 的 控 件 组 成, 这 些 控 件 共 用 一 个 相 同 的 控 件 名 即 控 件 数 组 中 每 个 控 件 的 名 称 属 性 设 置 为 统 一 的 控 件 数 组 名 每 个 控 件 都 有 一 个 惟 一 的 索 引 号 ( 即 下 标 值 ), 索 引 号 由 控 件 的 Index 属 性 设 置, 所 以 通 过 Index 的 值 来 区 分 控 件 数 组 中 的 某 个 元 素 Index 的 最 小 值 为 0, 最 大 值 为 建 立 控 件 数 组 建 立 控 件 数 组 有 两 种 方 法 : 1. 对 建 立 的 多 个 控 件 设 置 相 同 的 控 件 名 操 作 步 骤 为 : (1) 在 应 用 程 序 窗 体 界 面 上 拖 曳 出 所 需 要 的 多 个 相 同 类 型 的 控 件 作 为 控 件 数 组 的 数 组 元 素 ; (2) 单 击 一 个 控 件, 在 其 所 对 应 的 属 性 窗 口 中 的 名 称 属 性 栏 设 置 为 统 一 的 控 件 数 组 名 ; (3) 再 单 击 另 一 个 控 件, 同 (2) 一 样 设 置 其 名 称 属 性, 回 车 后 出 现 一 对 话 框 询 问 是 否 创 建 一 个 控 件 数 组, 单 击 是 ; (4) 把 剩 余 的 控 件 同 (2) 一 样 设 置 后, 控 件 数 组 就 建 好 了, 每 个 控 件 的 Index 属 性 按 照 其 设 置 名 称 时 的 先 后 顺 序 自 动 编 号 为 0,1,2, 2. 利 用 剪 贴 板 复 制 粘 贴 功 能 自 动 建 立 操 作 步 骤 为 :

161 148 Visual Basic 程 序 设 计 教 程 (1) 在 应 用 程 序 窗 体 界 面 上 拖 曳 出 要 建 立 控 件 数 组 的 第 一 个 控 件 对 象 在 其 属 性 窗 口 中 的 名 称 属 性 栏 设 置 控 件 数 组 名 ; (2) 激 活 第 一 个 控 件, 单 击 工 具 栏 上 的 图 标 或 编 辑 菜 单 栏 的 复 制 选 项, 将 其 复 制 到 剪 贴 板 中 ; (3) 单 击 工 具 栏 上 的 图 标 或 编 辑 菜 单 栏 的 粘 贴 选 项, 出 现 一 对 话 框 询 问 是 否 创 建 一 个 控 件 数 组, 单 击 是 第 二 个 控 件 对 象 出 现 在 窗 体 界 面 中, 其 Index 属 性 的 值 为 1, 第 一 次 建 立 的 控 件 对 象 的 Index 属 性 的 值 为 0; (4) 还 需 要 几 个 控 件 元 素, 就 继 续 单 击 工 具 栏 上 的 图 标, 每 个 控 件 的 Index 属 性 按 先 后 顺 序 自 动 编 号 为 2,3,4, 示 例 8.8 创 建 如 图 8.9 所 示 界 面, 单 击 任 一 个 字 体 单 选 钮, 文 本 标 签 就 变 为 何 种 字 体 显 图 8.9 例 8.8 运 行 结 果 问 题 分 析 : 如 果 界 面 中 建 立 三 个 相 互 独 立 的 单 选 钮, 则 每 个 单 选 钮 都 需 要 编 写 相 应 的 单 击 事 件 代 码, 而 如 果 将 这 三 个 单 选 钮 用 一 个 控 件 数 组 实 现, 共 用 一 个 数 组 名, 则 只 需 编 写 一 个 控 件 数 组 名 所 对 应 的 单 击 事 件 代 码 即 可 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 先 在 Form1 窗 体 界 面 中 建 立 一 个 标 签 (Label1) 然 后 在 下 面 介 绍 的 两 种 方 法 中 任 选 一 种 建 立 fontstyle 控 件 数 组 方 法 一 : 1 分 别 建 立 三 个 单 选 按 钮 (Option1 Option2 Option3) 窗 体 界 面 如 图 8.10(a); (a) (b) 图 8.10 例 8.7 创 建 控 件 数 组 时 的 界 面 2 激 活 Option1, 设 置 其 名 称 为 fontstyle; 3 激 活 Option2, 设 置 其 名 称 为 fontstyle 出 现 对 话 框 如 图 8.10(b), 单 击 是 ; 4 激 活 Option3, 设 置 其 名 称 为 fontstyle 控 件 数 组 创 建 完 毕 方 法 二 : 1 先 建 立 一 个 单 选 按 钮 (Option1) 设 置 其 名 称 为 fontstyle;

162 第 8 章 数 组 激 活 Option1, 单 击 工 具 栏 上 的 图 标 或 编 辑 菜 单 栏 的 复 制 选 项 ; 3 单 击 工 具 栏 上 的 图 标 或 编 辑 菜 单 栏 的 粘 贴 选 项, 出 现 对 话 框 如 图 8.10(b), 单 击 是 在 窗 体 左 上 角 又 出 现 一 个 单 选 按 钮 (Option1), 为 控 件 数 组 fontstyle 的 第 二 个 元 素 4 再 单 击 工 具 栏 上 的 图 标, 在 窗 体 中 又 出 现 一 个 单 选 按 钮 (Option1), 为 控 件 数 组 fontstyle 的 第 三 个 元 素 将 三 个 控 件 对 齐 即 可 (2) 设 置 界 面 中 各 对 象 的 属 性 : 设 置 Label1 的 Caption 为 字 体 选 择,fontStyle 数 组 第 一 个 元 素 的 Caption 属 性 设 为 宋 体, 第 二 个 元 素 的 Caption 属 性 设 为 黑 体, 第 三 个 元 素 的 Caption 属 性 设 为 楷 体 (3) 编 写 程 序 代 码 : 程 序 刚 运 行 时, 默 认 第 一 个 单 选 钮 是 选 中 状 态 需 编 写 Form_Load() 事 件 代 码 如 下 : Private Sub Form_Load() fontstyle(0).value = 1 ' 先 指 定 第 一 个 单 选 钮 被 选 中 Label1.Font = " 宋 体 " 由 于 以 后 单 击 其 他 单 选 钮,Label1 的 字 体 都 作 相 应 的 变 化 需 再 编 写 控 件 数 组 fontstyle 的 单 击 事 件 fontstyle_click() 双 击 窗 体 中 任 一 个 单 选 钮 进 入 代 码 编 辑 窗 口, 代 码 如 下 : Private Sub fontstyle_click(index As Integer) If Index = 0 Then Label1.Font = " 宋 体 " If Index = 1 Then Label1.Font = " 黑 体 " If Index = 2 Then Label1.Font = " 楷 体 _GB2312" (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 鼠 标 点 击 任 一 种 字 体 按 钮 可 看 到 标 签 文 本 字 体 选 择 以 不 同 的 字 体 方 式 显 示, 运 行 结 果 如 图 8.9 所 示 Visual Basic 将 控 件 数 组 的 Index 属 性 作 为 一 个 激 发 事 件 的 参 数 传 递 给 事 件 过 程, 因 此, 在 控 件 数 组 fontstyle 的 单 击 事 件 fontstyle_click() 中, 通 过 传 递 的 参 数 Index 的 值 可 以 知 道 选 中 的 是 控 件 数 组 的 第 几 个 元 素 : 若 是 第 一 个 元 素, 其 Index 的 值 应 为 0, 则 设 置 文 本 标 签 Label1 的 Font 属 性 为 宋 体 ; 若 是 第 二 个 元 素, 其 Index 的 值 应 为 1, 则 设 置 文 本 标 签 Label1 的 Font 属 性 为 黑 体 ; 若 是 第 三 个 元 素, 其 Index 的 值 应 为 2, 则 设 置 文 本 标 签 Label1 的 Font 属 性 为 楷 体 _GB2312 由 此 例 可 以 看 出, 当 窗 体 中 多 个 相 同 类 型 的 控 件, 且 有 类 似 的 操 作 时, 使 用 控 件 数 组 会 使 界 面 更 易 设 计 ( 利 用 剪 贴 板 功 能 ), 编 写 程 序 代 码 更 加 简 化 方 便 8.6 数 组 的 应 用 举 例 例 8.9 选 择 法 排 序 问 题 分 析 :

163 150 Visual Basic 程 序 设 计 教 程 假 设 有 10 个 数, 用 数 组 a 存 放 把 10 个 数 从 小 到 大 排 序, 选 择 法 排 序 的 算 法 步 骤 是 : (1) 先 在 10 个 数 中 找 出 最 小 的 数 放 到 a[1] 处 1 先 假 设 a[1] 中 的 数 最 小, 用 变 量 p 记 下 此 时 最 小 数 的 位 置, 即 p=1; 2 依 次 拿 a[p] 与 a[i](i 从 2 变 化 到 10) 进 行 比 较, 每 次 比 较 时, 若 a[i] 中 的 数 比 a[p] 中 的 数 小 时, 则 把 i 的 值 赋 给 p, 即 令 p 总 是 指 向 当 前 所 比 较 的 数 中 最 小 的 数 的 位 置, 这 样 在 顺 序 比 较 到 a[10] 为 止,p 就 是 指 向 10 个 数 中 的 最 小 数 的 位 置,a[p] 就 是 10 个 数 中 的 最 小 数 ; 3 把 a[p] 与 a[1] 中 的 数 对 调 a[1] 中 存 放 的 就 是 最 小 数 了 (2) 再 从 a[2] 至 a[10] 的 9 个 数 中 找 出 最 小 的 数 放 到 a[2] 中 1 先 假 设 a[2] 至 a[10] 的 9 个 数 中 a[2] 的 数 最 小, 用 变 量 p 记 下 此 数 的 位 置, 即 p=2 2 依 次 拿 a[p] 与 a[i](i 从 3 变 化 到 10) 进 行 比 较, 每 次 比 较 时, 若 a[i] 中 的 数 比 a[p] 中 的 数 小 时, 则 把 i 的 值 赋 给 p, 即 令 p 总 是 指 向 当 前 所 比 较 的 数 中 最 小 的 数 的 位 置, 这 样 在 顺 序 比 较 到 a[10] 为 止,p 就 是 指 向 9 个 数 中 的 最 小 数 的 位 置,a[p] 就 是 9 个 数 中 的 最 小 数 3 把 a[p] 与 a[2] 中 的 数 对 调 a[2] 中 存 放 的 就 是 10 个 数 中 第 二 小 的 数 了 (3) 再 从 a[3] 至 a[10] 中 找 出 最 小 的 数 放 到 a[3] 中, 方 法 与 (1) (2) 相 同 (4) 依 此 类 推, 直 到 剩 下 两 个 数 a[9] 和 a[10] 比 较 完 后,10 个 数 就 按 从 小 到 大 排 好 了 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 在 Form1 窗 体 界 面 中 建 立 两 个 标 签 (Label1 Label2) 和 两 个 文 本 框 (Text1,Text2) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 8.4: 表 8.4 例 8.9 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 选 择 法 排 序 Label1 Caption 10 个 数 是 : Label2 Caption 排 序 结 果 是 : Text1 Text 置 空 Text2 Text 置 空 (3) 编 写 程 序 代 码 : Option Base 1 Private Sub Form_Load() Const N = 10 ' 常 数 N 确 定 数 组 的 大 小 Dim a(n) As Integer Dim i, j, p, Temp As Integer Show For i = 1 To N ' For 循 环 i 从 1 变 化 到 N a(i) = Int(100 * Rnd)+1 ' 产 生 N 个 1~100 间 的 随 机 数 存 放 到 数 组 元 素 a(i) 中 Next i For i = 1 To N ' 在 Text1 中 输 出 原 始 数 据 Text1.Text = Text1.Text & a(i) & "," ' 输 出 a 数 组 所 有 元 素

164 第 8 章 数 组 151 Next i ' 选 择 法 排 序 部 分 For i = 1 To N - 1 p = i For j = i + 1 To N If a(p) > a(j) Then p = j Next j If p <> i Then ' 交 换 Temp = a(i) a(i) = a(p) a(p) = Temp End If Next i ' 输 出 排 序 的 结 果 For i = 1 To N Text2.Text = Text2.Text & a(i) & "," ' 输 出 a 数 组 所 有 元 素 Next i (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 运 行 结 果 如 图 8.11 所 示 图 8.11 例 8.9 运 行 结 果 程 序 代 码 中 使 用 两 重 For 循 环 实 现 选 择 法 排 序, 外 循 环 控 制 变 量 i 从 1 变 化 到 N 1( 常 数 N 值 为 10), 控 制 循 环 寻 找 9 次 最 小 的 数 内 循 环 控 制 变 量 j 的 初 值 为 i+1, 终 值 为 N, 表 示 当 i 值 为 1 时, 将 第 1 个 数 与 其 后 的 第 2 个 至 第 10 个 数 中 寻 找 到 最 小 的 数 交 换 位 置 ; 当 i 值 为 2 时, 将 第 2 个 数 与 其 后 的 第 3 个 至 第 10 个 数 中 寻 找 到 的 最 小 的 数 交 换 位 置 依 此 类 推, 直 到 i 的 值 为 9 时,10 个 数 的 顺 序 就 排 好 了 例 8.10 用 冒 泡 法 排 序 问 题 分 析 : 冒 泡 法 排 序 也 叫 下 沉 法 排 序 其 思 路 是 在 一 列 数 中 从 前 往 后 每 次 将 两 两 相 邻 的 数 进 行 比 较, 然 后 将 小 的 数 调 换 到 前 面, 大 的 放 到 后 面 经 过 第 一 轮 两 两 比 较 后, 最 大 的 数 就 排 到 最 后 的 位 置 上 然 后 再 从 第 一 个 数 至 倒 数 第 二 个 数 之 间 开 始 新 一 轮 的 两 两 比 较 调 换 后, 第 二 大 的 数 已 排 在 倒 数 第 二 的 位 置 上 然 后 再 开 始 新 一 轮 的 比 较, 依 此 类 推, 直 至 所 有 数 从 小 到 大 排 好 队 假 设 有 4 个 数, 开 始 的 顺 序 是 , 用 冒 泡 法 排 序 的 过 程 如 下 :

165 152 Visual Basic 程 序 设 计 教 程 (1) 第 一 轮 需 经 过 三 次 比 较 : 开 始 值 第 一 次 比 较 交 换 结 果 第 二 次 比 较 交 换 结 果 第 三 次 比 较 交 换 结 果 (2) 第 二 轮 需 经 过 两 次 比 较 : 开 始 值 第 一 次 比 较 交 换 结 果 第 二 次 比 较 交 换 结 果 (3) 第 三 轮 只 需 一 次 比 较 : 开 始 值 第 一 次 比 较 交 换 结 果 如 果 有 N 个 数 排 序, 则 需 要 N 1 轮 两 两 比 较 才 可 排 好 序 每 一 轮 比 较 时, 两 两 相 比 的 次 数 是 不 同 的 在 程 序 代 码 编 写 时, 需 用 双 重 循 环 来 实 现 外 循 环 控 制 第 几 轮 比 较, 内 循 环 控 制 两 两 比 较 的 次 数 第 一 轮 时, 有 N 个 数 进 行 比 较, 相 邻 的 两 数 相 比 需 要 N 1 次, 经 过 交 换 后, 最 大 的 数 已 排 到 最 后 第 二 轮 时, 只 需 要 对 前 面 的 N 1 个 数 进 行 比 较, 相 邻 的 两 数 相 比 只 需 N 2 次, 经 过 交 换 后, 第 二 大 的 数 已 排 到 倒 数 第 二 的 位 置 依 此 类 推, 到 第 N 1 轮 时, 只 剩 下 最 前 面 的 两 个 数, 比 较 交 换 后,N 个 数 的 顺 序 已 排 列 完 毕 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 在 Form1 窗 体 界 面 中 建 立 两 个 标 签 (Label1 Label2) 和 两 个 文 本 框 (Text1,Text2) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 8.5 表 8.5 例 8.10 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 冒 泡 法 排 序 Label1 Caption 10 个 数 是 : Label2 Caption 排 序 结 果 是 : Text1 Text 置 空 Text2 Text 置 空 (3) 编 写 程 序 代 码 : Option Base 1 Private Sub Form_Load()

166 第 8 章 数 组 153 Const N = 10 ' 常 数 N 确 定 数 组 的 大 小 Dim a(n) As Integer Dim i, j, p, Temp As Integer Show For i = 1 To N ' For 循 环 i 从 1 变 化 到 N a(i) = Int(100 * Rnd) + 1 ' 产 生 N 个 1~100 间 的 随 机 数 Next i ' 在 Text1 中 输 出 原 始 数 据 For i = 1 To N Text1.Text = Text1.Text & a(i) & "," ' 输 出 a 数 组 所 有 元 素 Next i ' 冒 泡 法 排 序 部 分 For i = 1 To N - 1 For j = 1 To N - i If a(j) > a(j + 1) Then ' 交 换 Temp = a(j) a(j) = a(j + 1) a(j + 1) = Temp End If Next j Next i ' 输 出 排 序 的 结 果 For i = 1 To N Text2.Text = Text2.Text & a(i) & "," ' 输 出 a 数 组 所 有 元 素 Next i (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 运 行 结 果 如 图 8.12 所 示 图 8.12 例 8.10 运 行 结 果 上 述 程 序 代 码 中 使 用 两 重 For 循 环 实 现 冒 泡 法 排 序, 外 循 环 控 制 变 量 i 从 1 变 化 到 N 1, 控 制 共 有 9 轮 比 较 内 循 环 控 制 变 量 j 的 初 值 为 1, 终 值 为 N i, 内 循 环 的 循 环 体 是 a(j) 和 a(j+1) 进 行 比 较 交 换 所 以 当 i 值 为 1 时, 内 循 环 有 N 1 次 两 数 相 比 当 i 值 为 2 时, 内 循 环 有 N 2 次 两 数 相 比, 依 此 类 推 例 8.11 在 有 序 序 列 中 插 入 一 个 数, 使 插 入 后 的 数 列 仍 然 有 序

167 154 Visual Basic 程 序 设 计 教 程 问 题 分 析 : 假 设 排 好 顺 序 的 10 个 数 用 数 组 a 存 放, 输 入 一 个 数 用 变 量 num 存 放, 要 把 num 插 入 队 中, 则 num 需 要 与 a 数 组 中 的 元 素 进 行 比 较, 然 后 放 入 a 数 组 合 适 的 位 置 上, 因 此 a 数 组 在 定 义 时 可 定 义 含 11 个 元 素 设 a(1) 至 a(10) 已 存 放 10 个 从 小 到 大 的 数,num 与 a 数 组 元 素 的 比 较 算 法 如 下 : (1) 如 果 num a(10) 为 True, 则 num 为 最 大 的 数,num 赋 值 给 a(11), 然 后 输 出 数 组 a 所 有 元 素, 程 序 结 束 (2) 如 果 num a(10) 为 False, 则 通 过 循 环 控 制 变 量 i( 从 10 递 减 到 1),num 依 次 与 a(i) 进 行 比 较, 如 果 num > a(i) 为 True, 则 i+1 的 值 就 应 是 num 要 插 入 的 位 置,a 数 组 中 从 i+1 位 置 往 后 至 a(10) 间 的 所 有 元 素 顺 序 往 后 移 动 一 个 位 置 ( 按 照 a(10) a(9) a(i+1) 的 顺 序 依 次 后 移 ) 然 后 把 num 赋 值 给 a (i+1) 后 退 出 循 环 输 出 数 组 a 所 有 元 素, 程 序 结 束 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 在 Form1 窗 体 界 面 中 建 立 三 个 标 签 (Label1 Label2 Label3) 一 个 文 本 框 (Text1) 和 一 个 命 令 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 8.6 表 8.6 例 8.11 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 插 入 队 列 Label1 Caption 原 始 队 列 : Label2 Caption 新 队 列 是 : Label3 Caption 输 入 一 个 数 值 : Text1 Text 置 空 Command1 Caption 插 入 队 中 (3) 编 写 程 序 代 码 : 1 在 Form1 窗 口 中, 当 在 Text1 文 本 框 内 输 入 数 字 后, 单 击 Command1 按 钮 是 执 行 插 入 队 列, 所 以 应 编 写 Command1 的 单 击 事 件 代 码, 该 代 码 如 下 : Private Sub Command1_Click() Dim a(1 To 11) As Single ' 定 义 静 态 数 组 a 含 11 个 元 素 Dim i, j As Integer Dim num As Single ' 给 数 组 元 素 赋 初 值, 即 原 始 队 列 a(1) = 3: a(2) = 5: a(3) = 7: a(4) = 8: a(5) = 9 a(6) = 13: a(7) = 16: a(8) = 19: a(9) = 33: a(10) = 38 ' 输 出 原 始 队 列 For i = 1 To 10 Label2.Caption = Label2.Caption & a(i) & ", " Next i num = Val(Text1.Text)

168 第 8 章 数 组 155 ' 把 输 入 的 数 插 入 队 列 中 For i = 10 To 1 Step -1 If num < a(i) Then a(i+1) = a( i ) ' 元 素 后 移 一 个 位 置 else a(i+1) = num Exit For ' 退 出 循 环 End If Next i ' 输 出 新 队 列 For i = 1 To 11 Label3.Caption = Label3.Caption & a(i) & ", " Next i 2 在 运 行 时, 为 了 看 到 不 同 的 运 行 结 果, 当 文 本 框 中 的 数 字 改 变 时, 需 要 重 置 标 签 Label2 和 Label3 的 显 示 信 息, 所 以 要 编 写 Text1_Change() 事 件 代 码 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 Text1, 在 事 件 程 序 下 拉 列 表 框 中 选 择 Change, 再 接 着 输 入 下 面 的 代 码 : Private Sub Text1_Change() Label2.Caption = " 原 始 队 列 :" ' 重 置 Label2 的 Caption 值 Label3.Caption = " 新 队 列 是 :" ' 重 置 Label3 的 Caption 值 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 比 如 在 Text1 文 本 框 内 输 入 一 个 数 字 12 后, 用 鼠 标 单 击 插 入 队 中 按 钮, 可 看 到 Label2 位 置 处 显 示 原 始 的 序 列 Label3 位 置 处 显 示 插 队 后 的 新 序 列 为 了 检 验 程 序 的 严 密 性, 应 至 少 测 试 三 次 分 别 输 入 比 原 始 队 列 的 队 首 小 的 数, 比 队 尾 大 的 数 和 居 中 的 数 运 行 结 果 如 图 8.13 所 示 图 8.13 例 8.11 运 行 结 果 本 例 在 编 程 时 应 注 意 : (1) 当 找 到 要 插 入 位 置 i 时,a(i) 后 面 的 元 素 需 顺 序 往 后 移 动 一 个 位 置, 但 移 动 的 顺 序 应 该 是 先 把 第 10 位 置 数 移 到 第 11 位 置, 即 把 a(10) 赋 值 给 a(11), 然 后 再 把 把 第 9 位 置 数 移 到 第 10 位 置, 即 把 a(9) 赋 值 给 a(10), 依 此 类 推, 最 后 空 出 a(i), 再 把 num 赋 值 给 a(i+1)

169 156 Visual Basic 程 序 设 计 教 程 (2) 当 num 已 赋 值 给 a(i+1), 即 num 已 插 入 到 队 列 之 后, 应 执 行 Exit For, 结 束 循 环, 以 避 免 多 余 的 比 较 例 8.12 二 维 数 组 转 置 问 题 分 析 : 从 图 8.14 可 以 看 出, 二 维 数 组 的 转 置 是 数 组 元 素 沿 着 主 对 角 线 对 折 进 行 位 置 调 换 即 a(i, j) 元 素 与 a(j, i) 元 素 互 换 (a) 二 维 数 组 转 置 前 (b) 二 维 数 组 转 置 后 图 8.14 二 维 数 组 转 置 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 建 立 Form1 窗 体 界 面 调 整 窗 口 大 小 (2) 设 置 界 面 中 对 象 的 属 性 : 设 置 Form1 的 Caption 为 二 维 数 组 转 置 (3) 编 写 程 序 代 码 : Option Base 1 Private Sub Form_Load() Const N = 4 ' 常 量 N 决 定 二 维 数 组 大 小 Dim a(n, N) As Integer Dim i, j, Temp As Integer Show ' 数 组 初 始 化 For i = 1 To N ' For 循 环 i 从 1 变 化 到 N For j = 1 To N a(i, j) = i * 10 + j Next j Next i ' 输 出 原 始 数 组 Print " 转 置 前 的 数 组 :" For i = 1 To N ' For 循 环 i 从 1 变 化 到 N For j = 1 To N Print a(i, j); Next j Print

170 第 8 章 数 组 157 Next i ' 数 组 转 置 For i = 1 To N ' For 循 环 i 从 1 变 化 到 N For j = 1 To i ' 交 换 Temp = a(i, j) a(i, j) = a(j, i) a(j, i) = Temp Next j Next i ' 输 出 转 置 后 的 数 组 Print " 转 置 后 的 数 组 :" For i = 1 To N ' For 循 环 i 从 1 变 化 到 N For j = 1 To N Print a(i, j); Next j Print Next i (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 运 行 结 果 如 图 8.15 所 示 图 8.15 例 8.12 运 行 结 果 本 例 在 编 程 时 应 注 意 : (1) 为 使 程 序 更 具 有 通 用 性, 定 义 一 个 常 量 N, 来 决 定 二 维 数 组 的 大 小 a(n, N) (2)a(i, j) 元 素 与 a(j, i) 元 素 内 容 互 换 时, 要 利 用 一 下 中 间 变 量 Temp, 若 去 掉 Temp = a(i, j) 语 句, 只 写 a(i, j) = a(j, i) 和 a(j, i) = a(i, j) 两 条 语 句, 则 a(i, j) 和 a(j, i) 都 变 成 交 换 前 a(j, i) 的 内 容 了 (3) 转 置 部 分 的 代 码 段 是 使 用 两 重 循 环 实 现 的, 其 中 i 为 外 循 环 控 制 变 量, 从 1 变 化 到 N, 内 循 环 控 制 变 量 j 应 是 从 1 变 化 到 i 如 果 写 成 j 从 1 变 化 到 N, 则 相 当 于 a(i, j) 元 素 与 a(j, i) 元 素 内 容 互 换 了 两 次, 又 回 到 原 始 状 态 例 8.13 求 二 维 数 组 中 的 最 小 值 及 其 所 在 行 号 列 号 问 题 分 析 : 假 设 有 一 个 二 维 数 组 a 有 N 行 N 列 ( 下 界 设 为 1), 用 变 量 min 来 存 放 最 小

171 158 Visual Basic 程 序 设 计 教 程 值, 可 以 先 把 a(1,1) 赋 值 给 min 变 量, 然 后 通 过 两 重 循 环 ( 循 环 控 制 变 量 i 控 制 行 标 变 化,j 控 制 列 标 变 化 ), 依 次 将 min 与 a 数 组 的 每 个 变 量 a(i,j) 进 行 比 较, 只 要 a(i,j)<min 为 True 就 把 a(i,j) 赋 值 给 min, 并 同 时 记 下 i 和 j 的 当 前 值, 可 用 两 个 变 量 row 和 line, 令 row = i 且 line = j 实 现 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 建 立 Form1 窗 体 界 面 调 整 窗 口 大 小 (2) 设 置 界 面 中 对 象 的 属 性 : 设 置 Form1 的 Caption 为 最 小 值 和 行 列 号 (3) 编 写 程 序 代 码 : 二 维 数 组 的 内 容 可 用 随 机 函 数 Rnd 产 生, 则 不 需 要 输 入 数 据, 在 代 码 窗 口 中 直 接 编 写 Form_Load 事 件, 代 码 如 下 : Option Base 1 Private Sub Form_Load() Const N = 5 ' 常 数 N 确 定 数 组 的 大 小 Dim a(n, N) As Integer Dim i, j, row, line, min As Integer Show For i = 1 To N ' For 循 环 i 从 1 变 化 到 N For j = 1 To N ' For 循 环 j 从 1 变 化 到 N a(i, j) = Int(100 * Rnd) + 1 ' 产 生 N*N 个 1~100 间 的 随 机 数 Next j Next i ' 输 出 二 维 数 组 Print " 数 组 内 容 是 :" For i = 1 To N For j = 1 To N Print a(i, j); Next j Print ' 输 完 一 行 元 素 后 输 出 一 个 换 行 Next i ' 设 定 初 始 值 min = a(1, 1): row = 1: line = 1 ' 寻 找 最 小 数 For i = 1 To N For j = 1 To N If a(i, j) < min Then min = a(i, j) row = i

172 第 8 章 数 组 159 line = j End If Next j Next i ' 输 出 结 果 Print " 最 小 值 是 :"; min Print " 在 第 "; row; " 行 第 "; line; " 列 " (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 运 行 结 果 如 图 8.16 所 示 图 8.16 例 8.13 运 行 结 果 注 意 : 在 寻 找 最 小 数 部 分, 必 须 在 循 环 体 内 给 min 赋 值 的 同 时, 使 用 另 外 两 个 变 量 来 记 住 当 时 的 i 和 j 的 值, 因 为 当 两 层 循 环 都 结 束 时,i 和 j 的 值 都 变 为 N+1 了 比 如 我 们 可 以 在 本 例 的 最 后 ( 语 句 之 前 ) 增 加 一 行 输 出 语 句 Print "i="; i; "j="; j, 则 结 果 变 为 图 8.17 所 示 图 8.17 循 环 结 束 后 i,j 发 生 变 化 习 题 1. 对 n 个 元 素 的 数 组, 找 出 最 小 的 数 并 将 其 与 第 一 个 元 素 对 换 位 置 2. 输 入 十 个 数, 进 行 从 大 到 小 排 序 3. 把 两 个 有 序 序 列 合 并 成 一 个 新 的 有 序 序 列 4. 计 算 二 维 数 组 主 对 角 线 的 元 素 的 平 方 之 和 5. 找 出 二 维 数 组 中 的 最 大 值 及 其 所 在 的 行 列 号 6. 有 n 个 无 序 的 数 存 放 在 数 组 a 中, 其 中 若 有 多 次 重 复 的 数 值, 将 其 删 除 到 仅 剩 一 个, 使 得 数 组 中 不 再 有 重 复 数 值 出 现, 输 出 最 终 的 数 组 内 容

173 160 Visual Basic 程 序 设 计 教 程 7. 打 印 杨 辉 三 角 形 :

174 第 9 章 过 程 通 常 我 们 遇 到 一 个 复 杂 的 任 务 时, 单 靠 一 个 人 的 能 力 是 较 难 实 现 的, 可 以 把 这 个 复 杂 任 务 分 解 为 若 干 个 小 的 任 务, 由 多 人 合 作 完 成, 每 人 只 需 完 成 自 己 能 力 所 及 的 一 部 分 任 务 这 样 既 可 以 降 低 任 务 的 复 杂 性, 又 可 以 缩 短 完 工 日 期, 提 高 效 率 同 样 的 道 理, 在 编 写 大 的 复 杂 的 应 用 程 序 时, 也 可 以 把 它 分 解 成 多 个 较 简 单 的 容 易 实 现 的 模 块 每 一 个 模 块 完 成 一 个 相 对 独 立 的 功 能 根 据 任 务 的 需 求 调 用 不 同 的 模 块, 共 同 组 建 成 一 个 完 整 的 复 杂 的 应 用 程 序 由 于 每 个 模 块 都 由 若 干 程 序 段 构 成, 可 能 有 一 些 程 序 段 会 在 多 个 模 块 中 重 复 使 用, 为 提 高 效 率, 可 以 把 这 些 具 有 通 用 性 能 完 成 一 定 功 能 的 程 序 段 单 独 拿 出 来, 用 过 程 来 定 义, 哪 个 模 块 需 要, 就 可 以 直 接 调 用 该 过 程 Visual Basic 中 有 三 种 过 程 : 子 程 序 (Sub) 过 程 函 数 (Function) 过 程 和 属 性 (Property) 过 程 三 种 过 程 都 需 要 先 定 义 ( 即 建 立 过 程 ), 然 后 才 能 调 用 其 中 : (1)Sub 过 程 调 用 后 无 返 回 值 ; (2)Function 过 程 调 用 后 返 回 一 个 值 ; (3)Property 过 程 调 用 后 可 以 返 回 和 设 置 属 性 的 值, 也 可 以 设 置 对 象 的 引 用, 由 于 比 较 复 杂, 本 章 不 予 介 绍 下 面 主 要 介 绍 Sub 过 程 和 Function 过 程 9.1 Sub 过 程 Sub 过 程 可 以 放 在 标 准 模 块 和 窗 体 模 块 中 定 义 Visual Basic 中 包 含 两 种 Sub 过 程 : 事 件 过 程 和 通 用 过 程 事 件 过 程 与 通 用 过 程 1. 事 件 过 程 Visual Basic 是 事 件 驱 动 的, 事 件 是 能 被 对 象 ( 窗 体 和 控 件 ) 识 别 的 动 作 如 对 象 的 单 击 (Click) 事 件, 双 击 (DblClick) 事 件, 内 容 改 变 (Change) 事 件 等 等 为 一 个 事 件 所 编 写 的 程 序 代 码 称 为 事 件 过 程 当 Visual Basic 中 的 对 象 发 生 某 个 事 件 时, 便 自 动 调 用 相 应 的 事 件 过 程 根 据 对 象 的 不 同, 事 件 过 程 又 分 为 窗 体 事 件 过 程 和 控 件 事 件 过 程 (1) 窗 体 事 件 过 程 : 窗 体 事 件 的 过 程 名 由 单 词 Form 下 划 线 _ 和 事 件 名 组 成 窗 体 事 件 过 程 定 义 的 语 法 为 : Private Sub Form_ 事 件 名 ( [ 形 参 列 表 ] )

175 162 Visual Basic 程 序 设 计 教 程 [ 局 部 变 量 和 常 数 声 明 ] 语 句 组 在 前 面 的 章 节 中 用 到 的 Form_Load() 事 件 就 是 窗 体 事 件, 常 用 的 窗 体 事 件 还 有 Form_Click() 事 件 Form_Resize() 事 件 等 等 如 下 面 代 码 段 为 窗 体 的 单 击 事 件, 运 行 时, 当 鼠 标 在 窗 体 内 单 击 时, 引 发 本 窗 体 的 单 击 事 件, 执 行 单 击 事 件 的 代 码, 则 在 本 窗 体 的 标 题 栏 上 显 示 窗 体 单 击 事 件 Private Sub Form_Click() Caption = " 窗 体 单 击 事 件 " (2) 控 件 事 件 过 程 : 控 件 事 件 的 过 程 名 由 具 体 某 个 控 件 名 ( 由 控 件 属 性 窗 口 中 的 Name 值 指 定 ) 下 划 线 _ 和 事 件 名 组 成 控 件 事 件 过 程 定 义 的 语 法 为 : Private Sub 控 件 名 _ 事 件 名 ( [ 形 参 列 表 ] ) [ 局 部 变 量 和 常 数 声 明 ] 语 句 组 每 个 窗 体 中 可 以 包 含 若 干 个 控 件, 而 每 个 控 件 又 可 有 若 干 个 事 件 过 程 如 下 列 一 段 代 码 是 Text1 文 本 框 的 两 个 事 件 过 程 在 运 行 时, 如 在 文 本 框 内 部 输 入 数 据 时, 引 发 Text1_Change() 事 件, 文 本 框 内 的 文 字 变 为 某 种 颜 色, 而 当 鼠 标 在 文 本 框 内 部 单 击 时, 引 发 Text1_Click() 事 件, 文 本 框 内 的 文 字 变 为 另 一 种 颜 色 Private Sub Text1_Change() Text1.ForeColor = "111111" Private Sub Text1_Click() Text1.ForeColor = "000000" 2. 通 用 过 程 事 件 过 程 只 能 针 对 某 个 具 体 的 窗 体 或 控 件 而 当 有 多 个 窗 体 或 控 件 的 事 件 过 程 中 需 要 执 行 某 些 相 同 的 操 作 时, 为 了 避 免 重 复 编 写 代 码, 可 以 把 这 些 相 同 操 作 所 对 应 的 代 码 段 拿 出 来 定 义 一 个 通 用 过 程 这 样 当 窗 体 或 控 件 的 事 件 过 程 中 需 要 执 行 这 部 分 操 作 时, 只 需 调 用 通 用 过 程 就 可 以 了 通 用 过 程 定 义 的 语 法 为 : [ Public Private Static] Sub 过 程 名 ( [ 形 参 列 表 ] ) [ 局 部 变 量 和 常 数 声 明 ] 语 句 组 [ Exit Sub ]

176 第 9 章 过 程 163 语 句 组 说 明 : (1)Public Private 和 Static: 是 可 选 项, 表 示 过 程 在 工 程 中 的 访 问 范 围 Public 或 Private 表 示 该 过 程 是 公 用 的 还 是 私 用 的 Public 过 程 可 以 在 整 个 工 程 范 围 内 被 所 有 模 块 中 的 其 他 过 程 访 问 调 用 Private 过 程 只 能 在 本 窗 体 或 本 模 块 中 被 调 用 Static 表 示 该 过 程 中 的 局 部 变 量 是 静 态 变 量, 在 过 程 被 调 用 后 该 变 量 的 值 仍 然 保 留 当 没 有 使 用 Public Private 或 Static 显 示 的 声 明 过 程 时, 该 过 程 被 隐 含 指 定 为 Public (2)Sub: 是 定 义 一 个 Sub 过 程 的 开 始 标 志 (3) 过 程 名 :Sub 过 程 的 名 称, 其 起 名 规 则 与 Visual Basic 的 变 量 名 的 命 名 规 则 相 同 (4) 局 部 变 量 和 常 数 声 明 : 用 来 声 明 在 过 程 内 部 使 用 的 变 量 和 常 数 (5)Exit Sub: 是 可 选 项 部 分, 它 使 该 Sub 过 程 执 行 至 此 时 立 即 从 此 处 退 出 若 执 行 了 Exit Sub, 其 后 本 过 程 中 的 其 他 语 句 将 不 被 执 行 Exit Sub 一 般 与 If 语 句 配 合 使 用 (6): 定 义 Sub 过 程 的 结 束 标 志 当 程 序 执 行 至 语 句 时, 退 出 该 过 程, 并 立 即 返 回 到 调 用 语 句 处, 继 续 执 行 调 用 语 句 后 的 下 一 条 语 句 (7)( 形 参 列 表 ): 代 表 在 Sub 过 程 被 调 用 时 要 传 递 给 Sub 过 程 的 参 数 变 量 列 表, 各 个 参 数 一 般 需 定 义 数 据 类 型, 有 多 个 参 数 时 应 该 用 逗 号 隔 开, 没 有 参 数 时 一 对 括 号 不 能 省 略 形 参 列 表 中 每 个 参 数 的 一 般 格 式 为 : [ByVal ByRef] 变 量 名 [ ( ) ] [ As 类 型 ] 说 明 : (1)ByVal: 为 可 选 项, 表 示 其 后 的 参 数 变 量 按 值 传 递 (2)ByRef: 表 示 其 后 的 参 数 变 量 按 地 址 传 递 它 是 Visual Basic 的 默 认 选 项 (3) 变 量 名 [ ( ) ]: 代 表 参 数 的 变 量 名 称, 要 遵 循 Visual Basic 的 变 量 命 名 规 定 当 该 参 数 是 数 组 时, 其 数 组 名 后 应 加 括 号 在 定 义 过 程 时, 此 变 量 名 代 表 形 式 参 数 ( 简 称 形 参 ), 在 过 程 调 用 时, 用 实 际 参 数 ( 简 称 实 参 ) 代 替 (4)As 类 型 : 代 表 过 程 中 参 数 的 数 据 类 型, 可 以 是 Byte Boolean Integer Long Single Double String Date Currency Object Variant 或 用 户 定 义 的 类 型 如 果 不 写 As 类 型 时, 则 默 认 该 参 数 为 Variant 类 型 如 下 例 Message() 为 一 个 非 常 简 单 的 通 用 过 程 Public Sub Message() MsgBox (" 你 好!") 该 过 程 为 显 示 一 个 内 容 为 你 好! 的 对 话 框 建 立 Sub 过 程 在 前 几 章 我 们 建 立 了 许 多 窗 体 事 件 过 程 和 控 件 事 件 过 程 的 例 子, 这 里 我 们 主 要 讲 通 用 过 程 的 建 立 通 用 过 程 可 以 放 在 标 准 模 块 或 窗 体 模 块 中 定 义 1. 在 标 准 模 块 中 建 立 通 用 过 程

177 164 Visual Basic 程 序 设 计 教 程 如 果 在 标 准 模 块 中 建 立 通 用 过 程, 可 以 使 用 如 下 两 种 方 法 : (1) 第 一 种 方 法 操 作 步 骤 如 下 : 1 在 工 程 菜 单 中 选 择 添 加 模 块 对 话 框, 如 图 9.1 所 示 选 择 新 建 选 项 卡, 选 中 模 块 图 标, 单 击 打 开 按 钮, 则 打 开 了 模 块 代 码 窗 口 如 图 9.2(a) 所 示 图 9.1 添 加 模 块 对 话 框 (a) (b) 图 9.2 模 块 代 码 窗 口 2 在 工 具 菜 单 中 选 择 添 加 过 程, 打 开 添 加 过 程 对 话 框, 如 图 9.3 所 示 图 9.3 添 加 过 程 对 话 框 在 名 称 框 中 输 入 要 建 立 的 过 程 的 名 字 ( 如 Message)

178 第 9 章 过 程 165 在 类 型 栏 内 选 择 要 建 立 的 过 程 的 类 型, 如 果 建 立 子 程 序 过 程, 则 应 选 择 子 程 序 ; 如 果 要 建 立 函 数 过 程, 则 应 选 择 函 数 在 范 围 栏 内 选 择 过 程 的 适 用 范 围 如 果 选 择 公 有 的, 则 所 建 立 的 过 程 可 用 于 本 工 程 内 所 有 的 窗 体 模 块 ; 如 果 选 择 私 有 的, 则 所 建 立 的 过 程 只 能 用 于 本 标 准 模 块 单 击 确 定 按 钮, 回 到 模 块 代 码 窗 口 过 程 的 首 行 和 结 束 部 分 则 自 动 写 好, 如 图 9.2 (b) 所 示 3 在 模 块 代 码 窗 口 内 的 Sub 和 之 间, 根 据 过 程 要 完 成 的 功 能 输 入 过 程 体 的 程 序 代 码 ( 如 MsgBox (" 你 好!")) (2) 第 二 种 方 法 操 作 步 骤 如 下 : 1 在 工 程 菜 单 中 选 择 添 加 模 块 对 话 框, 如 图 9.1 所 示 选 择 新 建 选 项 卡, 选 中 模 块 图 标, 单 击 打 开 按 钮, 则 打 开 了 模 块 代 码 窗 口 如 图 9.2(a) 所 示 2 在 打 开 的 模 块 代 码 窗 口 中 直 接 输 入 要 定 义 的 通 用 过 程 的 首 行 内 容, 比 如 : Public Sub message ( ) 回 车 后, 会 自 动 产 生 过 程 结 束 语 句 如 图 9.2(b) 所 示 3 然 后 在 Sub 和 之 间 输 入 程 序 代 码 ( 如 MsgBox (" 你 好!")) 2. 在 窗 体 模 块 中 建 立 通 用 过 程 如 果 在 窗 体 模 块 中 建 立 通 用 过 程, 操 作 步 骤 如 下 : 1 在 工 程 资 源 管 理 器 内 选 中 某 窗 体, 然 后 在 视 图 菜 单 栏 选 择 代 码 窗 口, 进 入 窗 体 模 块 代 码 窗 口, 在 对 象 下 拉 列 表 框 中 选 择 通 用, 在 过 程 下 拉 列 表 框 中 选 择 声 明 2 在 窗 体 模 块 代 码 窗 口 中 直 接 输 入 要 定 义 的 通 用 过 程 的 首 行 内 容, 如 输 入 Public Sub message() 回 车 后, 会 自 动 产 生 过 程 结 束 语 句 图 9.2(b) 图 3 然 后 在 Sub 和 之 间 输 入 程 序 代 码 ( 如 MsgBox (" 你 好!") ) 调 用 Sub 过 程 建 立 好 的 Sub 过 程, 只 有 通 过 调 用 语 句 的 调 用, 其 程 序 段 才 被 执 行 调 用 Sub 过 程 有 两 种 方 式 : 1. 用 Call 语 句 调 用 Sub 过 程 用 Call 语 句 调 用 Sub 过 程 的 语 法 : Call 过 程 名 [( 实 参 列 表 )] 实 参 列 表 是 传 递 给 Sub 过 程 的 实 际 参 数 用 Call 语 句 调 用 某 个 过 程 时, 如 果 该 过 程 在 定 义 时 本 身 没 有 形 参, 则 实 参 列 表 和 () 可 以 省 略, 如 Call Message 否 则 应 给 出 相 应 的 实 际 参 数 ( 与 形 式 参 数 一 一 对 应 ), 并 放 在 () 中 如 Call PrintMe(a) 2. 把 过 程 名 作 为 一 个 语 句 把 过 程 名 作 为 一 个 语 句 来 使 用 时, 只 给 出 过 程 名 及 相 应 的 实 参 即 可, 如 PrintMe a 例 9.1 建 立 一 个 通 用 过 程 PrintMe, 输 出 问 候 某 人 的 对 话 框 问 题 分 析 : 可 在 窗 体 中 添 加 一 个 文 本 框, 用 于 输 入 某 人 姓 名, 添 加 一 个 命 令 按 钮, 通 过 单 击 按 钮 事 件 调 用 通 用 过 程 PrintMe,PrintMe 过 程 输 出 问 候 语 句 的 对 话 框

179 166 Visual Basic 程 序 设 计 教 程 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 在 Form1 窗 体 界 面 中 建 立 一 个 标 签 (Label1) 一 个 文 本 框 (Text1) 和 一 个 命 令 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 9.1: 表 9.1 例 9.1 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 调 用 通 用 过 程 Label1 Caption 请 输 入 姓 名 : Command1 Caption 确 定 Text1 Text 置 空 (3) 编 写 程 序 代 码 : 1 定 义 Sub 过 程 : 通 用 过 程 PrintMe 既 可 以 建 立 在 标 准 模 块 中, 也 可 以 建 立 在 窗 体 模 块 中, 下 面 以 建 立 在 窗 体 模 块 中 为 例, 建 立 PrintMe 操 作 步 骤 如 下 : 在 Visual Basic 的 视 图 菜 单 栏 选 择 代 码 窗 口, 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 通 用, 在 过 程 下 拉 列 表 框 中 选 择 声 明 然 后 输 入 下 列 代 码 : Public Sub PrintMe(name As String) MsgBox (name & ", 你 好! ") 2 调 用 Sub 过 程 : 在 代 码 窗 口 中, 接 着 在 上 述 代 码 的 下 方 再 建 立 按 钮 单 击 事 件 过 程, 输 入 下 面 的 代 码 : Private Sub Command1_Click() Dim a As String a = Text1.Text Call PrintMe (a) ' 在 单 击 事 件 过 程 中 调 用 通 用 过 程 PrintMe (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 比 如 在 Text1 文 本 框 内 输 入 王 菲 后, 用 鼠 标 单 击 确 定 按 钮, 可 看 到 一 个 对 话 框 显 示 王 菲, 你 好! 的 问 候 内 容, 运 行 结 果 如 图 9.4 所 示 图 9.4 例 9.1 运 行 结 果

180 第 9 章 过 程 Function 过 程 Function 过 程 和 Sub 过 程 都 是 能 完 成 某 些 特 定 功 能 的 一 段 程 序 代 码 但 当 我 们 在 调 用 某 个 过 程 后, 需 要 得 到 一 个 返 回 值 时, 可 以 应 用 Function 过 程 来 定 义 这 段 程 序 代 码 在 前 面 的 内 容 中 我 们 曾 用 过 Rnd Int Val InputBox 等 Visual Basic 内 部 函 数, 直 接 调 用 就 可 以, 使 用 非 常 方 便 虽 然 Visual Basic 提 供 了 许 多 种 类 的 内 部 函 数, 但 依 然 不 能 满 足 我 们 各 个 方 面 的 特 定 需 求 那 么, 我 们 就 可 以 通 过 Function 过 程 来 建 立 我 们 自 己 的 函 数 Function 过 程 也 需 要 先 定 义, 后 使 用 Function 过 程 的 定 义 Function 过 程 定 义 的 语 法 为 : [ Public Private Static] Function 函 数 名 ( [ 形 参 列 表 ] )[As 类 型 ] [ 局 部 变 量 和 常 量 声 明 ] [ 语 句 组 ] [ 函 数 名 = 表 达 式 ] [ Exit Function ] 语 句 组 [ 函 数 名 = 表 达 式 ] End Function 说 明 : (1)Function: 是 定 义 一 个 函 数 的 开 始 标 志 (2)Public Private Static 形 参 列 表 及 变 量 和 常 量 声 明 与 前 一 节 Sub 过 程 定 义 相 同 (3) 函 数 名 : 为 必 选 项, 是 Function 过 程 的 名 称, 与 Visual Basic 的 变 量 命 名 规 则 相 同, 并 且 有 函 数 类 型 在 同 一 个 模 块 中 的 Sub 过 程 和 Function 过 程 不 能 有 相 同 的 名 称 (4)As 类 型 : 为 可 选 项, 表 示 函 数 的 类 型, 决 定 函 数 返 回 值 的 数 据 类 型 如 果 缺 省 则 系 统 默 认 为 Variant 类 型 (5) 函 数 名 = 表 达 式 : 为 可 选 项, 给 函 数 名 赋 值 语 句, 表 达 式 的 值 就 是 函 数 的 返 回 值, 在 Function 过 程 内 可 以 有 多 次 给 函 数 名 赋 值 的 语 句, 但 返 回 值 只 有 一 个 ( 即 最 后 一 个 被 执 行 的 给 函 数 名 赋 值 的 表 达 式 的 值 ) 如 果 没 有 函 数 名 赋 值 的 语 句, 则 根 据 该 函 数 的 类 型 不 同 返 回 不 同 的 默 认 值 : 若 是 数 值 类 型 的, 则 返 回 0 ; 若 是 字 符 串 类 型 的, 则 返 回 空 字 符 串 但 通 常 情 况 下, 在 过 程 结 束 语 句 End Function 之 前 都 有 一 条 函 数 名 赋 值 语 句 (6)Exit Function: 是 可 选 项 语 句, 它 使 该 函 数 过 程 执 行 至 此 时 立 即 从 此 处 退 出 执 行 了 Exit Function 语 句 后, 则 其 后 面 的 本 过 程 中 其 他 语 句 将 不 被 执 行 Exit Function 一 般 与 If 语 句 配 合 使 用 (7)End Function: 定 义 Function 过 程 的 结 束 标 志 当 程 序 执 行 至 End Function 语 句 时, 退 出 该 过 程, 并 立 即 返 回 到 调 用 语 句 处, 继 续 执 行 调 用 语 句 后 的 下 一 条 语 句 比 如 我 们 设 计 一 个 Function 过 程 CircleArea 来 计 算 圆 的 面 积 代 码 如 下 : Public Function CircleArea(ByVal radii As Double) As Double

181 168 Visual Basic 程 序 设 计 教 程 Const PI = If radii < 0 Then MsgBox (" 数 据 输 入 有 错!") Exit Function End If CircleArea = PI * radii * radii End Function 设 计 时 应 注 意 : (1) 由 于 计 算 圆 面 积 要 用 到 圆 周 率 π, 计 算 机 的 计 算 精 度 有 限, 我 们 只 能 取 一 个 近 似 值, 这 里 我 们 定 义 一 个 常 量 标 识 符 PI 来 替 换 π,pi 就 代 表 常 量 (2)radii 为 形 参, 代 表 圆 的 半 径, 需 要 对 其 合 法 性 进 行 检 查, 如 果 radii 的 值 是 小 于 零 的 数, 应 进 行 相 应 的 处 理, 比 如 输 出 提 示 信 息 ( 可 用 MsgBox 函 数 或 其 他 方 式 ) 后, 退 出 Function 过 程 调 用 Function 过 程 建 立 好 的 Function 过 程 与 Sub 过 程 一 样, 只 有 通 过 调 用 语 句 的 调 用, 其 程 序 段 才 被 执 行 调 用 自 己 定 义 的 Function 过 程 与 调 用 Visual Basic 内 部 函 数 的 方 法 相 同, 既 可 以 将 函 数 名 及 其 参 数 放 到 表 达 式 中, 也 可 以 单 独 使 用 调 用 Function 过 程 有 两 种 方 式 : 1. 有 返 回 值 调 用 方 式 把 要 调 用 的 函 数 名 及 其 所 需 的 参 数 写 在 表 达 式 中, 函 数 的 返 回 值 参 与 表 达 式 的 运 算 如 下 面 几 个 调 用 CircleArea 的 示 例 : area = CircleArea(r) 其 中 CircleArea(r) 就 是 调 用 CircleArea 函 数, 其 中 r 为 实 际 参 数,r 的 数 据 传 递 给 radii 形 参, 在 CircleArea 函 数 内 计 算 出 结 果, 得 到 返 回 值, 然 后 函 数 的 返 回 值 再 通 过 赋 值 语 句 赋 值 给 变 量 area cubage = 4* r * CircleArea(r) / 3 调 用 CircleArea 函 数, 将 该 函 数 的 返 回 值 参 加 到 表 达 式 运 算 中, 最 终 表 达 式 的 结 果 再 通 过 赋 值 语 句 赋 值 给 变 量 cubage If CircleArea(r)> then MsgBox (" 数 据 太 大 ") 在 If 语 句 的 条 件 表 达 式 中 调 用 CircleArea 函 数, 将 该 函 数 的 返 回 值 参 加 比 较 运 算 2. 无 返 回 值 调 用 方 式 可 以 像 调 用 Sub 过 程 一 样 调 用 Function 过 程 如 下 面 是 两 条 单 独 调 用 CircleArea(r) 函 数 的 语 句 Call CircleArea(r) CircleArea(r) 当 用 这 种 方 法 调 用 函 数 时,Visual Basic 将 放 弃 返 回 值 所 以 当 我 们 需 要 用 到 函 数 的 返 回 值 时, 需 使 用 第 一 种 方 式 来 调 用 函 数 例 9.2 输 入 圆 的 半 径, 计 算 它 的 面 积 和 周 长

182 第 9 章 过 程 169 问 题 分 析 : 建 立 一 个 计 算 面 积 的 函 数 CircleArea, 通 过 窗 体 界 面 文 本 框 输 入 数 据, 单 击 按 钮 事 件 调 用 CircleArea 函 数, 计 算 出 面 积, 然 后 在 界 面 上 输 出 结 果 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 在 Form1 窗 体 界 面 中 建 立 三 个 标 签 (Label1 Label2 Label3) 一 个 文 本 框 (Text1) 和 一 个 命 令 按 钮 (Command1) (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 9.2: 表 9.2 例 9.2 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 置 空 Label1 Caption 请 输 入 圆 的 半 径 : Label2 Caption 置 空 Label3 Caption 置 空 Command1 Caption 计 算 Text1 Text 置 空 (3) 编 写 程 序 代 码 : 1 定 义 Function 过 程 : Function 过 程 CircleArea 既 可 以 建 立 在 标 准 模 块 中 ( 方 法 同 Sub 过 程 的 建 立 ), 也 可 以 建 立 在 窗 体 模 块 中 下 面 以 建 立 在 窗 体 模 块 中 为 例, 建 立 CircleArea 操 作 步 骤 如 下 : 在 Visual Basic 的 视 图 菜 单 栏 选 择 代 码 窗 口, 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 通 用, 在 过 程 下 拉 列 表 框 中 选 择 声 明 然 后 输 入 下 列 代 码 : Const PI = Public Function CircleArea(ByVal radii As Double) As Double If radii <= 0 Then MsgBox (" 数 据 输 入 有 错!") Exit Function End If CircleArea = PI * radii * radii End Function 2 调 用 函 数 : 在 代 码 窗 口 中, 接 着 在 上 述 代 码 的 下 方 再 建 立 按 钮 单 击 事 件 过 程, 输 入 下 面 的 代 码 : Private Sub Command1_Click() Dim r As Double, area As Double, Primeter As Double r = Val(Text1.Text) area = CircleArea(r) ' 调 用 CircleArea 直 接 得 到 圆 的 面 积 Primeter = 2 * PI * r ' 计 算 圆 的 周 长 Label2.Caption = " 圆 的 面 积 是 :" & area

183 170 Visual Basic 程 序 设 计 教 程 Label3.Caption = " 圆 的 周 长 是 :" & Primeter (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 比 如 在 Text1 文 本 框 内 输 入 3 后, 鼠 标 单 击 计 算 按 钮, 可 看 到 以 3 为 半 径 计 算 出 的 圆 的 面 积 和 周 长, 运 行 结 果 如 图 9.5 所 示 图 9.5 例 9.2 运 行 结 果 9.3 过 程 中 的 参 数 传 递 一 般 我 们 在 编 写 Sub 过 程 或 Function 过 程 时, 要 考 虑 该 过 程 需 要 哪 些 输 入 的 数 据, 以 便 对 其 进 行 加 工 处 理 还 要 考 虑 处 理 之 后 哪 些 数 据 需 要 输 出 这 些 需 要 输 入 输 出 的 数 据 就 是 过 程 与 主 调 过 程 ( 调 用 过 程 者, 也 叫 主 程 序 ) 进 行 数 据 通 讯 的 条 件 和 结 果 过 程 与 主 调 过 程 进 行 数 据 通 讯 的 方 式 有 两 种 : 一 种 是 通 过 全 局 变 量, 一 种 是 通 过 参 数 传 递 由 于 全 局 变 量 在 任 何 一 个 过 程 内 都 可 改 变 其 值, 所 以 在 应 用 程 序 中 应 慎 重 使 用 全 局 变 量 更 多 的 是 采 用 参 数 传 递 的 方 式 来 实 现 数 据 的 通 信 参 数 传 递 就 是 在 调 用 一 个 过 程 时, 把 实 际 参 数 传 送 给 形 式 参 数, 然 后 按 实 际 参 数 执 行 调 用 的 过 程 形 式 参 数 与 实 际 参 数 1. 形 式 参 数 在 定 义 Sub 过 程 或 Function 过 程 时, 形 参 列 表 中 的 每 个 变 量 名 就 是 形 式 参 数, 简 称 形 参 在 过 程 被 调 用 之 前, 形 参 未 被 分 配 内 存, 只 是 说 明 形 参 的 类 型 和 在 过 程 内 的 作 用 形 参 列 表 中 各 个 参 数 之 间 用 逗 号 分 隔 形 参 可 以 是 : (1) 除 定 长 字 符 串 之 外 的 合 法 变 量 名 可 以 用 形 如 x$ 或 x As String 之 类 的 变 长 字 符 串 作 为 形 参, 但 不 能 用 形 如 x As String*10 之 类 的 定 长 字 符 串 作 为 形 参 例 如, 例 9.1 中 定 义 的 PrintMe 过 程 的 首 行 是 : Public Sub PrintMe(name As String) 其 中 的 name 就 是 一 个 变 长 字 符 串 类 型 的 形 参

184 第 9 章 过 程 171 而 例 9.2 中 定 义 的 CircleArea 函 数 的 首 行 是 : Public Function CircleArea(ByVal radii As Double) As Double 其 中 的 radii 就 是 一 个 Double 类 型 的 形 参 (2) 后 面 跟 有 左 右 圆 括 号 的 数 组 名 若 括 号 内 有 数 字 则 表 示 数 组 的 维 数 例 如, 定 义 一 个 求 一 组 数 中 最 大 值 的 Sub 过 程 maxnum 的 首 行 可 以 写 为 : Public Sub maxnum( arraya() As Single,n as Integer, max As Single) 其 中 形 参 列 表 中 有 三 个 形 参 : 第 一 个 是 数 组 名 arraya, 第 二 个 是 Integer 类 型 变 量 n, 第 三 个 是 Single 类 型 变 量 max 2. 实 际 参 数 在 调 用 Sub 过 程 或 Function 过 程 时, 在 实 参 列 表 中 列 出 的 常 量 变 量 或 表 达 式 等 就 是 实 际 参 数, 简 称 实 参 多 个 实 参 之 间 用 逗 号 分 隔 实 参 可 以 是 : (1) 常 量 ; (2) 合 法 的 变 量 ; (3) 表 达 式 ; (4) 后 面 跟 有 左 右 圆 括 号 的 数 组 名 如 调 用 maxnum 过 程 可 写 为 : Call maxnum(a(), 10, maxnumber) 其 中 a 是 Single 类 型 数 组 名, 10 是 整 型 常 数, maxnumber 是 Single 类 型 的 变 量 名 注 意 : 定 长 字 符 串 可 以 作 为 实 参 传 送 给 过 程 实 际 参 数 与 形 式 参 数 的 对 应 关 系 在 调 用 一 个 有 参 数 的 过 程 时, 必 须 完 成 形 参 与 实 参 的 结 合, 形 参 列 表 和 实 参 列 表 中 的 对 应 变 量 名 可 以 不 同, 但 实 参 和 形 参 的 个 数 顺 序 和 数 据 类 型 必 须 相 符 假 设 有 过 程 定 义 为 : Sub example(x1 As Double, x2 As Integer, x3() As Double, x4 As String) Sub 调 用 该 过 程 的 程 序 段 可 以 是 : Dim d, a (10 ) As Double Call example(d, 28, a(), "hello" ) 这 样 就 可 完 成 实 参 与 形 参 的 结 合, 形 参 与 实 参 的 对 应 关 系 如 图 9.6 所 示 按 照 一 一 对 应 方 式, 第 一 个 形 参 x1 接 受 第 一 个 实 参 d( 变 量 ) 的 值, 第 二 个 形 参 x2 接 受 第 二 个 实 参 28( 常 量 ), 第 三 个 形 参 x3 接 受 第 三 个 实 参 a( 数 组 ), 第 四 个 形 参 x4 接 受 第 四 个 实 参 "hello"( 常 量 ) 注 意 : 用 不 同 的 实 参 调 用 同 一 个 过 程 会 得 到 不 同 的 结 果, 如 果 实 参 中 含 有 变 量 或 数 组 时, 应 在 调 用 语 句 之 前 对 该 变 量 或 数 组 有 相 应 的 类 型 声 明

185 172 Visual Basic 程 序 设 计 教 程 形 式 参 数 过 程 定 义 : Sub example ( x1 As Double, x2 As Integer, x3() As Double, x4 As String) 过 程 调 用 : Call example( d, 28, a(), "hello" ) 实 际 参 数 图 9.6 形 参 与 实 参 对 应 关 系 按 值 传 递 与 按 地 址 传 递 实 现 调 用 过 程 的 实 参 与 被 调 用 过 程 的 的 形 参 之 间 的 数 据 传 递 有 两 种 方 式 : 按 值 传 递 和 按 地 址 传 递 1. 按 值 传 递 按 值 传 递 就 是 通 过 值 传 送 实 际 参 数, 即 形 参 与 实 参 结 合 时 传 递 的 是 实 参 的 值, 而 不 是 实 参 的 地 址 在 这 种 方 式 下, 如 果 在 过 程 内 形 参 的 值 有 改 变, 实 参 的 值 不 会 跟 着 变, 仍 保 持 原 先 的 内 容 如 果 调 用 某 过 程 时, 实 参 是 常 量 或 表 达 式, 或 者 过 程 定 义 时, 形 参 前 选 用 ByVal 关 键 字, 则 该 参 数 就 是 按 值 传 递 的 例 9.3 按 值 传 递 方 式 例 子 建 立 一 个 Form1 窗 体, 在 代 码 窗 口 中 输 入 下 列 一 段 程 序 : ' 定 义 一 个 按 值 传 递 参 数 的 过 程 byvalue Public Sub byvalue(byval x As Integer, ByVal y As Integer) Print " 过 程 内 参 数 x,y 改 变 前 的 值 为 :" & x & ", " & y x = x * 10 y = y + 10 Print " 过 程 内 参 数 x,y 改 变 后 的 值 为 :" & x & ", " & y ' 在 Form_Load 事 件 中 调 用 byvalue 过 程 Private Sub Form_Load() Dim a As Integer, b As Integer a = 6 b = 8 Show Print " 主 程 序 调 用 过 程 前 的 a,b 值 为 :" & a & ", " & b Call byvalue(a, b) Print " 主 程 序 调 用 过 程 后 的 a,b 值 为 :" & a & ", " & b 在 这 个 程 序 中, 当 byvalue 过 程 在 Form_Load 事 件 中 被 调 用 时, 形 参 才 被 分 配 临 时 内 存

186 第 9 章 过 程 173 单 元 x 和 y, 然 后 把 实 参 a 和 b 所 在 存 储 单 元 的 值 6 和 8 传 递 给 x 和 y, 在 过 程 内 x 和 y 的 存 储 单 元 的 值 通 过 赋 值 运 算 被 改 变 为 60 和 18 调 用 结 束 时, 实 参 a 和 b 所 在 存 储 单 元 的 值 仍 保 持 不 变 可 见 在 按 值 传 递 方 式 下, 参 数 的 传 递 是 单 方 向 的 参 数 传 递 过 程 如 图 9.7 所 示 a 6 b 8 a 6 b 8 x 6 y 8 x 60 y 18 (a) 参 数 结 合 时 程 序 运 行 结 果 如 图 9.8 所 示 图 9.7 例 9.3 参 数 传 递 过 程 (b) 参 数 改 变 时 图 9.8 例 9.3 运 行 结 果 2. 按 地 址 传 递 按 地 址 传 递 也 叫 做 引 用, 它 通 过 地 址 传 送 实 际 参 数, 即 形 参 与 实 参 结 合 时 传 递 的 是 实 参 的 地 址 在 这 种 方 式 下, 形 参 与 实 参 的 地 址 是 相 同 的 如 果 在 过 程 内 有 修 改 形 参 值 的 语 句 ( 赋 值 ), 则 实 参 的 值 也 会 跟 着 变 化 过 程 定 义 时, 形 参 前 选 用 ByRef 关 键 字, 则 该 参 数 就 是 按 地 址 传 递 形 参 前 没 有 ByVal 或 ByRef 选 项 时, 默 认 按 地 址 传 递 例 9.4 按 地 址 传 递 方 式 例 子 建 立 一 个 Form1 窗 体, 在 代 码 窗 口 中 输 入 下 列 一 段 程 序 : ' 定 义 一 个 按 地 址 传 递 参 数 的 过 程 byaddress Public Sub byaddress( a As Integer, b As Integer) Print " 过 程 内 参 数 x,y 改 变 前 的 值 为 :" & a & ", " & b a = a * 10 b = b + 10 Print " 过 程 内 参 数 x,y 改 变 后 的 值 为 :" & a & ", " & b ' 在 Form_Load 事 件 中 调 用 byaddress 过 程 Private Sub Form_Load() Dim a As Integer, b As Integer a = 6 b = 8 Show Print " 主 程 序 调 用 过 程 前 的 a,b 值 为 :" & a & ", " & b Call byaddress(a, b)

187 174 Visual Basic 程 序 设 计 教 程 Print " 主 程 序 调 用 过 程 后 的 a,b 值 为 :" & a & ", " & b 在 这 个 程 序 中, 当 byaddress 过 程 在 Form_Load 事 件 中 被 调 用 时, 把 实 参 a 和 b 所 在 存 储 单 元 的 地 址 传 递 给 形 参 x 和 y, 即 x 与 a 和 y 与 b 分 别 共 享 同 一 段 内 存 单 元 在 过 程 内 x 和 y 的 存 储 单 元 的 数 据 通 过 赋 值 运 算 被 改 变 为 60 和 18, 调 用 结 束 时, 实 参 a 和 b 所 在 存 储 单 元 的 值 已 被 改 变 可 见 在 按 地 址 传 递 方 式 下, 参 数 的 传 递 是 双 方 向 的 参 数 传 递 过 程 如 图 9.9 所 示 a x b 6 y 8 a x b 60 y 18 (a) 参 数 结 合 时 程 序 运 行 结 果 如 图 9.10 所 示 图 9.9 例 9.4 参 数 传 递 过 程 (b) 参 数 改 变 时 图 9.10 例 9.4 运 行 结 果 一 般 来 说, 传 地 址 比 传 值 更 能 节 省 内 存 和 提 高 效 率 因 为 在 定 义 过 程 时, 过 程 中 的 形 参 只 是 一 个 地 址, 系 统 不 必 为 保 存 它 的 值 而 分 配 内 存 单 元, 只 简 单 地 记 住 它 是 一 个 地 址 使 用 地 址 可 以 使 Visual Basic 进 行 更 有 效 的 操 作, 特 别 是 对 字 符 串 类 型 的 参 数 比 如 有 下 面 一 个 过 程 : Sub Inside( x As String ) Print " (" & x & ")" 这 个 过 程 就 是 通 过 参 数 传 递 一 个 字 符 串, 把 这 个 字 符 串 与 一 对 括 号 一 起 打 印 出 来 参 数 采 用 按 地 址 传 递 方 式, 在 调 用 该 过 程 时, 无 论 实 参 所 含 字 符 串 由 多 少 个 字 符 组 成, 系 统 不 需 再 为 此 分 配 存 储 单 元, 只 把 实 参 首 地 址 传 递 给 形 参 x, 即 可 输 出 实 参 存 储 单 元 的 所 有 字 符 如 果 参 数 采 用 按 值 传 递 方 式, 即 改 为 : Sub Inside(ByVal x As String ) Print " (" & x & ")" 则 每 次 调 用 该 过 程 时, 都 要 为 每 一 个 字 符 串 分 配 内 存 空 间 如 果 实 参 所 含 字 符 串 由 成 千 上 万 个 字 符 组 成, 系 统 需 再 为 形 参 分 配 与 实 参 同 等 大 小 的 存 储 空 间, 可 见 其 多 占 内 存 且 效 率 较 低 在 按 地 址 传 递 方 式 中, 形 参 不 是 一 个 真 正 的 局 部 变 量, 当 参 数 在 过 程 内 被 改 变 内 容 时, 有 可 能 对 主 调 过 程 的 执 行 产 生 不 必 要 的 干 扰 而 在 按 值 传 递 方 式 中, 形 参 是 一 个 真 正 的 局 部 变 量, 无 论 过 程 内 参 数 如 何 改 变, 都 不 会 对 主 调 过 程 的 执 行 产 生 干 扰 编 写 过 程 时, 究 竟 参 数 在 什 么 时 候 用 传 地 址 方 式, 什 么 时 候 用 传 值 方 式, 并 没 有 硬 性 规

188 第 9 章 过 程 175 定, 下 面 几 条 可 供 参 考 : (1) 对 于 Byte Boolean Integer Long Single Double Date Currency 或 Variant 类 型 的 变 量 参 数, 如 果 不 希 望 过 程 修 改 实 参 的 值, 则 可 用 传 值 方 式 (2) 对 于 String 类 型 的 变 量 参 数, 为 了 提 高 效 率, 可 以 采 用 按 地 址 传 递 方 式 (3) 任 意 类 型 的 数 组 参 数 用 户 定 义 类 型 ( 记 录 ) 和 对 象 类 型 的 参 数 必 须 采 用 按 地 址 传 递 方 式 数 组 参 数 的 传 递 在 定 义 过 程 时, 若 形 参 为 数 组, 则 调 用 该 过 程 时, 实 参 也 必 须 是 数 组, 并 且 数 组 的 数 据 类 型 必 须 相 同 传 递 方 式 只 能 按 地 址 传 递, 形 参 与 实 参 共 享 同 一 段 内 存 单 元 在 被 调 用 的 过 程 内 不 能 用 Dim 语 句 对 形 参 数 组 声 明, 否 则 会 产 生 重 复 声 明 的 编 译 错 误 但 是 在 使 用 动 态 数 组 时, 可 以 用 Redim 语 句 改 变 形 参 数 组 的 维 数 及 数 组 的 大 小 当 过 程 调 用 结 束 时, 对 应 的 实 参 数 组 的 维 数 及 大 小 也 随 之 发 生 变 化 例 9.5 建 立 一 个 输 出 一 组 数 的 Sub 过 程, 然 后 在 窗 体 上 输 出 两 组 数 据 问 题 分 析 : 定 义 一 个 Sub 过 程 PrintArray, 在 参 数 列 表 中 需 要 一 个 数 组 参 数, 在 过 程 内 利 用 For Each Next 语 句 访 问 数 组 的 每 一 个 元 素 并 输 出 其 内 容 在 窗 体 中 两 次 调 用 该 过 程 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 只 需 建 立 一 个 Form1 窗 体 即 可, 适 当 调 整 其 大 小 (2) 设 置 界 面 中 对 象 的 属 性 : 将 Form1 的 Caption 属 性 设 置 为 数 组 参 数 传 递 (3) 编 写 程 序 代 码 : 以 在 窗 体 模 块 中 建 立 PrintArray 过 程 为 例, 从 视 图 菜 单 栏 选 择 代 码 窗 口, 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 ( 通 用 ), 在 事 件 程 序 下 拉 列 表 框 中 选 择 ( 声 明 ), 输 入 下 面 一 段 代 码 : Option Base 1 ' 声 明 数 组 下 界 为 1 ' 定 义 Sub 过 程 PrintArray Public Sub PrintArray(arrayA() As Integer) Dim x As Variant For Each x In arraya Print x & " "; ' 输 出 数 组 每 个 元 素 Next i ' 主 程 序 部 分 两 次 调 用 PrintArray 过 程 Private Sub Form_Load() Dim a(4) As Integer Dim b(6) As Integer Show

189 176 Visual Basic 程 序 设 计 教 程 a(1) = 2: a(2) = 4: a(3) = 6: a(4) = 8 ' 初 始 化 a 数 组 b(1) = 3: b(2) = 6: b(3) = 9: b(4) = 12: b(5) = 15: b(6) = 18 ' 初 始 化 b 数 组 Print " 数 组 A 的 内 容 是 :" Call PrintArray(a()) ' 第 一 次 调 用 PrintArray 过 程 Print Print " 数 组 B 的 内 容 是 :" Call PrintArray(b()) ' 第 二 次 调 用 PrintArray 过 程 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 程 序 运 行 结 果 如 图 9.11 所 示 图 9.11 例 9.5 运 行 结 果 在 定 义 的 Sub 过 程 PrintArray 中 含 有 一 个 形 参 数 组 arraya, 在 过 程 体 中 用 For Each x Next 循 环 语 句 对 数 组 元 素 进 行 处 理, 它 所 执 行 的 次 数 由 实 参 数 组 中 元 素 的 个 数 决 定, 所 以, 在 第 一 次 调 用 PrintArray 过 程 时, 实 参 数 组 a 与 形 参 数 组 arraya 结 合,arrayA 数 组 与 a 数 组 共 享 同 一 段 内 存 单 元 由 于 实 参 数 组 a 含 四 个 元 素, 则 循 环 体 (Print x) 一 共 执 行 四 次 而 在 第 二 次 调 用 PrintArray 过 程 时, 实 参 数 组 b 与 形 参 数 组 arraya 结 合,arrayA 数 组 重 新 与 b 数 组 共 享 同 一 段 内 存 单 元 由 于 实 参 数 组 b 含 六 个 元 素, 则 循 环 体 一 共 执 行 六 次 局 部 变 量 x 每 循 环 一 次, 都 代 表 实 参 数 组 中 的 一 个 元 素 的 值 要 求 x 必 须 为 Variant 类 型 例 9.6 建 立 一 个 求 一 组 数 最 大 值 的 Function 过 程 和 一 个 产 生 n 个 随 机 数 的 Sub 过 程, 由 键 盘 输 入 n 值 后, 自 动 产 生 n 个 随 机 数, 然 后 输 出 这 些 数 中 的 最 大 值 问 题 分 析 : 由 于 程 序 在 运 行 前, 不 能 确 定 产 生 多 少 个 随 机 数, 因 此 需 要 一 个 动 态 数 组 a, 在 窗 体 界 面 中, 通 过 一 个 文 本 框 输 入 一 个 数 值 n, 用 n 值 决 定 动 态 数 组 a 的 大 小 两 个 过 程 为 求 最 大 值 的 过 程 maxnum 和 产 生 n 个 随 机 数 的 过 程 RndArray, 它 们 都 需 要 一 个 数 组 参 数 来 传 递 一 组 数 据 数 组 的 大 小 可 再 通 过 一 个 整 型 参 数 传 递 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 在 Form1 窗 体 界 面 中 建 立 三 个 标 签 (Label1 Label2 Label3) 一 个 文 本 框 (Text1) 和 一 个 命 令 按 钮 Command1 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 9.3 表 9.3 例 9.6 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption n 个 数 的 最 大 值 Label1 Caption 输 入 n 值 : Command1 Caption 求 最 大 值 Text1 Text 置 空

190 第 9 章 过 程 177 (3) 编 写 程 序 代 码 : 编 写 代 码 过 程 如 下 ( 以 在 窗 体 模 块 中 建 立 Sub 过 程 和 Function 过 程 为 例 ): 1 从 视 图 菜 单 栏 选 择 代 码 窗 口, 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 ( 通 用 ), 在 事 件 程 序 下 拉 列 表 框 中 选 择 ( 声 明 ), 输 入 下 面 三 行 代 码 : Option Base 1 ' 规 定 数 组 默 认 下 界 值 为 1 Dim a() As Integer ' 在 标 准 模 块 中 定 义 a 为 动 态 数 组 Dim n As Integer ' 全 局 变 量 n 用 于 重 定 义 数 组 a 的 大 小 2 在 上 面 三 行 代 码 下 接 着 编 写 产 生 n 个 随 机 数 的 Sub 过 程 RndArray 程 序 代 码 : ' RndArray 为 产 生 n 个 随 机 数 的 Sub 过 程 Public Sub RndArray(arrayA() As Integer, n As Integer) Dim i As Integer For i = 1 To n arraya(i) = Int(100 * Rnd) + 1 Next i 3 再 接 着 编 写 求 最 大 值 的 Function 过 程 maxnum 程 序 代 码 : ' maxnum 为 求 最 大 值 的 Function 过 程 Public Function maxnum(arrraya() As Integer, n As Integer) As Integer Dim i As Integer, max As Integer max = arrraya(1) For i = 2 To n If max < arrraya(i) Then max = arrraya(i) Next i maxnum = max End Function 4 当 文 本 框 中 输 入 数 字 时, 调 用 产 生 n 个 数 的 随 机 数 的 过 程, 所 以 可 编 写 Text1_Change() 事 件 代 码, 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 Text1, 在 事 件 程 序 下 拉 列 表 框 中 选 择 (Change), 输 入 下 面 的 Text1_Change 事 件 代 码 : Private Sub Text1_Change() Dim i As Integer n = Val(Text1.Text) ReDim a(n) ' 重 定 义 动 态 数 组 a 含 n 个 元 素 Label2.Caption = n & " 个 随 机 数 是 :" ' 置 标 签 Label2 的 显 示 信 息 Call RndArray(a(), n) ' 调 用 产 生 n 个 随 机 数 的 过 程 RndArray For i = 1 To n Label2.Caption = Label2.Caption & a(i) & " " ' 输 出 n 个 数 Next i 5 在 运 行 时, 当 文 本 框 中 输 入 数 字 后, 用 鼠 标 点 击 Command1 时, 调 用 求 最 大 值 过 程

191 178 Visual Basic 程 序 设 计 教 程 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 Command1, 在 事 件 程 序 下 拉 列 表 框 中 选 择 (Click), 输 入 下 面 的 Command1_Click 事 件 代 码 : Private Sub Command1_Click() Dim i As Integer Label3.Caption = " 其 中 最 大 值 是 :" & maxnum(a(), n) ' 输 出 最 大 值 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 比 如 在 Text1 文 本 框 内 输 入 10 后, 可 看 到 在 Label2 位 置 处 列 出 产 生 的 10 个 随 机 数 再 用 鼠 标 单 击 求 最 大 值 按 钮, 就 可 看 到 在 Label3 位 置 处 显 示 出 10 个 数 中 最 大 的 一 个 数, 运 行 结 果 如 图 9.12 所 示 图 9.12 例 9.6 运 行 结 果 9.4 可 选 参 数 与 可 变 参 数 Visual Basic 提 供 了 非 常 灵 活 和 安 全 的 参 数 传 送 方 式, 允 许 使 用 可 选 参 数 和 可 变 参 数 在 调 用 一 个 过 程 时, 可 以 向 过 程 传 送 可 选 的 参 数 或 者 任 意 数 量 的 参 数 1. 可 选 参 数 可 选 参 数 通 过 Optional 来 定 义, 一 般 格 式 为 : Sub 过 程 名 ( Optional 参 数 ) 在 过 程 定 义 时, 如 果 参 数 表 中 使 用 Optional, 则 其 后 面 所 列 的 参 数 就 是 可 选 的 在 调 用 过 程 时, 可 选 参 数 位 置, 可 以 有 实 参 对 应, 也 可 没 有 实 参 对 应 在 过 程 体 内 可 以 通 过 IsMissing 命 令 测 试 调 用 时 是 否 传 送 了 可 选 参 数 例 9.7 建 立 一 个 能 求 两 个 或 三 个 数 的 平 方 和 的 Sub 过 程, 然 后 分 别 用 两 个 数 和 三 个 数 调 用 该 过 程 问 题 分 析 : 先 定 义 一 个 Sub 过 程 AddSqr, 因 为 两 个 数 或 三 个 数 都 可 调 用 该 过 程, 所 以 在 参 数 列 表 中 需 要 三 个 参 数, 其 中 前 两 个 与 普 通 过 程 中 书 写 格 式 相 同, 最 后 一 个 参 数 必 须 是 可 选 参 数, 其 前 面 用 Optional, 类 型 不 用 指 定 ( 缺 省 为 Variant 类 型 ) 然 后 在 窗 体 中 两 次 调 用 该 过 程 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 只 需 建 立 一 个 Form1 窗 体 即 可, 适 当 调 整 其 大 小 (2) 设 置 界 面 中 对 象 的 属 性 : 将 Form1 的 Caption 属 性 设 置 为 可 选 参 数

192 第 9 章 过 程 179 (3) 编 写 程 序 代 码 : 以 在 窗 体 模 块 中 建 立 AddSqr 过 程 为 例, 从 视 图 菜 单 栏 选 择 代 码 窗 口, 在 代 码 窗 口 中 的 对 象 下 拉 列 表 框 中 选 ( 通 用 ), 在 事 件 程 序 下 拉 列 表 框 中 选 择 ( 声 明 ), 输 入 下 面 一 段 代 码 : ' 定 义 含 可 选 参 数 的 Sub 过 程 AddSqr, 功 能 是 计 算 两 个 数 或 三 个 数 的 平 方 和 Public Sub AddSqr(x1 As Integer, x2 As Integer, Optional x3) Dim sum As Integer sum = x1 * x1 + x2 * x2 ' 先 计 算 第 一 个 和 第 二 个 参 数 If Not IsMissing(x3) Then ' 判 断 如 果 有 第 三 个 参 数 则 继 续 计 算 sum = sum + x3 * x3 Print x1 & "," & x2 & "," & x3 & " 的 平 方 和 为 :" & sum Else Print x1 & "," & x2 & " 的 平 方 和 为 :" & sum End If ' 主 程 序 部 分 两 次 调 用 AddSqr 过 程 Private Sub Form_Load() Show Call AddSqr(3, 5) ' 第 一 次 用 Call 方 式 调 用 AddSqr 时, 传 递 了 两 个 参 数 Print AddSqr 2, 4, 6 ' 第 二 次 直 接 用 过 程 名 加 参 数 的 方 式 调 用 时, 传 递 了 三 个 参 数 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 程 序 运 行 结 果 如 图 9.13 所 示 图 9.13 例 9.7 运 行 结 果 注 意 : 可 选 参 数 必 须 放 在 参 数 列 表 的 最 后, 并 且 必 须 是 Variant 类 型 2. 可 变 参 数 可 变 参 数 通 过 ParamArray 命 令 来 定 义, 一 般 格 式 为 : Sub 过 程 名 (ParamArray 数 组 名 ) 这 里 的 数 组 名 为 形 参, 只 有 名 字 和 括 号, 没 有 上 下 界 类 型 缺 省 为 Variant 调 用 过 程 时, 实 参 可 以 有 任 意 多 个 在 过 程 体 内 可 通 过 For Each Next 语 句 来 访 问 每 个 参 数 例 9.8 建 立 一 个 计 算 任 意 多 个 数 的 平 方 和 的 Sub 过 程, 然 后 分 别 用 3 个 4 个 5 个 数 多 次 调 用 该 过 程 问 题 分 析 : 先 定 义 一 个 Sub 过 程 AddSqrAll, 在 参 数 列 表 中 只 需 要 一 个 可 变 参 数 然 后 在 窗 体 中 用 多 个 数 调 用 该 过 程

193 180 Visual Basic 程 序 设 计 教 程 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 只 需 建 立 一 个 Form1 窗 体 即 可, 适 当 调 整 其 大 小 (2) 设 置 界 面 中 对 象 的 属 性 : 将 Form1 的 Caption 属 性 设 置 为 可 变 参 数 (3) 编 写 程 序 代 码 : 以 在 窗 体 模 块 中 建 立 AddSqrAll 过 程 为 例, 在 代 码 窗 口 中 输 入 下 列 一 段 代 码 : ' 定 义 含 可 变 参 数 的 Sub 过 程 AddSqrAll, 功 能 是 计 算 任 意 多 个 数 的 平 方 和 Public Sub AddSqrAll(ParamArray numbers()) Dim sum As Integer For Each x In numbers sum = sum + x * x ' 先 计 算 第 一 个 和 第 二 个 参 数 Print x & ","; Next x Print " 的 平 方 和 为 :" & sum ' 主 程 序 调 用 部 分 Private Sub Form_Load() Show Call AddSqrAll(1, 3, 5) ' 第 一 次 调 用 AddSqrAll, 传 递 了 三 个 参 数 Print AddSqrAll 1, 2, 3, 4 ' 第 二 次 调 用 AddSqrAll, 传 递 了 四 个 参 数 Print AddSqrAll 2, 4, 6, 8, 10 ' 第 三 次 调 用 AddSqrAll, 传 递 了 五 个 参 数 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序 程 序 运 行 结 果 如 图 9.14 所 示 图 9.14 例 9.8 运 行 结 果 由 于 可 变 参 数 过 程 中 的 参 数 是 Variant 类 型, 因 此 可 以 把 任 何 类 型 的 实 参 传 送 给 该 过 程 9.5 对 象 参 数 传 统 的 面 向 过 程 的 程 序 设 计 语 言, 一 般 使 用 变 量 作 为 过 程 的 形 式 参 数, 而 在 Visual Basic 中 作 为 形 参 的 不 仅 有 变 量 数 组, 还 有 对 象 当 对 象 作 为 过 程 的 参 数 时 又 分 为 窗 体 参 数 和 控

194 第 9 章 过 程 181 件 参 数 在 调 用 含 有 对 象 的 过 程 时, 对 象 只 能 用 传 地 址 方 式 传 送 窗 体 参 数 在 定 义 过 程 时, 若 是 形 参 列 表 中 出 现 形 参 名 As Form, 则 此 形 参 名 为 窗 体 参 数, 在 调 用 含 窗 体 参 数 的 过 程 时, 与 之 对 应 的 实 参 必 须 为 某 个 窗 体 例 9.9 定 义 一 个 能 设 置 任 意 一 个 窗 体 的 尺 寸 大 小 的 过 程, 然 后 建 立 多 个 窗 体 调 用 此 过 程 进 行 窗 体 设 置 问 题 分 析 : 先 定 义 一 个 Sub 过 程 FormSet, 因 为 既 要 传 递 窗 体 参 数, 又 要 传 递 窗 口 尺 寸 大 小, 所 以 我 们 至 少 要 设 置 三 个 参 数 一 个 是 窗 体 参 数, 另 两 个 可 以 是 用 来 传 递 尺 寸 的 宽 和 高 的 整 型 变 量 参 数 然 后 建 立 两 个 窗 体 Form1 和 Form2, 分 别 在 两 个 窗 体 的 单 击 事 件 中 调 用 FormSet 过 程, 对 Form1 和 Form2 进 行 设 置 由 于 Visual Basic 应 用 程 序 在 运 行 时, 当 前 活 动 窗 体 只 能 有 一 个, 即 Form1 和 Form2 需 要 交 替 出 现, 所 以 还 需 编 写 窗 体 的 双 击 事 件, 用 于 显 示 另 一 个 窗 体 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 先 建 立 Form1 窗 体, 然 后 在 工 程 菜 单 选 择 添 加 窗 体 对 话 框, 选 择 窗 体 ( 一 般 为 默 认 已 选 中 状 态 ), 点 击 打 开 按 钮 后, 就 又 建 立 了 Form2 窗 体 如 9.15 (a) (b) 图 9.15 建 立 两 个 窗 体 (2) 设 置 界 面 中 各 对 象 的 属 性 : 适 当 调 整 Form1 和 Form2 窗 体 的 边 框 尺 寸 到 适 当 大 小 (3) 编 写 程 序 代 码 : 1 建 立 模 块 级 通 用 过 程 在 工 程 菜 单 中 选 择 添 加 模 块 对 话 框, 选 择 新 建 选 项 卡, 选 中 模 块 图 标, 单 击 打 开 按 钮, 则 打 开 了 模 块 代 码 窗 口 然 后 输 入 下 列 程 序 代 码 : ' 定 义 含 窗 体 参 数 的 通 用 过 程 FormSet, 用 于 设 置 窗 体 标 题 尺 寸 及 背 景 色 Public Sub FormSet(f As Form, h As Integer, w As Integer) f.caption = " 设 置 " & f.name ' 对 窗 体 标 题 栏 进 行 设 置 f.top = 0 ' 对 窗 体 尺 寸 进 行 设 置 f.left = 0 f.height = h f.width = w

195 182 Visual Basic 程 序 设 计 教 程 f.backcolor = "111111" ' 对 窗 体 背 景 色 进 行 设 置 2 在 工 程 资 源 管 理 器 内 选 中 Form1 窗 体, 然 后 在 视 图 菜 单 中 选 择 代 码 窗 口, 在 打 开 的 Form1 窗 体 模 块 代 码 窗 口 内 输 入 Form1 窗 体 的 Form_Click 事 件 和 Form_DblClick 事 件 的 代 码 : ' 在 Form1 窗 体 的 单 击 事 件 中 调 用 FormSet 通 用 过 程 Private Sub Form_Click() Call FormSet(Form1, 800, 2200) ' 调 用 FormSet 过 程, 实 参 为 Form1 窗 体 ' 在 Form1 内 双 击 时, 隐 藏 Form1 窗 体, 显 示 Form2 窗 体 Private Sub Form_DblClick() Form1.Hide Form2.Show 3 在 工 程 资 源 管 理 器 内 选 中 Form2 窗 体, 然 后 在 视 图 菜 单 中 选 择 代 码 窗 口, 在 打 开 的 Form2 窗 体 模 块 代 码 窗 口 内 输 入 Form2 窗 体 的 Form_Click 事 件 和 Form_DblClick 事 件 的 代 码 : ' 在 Form2 窗 体 的 单 击 事 件 中 调 用 FormSet 通 用 过 程 Private Sub Form_Click() Call FormSet(Form2, 1200, 2200) ' 调 用 FormSet 过 程, 实 参 为 Form2 窗 体 ' 在 Form2 内 双 击 时, 隐 藏 Form2 窗 体, 显 示 Form1 窗 体 Private Sub Form_DblClick() Form2.Hide Form1.Show (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 运 行 结 果 如 图 9.16 所 示 首 先 出 现 的 是 原 始 尺 寸 的 Fom1 窗 体, 如 图 (a) 鼠 标 在 Fom1 窗 体 内 单 击 时, 执 行 调 用 FormSet 过 程, 对 Form1 窗 体 进 行 设 置, 出 现 图 (b) 在 Form1 窗 体 内 双 击 时, 隐 藏 Form1 窗 体, 显 示 Form2 窗 体, 出 现 原 始 尺 寸 的 Form2 窗 体, 如 图 (c) 鼠 标 在 Form2 窗 体 内 单 击 时, 执 行 调 用 FormSet 过 程, 对 Form2 窗 体 进 行 设 置, 出 现 图 (d) (a) (b) (c) (d) 图 9.16 例 9.9 运 行 结 果

196 第 9 章 过 程 控 件 参 数 在 定 义 过 程 时, 若 是 形 参 列 表 中 出 现 形 参 名 As Control, 则 此 形 参 名 为 控 件 参 数, 控 件 参 数 比 窗 体 参 数 要 复 杂, 因 为 具 体 的 控 件 有 许 多 种 类, 所 以 在 调 用 含 控 件 参 数 的 过 程 时, 与 之 对 应 的 实 参 可 以 是 各 种 控 件 但 是 在 编 写 含 控 件 参 数 的 通 用 过 程 时, 因 不 同 种 类 的 控 件 属 性 不 完 全 相 同, 应 注 意 区 分 判 别 例 9.10 建 立 一 个 可 以 设 置 任 意 一 种 控 件 的 字 体 及 字 号 的 过 程, 然 后 建 立 多 个 控 件 调 用 此 过 程 进 行 设 置 问 题 分 析 : 先 定 义 一 个 Sub 过 程 ControlSet, 因 为 既 要 传 递 控 件 参 数, 又 要 传 递 字 体 种 类 及 字 号, 所 以 我 们 需 设 置 三 个 参 数, 一 个 是 控 件 参 数, 一 个 是 用 来 传 递 字 体 种 类 的 字 符 串 类 型 的 变 量 参 数, 最 后 一 个 是 用 来 传 递 字 号 大 小 的 整 型 的 变 量 参 数 然 后 建 立 一 个 窗 体 Form1, 在 Form1 窗 体 上 添 加 各 种 控 件, 如 Text Label 和 Command 等, 分 别 在 各 个 控 件 的 单 击 事 件 中 调 用 ControlSet 过 程 对 各 自 的 控 件 进 行 设 置 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 先 建 立 Form1 窗 体, 在 Form1 中 添 加 Text1 Label1 和 Command1 三 种 控 件 (2) 设 置 界 面 中 各 对 象 的 属 性 如 表 9.4 表 9.4 例 9.10 对 象 属 性 设 置 对 象 名 称 属 性 名 称 设 置 值 Form1 Caption 控 件 参 数 示 例 Label1 Caption 标 签 控 件 Command1 Caption 按 钮 控 件 Text1 Text 文 本 控 件 (3) 编 写 程 序 代 码 : 1 建 立 模 块 级 通 用 过 程 在 工 程 菜 单 中 选 择 添 加 模 块 对 话 框, 选 择 新 建 选 项 卡, 选 中 模 块 图 标, 单 击 打 开 按 钮, 则 打 开 了 模 块 代 码 窗 口 然 后 输 入 下 列 程 序 代 码 : ' 定 义 含 控 件 参 数 的 通 用 Sub 过 程 ControlSet, 用 于 设 置 控 件 的 字 体 和 字 号 Public Sub ControlSet(C As Control, name As String, size As Integer) C.Font = name ' 设 置 控 件 的 字 体 C.FontSize = size ' 设 置 控 件 的 字 号 2 在 工 程 资 源 管 理 器 内 先 选 中 Form1 窗 体, 然 后 在 视 图 菜 单 中 选 择 代 码 窗 口, 在 打 开 的 Form1 窗 体 模 块 代 码 窗 口 内 输 入 下 列 程 序 代 码 : ' 在 命 令 按 钮 控 件 的 单 击 事 件 内 调 用 通 用 Sub 过 程 ControlSet Private Sub Command1_Click ( ) Call ControlSet ( Command1, " 隶 书 ", 15 )

197 184 Visual Basic 程 序 设 计 教 程 ' 在 标 签 控 件 的 单 击 事 件 内 调 用 通 用 Sub 过 程 ControlSet Private Sub Label1_Click ( ) Call ControlSet ( Label1, " 楷 体 _GB2312", 12 ) ' 在 文 本 控 件 的 单 击 事 件 内 调 用 通 用 Sub 过 程 ControlSet Private Sub Text1_Click ( ) Call ControlSet (Text1, " 黑 体 ", 14 ) (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 运 行 结 果 如 图 9.17 所 示 首 先 出 现 的 是 Form1 窗 体 三 种 控 件 的 原 始 状 态, 如 图 (a) 然 后 分 别 点 击 各 个 控 件 可 看 到 不 同 的 效 果, 图 (b) 是 三 种 控 件 都 单 击 过 后 的 结 果 (a) (b) 图 9.17 例 9.10 运 行 结 果 在 定 义 过 程 时, 控 件 参 数 在 类 型 上 也 可 以 直 接 用 某 种 具 体 的 控 件 类 型, 比 如 La As Label, 表 示 La 为 标 签 类 型 的 控 件 参 数 调 用 该 过 程 时, 实 参 必 须 为 某 个 标 签 控 件 9.6 递 归 过 程 Visual Basic 允 许 使 用 递 归 过 程 递 归 过 程 是 指, 在 过 程 定 义 时, 过 程 体 内 出 现 直 接 或 间 接 调 用 自 身 的 过 程 递 归 是 一 项 非 常 有 用 的 程 序 设 计 技 术, 许 多 数 学 模 型 要 用 到 递 归 技 术 在 幂 指 数 运 算 阶 乘 运 算 级 数 运 算 等 方 面 用 递 归 方 法 比 用 其 他 方 法 更 易 实 现, 且 可 读 性 强 递 归 分 两 种 类 型 : 间 接 递 归 和 直 接 递 归 1. 间 接 递 归 间 接 递 归 就 是 在 过 程 体 内 出 现 间 接 调 用 自 身 的 过 程 如 下 面 定 义 的 test1 和 test2 过 程 Function Test1(n As Integer) x = Test2(m) End Function Function Test2(m As Integer) y = Test1(n)

198 第 9 章 过 程 185 End Function 在 Test1 过 程 中 出 现 调 用 Test2 过 程 的 语 句, 而 在 Test2 过 程 中 又 出 现 调 用 Test1 过 程 的 语 句 所 以 Test1 和 Test2 过 程 都 是 递 归 过 程 2. 直 接 递 归 直 接 递 归 就 是 在 过 程 体 内 出 现 直 接 调 用 自 身 的 过 程 如 下 面 定 义 的 Direct 过 程 Function Direct(n As Integer) S = Direct(m) End Function 无 论 使 用 直 接 递 归 还 是 间 接 递 归 都 必 须 注 意, 自 身 调 用 不 能 无 终 止 地 进 行, 即 要 有 条 件 地 有 限 次 地 自 身 调 用 一 般 自 身 调 用 的 语 句 通 常 与 If 语 句 一 起 配 合 使 用 在 编 写 递 归 程 序 时 重 点 要 考 虑 两 个 方 面 : 一 是 建 立 递 推 公 式, 二 是 注 意 递 归 结 束 条 件 例 9.11 建 立 一 个 计 算 n! 的 递 归 过 程, 随 意 输 入 一 个 数 进 行 计 算 问 题 分 析 : 先 分 析 计 算 n! 的 递 推 公 式 由 数 学 知 识 可 知 : 负 数 没 有 阶 乘,0!=1, 正 整 数 n! 为 1*2*3* *(n-1)* n, 即 n!= n *(n-1)* *3*2*1 再 进 一 步 用 递 推 方 法 表 示 : n!= n*(n-1)! (n-1)!= (n-1)*(n-2)! 2!=2*1! 1!=1 由 上 面 分 析 可 总 结 出 递 推 公 式 为 : 1 (n = 0, 1) n! = n * ( n 1 )! ( n > 1 ) 递 归 结 束 条 件 是 当 n=1 时,n!=1 根 据 上 面 的 递 推 公 式 及 递 归 结 束 条 件 建 立 一 个 递 归 Function 过 程 Factorial, 通 过 输 入 框 输 入 一 个 数 后 调 用 factorial 过 程 并 输 出 结 果 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 只 需 建 立 一 个 Form1 窗 体, 用 于 输 出 结 果 (2) 设 置 界 面 对 象 的 属 性 : 把 Form1 的 Caption 设 置 为 递 归 方 法 计 算 n! (3) 编 写 程 序 代 码 : 以 在 窗 体 模 块 中 建 立 递 归 过 程 Factorial 为 例, 在 视 图 菜 单 中 选 择 代 码 窗 口, 在 打 开 的 Form1 窗 体 模 块 代 码 窗 口 内 输 入 下 列 程 序 代 码 : ' 定 义 递 归 过 程 Factorial, 用 于 计 算 n! Function Factorial(n As Integer) As Double

199 186 Visual Basic 程 序 设 计 教 程 If n = 0 Or n = 1 Then ' 递 归 结 束 条 件 Factorial = 1 Else Factorial = n * Factorial(n - 1) ' 递 归 调 用 End If End Function ' 调 用 递 归 过 程 的 主 程 序 Private Sub Form_Load() Dim num As Integer ' 由 于 计 算 精 度 有 限, 数 据 不 能 太 大 如 果 输 入 的 数 据 不 对 需 重 新 再 输 入 Do num = InputBox(" 请 输 入 一 个 20 以 内 的 正 整 数 :") Loop Until num >= 0 And num <= 20 ' 在 Form1 上 显 示 出 计 算 的 结 果 Show Print num & "!=" & Factorial(num) ' 把 调 用 递 归 过 程 Factorial 后 的 结 果 输 出 (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 比 如 在 输 入 框 内 输 入 数 字 4, 点 击 确 定 按 钮 后, 出 现 运 行 结 果 如 图 9.18 所 示 图 9.18 例 9.11 运 行 结 果 若 输 入 n 值 较 大 时, 计 算 出 的 n! 会 非 常 大, 受 计 算 精 度 限 制, 为 了 防 止 产 生 溢 出 错 误, 这 里 我 们 只 计 算 20 以 内 的 正 整 数 递 归 求 解 的 过 程 分 为 两 个 阶 段 : 第 一 阶 段 为 递 推, 第 二 阶 段 为 回 推 以 n=4 为 例, 计 算 Factorial(4) 的 过 程 如 图 9.19 Factorial(4) Factorial(4) = 4 * Factorial(3) = 4 * 6 返 回 24 Factorial(3) Factorial(3) = 3 * Factorial(2) = 3 * 2 返 回 6 Factorial(2) Factorial(2) = 2 * Factorial(1) = 2 * 1 返 回 2 递 推 阶 段 Factorial(1) 返 回 1 =1 回 推 阶 段 图 9.19 调 用 递 归 过 程 的 执 行 顺 序 例 9.12 有 10 个 人 坐 在 一 起, 问 第 10 个 人 多 少 岁? 答, 比 第 9 个 人 大 2 岁 第 8 个 人

200 第 9 章 过 程 187 说 他 比 第 7 个 人 大 2 岁, 第 6 个 人 又 比 第 5 个 人 大 2 岁, 依 此 类 推 至 第 2 个 人 比 第 1 个 人 大 2 岁, 最 后 第 1 个 人 说 自 己 是 13 岁 请 问 第 10 个 人 到 底 多 大? 问 题 分 析 : 这 是 一 个 可 用 递 归 方 法 计 算 的 问 题 因 为 各 个 相 邻 的 两 人 年 龄 相 差 两 岁, 所 以 可 得 出 计 算 年 龄 的 的 递 推 公 式 是 : 13 (n = 1) Age(n)= Age(n-1)+2 (n > 1) 递 归 结 束 条 件 是 当 n=1 时,Age(1)=13 根 据 上 面 的 递 推 公 式 及 递 归 结 束 条 件 建 立 一 个 递 归 Function 过 程 Age, 在 Form1 窗 体 Load 事 件 内 调 用 Age 过 程, 并 在 Form1 窗 体 上 输 出 结 果 Visual Basic 应 用 程 序 设 计 步 骤 如 下 : (1) 建 立 应 用 程 序 用 户 界 面 : 只 需 建 立 一 个 Form1 窗 体, 用 于 输 出 结 果 (2) 设 置 界 面 对 象 的 属 性 : 把 Form1 的 Caption 设 置 为 递 归 计 算 年 龄 (3) 编 写 程 序 代 码 : 在 视 图 菜 单 中 选 择 代 码 窗 口, 在 打 开 的 Form1 代 码 窗 口 内 输 入 下 列 程 序 代 码 : ' 定 义 计 算 年 龄 的 递 归 过 程 Age Function Age(n As Integer) As Integer If n = 1 Then Age = 13 Else Age = Age(n - 1) + 2 End If End Function ' 调 用 递 归 过 程 的 主 程 序 Private Sub Form_Load() Dim m As Integer Show m = 10 Print " 第 " & m & " 人 的 年 龄 是 :" & Age(m) (4) 运 行 程 序 : 按 F5 功 能 键 或 单 击 工 具 栏 上 的 按 钮 运 行 该 程 序, 运 行 结 果 如 图 9.20 所 示 图 9.20 例 9.12 运 行 结 果

201 188 Visual Basic 程 序 设 计 教 程 在 执 行 递 归 操 作 时,Visual Basic 把 递 归 过 程 中 的 信 息 保 存 在 堆 栈 中 利 用 递 归 算 法 可 以 解 决 一 些 特 殊 的 问 题, 但 是 若 递 归 调 用 的 量 太 大 时, 可 能 会 导 致 堆 栈 的 溢 出 所 以 使 用 要 慎 重 9.7 变 量 与 过 程 的 作 用 范 围 在 编 写 Visual Basic 应 用 程 序 时, 可 能 会 用 到 许 多 变 量 和 编 写 多 个 过 程, 这 些 变 量 名 和 过 程 名 由 于 建 立 的 位 置 不 同 或 定 义 时 使 用 了 不 同 的 声 明 关 键 字, 它 们 的 作 用 范 围 也 不 同 变 量 的 作 用 范 围 变 量 的 作 用 范 围 是 指 变 量 的 有 效 范 围 根 据 定 义 变 量 时 所 用 的 关 键 字 和 所 处 的 位 置 不 同, Visual Basic 中 的 变 量 可 分 为 过 程 级 变 量 模 块 级 变 量 和 全 局 变 量 1. 过 程 级 变 量 过 程 级 变 量 也 称 为 局 部 变 量, 是 指 在 一 个 过 程 内 声 明 的 变 量, 该 变 量 只 能 在 本 过 程 内 部 被 引 用 或 被 改 变 其 值, 而 不 能 被 其 他 的 过 程 使 用 因 此 过 程 级 变 量 的 作 用 范 围 是 限 制 在 本 过 程 内 在 过 程 内 使 用 Dim 或 Static 关 键 字 声 明 的 变 量 都 是 过 程 级 变 量 如 果 在 过 程 内 未 作 声 明 而 直 接 使 用 某 个 变 量, 该 变 量 也 被 当 成 过 程 级 变 量 如 下 面 一 段 代 码 : Private Sub Form_Load() Dim x As Single, y As Integer Static sum As Double z = 5 x = 3 y = 4 sum = x + y + z Print sum 在 这 个 Form_Load 过 程 中 声 明 了 三 个 变 量 x y 和 sum, 它 们 都 是 过 程 级 变 量 此 外 在 过 程 体 内 还 使 用 了 一 个 变 量 z, 虽 然 它 没 有 用 Dim 或 Static 关 键 字 声 明, 但 仍 属 于 过 程 级 变 量 为 了 养 成 良 好 的 编 程 风 格, 在 编 写 程 序 时, 最 好 代 码 中 用 到 的 所 有 变 量 都 显 式 声 明, 当 然 也 可 以 在 程 序 的 开 头 用 Option Explicit 语 句 来 强 制 执 行 显 式 声 明 变 量 过 程 级 变 量 根 据 其 生 存 期 的 不 同 又 分 为 动 态 变 量 和 静 态 变 量 动 态 变 量 的 生 存 期 为 过 程 的 一 次 调 用 期 间 用 Dim 声 明 的 变 量 属 于 动 态 变 量, 在 过 程 内 未 经 显 式 声 明 而 直 接 使 用 的 变 量 也 是 动 态 变 量 当 系 统 执 行 到 动 态 变 量 所 在 过 程 时, 动 态 变 量 才 被 分 配 内 存 单 元, 在 过 程 体 执 行 期 间 被 使 用 当 过 程 执 行 结 束 后, 该 变 量 所 占 内 存 单 元 被 自 动 释 放, 该 变 量 的 值 也 消 失 若 该 过 程 又 被 调 用 时, 再 次 为 动 态 变 量 重 新 分 配 内 存 单 元 静 态 变 量 的 生 存 期 为 整 个 应 用 程 序 的 执 行 期 间 用 Static 声 明 的 变 量 属 于 静 态 变 量 静 态 变 量 在 应 用 程 序 执 行 期 间 占 据 固 定 的 内 存 单 元, 当 静 态 变 量 所 在 的 过 程 执 行 结 束 后, 该 变 量 不 释 放 内 存 空 间, 变 量 的 值 保 持 不 变 若 该 过 程 又 被 调 用 时, 接 着 使 用 上 次 的 值

202 第 9 章 过 程 189 例 9.13 静 态 变 量 与 动 态 变 量 对 比 例 子 建 立 一 个 Form1 窗 体, 在 代 码 窗 口 中 输 入 下 列 一 段 程 序 代 码 : ' 定 义 一 个 通 用 Sub 过 程 Test, 用 于 对 比 测 试 静 态 变 量 与 动 态 变 量 Public Sub Test(n As Integer) Static x As Integer Dim y As Integer x = x + n y = y + n z = z + n Print " 变 量 x 值 为 " & x Print " 变 量 y 值 为 " & y Print " 变 量 z 值 为 " & y ' 主 程 序 两 次 调 用 Test 过 程 Private Sub Form_Load() Show Print " 第 一 次 调 用 test 过 程 " Call Test(2) Print Print " 第 二 次 调 用 test 过 程 " Call Test(2) 程 序 运 行 结 果 如 图 9.21 所 示 当 第 一 次 调 用 Test 过 程 时, 静 态 变 量 x 与 动 态 变 量 y 和 z 都 在 初 始 值 默 认 为 0 的 基 础 上 加 实 参 的 值 (2), 所 以 输 出 结 果 都 为 2,Test 过 程 结 束 时, 变 量 y 和 z 的 内 存 单 元 被 释 放 当 第 二 次 调 用 Test 过 程 时, 静 态 变 量 x 保 持 上 一 次 的 结 果 (2) 再 加 上 实 参 的 值 (2), 结 果 为 4 而 动 态 变 量 y 和 z 都 又 重 新 分 配 了 内 存 单 元, 初 始 值 默 认 为 0 再 上 加 实 参 的 值 (2), 所 以 输 出 的 y 值 和 z 值 仍 然 是 2 图 9.21 例 9.13 运 行 结 果 当 定 义 过 程 时 若 是 使 用 Static 来 声 明 过 程, 则 表 示 过 程 内 用 到 的 所 有 局 部 变 量 均 是 静 态 变 量 如 前 面 的 例 9.13 中, 若 是 定 义 Test 过 程 的 首 行 语 句 变 为 Static Sub Test(n As Integer), 则 Test 过 程 内 的 变 量 x y 和 z 都 属 于 静 态 变 量 程 序 的 运 行 结 果 如 图 9.22 所 示

203 190 Visual Basic 程 序 设 计 教 程 图 9.22 用 Static 声 明 Test 过 程 时 的 运 行 结 果 所 以 当 我 们 需 要 保 留 过 程 中 某 些 变 量 的 结 果 时, 就 可 使 用 Static 来 声 明 这 部 分 变 量, 若 不 需 要 保 留 结 果 时 就 可 用 Dim 来 声 明 变 量 如 果 希 望 过 程 内 所 有 的 变 量 ( 无 论 是 显 式 声 明 的 变 量, 还 是 未 声 明 就 直 接 使 用 的 变 量 ) 都 保 留 结 果 时, 就 用 Static 来 定 义 过 程 2. 模 块 级 变 量 模 块 级 变 量 是 指 在 一 个 模 块 内 所 有 的 过 程 都 可 使 用 它, 但 在 其 他 的 模 块 内 则 无 法 访 问 或 改 变 其 值 的 变 量 因 此 模 块 级 变 量 的 作 用 范 围 是 限 制 在 本 模 块 内 在 窗 体 模 块 或 标 准 模 块 (Visual Basic 的 工 程 菜 单 中 选 择 添 加 模 块 ) 的 顶 部 用 Dim 或 Private 关 键 字 声 明 模 块 级 变 量 例 9.14 模 块 级 变 量 示 例 建 立 一 个 Form1 窗 体, 在 Form1 的 代 码 窗 口 中 输 入 以 下 代 码 : Dim x As Integer Private y As Single Private Sub Form_Click() x = 7 : y = 9 Print " x = " & x & " y = " & y Private Sub Form_Load() Show x = 3 : y = 5 Print " x = " & x & " y = " & y 在 Form1 窗 体 模 块 中 定 义 了 两 个 模 块 级 变 量 (x y) 和 两 个 窗 体 事 件 过 程 (Form_Click Form_Load) 在 两 个 过 程 中 都 对 两 个 模 块 级 变 量 进 行 了 访 问 并 改 变 了 其 值 程 序 运 行 时, 首 先 执 行 的 是 Form_Load 事 件, 在 Form_Load 事 件 中,x 和 y 被 分 别 赋 值 为 3 和 5, 然 后 输 出 x 和 y 的 值, 如 果 在 窗 体 内 单 击 鼠 标, 则 执 行 Form_Click 事 件, 在 Form_Click 事 件 中,x y 被 重 新 赋 值 为 7 和 9, 再 次 输 出 x 和 y 的 值 运 行 结 果 如 图 9.23 图 9.23 模 块 级 变 量 示 例

204 第 9 章 过 程 全 局 变 量 全 局 变 量 是 指 在 整 个 应 用 程 序 中, 所 有 的 过 程 内 都 可 引 用 或 改 变 其 值 的 变 量 全 局 变 量 的 作 用 范 围 是 整 个 应 用 程 序 在 窗 体 模 块 或 标 准 模 块 的 顶 部 用 Public 关 键 字 声 明 全 局 变 量 如 果 是 在 标 准 模 块 中 定 义 的 全 局 变 量, 可 以 在 整 个 应 用 程 序 内 被 所 有 的 模 块 所 有 的 过 程 直 接 使 用 如 果 是 在 某 个 窗 体 模 块 中 用 Public 声 明 变 量 时, 该 变 量 在 本 窗 体 模 块 内 的 所 有 过 程 都 可 直 接 使 用 当 别 的 窗 体 也 想 使 用 该 变 量 时, 必 须 在 变 量 名 前 加 上 窗 体 名 称 比 如 在 Form1 窗 体 中 有 Public x As Integer, 在 Form2 窗 体 中 可 以 用 Form1.x = 5 对 Form1 窗 体 中 的 全 局 变 量 x 进 行 赋 值 例 9.15 全 局 变 量 示 例 在 工 程 中 建 立 一 个 Form1 窗 体 和 一 个 标 准 模 块, 在 标 准 模 块 Module1 中 输 入 以 下 代 码 : Public x As Integer Public y As Single Public Sub Reset() x = 1 : y = 2 在 标 准 模 块 中 定 义 了 两 个 全 局 级 变 量 x y 和 一 个 通 用 过 程 Reset, 在 Reset 过 程 内 对 x y 赋 值 为 1 和 2 在 窗 体 Form1 的 代 码 窗 口 中 输 入 以 下 代 码 : Private Sub Form_Click() x = 7 : y = 9 Print " x = " & x & " y = " & y Reset Private Sub Form_Load() Show x = 3 : y = 5 Print " x = " & x & " y = " & y 在 Form1 窗 体 模 块 定 义 了 两 个 窗 体 事 件 过 程 (Form_Load 和 Form_Click) 在 两 个 窗 体 过 程 中 都 对 两 个 全 局 变 量 进 行 了 访 问 并 改 变 了 其 值 程 序 运 行 时, 首 先 执 行 的 是 Form_Load 事 件 在 Form_Load 事 件 中,x 和 y 被 分 别 赋 值 为 3 和 5, 然 后 输 出 x 和 y 的 值 如 果 在 Form1 窗 体 内 单 击 鼠 标, 则 执 行 Form_Click 事 件, 在 Form_Click 事 件 中,x,y 先 被 重 新 赋 值 为 7 和 9, 再 次 输 出 x 和 y 的 值, 接 着 调 用 Reset 过 程 在 Reset 过 程 内 又 对 x,y 重 新 赋 值 为 1 和 2 最 后 再 输 出 x 和 y 的 值 运 行 结 果 如 图 9.24 所 示 图 9.24 全 局 变 量 示 例

205 192 Visual Basic 程 序 设 计 教 程 由 于 全 局 变 量 在 任 何 一 个 过 程 内 都 可 以 被 改 变 其 值, 为 了 防 止 一 些 变 量 在 无 意 中 被 修 改, 在 编 写 程 序 时, 特 别 是 由 多 人 共 同 完 成 的 较 大 的 应 用 程 序, 应 尽 量 少 使 用 全 局 变 量 当 全 局 变 量 与 局 部 变 量 同 名 时, 全 局 变 量 和 局 部 变 量 在 不 同 的 范 围 内 有 效 在 过 程 内, 局 部 变 量 有 效, 而 在 过 程 外 全 局 变 量 有 效 例 9.16 全 局 变 量 与 局 部 变 量 同 名 示 例 建 立 一 个 Form1 窗 体, 在 Form1 窗 体 模 块 的 代 码 窗 口 输 入 以 下 代 码 : Public x As Integer Public Sub Contrast( n As Integer) Dim x As Integer x = n Print " 过 程 内 的 局 部 变 量 x 值 为 " & x Private Sub Form_Load() Show x = 5 Print " 调 用 Contrast 前 全 局 变 量 x 的 值 为 "& x Call Contrast(2) Print " 调 用 Contrast 后 全 局 变 量 x 的 值 为 " & x 其 中 定 义 了 一 个 全 局 变 量 (x) 一 个 Sub 过 程 Contrast 和 Form_Load 事 件 过 程 在 Contrast 过 程 中 又 定 义 了 一 个 变 量 x, 则 此 变 量 是 属 于 Contrast 过 程 的 局 部 变 量 程 序 运 行 时, 首 先 执 行 Form_Load 事 件 过 程, 在 Form_Load 事 件 过 程 中, 首 先 对 全 局 变 量 x 赋 值 为 5 后 输 出 x 值, 然 后 调 用 Contrast 过 程, 在 Contrast 过 程 内 对 局 部 变 量 x 赋 值 为 2, 输 出 x 值,Contrast 过 程 调 用 结 束 后, 又 一 次 输 出 x 值, 此 时 的 x 应 是 全 局 变 量 x 程 序 运 行 结 果 如 图 9.25 所 示 图 9.25 全 局 变 量 与 局 部 变 量 同 名 示 例 过 程 的 作 用 范 围 过 程 的 作 用 范 围 是 指 过 程 的 有 效 范 围 根 据 定 义 Sub 过 程 或 Function 过 程 时 所 用 的 声 明 关 键 字 不 同,Visual Basic 中 的 过 程 可 分 为 私 有 过 程 和 公 共 过 程 1. 私 有 过 程 私 有 过 程 也 叫 局 部 过 程, 是 指 在 定 义 Sub 过 程 或 Function 过 程 时 选 用 Private 关 键 字 进 行 声 明 私 有 过 程 的 有 效 范 围 在 声 明 过 程 的 模 块 之 内, 即 私 有 过 程 只 能 在 本 模 块 内 被 调 用, 其 他 模 块 不 能 调 用

206 第 9 章 过 程 公 共 过 程 公 共 过 程 也 叫 全 局 过 程, 是 指 在 定 义 Sub 过 程 或 Function 过 程 时 选 用 Public 关 键 字 进 行 声 明 公 共 过 程 的 有 效 范 围 在 整 个 应 用 程 序 之 内 如 果 是 在 标 准 模 块 中 定 义 的 公 共 过 程, 可 以 在 整 个 应 用 程 序 内 被 所 有 的 模 块 所 有 的 过 程 直 接 调 用 比 如 前 面 的 例 9.15 中, 在 标 准 模 块 内 定 义 的 Reset 过 程 就 是 一 个 公 共 过 程 在 Form1 窗 体 模 块 中 的 Form_click 事 件 过 程 中 就 有 直 接 调 用 Reset 公 共 过 程 的 语 句 Reset 如 果 是 在 窗 体 模 块 中 定 义 的 公 共 过 程, 可 被 在 本 窗 体 模 块 内 的 所 有 过 程 直 接 调 用, 而 在 其 他 模 块 中 调 用 时 必 须 加 上 公 共 过 程 所 在 窗 体 的 名 称 比 如, 如 果 在 Form1 窗 体 中 有 Public Sub PrintMe(x As String), 则 在 Form2 窗 体 中 可 以 用 Form1.PrintMe("hello") 来 调 用 Form1 窗 体 模 块 中 定 义 的 PrintMe 过 程 习 题 1. 编 制 一 个 子 程 序, 输 入 一 个 坐 标 点, 判 断 其 在 平 面 坐 标 系 中 的 第 几 象 限 2. 编 制 一 个 求 最 大 公 约 数 的 函 数, 然 后 输 入 两 个 数 调 用 该 函 数 3. 建 立 一 个 检 验 姓 名 和 密 码 的 子 程 序, 以 自 己 的 姓 名 和 年 龄 为 准, 若 窗 体 内 输 入 的 数 据 正 确 时 显 示 祝 贺 信 息, 若 输 入 错 误 时, 提 示 错 误 信 息 4. 编 制 一 个 排 序 的 函 数, 对 任 意 大 小 的 一 组 数 进 行 从 大 到 小 排 序 5. 编 制 一 个 求 平 均 值 的 函 数, 对 任 意 一 组 数 求 其 平 均 值 6. 有 一 张 边 长 为 20cm 的 正 方 形 纸, 剪 掉 两 个 半 径 分 别 是 5cm 和 8cm 的 圆 后, 还 剩 下 多 少 面 积? 7. 建 立 一 个 可 以 设 置 任 意 一 种 控 件 的 Caption 属 性 和 BackColor 属 性 的 过 程, 然 后 建 立 多 个 控 件 调 用 此 过 程 进 行 设 置 8. 建 立 一 个 可 以 设 置 任 意 一 个 窗 体 的 标 题 显 示 内 容 和 字 体 的 过 程, 然 后 建 立 多 个 窗 体 调 用 此 过 程 进 行 窗 体 设 置 9. 猴 子 吃 桃 问 题 : 猴 子 摘 了 一 堆 桃, 第 一 天 吃 掉 一 半, 还 嫌 不 过 瘾, 又 吃 了 一 个, 第 二 天 又 从 剩 下 的 桃 子 中 吃 掉 一 半 零 一 个, 以 后 每 天 如 此, 到 第 9 天 时, 只 剩 下 一 个 了 请 问, 猴 子 一 共 摘 了 多 少 桃?

207 第 10 章 Visual Basic 的 常 用 控 件 10.1 概 述 在 Visual Basic 中, 窗 体 是 最 重 要 的 对 象, 是 构 成 应 用 程 序 的 用 户 界 面 的 基 本 模 块 控 件 (Component) 是 窗 体 中 的 图 形 对 象, 是 构 成 窗 体 的 基 本 元 素 控 件 是 用 来 接 收 和 显 示 数 据 信 息 的 Visual Basic 中, 控 件 也 叫 部 件 或 组 件, 主 要 有 三 类 : 1. 标 准 控 件 标 准 控 件 也 叫 内 部 控 件 或 固 有 控 件, 由 Visual Basic 本 身 提 供, 与 应 用 程 序 封 装 在 一 起 标 准 控 件 总 是 显 示 在 控 件 箱 中, 不 能 从 控 件 箱 中 删 除 启 动 Visual Basic 后, 如 果 没 有 添 加 其 他 控 件, 工 具 箱 中 的 控 件 就 是 标 准 控 件 如 图 10.1 所 示 图 10.1 控 件 箱 中 的 标 准 控 件 Visual Basic 的 标 准 控 件 按 功 能 可 分 为 以 下 几 类 : (1) 文 本 控 件 : 包 括 文 本 框 和 标 签 ; (2) 图 形 控 件 : 包 括 图 片 框 图 像 框 直 线 和 形 状 ; (3) 按 钮 控 件 : 包 括 命 令 按 钮 ; (4) 选 择 控 件 : 包 括 复 选 框 单 选 按 钮 列 表 框 和 组 合 框 ; (5) 滚 动 控 件 : 包 括 水 平 滚 动 条 和 垂 直 滚 动 条 ; (6) 框 架 控 件 : 包 括 框 架 ; (7) 文 件 系 统 控 件 : 包 括 驱 动 器 列 表 框 目 录 列 表 框 和 文 件 列 表 框 ; (8) 计 时 器 控 件 : 包 括 计 时 器

208 第 10 章 Visual Basic 的 常 用 控 件 195 和 窗 体 一 样, 有 些 控 件 可 以 作 为 其 他 控 件 的 容 器, 如 框 架 图 片 框 等 多 数 控 件 都 具 有 容 器 (Container) 属 性, 用 于 说 明 所 属 的 容 器 2. ActiveX 控 件 ActiveX 控 件 是 Visual Basic 工 具 箱 的 扩 充 部 分 要 使 用 某 个 ActiveX 控 件, 需 要 首 先 将 该 控 件 添 加 到 控 件 箱 中 方 法 是 选 择 工 程 菜 单 下 的 部 件 命 令, 打 开 控 件 选 项 卡 ( 如 图 10.2 所 示 ), 选 择 需 要 的 控 件 也 可 以 通 过 在 控 件 箱 上 单 击 鼠 标 右 键, 再 选 择 快 捷 菜 单 中 的 部 件 命 令 打 开 该 对 话 框 使 用 ActiveX 控 件 的 方 法 与 使 用 标 准 控 件 相 同 图 10.2 控 件 选 项 卡 3. 可 插 入 对 象 可 插 入 对 象 是 由 其 他 应 用 程 序 创 建 的 对 象, 如 Excel 表 格 Word 文 档 PowerPoint 幻 灯 片 等 在 Visual Basic 中 可 以 利 用 可 插 入 对 象 扩 充 程 序 的 功 能 添 加 和 使 用 可 插 入 对 象 的 方 法 与 ActiveX 控 件 相 同 在 前 面 的 学 习 中, 通 过 学 习 和 使 用 Visual Basic 的 标 签 文 本 框 命 令 按 钮 等 三 大 控 件, 我 们 已 经 掌 握 了 窗 体 控 件 等 对 象 的 部 分 属 性, 如 Caption Enabled Name Visible Height Width Top Left FontName FontSize FontBold 等 这 一 章, 我 们 将 学 习 其 他 标 准 控 件 的 用 法 以 及 他 们 的 其 他 常 用 属 性 10.2 图 形 控 件 图 形 控 件 有 四 个 : 直 线 形 状 图 片 框 和 图 像 框 直 线 (Line) 直 线 控 件 用 于 绘 制 具 有 颜 色 线 型 的 线 段, 常 用 属 性 见 表 10.1

209 196 Visual Basic 程 序 设 计 教 程 表 10.1 直 线 (Line) 控 件 的 常 用 属 性 类 别 名 称 说 明 属 性 X1 Y1 X2 Y2 BorderWidth BorderColor 线 段 起 始 点 的 横 坐 标 线 段 起 始 点 的 纵 坐 标 线 段 终 止 点 的 横 坐 标 线 段 终 止 点 的 纵 坐 标 线 段 的 宽 度 线 段 的 颜 色, 用 6 位 十 六 进 制 数 表 示 BorderStyle 线 段 的 线 型, 有 7 种 取 值, 见 表 10.2 用 直 线 控 件 绘 制 出 的 是 一 条 从 点 (x1,y1) 到 点 (x2,y2) 的 线 段 需 要 说 明 的 是, 与 我 们 的 习 惯 不 同,Visual Basic 采 用 的 坐 标 系 的 原 点 位 于 屏 幕 左 上 角, 纵 轴 的 方 向 是 向 下 的 另 外, 如 果 BorderWidth 的 值 大 于 1, 那 么 大 于 1 的 BorderStyle 取 值 将 无 效 表 10.2 直 线 控 件 和 形 状 控 件 的 BorderStyle 属 性 的 取 值 BorderStyle 属 性 值 含 义 0-Transparent 透 明 ( 即 不 显 示 ) 1-Solid 实 线 ( 缺 省 值 ) 2-Dash 3-Dot 4-Dash-Dot 5-Dash-Dot-Dot 6-Inside Solid 虚 线 点 线 点 划 线 点 点 划 线 内 收 实 线 例 10.1 新 建 一 个 标 准 EXE 工 程, 添 加 一 个 窗 体 Form1, 在 窗 体 中 画 一 条 直 线 Line1, 通 过 对 Form1 的 Resize 事 件 编 程 实 现 用 直 线 将 窗 体 平 分 为 上 下 两 部 分 程 序 的 代 码 部 分 为 : Private Sub Form_Resize() Line1.X1 = 0 Line1.Y1 = Me.ScaleHeight / 2 'Me 为 关 键 字, 代 表 当 前 模 块 Form1 Line1.X2 = Me.ScaleWidth 'ScaleHeight ScaleWidth 为 窗 体 的 内 部 高 度 和 宽 度 Line1.Y2 = Line1.Y 形 状 (Shape) 形 状 控 件 用 于 绘 制 比 直 线 复 杂 的 几 何 图 形, 如 矩 形 椭 圆 等, 其 常 用 属 性 见 表 10.3

210 第 10 章 Visual Basic 的 常 用 控 件 197 表 10.3 形 状 (Shape) 控 件 的 常 用 属 性 类 别 名 称 说 明 Shape 形 状, 有 6 种, 见 表 10.4 BorderWidth 边 框 的 宽 度 BorderColor 边 框 的 颜 色, 用 6 位 十 六 进 制 数 表 示 属 性 BorderStyle 边 框 的 线 型, 有 7 种 取 值, 见 表 10.2 BackColor 背 景 色 FillStyle 内 部 填 充 的 图 案 样 式, 有 8 种, 见 表 10.5 FillColor 内 部 的 填 充 色 BackStyle 背 景 样 式, 有 2 种, 见 表 10.6 表 10.4 形 状 控 件 的 Shape 属 性 的 取 值 Shape 属 性 值 含 义 0-Rectangle 矩 形 1-Square 正 方 形 2-Oval 椭 圆 3-Circle 圆 4-Rounded Rectangle 圆 角 矩 形 5-Rounded Square 圆 角 正 方 形 表 10.5 形 状 控 件 的 FillStyle 属 性 的 取 值 FillStyle 属 性 值 含 义 0-Solid 实 心 填 充 1-Transparent 透 明 2-Horizontal Line 水 平 线 3-Vertical Line 竖 线 4-Upward Diagonal 左 上 到 右 下 的 斜 线 5-Downward Diagonal 左 下 到 右 上 的 斜 线 6-Cross 垂 直 交 叉 线 7-Diagonal Cross 对 角 交 叉 线 表 10.6 形 状 控 件 的 BackStyle 属 性 的 取 值 BackStyle 属 性 值 含 义 0-Transparent 透 明 1-Opaque 填 充 形 状 控 件 的 内 部 填 充 方 式 由 BackStyle FillStyle 等 属 性 共 同 设 置, 见 表 10.7

211 198 Visual Basic 程 序 设 计 教 程 表 10.7 形 状 控 件 内 的 填 充 FillStyle 属 性 BackStyle 属 性 形 状 内 的 填 充 方 式 0-Solid 无 作 用 用 FillColor 指 定 的 填 充 色 填 充 1-Transparent 其 他 0-Transparent 1-Opaque 0-Transparent 1-Opaque 透 明 用 BackColor 制 定 的 背 景 色 填 充 用 FillStyle 制 定 的 填 充 图 案 和 FillColor 制 定 的 填 充 色 填 充, 背 景 透 明 用 FillStyle 制 定 的 填 充 图 案 和 FillColor 制 定 的 填 充 色 填 充, 背 景 用 BackColor 制 定 的 背 景 色 填 充 例 10.2 用 形 状 控 件 在 窗 体 Form1 中 绘 制 出 6 个 相 同 大 小 的 形 状, 属 性 设 置 下 表 所 示 控 件 名 称 Shape 属 性 BackStyle 属 性 FillStyle 属 性 形 状 内 的 填 充 Shape 用 FillColor 填 充 Shape 透 明 Shape 用 BackColor 填 充 Shape 背 景 透 明, 水 平 线 Shape 背 景 被 填 充, 竖 线 Shape 背 景 被 填 充, 斜 线 程 序 的 运 行 结 果 如 图 10.3 所 示 图 10.3 例 10.2 的 运 行 结 果 直 线 控 件 和 形 状 控 件 为 交 互 地 绘 制 规 则 的 几 何 图 形 提 供 了 方 便, 但 不 适 合 绘 制 复 杂 的 函 数 图 形 或 其 他 动 态 图 形 Visual Basic 所 具 有 的 强 大 的 绘 图 能 力 是 靠 众 多 的 绘 图 语 句 或 函 数 来 实 现 的 图 片 框 (PictureBox) 图 片 框 是 一 个 容 器, 允 许 在 其 中 添 加 各 种 控 件, 也 包 括 另 一 个 图 片 框 因 而 图 片 框 的 属 性 方 法 事 件 等 都 和 窗 体 有 相 似 之 处 例 10.3 新 建 一 个 工 程, 在 窗 体 Form1 中 添 加 一 个 图 片 框 Picture1, 在 图 片 框 中 添 加 一 个 标 签 Label1 程 序 的 代 码 如 下 : Private Sub Form_Load()

212 第 10 章 Visual Basic 的 常 用 控 件 199 Label1.FontSize = 16 Label1.Caption = " 欢 迎 使 用 PictureBox 控 件 " Picture1.Picture = LoadPicture("C:\ 飞 翔.jpg") 其 中,LoadPicture 函 数 用 于 动 态 地 读 取 一 个 图 片 程 序 的 运 行 结 果 如 图 10.4 所 示 利 用 图 片 框 控 件 对 象 的 方 法 可 以 绘 制 各 种 复 杂 的 图 形 图 10.4 例 10.3 的 运 行 结 果 图 10.5 例 10.4 的 运 行 结 果 例 10.4 新 建 一 个 工 程, 在 窗 体 Form1 中 添 加 一 个 图 片 框 Picture1, 输 入 以 下 代 码 : Private Sub Form_Load() Dim i, x, y With Picture1 ' 用 With 结 构 给 对 象 属 性 赋 值.ScaleWidth = 360.ScaleHeight = 200.ForeColor = 0 ' 绘 图 色 为 黑 色.AutoRedraw = True End With Picture1.PSet (0, 100) ' 设 置 绘 图 起 点 For i = 0 To 72 x = i * 5 y = * Sin(x * / 180) Picture1.Line -(x, y) ' 从 上 一 次 画 线 的 终 点 画 到 (x,y) 点 Next Picture1.AutoRedraw = False 程 序 的 运 行 结 果 如 图 10.5 所 示 图 像 框 (Image) 和 图 片 框 类 似, 图 像 框 也 可 以 用 来 显 示 图 形 但 是 二 者 具 有 很 多 不 同 :

213 200 Visual Basic 程 序 设 计 教 程 (1) 图 片 框 中 的 图 片 的 大 小 不 能 改 变, 可 以 将 图 片 框 的 AutoSize 属 性 设 置 为 True, 以 便 根 据 图 片 的 尺 寸 调 整 图 片 框 的 大 小 ; 图 像 框 可 以 实 现 对 图 片 的 缩 放, 只 要 设 置 Stretch 属 性 为 True, 不 论 图 片 的 尺 寸 如 何, 都 会 缩 放 到 图 像 框 的 大 小 (2) 图 片 框 是 一 个 容 器, 可 以 包 含 其 他 控 件, 因 而 占 用 内 存 多, 且 显 示 速 度 慢 ; 图 像 框 不 能 作 为 容 器, 只 能 用 来 显 示 图 片, 但 是 占 用 内 存 少, 显 示 速 度 快 (3) 图 片 框 对 象 封 装 了 许 多 绘 图 方 法, 支 持 屏 幕 绘 图 文 字 显 示 等 ; 图 像 框 不 具 备 这 些 功 能 可 见, 图 像 框 是 专 门 用 来 显 示 图 片 的 10.3 框 架 和 选 择 控 件 框 架 (Frame) 框 架 控 件 是 一 个 容 器, 使 用 框 架 的 主 要 目 的 是 将 窗 体 中 的 控 件 按 功 能 或 类 别 分 组 框 架 的 常 用 属 性 有 两 个 较 特 殊 : (1)Caption 属 性 : 表 示 框 架 控 件 的 标 题 文 字, 显 示 在 框 架 的 左 上 角 (2)Enabled 属 性 : 当 Enabled 的 值 为 True 时, 表 示 该 框 架 是 活 动 的, 框 架 内 的 控 件 的 可 用 性 由 各 自 的 Enabled 属 性 决 定 当 Enabled 的 值 为 False 时, 框 架 的 标 题 变 灰, 表 示 该 框 架 不 可 用, 框 架 内 的 所 有 控 件 均 被 屏 蔽 在 程 序 中 使 用 框 架 的 方 法 有 两 个 : (1) 首 先 在 窗 体 中 创 建 一 个 空 的 框 架, 然 后 在 框 架 内 添 加 一 组 控 件 要 注 意 确 保 框 架 和 框 架 内 的 控 件 组 成 一 个 整 体, 可 以 通 过 拖 动 框 架 察 看 控 件 是 否 随 之 移 动 的 方 法 来 确 定 如 果 所 绘 制 的 控 件 属 于 该 框 架 ( 分 组 ), 则 会 随 之 移 动 ; 否 则 保 持 不 动 (2) 要 将 窗 体 中 已 存 在 的 控 件 移 到 框 架 中, 可 以 先 选 取 该 控 件, 再 剪 切 下 来, 然 后 选 中 目 标 框 架, 再 粘 贴 该 控 件 到 框 架 中, 最 后 再 调 整 控 件 在 框 架 中 的 位 置 与 窗 体 图 片 框 类 似, 框 架 ( 容 器 ) 对 内 部 的 控 件 有 裁 减 作 用, 如 果 控 件 超 出 了 框 架 的 边 界, 超 出 部 分 将 被 屏 蔽 起 来 有 的 控 件 可 能 因 为 不 在 框 架 的 边 界 内 而 整 个 被 屏 蔽, 变 得 不 可 见 复 选 框 (CheckBox) 和 单 选 按 钮 (OptionButton) Visual Basic 的 选 择 类 控 件 包 括 复 选 框 单 选 按 钮 列 表 框 和 组 合 框 复 选 框 允 许 从 一 组 选 项 中 同 时 选 中 多 个 选 项, 也 可 以 不 选 单 选 按 钮 ( 也 叫 选 项 按 钮 或 无 线 电 按 钮 ) 只 允 许 选 中 一 个 选 项, 不 能 不 选, 一 旦 选 中 某 一 项, 其 他 项 将 自 动 变 为 不 选 复 选 框 和 单 选 按 钮 都 支 持 Click 事 件, 它 们 的 常 用 属 性 见 表 10.8 注 意, 复 选 框 的 Value 属 性 不 能 替 代 Enabled 属 性,Value 取 3 时 只 表 示 控 件 暂 时 不 可 用, 但 仍 接 受 Click 事 件, 从 而 改 为 0 或 1 而 Enabled 属 性 为 False 时, 表 示 控 件 不 可 用, 不 再

214 第 10 章 Visual Basic 的 常 用 控 件 201 接 受 Click 事 件 表 10.8 复 选 框 (CheckBox) 和 单 选 按 钮 (OptionButton) 控 件 的 常 用 属 性 类 别 名 称 说 明 标 题 文 本 的 对 齐 方 式, 有 两 种 : Alignment 0- 控 件 居 中, 标 题 在 控 件 的 右 侧 ( 默 认 ) 1- 控 件 居 中, 标 题 在 控 件 的 左 侧 控 件 的 样 式, 有 两 种 : Style 0- 标 准 方 式, 同 时 显 示 控 件 和 标 题 ( 默 认 ) 1- 图 形 方 式, 形 式 上 像 命 令 按 钮 控 件 的 状 态 属 性 (1) 对 于 复 选 框,Value 的 取 值 有 3 种 : 0-UnChecked, 未 被 选 中 ( 默 认 ); 1-Checked, 选 中 ; Value 2-Grayed, 控 件 暂 时 灰 化, 不 可 用 (2) 对 于 单 选 按 钮,Value 的 取 值 有 两 种 : False- 未 被 选 中 ( 默 认 ) True- 选 中 例 10.5 输 入 并 显 示 个 人 情 况 简 介, 包 括 姓 名 性 别 年 龄 计 算 机 水 平 和 外 语 水 平 要 创 建 图 10.6 所 示 的 窗 体 : 图 10.6 例 10.5 的 设 计 窗 体 (1) 在 窗 体 中 添 加 4 个 框 架 :Frame1 Frame2 Frame3 Frame4 (2) 在 Frame1 框 架 中 添 加 一 个 单 选 按 钮 optsex, 然 后 在 optsex 上 右 击, 在 快 捷 菜 单 中 选 复 制, 再 右 击 Frame1 框 架, 选 择 粘 贴, 选 择 创 建 控 件 数 组 optsex (3) 与 (2) 类 似, 在 Frame2 框 架 中 添 加 有 2 个 复 选 框 的 控 件 数 组 chkeng, 在 Frame3 框 架 中 添 加 有 3 个 复 选 框 的 控 件 数 组 chkcmp (4) 在 Frame4 框 架 中 添 加 文 本 框 txtdemo, 将 MultiLine 属 性 设 为 True( 即 允 许 多 行 ) (5) 在 窗 体 上 添 加 一 个 命 令 按 钮 cmdview, 其 Caption 属 性 设 置 为 显 示 (&V)

215 202 Visual Basic 程 序 设 计 教 程 (6) 创 建 其 他 控 件, 并 适 当 设 置 各 控 件 的 属 性 部 分 控 件 的 主 要 属 性 见 下 表 : 控 件 数 组 名 称 Index 属 性 Caption 属 性 其 他 属 性 及 取 值 optsex 0 男 Value:True 1 女 0 四 级 chkeng 1 六 级 0 一 级 chkcmp 1 二 级 2 三 级 程 序 代 码 如 下 : Private Sub cmdview_click() Dim s As String Dim t As CheckBox Dim o As OptionButton For Each o In optsex If o.value Then s = o.caption Next txtdemo.text = txtname.text & "," & s & "," & txtage.text & " 岁 " & vbcrlf s = "" For Each t In chkeng If t.value = 1 Then s = t.caption Next If s <> "" Then txtdemo.text = txtdemo.text & " 外 语 " & s s = "" For Each t In chkcmp If t.value = 1 Then s = t.caption Next If s <> "" Then txtdemo.text = txtdemo.text & ", 计 算 机 " & s 列 表 框 (ListBox) 列 表 框 用 于 列 出 可 供 选 择 的 项 目 的 列 表, 用 户 可 以 从 中 选 择 一 个 或 多 个 项 目, 也 可 以 不 选 任 何 项 目 选 中 的 项 目 反 白 显 示 如 果 所 列 出 的 项 目 很 多, 超 出 了 列 表 框 的 设 计 高 度, 会 自 动 加 上 垂 直 滚 动 条 同 样, 如 果 某 个 项 目 的 长 度 超 出 了 设 计 宽 度, 也 会 自 动 添 加 水 平 滚 动 条 1. 列 表 框 的 属 性 (1)Columns 属 性 : Columns 属 性 用 来 决 定 列 表 框 中 所 列 项 目 的 列 数 通 常,Columns 的 值 取 0( 默 认 ), 表

216 第 10 章 Visual Basic 的 常 用 控 件 203 示 所 有 项 目 呈 单 列 显 示, 每 行 一 项 如 果 将 Columns 设 置 为 大 于 0, 那 么 列 表 框 中 的 项 目 呈 多 列 显 示, 先 排 左 边 的 列, 第 一 列 排 满 后, 再 排 第 二 列 第 三 列 (2)ListCount 属 性 : 表 示 列 表 框 中 列 表 项 的 总 条 数 (3)ListIndex 属 性 : ListIndex 属 性 是 只 读 的, 设 计 时 不 可 用, 表 示 用 户 在 列 表 框 中 最 后 一 次 所 选 中 的 项 目 的 序 号 列 表 框 中 的 项 目 是 按 序 号 排 列 的, 第 一 项 的 序 号 为 0, 第 二 项 的 序 号 为 1, 依 此 类 推 如 果 没 有 选 择 任 何 项 目,SelectIndex 属 性 的 值 为 -1 (4)List 属 性 : List 属 性 是 一 个 数 组, 存 放 了 列 表 框 中 所 有 项 目 的 值, 每 个 项 目 的 值 对 应 List 属 性 的 一 个 数 组 元 素 列 表 框 中 的 每 一 项 都 有 一 个 序 号, 因 此, 当 i=0,1,2,,listcount-1 时,List(i) 表 示 第 i 项 的 值 (5)ItemData 属 性 : ItemData 属 性 也 是 一 个 数 组, 存 放 了 列 表 框 中 所 有 项 目 的 自 定 义 编 号 ItemData 属 性 与 List 属 性 一 一 对 应, 即 第 i 个 列 表 项 的 List(i) 对 应 ItemData(i) 缺 省 状 态 下, 所 有 项 目 的 ItemData 都 为 0 (6)Selected 属 性 : Selected 属 性 同 样 是 一 个 数 组, 存 放 列 表 框 中 每 一 项 的 状 态 如 果 Selected(i) 的 值 为 True, 表 示 第 i 项 已 被 选 中, 反 之, 则 没 有 被 选 中 由 于 ListIndex 属 性 只 保 存 最 后 被 选 中 的 项 的 序 号, 因 此 不 适 合 多 项 选 择 的 情 况, 此 时 可 使 用 Selected 属 性 判 断 有 哪 些 列 表 项 被 选 中 (7)MultiSelect 属 性 : 用 于 决 定 是 否 允 许 用 户 在 列 表 框 中 进 行 多 项 目 选 择 MuiltiSelect 属 性 有 3 种 取 值 : 1 0-None( 默 认 ), 表 示 不 能 多 选, 每 选 中 一 项, 对 其 他 项 的 选 择 自 动 取 消 2 1-Simple, 表 示 允 许 使 用 鼠 标 单 击 和 空 格 键 进 行 多 项 选 择, 选 中 某 项 不 会 取 消 对 其 他 项 的 选 择, 除 非 在 同 一 项 上 单 击 鼠 标 或 按 空 格 键 3 2-Extended, 表 示 可 以 使 用 Shift 键 Ctrl 键 等 进 行 复 杂 的 多 项 选 择 操 作 按 下 Shift 键 并 单 击 鼠 标 或 按 下 Shift 以 及 一 个 箭 头 键 将 在 以 前 选 中 项 的 基 础 上 扩 展 选 择 到 当 前 选 中 项 按 下 Ctrl 并 单 击 鼠 标 来 在 列 表 中 选 中 或 取 消 选 中 项 (8)Style 属 性 : Style 属 性 表 示 列 表 框 的 样 式 取 值 为 0-Standard( 默 认 ), 表 示 为 标 准 列 表 框 如 果 取 值 为 1-Checked, 则 每 个 列 表 项 的 左 边 有 个 复 选 框, 用 来 表 示 该 项 的 选 中 状 态 如 果 Style 属 性 为 1,MultiLine 属 性 就 只 能 取 0, 但 允 许 用 鼠 标 单 击 或 空 格 键 进 行 多 选, 与 Style 为 0,MultiLine 为 1 相 同 (9)Text 属 性 : 表 示 列 表 框 中 最 后 一 次 选 中 的 项 的 值, 即, 与 ListIndex 对 应 的 List 属 性 2. 创 建 列 表 框 如 果 列 表 框 的 项 目 都 可 以 事 先 给 定, 而 且 以 后 也 不 会 修 改, 可 以 在 创 建 列 表 框 时, 直 接 添 加 列 表 项, 方 法 是 : (1) 创 建 并 选 中 列 表 框 ;

217 204 Visual Basic 程 序 设 计 教 程 (2) 在 属 性 窗 口 中 单 击 List 属 性 右 端 的 箭 头, 拉 下 一 个 方 框, 顺 序 输 入 各 列 表 项, 每 输 入 一 项 按 Ctrl+Enter( 回 车 ) 键 换 行, 输 入 最 后 一 条 列 表 项 后 按 回 车 键 结 束 ; (3) 如 果 有 必 要, 参 照 (2) 输 入 ItemData 属 性 通 常, 程 序 中 列 表 框 的 内 容 需 要 动 态 地 更 新, 可 以 采 用 将 列 表 框 与 数 据 库 连 接 起 来 的 方 法 ( 不 属 于 本 书 内 容 ), 或 者 采 用 下 面 的 方 法 例 10.6 学 生 年 龄 查 询 创 建 一 个 窗 体, 如 图 10.7 所 示 添 加 标 签 lblresult 用 于 显 示 结 果, 添 加 列 表 框 lststudent, 用 List 属 性 存 放 学 生 的 姓 名, 用 ItemData 属 性 存 放 学 生 的 年 龄 ( 随 意 输 入 ) 图 10.7 例 10.6 的 窗 体 程 序 代 码 如 下 : Private Sub lststudent_click() If lststudent.listindex >= 0 Then lblresult.caption = lststudent.text & lststudent.itemdata(lststudent.listindex) & " 岁 " End If 3. 列 表 框 的 方 法 列 表 框 有 3 个 重 要 方 法, 用 于 在 程 序 中 动 态 地 更 新 列 表 项, 他 们 是 : (1)AddItem 方 法 : 功 能 : 向 列 表 框 添 加 列 表 项 语 法 :[ 列 表 框 ].AddItem 列 表 项 [, 索 引 号 ] 说 明 : 如 果 省 略 索 引 号, 表 示 在 列 表 框 的 尾 部 添 加 列 表 项 ; 否 则, 表 示 将 新 的 列 表 项 插 入 到 指 定 位 置 上 注 意, 索 引 号 的 取 值 范 围 为 0~ListCount-1 (2)RemoveItem 方 法 : 功 能 : 从 列 表 框 中 删 除 制 定 的 列 表 项 语 法 :[ 列 表 框 ].RemoveItem 索 引 号 (3)Clear 方 法 : 功 能 : 清 除 列 表 框 的 所 有 列 表 项 语 法 :[ 列 表 框 ].Clear 例 10.7 列 表 框 的 动 态 更 新 新 建 一 个 工 程, 添 加 窗 体 Form1, 再 添 加 必 要 控 件, 如 图 10.8 所 示 其 中 与 要 添 加 到 列 表 框 中 的 姓 名 和 年 龄 对 应 的 文 本 框 是 txtnamenew 和 txtagenew, 与 刚 删 除 的 列 表 项 对 应 的 姓

218 第 10 章 Visual Basic 的 常 用 控 件 205 名 和 年 龄 用 txtnamedel 和 txtagedel 表 示 两 个 命 令 按 钮 分 别 是 btnadd 和 btndel 列 表 框 的 Name 属 性 为 List1 程 序 运 行 时, 要 添 加 列 表 项, 首 先 输 入 姓 名 和 年 龄, 再 单 击 >> 按 钮 ; 要 删 除 某 列 表 项, 先 选 中 该 项, 再 单 击 << 按 钮 程 序 代 码 如 下 : Private Sub btnadd_click() List1.AddItem txtnamenew.text ' 在 列 表 框 最 后 添 加 列 表 项 List1.ItemData(List1.ListCount - 1) = txtagenew.text ' 修 改 最 后 一 项 的 ItemData Private Sub btndel_click() If List1.ListIndex >= 0 Then txtnamedel.text = List1.List(List1.ListIndex) ' 显 示 要 删 除 的 列 表 项 txtagedel.text = List1.ItemData(List1.ListIndex) List1.RemoveItem List1.ListIndex ' 删 除 选 中 的 列 表 项 End If 例 10.8 多 项 选 择 图 10.8 例 10.7 的 窗 体 新 建 一 个 工 程, 参 照 图 10.9 创 建 窗 体 Form1 主 要 控 件 的 属 性 设 置 如 下 : 图 10.9 例 10.8 的 窗 体

219 206 Visual Basic 程 序 设 计 教 程 txtname( 姓 名 ):Text="" label3( 结 果 ):Caption="",BorderStyle=1(Fix Single) List1( 爱 好 ):Style=1(Check Box),List= 唱 歌, 跳 舞, btnok( 确 定 按 钮 ):Caption= 确 定 (&O),Default=True 程 序 代 码 如 下 : Private Sub btnok_click() Dim i As Integer Dim b As Boolean Dim s As String b = False s = txtname.text & " 爱 好 " For i = 0 To List1.ListCount - 1 If List1.Selected(i) Then If b Then s = s & " " Else b = True End If s = s & List1.List(i) End If Next If b Then Label3.Caption = s Else Label3.Caption = "" 组 合 框 (ComboBox) 组 合 框 是 组 合 了 列 表 框 和 文 本 框 的 控 件, 允 许 在 文 本 框 中 输 入 和 编 辑 数 据, 也 可 以 在 列 表 框 中 选 择 数 据 组 合 框 控 件 既 具 有 与 列 表 框 相 似 的 属 性 和 方 法, 如 ListCount ItemData ListIndex 和 AddItem RemoveItem Clear 等, 也 同 时 具 有 与 文 本 框 相 似 的 属 性 和 方 法, 如 SelLength SelStart SelText Text 等 组 合 框 有 两 个 较 特 殊 的 属 性 : (1)Style 属 性 : Style 属 性 用 来 确 定 组 合 框 控 件 的 类 型 和 显 示 方 式, 有 3 种 取 值 : 1 0-DropDown Combo( 默 认 ), 为 下 拉 式 组 合 框, 由 一 个 文 本 框 和 一 个 下 拉 式 列 表 框 组 成, 用 户 可 以 在 文 本 框 中 输 入, 也 可 以 单 击 列 表 框 选 择 列 表 项 输 入 平 时, 该 组 合 框 只 显 示 文 本 框 和 右 端 的 箭 头, 因 而 占 用 较 少 的 屏 幕 空 间 2 1-Simple Combo, 为 简 单 组 合 框, 由 一 个 文 本 框 和 一 个 简 单 列 表 框 组 成, 列 表 框 一 直 显 示 在 屏 幕 上 使 用 方 法 与 下 拉 式 组 合 框 相 同

220 第 10 章 Visual Basic 的 常 用 控 件 Dropdown List, 为 下 拉 式 列 表 框, 形 式 上 与 下 拉 式 组 合 框 相 同, 但 用 户 不 能 在 文 本 框 中 输 入 或 编 辑, 只 能 在 列 表 框 中 选 择 (2)Locked 属 性 : 用 来 表 示 组 合 框 的 文 本 框 是 否 被 锁 定 若 为 True, 则 不 能 允 许 直 接 输 入 或 编 辑 例 10.9 学 习 成 绩 录 入 参 照 图 创 建 工 程 和 窗 体, 其 中 主 要 的 控 件 包 括 : 下 拉 式 列 表 框 comboname: 存 放 考 生 姓 名,Style 属 性 取 2,List 属 性 手 工 输 入 ( 参 照 创 建 列 表 框 一 节 ); 下 拉 式 组 合 框 combocourse: 存 放 课 程 名 称,List 属 性 在 程 序 运 行 时 动 态 建 立 ; 文 本 框 txtscore: 用 于 输 入 考 试 成 绩 ; 确 定 按 钮 btnok:caption 属 性 为 确 定 (&O) Default 属 性 取 True 程 序 运 行 时, 单 击 该 按 钮 可 以 将 新 出 现 的 课 程 名 称 添 加 到 列 表 中 ; 标 签 Label4: 用 于 在 单 击 确 定 按 钮 时 显 示 输 入 数 据 ; 退 出 按 钮 btnquit: 用 于 结 束 程 序 运 行 图 例 10.9 的 运 行 结 果 程 序 代 码 如 下 : Private Sub btnquit_click() End Private Sub btnok_click() Dim i As Integer Dim b As Boolean b = False For i = 0 To ComboCourse.ListCount - 1 ' 确 定 是 否 在 列 表 框 中 If ComboCourse.List(i) = ComboCourse.Text Then b = True: Exit For End If Next If Not b Then ComboCourse.AddItem ComboCourse.Text ' 添 加 到 列 表 框 中

221 208 Visual Basic 程 序 设 计 教 程 btnok Label4.Caption = comboname.text & " " & ComboCourse.Text & "" & txtscore.text 例 个 人 信 息 调 查 参 照 图 创 建 窗 体 Form1, 主 要 控 件 的 属 性 见 下 表 : btncancel 控 件 名 称 属 性 名 属 性 值 控 件 名 称 属 性 名 属 性 值 Caption 确 定 (&O) combofolk( 民 族 ) List 汉 族, Default True combofro( 籍 贯 ) List 北 京, Caption 取 消 (&C) comboapp( 综 合 测 评 ) List 优 秀, Cancel True chkdeg( 党 员 ) Caption 是 txtname Text "" comboeng( 外 语 ) List 英 语 四 级, List 1980, combocomp( 计 算 机 ) List 一 级, comboyear( 出 生 年 份 ) Style 2 chkspec( 爱 好, 数 组 ) Caption 唱 歌 optsex( 性 别, 数 组 ) Caption 男, 请 读 者 自 己 编 写 程 序 的 代 码 图 例 的 设 计 窗 体 10.4 滚 动 条 控 件 滚 动 条 控 件 有 两 种 : 水 平 滚 动 条 (HScrollBar) 和 垂 直 滚 动 条 (VScrollBar) 除 了 方 向 不 同 外, 两 种 控 件 的 属 性 方 法 事 件 和 使 用 方 法 完 全 相 同 滚 动 条 常 用 在 窗 口 中, 用 于 滚 动 窗 口 中 的 内 容 滚 动 条 由 滚 动 框 和 滚 动 箭 头 构 成, 图 显 示 了 一 个 水 平 滚 动 条

222 第 10 章 Visual Basic 的 常 用 控 件 209 滚 动 箭 头 滚 动 框 滚 动 箭 头 图 滚 动 条 的 组 成 滚 动 条 的 使 用 方 法 有 三 种 : (1) 拖 动 : 用 鼠 标 拖 动 滚 动 条 的 滚 动 框 ; (2) 单 击 滚 动 框 空 白 区 域, 可 以 快 速 滚 动 ; (3) 单 击 滚 动 箭 头, 可 以 一 步 步 地 慢 速 滚 动 1. 滚 动 条 的 属 性 (1)Min 属 性 和 Max 属 性 : 滚 动 条 常 用 来 表 示 一 个 变 化 范 围 通 常, 水 平 滚 动 条 的 值 从 左 向 右 递 增, 左 端 最 小 而 右 端 最 大, 而 垂 直 滚 动 条 的 值 自 上 而 下 递 增, 上 端 最 小 而 下 端 最 大 最 小 值 (Min) 和 最 大 值 (Max) 之 间 的 值 构 成 了 滚 动 条 所 代 表 的 取 值 范 围, 该 范 围 被 平 分 为 Max Min 个 相 同 的 间 隔 (2)Value 属 性 : Value 属 性 的 值 就 是 滚 动 条 的 当 前 值, 也 就 是 滚 动 框 的 位 置 (3)SmallChange 属 性 : 代 表 单 击 滚 动 条 上 的 滚 动 箭 头 时,Value 属 性 的 变 化 量 (4)LargeChange 属 性 : 代 表 单 击 滚 动 条 的 滚 动 箭 头 与 滚 动 框 之 间 的 空 白 时,Value 属 性 的 变 化 量 LargeChange 属 性 的 值 不 一 定 比 SmallChange 属 性 大 滚 动 框 的 大 小 由 滚 动 值 的 范 围 (Max Min) 和 LargeChange 属 性 的 值 共 同 决 定 2. 滚 动 条 的 事 件 滚 动 条 的 事 件 主 要 有 两 个 : (1)Change 事 件 : 单 击 滚 动 条 空 白 或 滚 动 箭 头, 或 者 释 放 滚 动 框 时 触 发 该 事 件, 可 用 来 得 到 滚 动 条 的 最 后 的 值 (2)Scroll 事 件 : 拖 动 滚 动 框 是 触 发, 常 用 来 跟 踪 滚 动 条 的 动 态 变 化 情 况 3. 应 用 举 例 容 易 看 出, 滚 动 条 不 仅 可 以 用 来 滚 动 屏 幕 内 容, 而 且 可 以 作 为 数 值 输 入 控 件, 由 于 操 作 方 便, 所 以 这 一 应 用 非 常 高 效 例 屏 幕 内 容 的 滚 动 新 建 一 个 工 程, 添 加 图 所 示 的 窗 体, 滚 动 条 HScroll 的 Max 设 为 10,Value 取 5, LargeChange 取 2

223 210 Visual Basic 程 序 设 计 教 程 图 例 的 窗 体 程 序 代 码 如 下 : Private Sub Form_Load() HScroll1.Value = 0 ' 将 触 发 Change 事 件 Private Sub HScroll1_Change() Label1.Left = HScroll1.Value * 200 例 颜 色 的 动 态 设 置 新 建 工 程 的 窗 体 Form1 如 图 所 示 其 中, 三 个 水 平 滚 动 条 组 成 控 件 数 组 hscolor, 对 于 每 一 个 滚 动 条,Max 属 性 设 置 为 255,LargeChange 属 性 设 为 5 三 个 文 本 框 构 成 控 件 数 组 txtcolor 在 窗 口 左 上 角 添 加 两 个 图 片 框 Picture1 和 Picture2, 分 别 演 示 当 前 颜 色 设 置 和 动 态 调 整 情 况 标 签 欢 迎 使 用 Visual Basic! 的 字 号 设 为 二 号 图 例 的 窗 体 Private Sub hscolor_change(index As Integer) txtcolor(index).text = hscolor(index).value Picture1.BackColor = RGB(hsColor(0).Value, hscolor(1).value, hscolor(2).value) Label1.ForeColor = Picture1.BackColor

224 第 10 章 Visual Basic 的 常 用 控 件 211 Private Sub hscolor_scroll(index As Integer) txtcolor(index).text = hscolor(index).value Picture2.BackColor = RGB(hsColor(0).Value, hscolor(1).value, hscolor(2).value) 说 明 :RGB 函 数 返 回 一 个 Long 整 数, 表 示 一 个 RGB 颜 色 值 RGB 函 数 的 语 法 是 : RGB( 红 色, 绿 色, 蓝 色 ) 其 中, 三 个 参 数 分 别 表 示 构 成 RGB 颜 色 的 红 绿 蓝 三 色, 参 数 的 取 值 范 围 是 0~255 运 行 例 时, 要 体 会 在 滚 动 条 的 不 同 用 法 下 程 序 的 执 行 情 况 10.5 计 时 器 控 件 计 时 器 (Timer) 控 件 用 于 每 隔 一 段 时 间 自 动 触 发 一 次 Timer 事 件, 可 以 有 规 律 地 重 复 执 行 一 段 程 序 计 时 器 控 件 必 须 依 附 在 窗 体 上, 但 只 在 设 计 时 可 见, 运 行 时 是 不 可 见 的, 因 此 可 以 将 计 时 器 控 件 安 放 在 窗 体 的 任 意 位 置 1. 计 时 器 的 属 性 除 了 Name 属 性 外, 计 时 器 还 有 两 个 重 要 的 属 性 :Enabled 和 Interval (1)Enabled 属 性 : 表 示 计 时 器 是 否 有 效 ( 是 否 触 发 Timer 事 件 ), 为 True 时, 计 时 器 被 激 活, 反 之, 停 止 计 时 (2)Interval 属 性 : 表 示 两 次 触 发 Timer 事 件 之 间 的 事 件 间 隔, 单 位 为 毫 秒 ( 千 分 之 一 秒 ) 若 Interval 属 性 的 值 为 n, 则 每 秒 将 触 发 1000/n 次 Timer 事 件 Interval 属 性 的 值 为 0 时, 计 时 器 无 效 2. 计 时 器 的 事 件 计 时 器 控 件 只 有 Timer 事 件 对 于 一 个 包 含 计 时 器 控 件 的 窗 体, 每 经 过 Interval 属 性 指 定 的 一 段 时 间, 就 产 生 一 个 Timer 事 件 计 时 器 控 件 有 比 较 广 泛 的 用 途, 比 如 模 拟 时 钟 秒 表, 制 作 动 画 等 例 一 个 简 单 的 动 画 在 窗 体 中 添 加 一 个 实 心 圆 Shape1( 可 以 看 作 一 个 球 ) 和 一 个 计 时 器 Timer1, 如 图 所 示 Timer1 的 Interval 属 性 设 为 200(0.2 秒 ) Shape1 的 Shape 属 性 取 3( 圆 ),FillStyle 属 性 取 0( 实 心 ),FillColor 属 性 取 &HFF( 红 色 ),BorderStyle 属 性 取 0( 透 明 ) 在 圆 的 下 面 画 一 条 直 线 表 示 地 面 图 例 的 设 计 窗 体

225 212 Visual Basic 程 序 设 计 教 程 程 序 演 示 了 一 个 球 在 地 面 随 风 跳 动 的 情 况 程 序 代 码 如 下 : Private b As Integer ' 用 来 控 制 球 的 高 度 Private Sub Form_Load() b = 1 Randomize Private Sub Timer1_Timer() i = Int(5 * Rnd) * 20 If i = 0 Then b = -b Shape1.Top = Shape1.Top * b ' 模 拟 跳 跃 形 态 Else Shape1.Left = Shape1.Left + I ' 随 意 滚 动 If Shape1.Left > Me.ScaleWidth Then Shape1.Left = Shape1.Left - Me.ScaleWidth End If 10.6 文 件 系 统 控 件 文 件 系 统 控 件 的 作 用 是 显 示 驱 动 器 目 录 和 文 件 的 有 关 信 息, 方 便 用 户 选 择 文 件 系 统 控 件 包 括 驱 动 器 列 表 框 (DriverListBox) 目 录 列 表 框 (DirListBox) 和 文 件 列 表 框 (FileListBox) 文 件 系 统 控 件 可 以 组 合 使 用, 也 可 以 单 独 使 用 驱 动 器 列 表 框 (DriverListBox) 驱 动 器 列 表 框 的 外 观 和 下 拉 式 列 表 框 相 似, 在 文 本 框 中 显 示 当 前 的 驱 动 器, 在 列 表 框 中 显 示 当 前 系 统 中 所 有 有 效 的 驱 动 器 可 以 通 过 单 击 列 表 框 中 的 驱 动 器 项 改 变 当 前 的 驱 动 器 驱 动 器 列 表 框 的 Driver 属 性 的 值 是 当 前 驱 动 器 的 名 称, 如 A: C: 等 该 属 性 不 能 在 设 计 时 设 置, 但 可 以 用 代 码 设 置, 语 法 为 : 驱 动 器 列 表 框.Driver [ = 驱 动 器 名 称 ] 如 果 驱 动 器 名 称 对 应 的 驱 动 器 不 存 在, 以 上 操 作 将 产 生 一 个 错 误 修 改 Driver 属 性 更 常 见 的 方 法 是 在 程 序 运 行 时, 从 驱 动 器 列 表 框 中 选 定 当 选 择 一 个 新 的 驱 动 器 时, 将 触 发 驱 动 器 列 表 框 的 Change 事 件 在 Change 事 件 中, 可 以 读 取 Driver 属 性 的 值 目 录 列 表 框 (DirListBox) 目 录 列 表 框 用 树 型 结 构 显 示 当 前 驱 动 器 上 的 目 录 结 构 该 控 件 的 外 观 与 列 表 框 类 似, 不 同 的 是 每 个 目 录 名 前 面 有 一 个 图 标, 可 以 反 映 目 录 的 状 态 ( 是 否 打 开 ), 而 且 子 目 录 相 对 上

226 第 10 章 Visual Basic 的 常 用 控 件 213 一 级 目 录 是 缩 进 的 可 以 用 目 录 列 表 框 的 Path 属 性 存 取 当 前 驱 动 器 的 当 前 目 录 如 果 需 要 改 变 当 前 目 录, 有 两 种 方 法 : (1) 在 程 序 代 码 中 设 置, 语 法 是 : 目 录 列 表 框.Path [ = 路 径 ] 路 径 字 符 串 的 格 式 是 :[ [ 驱 动 器 名 ] \ ] 目 录 名 [ \ 目 录 名 ] 例 如,dir1.Path="D:\VB" 将 D:\VB 设 置 为 当 前 目 录, 此 时 列 表 框 中 将 显 示 D:\VB 下 的 目 录 结 构 (2) 在 列 表 框 中, 通 过 双 击 某 目 录 将 其 设 置 为 当 前 目 录 当 目 录 列 表 框 的 Path 属 性 改 变 时, 将 触 发 Change 事 件 通 常, 使 用 驱 动 器 列 表 框 改 变 当 前 驱 动 器 时, 相 应 的 目 录 列 表 框 也 应 当 随 之 改 变, 显 示 当 前 驱 动 器 上 的 目 录 结 构 因 此, 应 该 为 驱 动 器 列 表 框 的 Change 事 件 添 加 修 改 目 录 列 表 框 的 Path 属 性 的 代 码, 以 达 到 同 步 显 示 的 目 的 方 法 是 将 驱 动 器 列 表 框 的 Driver 属 性 的 值 赋 给 目 录 列 表 框 的 Path 属 性 文 件 列 表 框 (FileListBox) 文 件 列 表 框 中 显 示 了 当 前 目 录 下 的 文 件 列 表, 外 观 与 标 准 列 表 框 相 似 文 件 列 表 框 有 三 个 较 特 殊 的 属 性 :Path 属 性 FileName 属 性 和 Pattern 属 性 1. Path 属 性 用 来 存 取 当 前 路 径, 与 目 录 列 表 框 的 Path 属 性 相 似 在 文 件 列 表 框 中, 不 能 显 式 地 改 变 Path 属 性 的 值, 因 此, 经 常 借 助 目 录 列 表 框 实 现 对 Path 属 性 的 修 改 2. FileName 属 性 用 来 存 取 文 件 列 表 框 中 被 选 定 的 文 件 名 存 取 FileName 属 性 的 语 法 为 : 文 件 列 表 框.FileName [ = 文 件 名 ] 设 置 FileName 属 性 时, 文 件 名 中 可 以 包 含 目 录 名 和 驱 动 器 名, 即 允 许 使 用 路 径 读 取 到 的 FileNmae 属 性 的 值 不 包 含 文 件 的 路 径 3. Pattern 属 性 Pattern 属 性 用 来 对 文 件 列 表 框 中 的 文 件 名 进 行 筛 选 默 认 情 况 下,Pattern 属 性 的 值 为 *.*, 即 不 筛 选, 显 示 所 有 文 件 可 以 在 设 计 时 或 代 码 中 设 置 Pattern 属 性 存 取 Pattern 属 性 的 语 法 为 : 文 件 列 表 框.Pattern [ = 格 式 字 符 串 ] 格 式 字 符 串 中 允 许 使 用 * 和? 通 配 符, 一 个 * 表 示 与 任 意 多 个 任 意 字 符 匹 配, 而 一 个? 只 能 匹 配 最 多 一 个 任 意 字 符 格 式 字 符 串 可 以 同 时 包 含 多 种 文 件 的 选 择, 如 要 同 时 显 示.jpg 文 件 和.bmp 文 件, 可 以 使 用 形 如 *.jpg;*.bmp 的 格 式 字 符 串, 用 ; 分 割 不 同 的 格 式 描 述 当 Pattern 属 性 改 变 时, 列 表 框 的 内 容 将 立 即 更 新 容 易 理 解, 文 件 列 表 框 中 所 列 的 文 件 名 与 Path 属 性 和 Pattern 属 性 有 关 例 显 示 当 前 目 录 下 的 图 片 文 件 列 表, 并 能 够 预 览 选 定 的 图 片

227 214 Visual Basic 程 序 设 计 教 程 参 照 图 创 建 一 个 工 程 和 窗 体, 参 照 表 10.9 设 置 控 件 的 属 性 程 序 代 码 如 下 : Private Sub dirlist_change() filelist.path = dirlist.path ' 设 置 当 前 目 录 Private Sub drvlist_change() dirlist.path = drvlist.drive ' 设 置 当 前 驱 动 器 图 例 的 设 计 窗 体 表 10.9 例 的 控 件 属 性 控 件 对 象 功 能 属 性 名 属 性 值 目 录 列 表 框 Name dirlist 驱 动 器 列 表 框 Name drvlist 文 件 列 表 框 Name filelist 文 本 框 文 件 类 型 Name txtfile ( 格 式 描 述 ) Text *.jpg;*.bmp 标 签 显 示 文 件 全 称 Name Label4 图 像 框 预 览 选 定 图 片 Name Stretch Image1 True Private Sub filelist_click() Dim s As String ' s 为 所 选 文 件 的 全 称 If Right(fileList.Path, 1) = "\" Then s = filelist.path & filelist.filename Else s = filelist.path & "\" & filelist.filename End If Label4.Caption = s

228 第 10 章 Visual Basic 的 常 用 控 件 215 If Right(s, 1) <> "\" Then Image1.Picture = LoadPicture(s) ' 显 示 图 片 Private Sub Form_Load() filelist.pattern = txtfile.text ' 初 始 化 文 件 列 表 框 Private Sub txtfile_lostfocus() filelist.pattern = txtfile.text ' 改 变 筛 选 条 件 10.7 其 他 控 件 OLE 控 件 对 象 链 接 与 嵌 入 (OLE) 技 术 是 在 面 向 对 象 思 想 下 发 展 起 来 的 一 种 数 据 交 换 技 术, 用 来 实 现 各 种 系 统 之 间 的 复 杂 的 数 据 交 换 在 Visual Basic 中, 可 以 使 用 OLE 技 术 实 现 应 用 程 序 与 其 他 软 件 ( 如 Word Excel 等 ) 的 无 缝 连 接, 从 而 极 大 地 扩 展 程 序 的 功 能 和 性 能 例 在 VB 程 序 中 使 用 Excel 表 格 程 序 设 计 步 骤 如 下 : (1) 创 建 工 程 和 窗 体 Form1; (2) 单 击 工 具 箱 中 的 OLE 控 件 工 具, 在 窗 体 Form1 上 拖 动 鼠 标 设 置 控 件 的 大 小 和 位 置, 释 放 鼠 标 后, 屏 幕 出 现 插 入 对 象 对 话 框, 如 图 所 示 ; 图 OLE 控 件 和 插 入 对 象 对 话 框 (3) 在 列 表 框 中 选 中 Microsoft Excel 工 作 表, 单 击 确 定 按 钮 ; (4) 窗 体 中 显 示 一 个 空 白 的 Excel 表 格, 在 表 格 中 输 入 部 分 数 据, 如 图 所 示 ;

229 216 Visual Basic 程 序 设 计 教 程 图 嵌 入 的 Excel 表 格 (5) 单 击 窗 体 的 空 白 区 域, 完 成 对 象 的 创 建 运 行 这 个 程 序 时, 在 OLE 控 件 上 双 击 鼠 标, 将 启 动 Excel, 如 图 所 示 可 以 看 到 窗 体 上 出 现 Excel 的 菜 单 和 工 具 图 例 的 程 序 运 行 情 况 ActiveX 控 件 ActiveX 控 件 以 前 叫 OLE 控 件, 也 可 以 说 是 从 OLE 控 件 发 展 来 的 ActiveX 控 件 是 Visual Basic 工 具 箱 的 扩 充 部 分 使 用 ActiveX 控 件 的 方 法 与 使 用 其 他 标 准 控 件 完 全 相 同 在 程 序 中 加 入 ActiveX 控 件 后, 它 将 成 为 开 发 和 运 行 环 境 的 一 部 分, 并 为 应 用 程 序 提 供 新 的 功 能 ActiveX 控 件 保 留 了 多 数 大 家 熟 悉 的 属 性 事 件 和 方 法, 这 样 就 保 证 代 码 的 一 致 性 同 时, ActiveX 控 件 增 强 或 增 加 了 部 分 属 性 和 方 法, 大 大 增 强 了 VB 的 编 程 能 力 例 一 个 小 型 动 画 程 序 创 建 一 个 标 准 EXE 工 程 并 添 加 一 个 窗 体 Form1, 单 击 工 程 菜 单 下 的 部 件 命 令, 在 控 件 列 表 框 中 选 中 Microsoft Windows Common Control-1 5.0, 单 击 确 定 按 钮, 此 时 工 具 箱 中 出 现 两 个 新 的 控 件 :Animation 控 件 和 UpDown 控 件 将 Animation 控 件 Animation1 添 加 到 窗 体 中 再 添 加 播 放 按 钮 Command1 和 停 止 按 钮 Command2 如 图 所 示

230 第 10 章 Visual Basic 的 常 用 控 件 217 图 例 的 设 计 窗 体 程 序 代 码 如 下 : Private Sub Command1_Click() Animation1.Play ' 播 放 动 画 Private Sub Command2_Click() Animation1.Stop ' 停 止 播 放 Private Sub Form_Load() Animation1.AutoPlay = False Animation1.Open ("c:\winnt\clock.avi") ' 打 开 动 画 文 件 Private Sub Form_Unload(Cancel As Integer) Animation1.Close ' 关 闭 动 画 文 件 习 题 1. 设 计 一 个 窗 体, 能 从 一 个 班 全 体 同 学 中 选 择 部 分 同 学 参 加 一 项 活 动, 如 图 所 示, 要 求 : 图 习 题 1 的 窗 体

231 218 Visual Basic 程 序 设 计 教 程 (1) 列 表 框 允 许 多 选 ; (2) 单 击 > 按 钮 将 左 边 列 表 框 中 选 中 的 若 干 同 学 移 到 右 边, 单 击 >> 按 钮 将 全 体 同 学 移 过 去 ; (3) 单 击 < 按 钮 将 右 边 列 表 框 中 选 中 的 同 学 移 到 左 边, 单 击 << 按 钮 移 动 全 部 同 学 ; (4) 单 击 确 定 按 钮 在 标 签 Label4 上 显 示 选 择 结 果 2. 对 于 习 题 1, 若 要 求 对 列 表 框 进 行 插 入 删 除 操 作 时, 不 改 变 同 学 的 前 后 次 序, 请 设 法 满 足 要 求 3. 编 程 模 拟 数 字 秒 表 窗 体 如 图 所 示, 窗 体 中 包 含 一 个 大 字 标 签, 用 来 显 示 时 间 计 时 开 始 前, 暂 停 / 继 续 按 钮 无 效, 按 启 动 按 钮 开 始 计 时, 同 时 暂 停 / 继 续 按 钮 变 为 有 效, 显 示 暂 停 字 样 若 单 击 暂 停 按 钮, 则 变 为 继 续 按 钮, 同 时 暂 停 计 时 ( 停 表 ); 再 单 击 继 续 按 钮, 变 回 暂 停 按 钮, 计 时 继 续 进 行 单 击 复 位 按 钮, 计 时 结 束, 暂 停 / 继 续 按 钮 变 为 无 效 图 数 字 秒 表 模 拟 4. 用 文 件 系 统 控 件 编 写 一 个 程 序 实 现 文 件 的 选 择 和 复 制 ( 将 选 定 的 若 干 文 件 复 制 到 指 定 的 目 录 中 ) 文 件 复 制 使 用 VB 的 FileCopy 语 句, 语 法 为 : FileCopy 原 文 件, 目 标 文 件 如 :FileCopy "C:\Readme.txt","A:\" 5. 在 窗 体 中 加 入 一 个 图 像 (image) 控 件, 并 加 载 一 个 图 片, 用 窗 体 上 的 水 平 滚 动 条 调 整 图 片 的 宽 度, 用 垂 直 滚 动 条 调 整 高 度

232 第 11 章 多 重 窗 体 程 序 设 计 11.1 概 述 前 面 所 接 触 的 程 序 大 多 比 较 简 单, 每 个 程 序 只 包 含 一 个 窗 体, 程 序 的 所 有 代 码 都 包 含 在 该 窗 体 模 块 中 当 应 用 程 序 庞 大 复 杂 时, 就 要 增 加 窗 体 实 际 上, 多 数 应 用 程 序 往 往 都 包 含 许 多 窗 体, 每 个 窗 体 都 有 自 己 的 代 码, 这 就 是 多 重 窗 体 程 序 随 着 程 序 的 进 一 步 复 杂 化, 会 发 现 有 许 多 在 几 个 窗 体 中 都 有 要 执 行 的 公 共 代 码, 为 了 避 免 在 两 个 窗 体 中 重 复 代 码, 就 需 要 创 建 一 些 独 立 模 块, 用 来 包 含 这 些 公 共 代 码, 这 就 是 标 准 模 块 如 果 需 要 共 享 的 是 一 些 对 象, 就 需 要 将 对 象 编 码 独 立 出 来, 这 就 是 类 模 块 窗 体 是 Visual Basic 程 序 的 三 类 模 块 中 的 一 种, 多 重 窗 体 程 序 设 计 问 题 实 际 就 是 多 模 块 的 程 序 设 计 问 题 多 重 窗 体 程 序 可 以 包 含 若 干 不 同 的 窗 体, 每 个 窗 体 的 设 计 方 法 与 单 窗 体 程 序 没 有 什 么 不 同, 关 键 是 要 解 决 不 同 窗 体 之 间 的 衔 接 和 窗 体 的 显 示 关 闭 等 问 题 创 建 多 重 窗 体 程 序 的 工 程 和 第 一 个 窗 体 的 方 法 与 单 窗 体 程 序 相 同, 其 他 窗 体 需 要 一 个 一 个 地 添 加 到 工 程 中, 方 法 是 执 行 工 程 菜 单 下 的 添 加 窗 体 命 令, 或 单 击 标 准 工 具 栏 的 添 加 窗 体 工 具 按 钮, 新 添 加 的 窗 体 的 名 称 (Name 属 性 ) 为 FormX(X 为 1, 2,3, ) 对 于 多 重 窗 体 程 序, 窗 体 名 称 是 一 个 常 用 的 属 性, 为 便 于 理 解 和 记 忆, 最 好 将 窗 体 名 称 改 为 有 意 义 的 名 字, 如 frmlogin 代 表 用 户 登 录 窗 体,frmMain 是 主 窗 体 等 在 窗 体 的 代 码 中, 可 以 使 用 Me 关 键 字 代 表 当 前 窗 体 的 名 称, 例 如 : Private Sub Form_Load() Me.BackColor = &H00007F7F& 这 里 Me 代 表 当 前 窗 体 模 块, 而 不 管 它 有 什 么 名 称 11.2 与 窗 体 有 关 的 语 句 和 方 法 Visual Basic 工 程 的 启 动 窗 体 可 以 在 启 动 程 序 后 自 动 打 开 并 显 示 在 屏 幕 上, 但 每 个 工 程 最 多 只 能 有 一 个 启 动 窗 体 对 于 多 重 窗 体 程 序, 缺 省 情 况 下, 创 建 的 第 一 个 窗 体 被 指 定 为 启 动 窗 体 要 指 定 其 他 窗 体 作 为 启 动 窗 体, 可 以 单 击 工 程 菜 单 下 的 工 程 x 属 性 命 令, 显 示 图 11.1 所 示 的 对 话 框, 在 启 动 对 象 列 表 框 中 选 择

233 220 Visual Basic 程 序 设 计 教 程 图 11.1 工 程 属 性 对 话 框 除 了 启 动 窗 体 外 的 其 他 窗 体 可 以 在 程 序 代 码 中 使 用 窗 体 的 方 法 来 打 开 窗 体 的 加 载 和 卸 载 1. Load 语 句 功 能 : 加 载 指 定 窗 体, 即 在 内 存 中 创 建 该 窗 体, 但 不 显 示 在 屏 幕 上 语 法 :Load 窗 体 名 称 说 明 : 加 载 窗 体 后, 该 窗 体 中 的 所 有 控 件 已 经 建 立 起 来 了, 窗 体 的 Load 事 件 已 被 触 发 2. Unload 语 句 功 能 : 卸 载 指 定 的 窗 体, 即 释 放 窗 体 所 占 内 存 语 法 :Unload 窗 体 名 称 说 明 : 与 Load 语 句 相 反, 不 论 指 定 的 窗 体 是 显 示 在 屏 幕 上 还 是 被 隐 藏 了,Unload 语 句 都 将 从 内 存 中 清 除 该 窗 体, 之 后 该 窗 体 就 不 再 存 在 了 窗 体 的 常 用 方 法 1. Show 方 法 功 能 : 将 指 定 的 窗 体 显 示 出 来 语 法 :[ 窗 体 名 称 ].Show [ 模 式 ] 说 明 : (1) 如 果 省 略 了 窗 体 名 称, 将 显 示 当 前 窗 体 (2)Show 方 法 兼 具 Load 语 句 的 功 能, 如 果 要 显 示 的 窗 体 没 有 加 载 到 内 存 中,Show 方 法 可 以 自 动 加 载 否 则, 直 接 将 已 加 载 的 窗 体 显 示 出 来 (3)Show 方 法 的 模 式 参 数 是 可 选 的, 取 值 为 0 或 1 如 果 模 式 参 数 的 值 为 1-vbModal, 所 显 示 的 窗 体 是 模 态 型 的, 此 时, 除 了 该 窗 体 外 其 他 窗 体 已 被 屏 蔽, 不 接 受 键 盘 或 鼠 标 操 作, 除 非 关 闭 该 窗 口 模 态 型 窗 体 类 似 Windows 程 序 中 的 模 式 对 话 框 如 果 模 式 参 数 的 值 为 0-vbModaless, 所 显 示 的 窗 体 是 非 模 态 型 的, 允 许 在 不 关 闭 该 窗 体 的 情 况 下

234 第 11 章 多 重 窗 体 程 序 设 计 221 操 作 其 他 窗 体 非 模 态 型 窗 体 类 似 Windows 程 序 中 的 无 模 式 对 话 框, 如 Word 中 的 查 找 / 替 换 对 话 框 等 如 果 省 略 模 式 参 数, 取 默 认 值 0-vbModaless 2. Hide 方 法 功 能 : 隐 藏 指 定 的 窗 体 语 法 :[ 窗 体 名 称 ].Hide 说 明 : 窗 体 被 隐 藏 后 并 没 有 从 内 存 中 消 失,Hide 方 法 不 会 触 发 Unload 事 件 容 易 理 解, Unload 语 句 兼 具 Hide 方 法 的 功 能 例 11.1 窗 体 的 显 示 模 式 程 序 包 含 两 个 窗 体, 窗 体 Form1 如 图 11.2(a) 所 示, 其 中 包 含 3 个 命 令 按 钮 : 模 态 方 式 按 钮 btnmodal 非 模 态 方 式 按 钮 btnmudaless 和 退 出 程 序 按 钮 btnexit, 程 序 代 码 为 : Private Sub btnexit_click() End ' 关 闭 所 有 窗 体, 退 出 程 序 Private Sub btnmodal_click() Form2.Show 1 ' 模 态 方 式 显 示 Private Sub btnmodaless_click() Form2.Show ' 非 模 态 方 式 显 示 Private Sub Form_Load() Load Form2 ' 同 时 装 载 Form2 窗 体, 但 不 显 示 Form2 Private Sub Form_Unload(Cancel As Integer) Unload Form2 ' 同 时 卸 载 Form2 窗 体 (a) Form1 (b) Frorm2 图 11.2 例 11.1 的 窗 体 窗 体 Form2 中 包 含 一 个 命 令 按 钮 Command1, 如 图 11.2(b) 所 示, 代 码 为 : Private Sub Command1_Click()

235 222 Visual Basic 程 序 设 计 教 程 Me.Hide ' 隐 藏 当 前 窗 体 11.3 多 重 窗 体 程 序 设 计 方 法 多 重 窗 体 程 序 相 对 比 较 复 杂, 设 计 程 序 时 需 要 采 用 适 当 的 方 法, 可 以 参 照 以 下 步 骤 进 行 : 1. 问 题 分 析 对 欲 求 解 问 题 进 行 详 细 全 面 的 分 析 是 程 序 设 计 的 基 础, 良 好 的 分 析 可 以 减 少 或 避 免 在 程 序 设 计 中 出 现 的 错 误, 提 高 设 计 效 率 养 成 分 析 的 习 惯 对 于 学 习 程 序 设 计 也 非 常 重 要 问 题 分 析 就 是 要 弄 清 问 题 的 关 键 和 本 质, 了 解 问 题 的 定 义 和 条 件, 并 由 此 确 定 程 序 的 功 能 和 性 能, 确 定 程 序 的 接 口, 即 输 入 和 输 出 数 据 的 组 成 和 作 用, 确 定 问 题 的 求 解 方 法, 即 算 法 方 案 问 题 分 析 的 目 标 是 要 建 立 问 题 的 逻 辑 模 型, 即 问 题 模 型, 明 确 程 序 要 做 什 么 2. 模 块 设 计 在 问 题 分 析 的 基 础 上, 结 合 程 序 设 计 方 法, 将 程 序 的 功 能 描 述 转 化 为 系 统 结 构 描 述, 按 功 能 划 分 模 块, 确 定 模 块 之 间 的 关 系, 建 立 程 序 的 逻 辑 模 型 3. 界 面 设 计 根 据 程 序 模 块 的 功 能 接 口 和 人 类 习 惯, 设 计 程 序 的 界 面, 即 设 计 窗 体, 从 问 题 模 型 和 逻 辑 模 型 导 出 模 块 间 的 调 用 关 系, 确 定 窗 口 的 流 向 4. 算 法 设 计 在 模 块 设 计 和 界 面 设 计 的 基 础 上, 确 定 数 据 的 处 理 方 法 和 条 件, 进 行 算 法 设 计, 并 用 算 法 语 言 描 述 算 法 5. 编 码 将 算 法 描 述 转 化 为 程 序 设 计 语 言 (Visual Basic) 描 述, 即 程 序 编 码 6. 程 序 调 试 和 测 试 对 已 完 成 编 码 的 程 序, 要 进 行 仔 细 的 调 试, 发 现 并 修 正 所 有 错 误 然 而, 程 序 调 通 了, 可 以 运 行 了, 还 不 能 说 明 程 序 就 没 有 错 误 了, 因 为 还 可 能 存 在 语 义 错 误 或 逻 辑 错 误, 还 需 要 进 行 程 序 运 行 测 试 调 试 的 目 的 是 发 现 程 序 中 的 语 法 错 误, 而 测 试 则 是 要 发 现 程 序 的 逻 辑 错 误 正 确 方 法 是 程 序 测 试 的 关 键, 通 常 选 择 程 序 或 者 问 题 的 典 型 数 据 而 不 是 常 规 数 据, 输 入 程 序 并 检 验 运 行 结 果 程 序 测 试 需 要 经 验 的 积 累, 因 此 初 学 者 要 注 意 记 录 和 总 结 例 11.2 信 息 发 布 程 序 (1) 问 题 分 析 : 该 程 序 要 满 足 两 个 要 求 : 1 只 有 合 法 用 户 才 能 发 布 信 息 ; 2 所 发 布 的 信 息 直 接 显 示 在 屏 幕 上 (2) 模 块 划 分 : 程 序 包 含 两 个 模 块 : 信 息 发 布 模 块 和 用 户 身 份 验 证 模 块 通 常, 用 户 身 份 由 用 户 名 和 用

236 第 11 章 多 重 窗 体 程 序 设 计 223 户 密 码 决 定 (3) 窗 体 设 计 : 程 序 包 含 一 个 主 窗 体 frmmain 和 一 个 用 户 登 录 窗 体 frmlogin, 如 图 11.3 所 示 程 序 启 动 后 直 接 进 入 frmmain 窗 体, 但 由 于 用 户 没 有 登 录, 窗 体 中 的 消 息 文 本 框 txtmsg 和 发 布 命 令 按 钮 btnsend 都 是 不 可 用 的 在 frmmain 窗 体 中, 单 击 登 录 按 钮 btnlogin, 可 打 开 frmlogin 窗 体 在 frmlogin 窗 体 中, 分 别 在 文 本 框 txtname 和 txtpassword 中 输 入 用 户 名 VB 和 密 码 123, 再 单 击 登 录 按 钮 btnlogin 完 成 登 录, 即 关 闭 frmlogin 窗 体, 回 到 frmmain 窗 体, 并 激 活 消 息 框 和 发 布 按 钮 (a)frmmain 窗 体 (b)frmlogin 窗 体 图 11.3 例 11.2 的 窗 体 窗 体 中 部 分 控 件 属 性 见 下 表 : 窗 体 名 称 控 件 名 称 属 性 名 称 属 性 值 txtmsg Text "" MultiLine True frmmain btnuserlogin Caption " 登 陆 (&L)" btnsend Caption " 发 布 (&S)" btnexit Caption " 退 出 (&X)" txtusername Text "" txtpassword Text "" PasswordChar "*" frmlogin Caption " 登 录 (&O)" btnlogin Default True btncancel Caption " 取 消 (&C)" Cancel True 说 明 : 文 本 框 txtpassword 的 PasswordChar 属 性 用 来 屏 蔽 输 入 的 字 符, 每 输 入 一 个 字 符 显 示 一 个 *, 起 到 保 护 密 码 的 作 用 frmmain 窗 体 的 代 码 如 下 : Private UserName As String ' 模 块 级 私 有 变 量, 存 放 用 户 名 Private Sub btnexit_click()

237 224 Visual Basic 程 序 设 计 教 程 End ' 结 束 程 序 Private Sub btnsend_click() MsgBox txtmsg.text, vbokonly + vbinformation, UserName ' 在 屏 幕 上 显 示 信 息 Private Sub btnuserlogin_click() frmlogin.show ' 打 开 并 显 示 用 户 登 录 窗 口 Private Sub Form_Load() SetUser "" ' 初 始 化, 无 用 户 登 录 Public Sub SetUser(s As String) ' 公 用 过 程, 可 以 被 其 他 模 块 调 用 If s <> "" Then txtmsg.enabled = True btnsend.enabled = True UserName = s Else txtmsg.enabled = False btnsend.enabled = False End If 说 明 : 1 第 一 行 定 义 了 一 个 窗 体 级 变 量 UserName, 它 是 Private 型 的, 只 能 在 窗 体 frmmain 的 方 法 中 使 用 2 窗 体 过 程 SetUser 被 定 义 为 Public 型, 允 许 在 其 他 窗 体 的 代 码 中 通 过 frmmain.setuser 的 方 式 调 用 frmlogin 窗 体 的 代 码 如 下 : Private Sub btncancel_click() Unload Me ' 卸 载 当 前 窗 体 Private Sub btnlogin_click() ' 验 证 用 户 名 和 密 码 If txtname.text = "VB" And txtpassword.text = "123" Then frmmain.setuser txtname.text ' 调 用 frmmain 窗 体 的 公 共 方 法 Unload Me ' 卸 载 当 前 窗 口 Else MsgBox " 用 户 非 法!", vbokonly + vbexclamation, " 警 告 " ' End If

238 第 11 章 多 重 窗 体 程 序 设 计 225 Private Sub Form_Load() Left = (Screen.Width - Width) / 2 Top = (Screen.Height - Height) / 2 ' 窗 体 显 示 在 屏 幕 中 央 ' Screen 为 VB 的 系 统 对 象 之 一, 代 表 屏 幕 11.4 MDI 界 面 设 计 现 代 计 算 机 程 序 的 功 能 越 来 越 强 大, 所 处 理 的 数 据 的 规 模 类 型 也 增 加 了 许 多, 如 何 方 便 高 效 地 进 行 人 机 交 互 是 程 序 设 计 的 一 项 重 要 内 容 界 面 设 计 的 目 的 就 是 确 定 程 序 的 人 机 交 互 界 面, 体 现 以 人 为 本 的 原 则 对 于 Visual Basic, 界 面 设 计 主 要 是 指 窗 体 的 构 成 和 样 式, 还 包 括 窗 体 的 呈 现 方 式 一 致 性 等 程 序 的 用 户 界 面 样 式 主 要 有 三 种 :SDI 界 面 MDI 界 面 和 资 源 管 理 器 界 面 1. SDI 界 面 SDI 界 面 是 单 文 档 界 面, 指 在 程 序 中 每 次 只 能 打 开 一 个 文 档, 要 打 开 其 他 文 档, 必 须 先 关 闭 已 打 开 的 文 档, 例 如,Windows 的 记 事 本 程 序 就 是 SDI 界 面 对 于 具 有 SDI 界 面 的 程 序, 不 能 将 一 个 窗 体 包 含 在 另 一 个 窗 体 中, 每 个 窗 体 都 可 以 在 屏 幕 上 任 意 移 动 要 退 出 程 序, 必 须 关 闭 所 有 打 开 的 窗 体 在 本 书 中 介 绍 的 大 多 数 程 序 都 是 SDI 界 面 的 2. MDI 界 面 MDI 界 面 是 多 文 档 界 面, 在 程 序 中 可 以 同 时 打 开 多 个 文 档 MDI 界 面 程 序 具 有 一 个 父 窗 体 MDI 窗 体, 每 打 开 一 个 文 档 将 打 开 一 个 子 窗 体 文 档 窗 体, 子 窗 体 包 含 在 父 窗 体 中 父 窗 体 为 所 有 子 窗 体 提 供 工 作 空 间, 子 窗 体 只 能 在 父 窗 体 中 移 动, 不 能 超 出 父 窗 体 的 工 作 区 域 限 制 当 父 窗 体 最 小 化 时, 所 有 子 窗 体 也 被 最 小 化, 任 务 栏 中 只 显 示 父 窗 体 的 图 标 如 果 关 闭 父 窗 体, 所 有 打 开 的 子 窗 体 都 将 被 关 闭 MDI 窗 体 类 似 于 具 有 一 个 限 制 条 件 的 普 通 窗 体 除 非 控 件 具 有 Align 属 性 ( 如 PictureBox 控 件 ) 或 者 具 有 不 可 见 界 面 ( 如 Timer 控 件 ), 不 能 将 控 件 直 接 放 置 在 MDI 窗 体 上 每 个 程 序 只 能 有 一 个 MDI 窗 体 子 窗 体 是 MDIChild 属 性 为 True 的 普 通 窗 体 一 个 应 用 程 序 可 以 包 含 许 多 相 似 或 者 不 同 样 式 的 子 窗 体, 也 可 以 同 时 包 含 若 干 普 通 窗 体, 通 常 MDI 界 面 的 程 序 中 普 通 窗 体 为 模 式 对 话 框 Microsoft Word 等 程 序 是 MDI 界 面 的 3. 资 源 管 理 器 界 面 目 前, 资 源 管 理 器 界 面 非 常 流 行, 如 Windows 的 资 源 管 理 器 程 序 该 界 面 包 括 两 个 窗 格 或 区 域, 通 常 左 边 是 一 个 树 型 的 或 层 次 型 的 窗 格, 右 边 是 一 个 显 示 区, 显 示 与 左 边 窗 格 中 选 中 的 项 目 对 应 的 内 容 下 面 的 例 子 简 单 说 明 了 Visual Basic 中 设 计 MDI 界 面 程 序 的 方 法 例 11.3 将 例 11.2 的 程 序 改 为 采 用 MDI 界 面

239 226 Visual Basic 程 序 设 计 教 程 (1) 打 开 例 11.2 的 工 程 ; (2) 单 击 工 程 菜 单 下 的 添 加 MDI 窗 体 命 令, 在 工 程 中 添 加 一 个 MDI 窗 体 MDIform1; (3) 打 开 frmmain 窗 体, 将 MDIChild 属 性 设 置 为 True( 表 示 它 是 MDI 窗 体 的 子 窗 体 ); (4) 运 行 程 序, 适 当 调 整 各 窗 体 的 大 小, 结 果 如 图 11.4 所 示 图 11.4 例 11.3 的 运 行 情 况 请 思 考 一 个 问 题, 目 前 该 工 程 的 启 动 对 象 设 置 为 frmmain 窗 体, 如 果 改 为 MDIForm1 窗 体, 结 果 会 怎 样? 该 如 何 修 改 程 序? 另 外, 程 序 运 行 时, 请 注 意 观 察 任 务 栏 的 情 况, 以 及 移 动 窗 体 和 最 大 化 最 小 化 窗 体 时 情 况, 体 会 MDI 界 面 的 特 点 11.5 标 准 模 块 与 Sub Main 过 程 通 常,Visual Basic 程 序 从 设 计 时 创 建 的 第 一 个 窗 体 开 始 执 行, 程 序 的 初 始 化 可 以 放 到 该 窗 体 的 Form_Load 事 件 过 程 中 如 果 需 要 在 加 载 任 何 窗 体 以 前 进 行 程 序 的 初 始 化, 可 以 把 初 始 化 代 码 放 到 标 准 模 块 的 Sub Main 过 程 中, 然 后 指 定 工 程 的 启 动 对 象 为 Sub Main 过 程 ( 参 见 11.1 节 ) Sub Main 过 程 必 须 在 标 准 模 块 中 建 立, 而 不 能 包 含 在 窗 体 模 块 中 创 建 Sub Main 过 程 的 方 法 是 : (1) 单 击 工 程 菜 单 下 的 添 加 模 块 命 令, 为 当 前 工 程 添 加 一 个 标 准 模 块,Visual Basic 为 标 准 模 块 提 供 的 缺 省 名 称 是 ModuleX(X 为 1,2,3, ); (2) 打 开 标 准 模 块 的 代 码 编 辑 窗 口, 在 所 有 过 程 的 外 部 输 入 Sub Main 后 按 回 车 键, 则 产 生 对 Sub Main 过 程 的 声 明 : Sub Main() (3) 为 Sub Main 过 程 编 写 代 码 每 个 工 程 可 以 包 含 若 干 标 准 模 块, 但 最 多 只 能 有 一 个 Sub Main 过 程 除 了 窗 体 模 块, 工 程 的 启 动 对 象 还 可 以 是 Sub Main 过 程, 但 不 能 是 一 个 标 准 模 块 或 其 他 过 程

240 第 11 章 多 重 窗 体 程 序 设 计 227 在 Sub Main 过 程 中, 通 常 包 含 程 序 的 初 始 化 代 码, 如 全 局 变 量 的 初 始 化 等, 还 可 以 用 于 在 启 动 程 序 的 主 窗 体 前 显 示 一 个 快 速 提 示 窗 体 许 多 大 型 程 序 的 启 动 时 间 相 对 较 长, 如 Visual Basic Word Photoshop 等, 常 在 主 窗 口 完 全 显 示 出 来 以 前 显 示 一 个 快 速 提 示 窗 口, 以 给 人 一 种 程 序 启 动 很 快 的 错 觉 例 11.4 快 速 提 示 窗 体 设 计 (1) 新 建 一 个 工 程 并 创 建 窗 体 Form1, 在 Form1 中 添 加 一 个 退 出 按 钮 Command1 窗 体 的 代 码 为 : Private Sub Command1_Click() End ' 退 出 程 序 Private Sub Form_Load() Dim x As Double x = Timer + 10# ' Timer 函 数 返 回 从 午 夜 开 始 到 现 在 经 过 的 秒 数 while x > Timer ' 延 迟 10 秒 DoEvents ' 将 控 制 交 给 操 作 系 统, 以 便 显 示 完 整 的 窗 体 Wend (2) 再 添 加 一 个 窗 体 Form2 作 为 快 速 提 示 窗 体, 如 图 11.5 所 示, 窗 体 的 BorderStyle 属 性 设 置 为 0-None; 图 11.5 例 11.4 的 Form2 窗 体 该 窗 体 代 码 为 : Private Sub Form_Load() Left = (Screen.Width - Width) / 2 ' 窗 体 显 示 在 屏 幕 中 央 Top = (Screen.Height - Height) / 2 (3) 再 添 加 一 个 标 准 模 块, 代 码 为 : Sub main( ) Form2.Show ' 显 示 快 速 提 示 窗 体 Form1.Show ' 打 开 主 窗 体 Unload Form2 ' 关 闭 快 速 提 示 窗 体 (4) 最 后 将 工 程 的 启 动 对 象 设 置 为 Sub Main

241 228 Visual Basic 程 序 设 计 教 程 11.6 闲 置 循 环 与 DoEvents 语 句 MS Windows 是 多 任 务 操 作 系 统, 采 用 分 时 方 式 允 许 同 时 运 行 多 个 程 序 但 是, 到 目 前 为 止 我 们 所 接 触 的 Visual Basic 程 序 似 乎 并 不 这 样, 同 一 程 序 的 不 同 过 程 似 乎 不 能 同 时 运 行, 为 什 么 会 这 样 呢? 难 道 Visual Basic 不 支 持 多 任 务? 答 案 自 然 是 否 定 的 Visual Basic 是 事 件 驱 动 的, 通 常, 只 有 当 事 件 发 生 时 才 执 行 相 应 的 程 序 代 码 如 果 程 序 运 行 时 未 发 生 任 何 事 件, 或 者 虽 然 有 事 件 发 生, 但 并 没 有 编 写 该 事 件 过 程, 程 序 将 处 于 闲 置 (Idle) 状 态, 就 像 什 么 也 没 发 生 一 样, 此 时 程 序 可 以 响 应 任 何 事 件 另 一 方 面, 一 旦 开 始 执 行 某 一 过 程 ( 或 函 数 ), 程 序 将 停 止 对 其 他 事 件 的 响 应, 就 像 非 常 忙 碌 (Busy) 一 样, 直 到 结 束 该 过 程 ( 或 函 数 ) 在 程 序 忙 碌 状 态 发 生 的 事 件 将 存 放 在 事 件 队 列 中, 等 待 处 理 因 此, 程 序 的 执 行 好 像 是 顺 序 的 为 了 实 现 程 序 的 并 行 执 行,Visual Basic 提 供 了 闲 置 循 环 和 DoEvents 语 句 程 序 中 最 耗 时 的 是 循 环 所 谓 闲 置 循 环 是 指 能 暂 时 回 到 闲 置 状 态 的 循 环, 也 就 是 说 程 序 执 行 这 一 循 环 时, 可 以 暂 时 从 忙 碌 状 态 回 到 闲 置 状 态, 将 控 制 权 交 给 操 作 系 统, 以 便 处 理 其 他 事 件, 操 作 系 统 处 理 完 事 件 队 列 中 的 事 件 后, 再 把 控 制 权 交 回 程 序, 继 续 执 行 该 循 环 这 样, 就 实 现 了 多 任 务 的 并 行 执 行 在 Visual Basic 中, 通 过 在 循 环 中 使 用 DoEvents 语 句, 实 现 闲 置 循 环 DoEvents 既 可 以 作 为 语 句, 也 可 以 作 为 函 数, 语 法 为 : DoEvents [ ( ) ] DoEvents 函 数 的 返 回 值 是 一 个 整 数, 代 表 当 前 程 序 所 打 开 的 窗 体 数 更 一 般 地,DoEvents 作 为 语 句 使 用 例 11.5 判 断 任 一 整 数 是 否 是 素 数 为 了 演 示 DoEvents 语 句, 这 里 采 用 最 原 始 的 算 法 程 序 只 有 一 个 窗 体 Form1, 如 图 11.6 所 示, 其 中 包 含 一 个 文 本 框 Text1, 确 定 按 钮 btnok 和 退 出 按 钮 btnquit 图 11.6 例 11.5 的 窗 体 程 序 代 码 如 下 : Private Sub btnok_click() Dim x As Long, i As Long If IsNumeric(Text1.Text) Then

242 第 11 章 多 重 窗 体 程 序 设 计 229 x = CLng(Text1.Text) For i = 2 To x - 1 If x Mod i = 0 Then Exit For End If Debug.Print i; ' 用 来 观 察 程 序 的 运 行 状 态 If i Mod 500 Then DoEvents ' 闲 置 循 环 Next If i < x Then MsgBox x & " 是 素 数!" Else MsgBox x & " 不 是 素 数!" End If Else MsgBox " 请 输 入 一 个 正 整 数 " End If Private Sub btnquit_click() End ' 不 论 其 他 过 程 是 否 都 已 结 束, 强 行 结 束 程 序 运 行 为 了 观 察 DoEvents 语 句 的 运 行 情 况, 输 入 一 个 较 大 的 素 数, 比 如 , 单 击 确 定 按 钮, 然 后 再 点 击 文 本 框 输 入 一 个 较 小 的 数, 如 9, 再 单 击 确 定 按 钮, 观 察 调 试 窗 口 的 显 示 情 况 需 要 注 意 的 是, 应 当 避 免 闲 置 循 环 的 重 入, 也 就 是 说 上 面 这 种 用 法 是 不 合 适 的 下 面 是 修 正 后 的 程 序 代 码 : Dim bidle As Boolean ' 标 志 变 量, 表 示 是 否 已 进 入 闲 置 循 环 Private Sub btnok_click() Dim x As Long, i As Long If bidle Then ' 该 过 程 包 含 闲 置 循 环, 不 能 重 入 MsgBox " 非 法 操 作!" Exit Sub End If bidle = True ' 设 置 标 志 If IsNumeric(Text1.Text) Then x = CLng(Text1.Text) For i = 2 To x - 1 If x Mod i = 0 Then Exit For End If

243 230 Visual Basic 程 序 设 计 教 程 Debug.Print i; If i Mod 500 Then DoEvents Next If i < x Then MsgBox x & " 是 素 数!" Else MsgBox x & " 不 是 素 数!" End If Else MsgBox " 请 输 入 一 个 正 整 数 " End If bidle = False ' 清 除 标 志 Private Sub btnquit_click() End Private Sub Form_Load() bidle = False ' 初 始 化 标 志 变 量 习 题 1. 某 程 序 运 行 时, 根 据 当 时 的 时 间 是 上 午 还 是 下 午, 打 开 的 第 一 个 窗 体 不 同, 比 如 若 在 上 午 启 动 程 序 显 示 用 户 登 录 窗 体, 下 午 则 打 开 标 有 暂 停 使 用 字 样 的 警 告 窗 体 试 编 程 实 现 2. 要 将 在 某 窗 体 中 输 入 的 数 据 传 递 到 另 一 个 窗 体 的 控 件 中, 如 把 在 登 录 窗 体 输 入 的 用 户 名 传 到 信 息 发 布 窗 体 的 发 布 者 文 本 框 中, 如 何 实 现? 3. 模 仿 Windows 的 打 印 机 管 理 的 添 加 打 印 机 过 程 编 程 实 现 向 导 程 序, 每 个 窗 体 包 含 上 一 步 下 一 步 确 定 退 出 等 按 钮 和 其 他 控 件, 包 括 以 下 窗 体 : (1) 欢 迎 窗 体 : 显 示 使 用 说 明 和 注 意 事 项 等, 内 容 自 定 ; (2) 用 户 窗 体 : 包 括 用 户 姓 名 单 位 名 称 联 系 电 话 等 文 本 框, 要 求 用 户 必 须 输 入 ; (3) 资 料 窗 体 : 包 括 出 生 年 月 通 信 地 址 自 我 介 绍 等, 由 用 户 选 择 输 入 ; (4) 结 果 窗 体 : 显 示 用 户 输 入 的 各 种 信 息

244 第 12 章 菜 单 设 计 大 家 经 常 使 用 的 程 序 中 绝 大 多 数 都 会 有 菜 单, 有 的 程 序 还 有 工 具 栏, 这 一 章 学 习 菜 单 和 工 具 栏 的 设 计 方 法 12.1 与 菜 单 有 关 的 概 念 菜 单 是 应 用 程 序 的 一 个 重 要 组 成 部 分, 是 应 用 程 序 的 系 统 功 能 的 集 中 体 现, 是 用 户 进 行 各 种 操 作 的 重 要 工 具 大 多 数 应 用 程 序 都 有 菜 单, 几 乎 所 有 的 操 作 都 可 以 通 过 程 序 窗 口 中 的 菜 单 来 完 成 现 在 的 用 户 已 经 习 惯 使 用 方 便 快 捷 的 菜 单 进 行 操 作, 如 果 一 个 程 序 没 有 菜 单, 用 户 会 感 到 无 从 下 手 对 于 早 期 的 字 符 界 面 的 应 用 程 序, 设 计 菜 单 是 一 项 非 常 费 力 的 工 作 现 在 的 应 用 程 序 具 有 图 形 用 户 界 面 (GUI), 采 用 可 视 化 的 编 程 工 具 开 发, 菜 单 设 计 变 得 轻 而 易 举 了 菜 单 的 形 式 有 两 种 : 下 拉 式 菜 单 和 弹 出 式 菜 单 下 拉 式 菜 单 下 拉 式 菜 单 由 菜 单 栏 菜 单 标 题 菜 单 项 等 组 成, 如 图 12.1 所 示 菜 单 栏 位 于 窗 体 的 标 题 栏 下 面, 包 含 一 个 或 多 个 菜 单 标 题 当 单 击 一 个 菜 单 标 题 ( 如 文 件 ), 包 含 菜 单 项 的 列 表 就 被 拉 下 来 菜 单 标 题 菜 单 栏 菜 单 项 分 隔 条 快 捷 键 访 问 键 图 12.1 下 拉 式 菜 单 菜 单 项 可 以 是 命 令 ( 如 新 建 和 退 出 ) 分 隔 条 和 子 菜 单 标 题 为 便 于 操 作, 菜 单 项 应 按 功 能 分 组, 如 与 文 件 相 关 的 操 作 新 建 打 开 等 被 安 排 在 文 件 菜 单 下,

245 232 Visual Basic 程 序 设 计 教 程 而 复 制 剪 切 粘 贴 等 编 辑 命 令 被 安 放 在 编 辑 菜 单 下 菜 单 项 由 标 题 访 问 键 快 捷 键 和 复 选 标 志 等 构 成 菜 单 的 标 题 应 具 有 明 确 的 含 义, 简 洁 明 了, 应 尽 可 能 采 用 大 家 熟 知 的 日 常 用 语 或 专 业 术 语 如 果 某 菜 单 命 令 将 打 开 一 个 对 话 框 ( 一 种 要 求 用 户 提 供 应 用 程 序 执 行 动 作 所 需 信 息 的 窗 口 ), 一 般 应 在 菜 单 项 的 后 边 加 上 省 略 号 ( ) 例 如, 当 从 文 件 菜 单 中 选 择 打 开 时, 出 现 打 开 文 件 对 话 框 菜 单 的 访 问 键 和 快 捷 键 的 选 择 应 符 合 当 前 多 数 程 序 的 惯 例, 如 Alt+F 是 文 件 菜 单 的 访 问 键,F1 是 帮 助 菜 单 的 快 捷 键, 剪 切 菜 单 的 快 捷 键 为 Ctrl+X, 等 等 Visual Basic 中, 菜 单 是 一 个 控 件, 也 是 一 个 对 象, 具 有 属 性 事 件 和 方 法 菜 单 控 件 的 常 用 属 性 包 括 Caption Enabled Visible Checked 等 菜 单 控 件 只 包 含 一 个 事 件, 即 Click 事 件, 当 用 鼠 标 或 键 盘 选 中 该 菜 单 控 件 时, 将 触 发 该 事 件 弹 出 式 菜 单 弹 出 式 菜 单 又 叫 快 捷 菜 单, 是 在 单 击 鼠 标 右 键 时 出 现 的 菜 单, 菜 单 的 组 成 通 常 与 鼠 标 指 针 的 位 置 及 指 向 有 关, 因 此 又 叫 上 下 文 菜 单 如 图 12.2 所 示 图 12.2 弹 出 式 菜 单 Visual Basic 中, 弹 出 式 菜 单 也 是 菜 单 控 件 的 一 部 分, 任 何 至 少 包 含 一 个 菜 单 项 的 菜 单, 运 行 时 都 可 以 作 为 弹 出 式 菜 单 12.2 菜 单 编 辑 器 Visual Basic 中 每 个 窗 体 都 可 以 有 一 个 菜 单, 菜 单 是 一 个 控 件, 但 不 能 把 菜 单 控 件 作 为 工 具 添 加 到 控 件 箱 中 可 以 启 动 菜 单 编 辑 器 创 建 修 改 或 删 除 菜 单 菜 单 编 辑 器 的 启 动 要 给 某 个 窗 体 添 加 菜 单, 必 须 首 先 打 开 并 激 活 该 窗 体, 然 后 可 以 选 择 下 列 方 法 之 一 启 动 菜 单 编 辑 器 : (1) 单 击 工 具 菜 单 下 的 菜 单 编 辑 器 命 令

246 第 12 章 菜 单 设 计 233 (2) 单 击 工 具 栏 的 菜 单 编 辑 器 按 钮 (3) 在 窗 体 的 空 白 区 域, 单 击 鼠 标 右 键, 在 快 捷 菜 单 中 选 择 菜 单 编 辑 器 (4) 使 用 快 捷 键 Ctrl+K 菜 单 编 辑 器 的 使 用 菜 单 编 辑 器 的 窗 口 如 图 12.3 所 示, 可 以 分 为 菜 单 属 性 设 置 区 菜 单 编 辑 区 和 菜 单 项 显 示 区 三 部 分 1. 菜 单 属 性 设 置 区 该 区 是 窗 口 的 上 半 部 分, 用 于 输 入 或 修 改 菜 单 项 的 属 性, 包 括 以 下 几 部 分 : (1) 标 题 : 即 菜 单 的 标 题, 相 当 于 控 件 的 Caption 属 性, 但 不 能 为 空 如 果 只 输 入 一 个 减 号 ( 即 键 盘 上 的 ), 该 菜 单 项 就 成 为 一 条 分 隔 条, 分 隔 条 不 接 受 Click 事 件 菜 单 项 的 访 问 键 用 标 题 中 带 & 符 号 的 字 符 表 示, 如 &F 表 示 访 问 键 为 Alt+F, 窗 体 中 显 示 为 F 图 12.3 菜 单 编 辑 器 (2) 名 称 : 即 菜 单 项 的 名 称, 相 当 于 控 件 的 Name 属 性 每 个 菜 单 项 都 必 须 有 一 个 惟 一 的 名 称, 即 使 分 隔 条 也 不 例 外 (3) 索 引 : 即 菜 单 项 的 索 引, 相 当 于 控 件 的 Index 属 性 与 其 他 控 件 类 似, 较 大 的 应 用 程 序 的 菜 单 项 较 多, 每 个 菜 单 项 有 一 个 名 称 太 复 杂, 可 以 创 建 菜 单 项 数 组, 用 不 同 的 索 引 值 来 识 别 不 同 的 菜 单 项 索 引 值 不 会 被 自 动 设 置 (4) 快 捷 键 : 对 于 同 一 程 序, 应 该 为 不 同 的 菜 单 项 设 置 不 同 的 快 捷 键, 以 免 引 起 混 乱 (5) 复 选 : 表 示 是 否 该 菜 单 项 已 被 选 中 Checked 属 性 为 True 需 要 说 明 的 是, 修 改 Checked 属 性 的 值 不 会 触 发 任 何 事 件, 但 是, 一 旦 点 击 了 该 菜 单 项, 即 触 发 了 Click 事 件, 将 修 改 Checked 属 性 的 值

247 234 Visual Basic 程 序 设 计 教 程 (6) 有 效 : 对 应 Enabled 属 性, 用 来 表 示 或 设 置 菜 单 项 的 可 操 作 性 如 果 没 有 选 中, 对 应 的 菜 单 项 在 程 序 运 行 时 将 被 灰 化 (7) 可 见 : 即 Visible 属 性, 如 果 为 False, 则 不 显 示 出 来 通 常, 弹 出 式 菜 单 第 一 级 菜 单 项 被 设 置 为 不 可 见 (8) 显 示 窗 口 列 表 : 在 MDI 界 面 程 序 中, 如 果 该 属 性 被 选 中, 将 显 示 所 打 开 的 文 档 窗 体 的 列 表 2. 菜 单 编 辑 区 位 于 窗 口 中 间, 由 7 个 按 钮 组 成, 分 别 是 : (1) 左 右 箭 头 按 钮 : 用 来 调 整 菜 单 的 级 别 ( 层 次 ), 单 击 右 箭 头 按 钮, 则 当 前 菜 单 项 被 缩 进 一 级, 变 为 上 一 菜 单 项 的 子 菜 单, 上 一 菜 单 项 将 变 为 级 联 菜 单 ( 右 边 显 示 黑 色 三 角 符 号 ) 相 反 地, 如 果 单 击 左 箭 头 按 钮, 则 当 前 菜 单 项 减 少 一 级 缩 进, 直 到 成 为 第 一 级 菜 单 缩 进 的 菜 单 项 在 显 示 区 显 示 时 左 边 有. 符 号, 根 据. 的 多 少 可 以 判 断 菜 单 项 的 级 别 ( 层 次 ), 没 有. 符 号 的 是 菜 单 标 题 主 菜 单 项, 有 一 个. 符 号 的 是 第 一 级 菜 单, 有 两 个. 符 号 的 是 第 二 级 菜 单, (2) 上 下 箭 头 按 钮 : 用 来 调 整 菜 单 项 的 前 后 次 序 ( 上 下 位 置 ) 和 分 组 单 击 上 箭 头 按 钮, 当 前 菜 单 项 被 上 移 一 个 位 置, 而 单 击 下 箭 头 按 钮, 则 下 移 一 个 位 置 (3) 下 一 个 按 钮 : 用 来 自 上 而 下 选 择 不 同 的 菜 单 项, 被 选 中 的 菜 单 项 成 为 当 前 菜 单 项 ( 在 显 示 区 中 被 反 显 ) 如 果 当 前 菜 单 项 是 最 后 一 个, 单 击 下 一 个 按 钮, 将 开 始 一 个 新 的 菜 单 项, 新 菜 单 项 的 级 别 与 它 前 面 的 菜 单 项 相 同 可 以 用 鼠 标 在 显 示 区 中 直 接 选 取 当 前 菜 单 项 如 果 单 击 最 后 一 个 菜 单 项 后 边 的 区 域, 将 生 成 一 个 新 菜 单 项, 它 属 于 主 菜 单, 左 边 没 有. 符 号 (4) 插 入 按 钮 : 用 来 在 当 前 菜 单 项 的 前 面 插 入 一 个 新 的 菜 单 项, 新 插 入 的 菜 单 项 的 级 别 与 当 前 菜 单 项 相 同 (5) 删 除 按 钮 : 用 来 删 除 当 前 菜 单 项 3. 菜 单 项 显 示 区 位 于 菜 单 编 辑 器 窗 口 的 最 下 边, 是 一 个 列 表 框 所 有 菜 单 项 都 显 示 在 这 里, 不 论 菜 单 项 是 否 可 见 每 一 行 代 表 一 个 菜 单 项, 菜 单 项 左 端 的. 符 号 表 示 菜 单 项 的 级 别 12.3 下 拉 式 菜 单 设 计 下 拉 式 菜 单 的 设 计 和 编 程 Visual Basic 中 可 以 使 用 菜 单 编 辑 器 为 任 意 窗 体 添 加 菜 单 控 件 例 12.1 一 个 简 单 的 文 本 编 辑 器 程 序 的 菜 单 设 计 (1) 新 建 一 个 标 准 EXE 工 程, 并 添 加 窗 体 Form1; (2) 在 窗 体 中 添 加 文 本 框 txtcontent, 其 MultiLine 属 性 为 True,ScrollBars 属 性 为 Both; (3) 单 击 工 具 栏 的 菜 单 编 辑 器 按 钮, 启 动 菜 单 编 辑 器, 创 建 菜 单, 各 菜 单 项 的 属

248 第 12 章 菜 单 设 计 235 性 设 置 见 表 12.1 表 12.1 例 12.1 的 菜 单 设 置 标 题 及 层 次 名 称 复 选 快 捷 键 有 效 文 件 (&F) mnufile. 新 建 (&N) mnunew. 打 开 (&O) mnuopen... 保 存 (&S) mnusave False... 另 存 为 (&A) mnusaveas False.- mnusp11. 退 出 (&X) mnuexit 编 辑 (&E) mnuedit. 剪 切 (&T) mnucut Ctrl+X False. 复 制 (&C) mnucopy Ctrl+C False. 粘 贴 (&P) mnupaste Ctrl+V False.- mnusp21. 全 选 (&A) mnuall Ctrl+A 格 式 (&O) mnuoption. 字 体 mnufontname.. 宋 体 (&S) mnusongti.. 楷 体 (&K) mnukaiti. 字 号 (&S) mnufontsize.. 小 号 (&S) mnusmall.. 大 号 (&B) mnubig. 修 饰 (&A) mnuadom.. 黑 体 (&B) mnubold Ctrl+B.. 斜 体 (&I) mnuitalic Ctrl+I.. 下 划 线 (&U) mnuunderline Ctrl+U 帮 助 (&H) mnuhelp. 目 录 和 索 引 (&I) mnuindex. 关 于 (&A) mnuabout 注 意 : 任 意 两 个 菜 单 项 的 快 捷 键 不 能 相 同, 同 一 组 菜 单 项 的 访 问 键 也 不 应 相 同 (4) 单 击 菜 单 编 辑 器 窗 口 的 确 定 按 钮, 完 成 菜 单 设 计 ; (5) 单 击 窗 体 中 的 某 个 菜 单 如 文 件, 将 显 示 相 应 的 下 拉 式 菜 单, 如 图 12.4 所 示, 再 单 击 某 个 菜 单 命 令 ( 如 果 是 级 联 菜 单, 可 以 继 续 选 择 ), 将 切 换 到 代 码 编 辑 窗 口 中, 输 入 程 序 代 码

249 236 Visual Basic 程 序 设 计 教 程 图 12.4 例 12.1 的 窗 体 和 菜 单 部 分 代 码 如 下 : Private Sub Form_Load() With txtcontent ' 设 置 为 默 认 参 数.FontName = " 宋 体 ".FontSize = 12 End With Private Sub mnubig_click() mnusmall.checked = False ' 选 择 大 号 字 体 mnubig.checked = True ' 取 消 选 择 txtcontent.fontsize = 24 ' 设 置 为 大 号 字 体 Private Sub mnubold_click() mnubold.checked = Not mnubold.checked ' 切 换 状 态 txtcontent.fontbold = mnubold.checked ' 根 据 菜 单 项 的 值 决 定 是 否 加 黑 显 示 Private Sub mnuexit_click() Unload Me ' 关 闭 当 前 窗 口 Private Sub mnuitalic_click() mnuitalic.checked = Not mnuitalic.checked txtcontent.fontitalic = mnuitalic.checked ' 是 否 斜 体 Private Sub mnukaiti_click() mnusongti.checked = False ' 取 消 对 宋 体 选 择 mnukaiti.checked = True ' 选 择 楷 体 txtcontent.fontname = " 楷 体 _GB2312" ' 设 置 文 本 框 的 字 体 为 楷 体

250 第 12 章 菜 单 设 计 237 Private Sub mnusmall_click() mnubig.checked = False mnusmall.checked = True txtcontent.fontsize = 12 Private Sub mnusongti_click() mnusongti.checked = True ' 取 消 对 楷 体 选 择 mnukaiti.checked = False ' 选 择 宋 体 txtcontent.fontname = " 楷 体 _GB2312" ' 设 置 文 本 框 的 字 体 为 宋 体 Private Sub mnuunderline_click() mnuunderline.checked = Not mnuunderline.checked txtcontent.fontunderline = mnuunderline.checked 说 明 : 字 体 字 号 修 饰 等 菜 单 下 的 菜 单 项 都 是 单 选 的, 但 菜 单 项 只 具 有 复 选 特 性, 因 此 必 须 在 程 序 中 用 代 码 实 现 单 选 (6) 运 行 程 序, 测 试 菜 单 的 功 能 要 注 意 同 时 测 试 访 问 键 快 捷 键 的 使 用 菜 单 项 属 性 的 动 态 设 置 正 如 大 家 在 例 12.1 中 所 看 到 的, 程 序 运 行 时, 可 以 通 过 在 程 序 代 码 中 修 改 菜 单 项 的 属 性 实 现 菜 单 的 动 态 设 置 通 常, 可 以 动 态 地 设 置 的 菜 单 项 属 性 包 括 Checked Enabled Visible 等 1. 菜 单 的 复 选 标 志 如 前 所 述, 菜 单 项 的 复 选 标 志 只 能 起 到 复 选 的 作 用, 表 示 被 选 中 或 未 被 选 中, 如 例 12.1 中 修 饰 菜 单 中 的 的 黑 体 斜 体 和 下 划 线 等, 不 能 表 示 在 同 一 分 组 中 的 菜 单 项 的 单 选 性, 如 字 体 中 的 宋 体 和 楷 体, 但 这 种 单 选 性 又 是 必 须 的, 因 为 他 们 表 示 的 是 文 本 框 中 文 本 的 字 体 的 同 一 属 性 为 此, 需 要 在 程 序 中 动 态 地 修 改 菜 单 项 的 复 选 标 志, 即 Checked 属 性 在 例 12.1 中, 事 件 过 程 mnuitalic_click 的 代 码 为 : Private Sub mnuitalic_click() mnuitalic.checked = Not mnuitalic.checked txtcontent.fontitalic = mnuitalic.checked ' 是 否 斜 体 第 一 句 用 于 动 态 地 修 改 菜 单 项 的 复 选 标 志 ( 如 不 改, 则 不 论 单 击 多 少 次, 总 是 不 变 ), 模 拟 了 复 选 框 控 件 的 操 作 过 程 而 在 另 一 个 事 件 过 程 mnukaiti_click 中, 模 拟 的 是 单 选 按 钮 的 操 作 方 法, 代 码 是 : Private Sub mnukaiti_click()

251 238 Visual Basic 程 序 设 计 教 程 mnusongti.checked = False ' 取 消 对 宋 体 选 择 mnukaiti.checked = True ' 选 择 楷 体 txtcontent.fontname = " 楷 体 _GB2312" ' 设 置 文 本 框 的 字 体 为 楷 体 前 两 句 用 于 设 置 惟 一 被 选 中 的 菜 单 项 可 以 想 象, 如 果 该 分 组 中 的 菜 单 项 不 只 两 个, 除 了 被 单 击 选 中 的 菜 单 项 外, 其 他 菜 单 项 的 Checked 属 性 都 必 须 动 态 地 修 改 为 False 为 了 方 便, 可 以 使 用 菜 单 控 件 数 组 2. 菜 单 的 有 效 性 容 易 理 解, 程 序 的 某 些 操 作 是 有 一 定 前 提 条 件 的, 比 如 复 制 操 作 时 将 把 选 中 的 文 本 复 制 到 剪 贴 板 中, 因 此 在 执 行 复 制 操 作 以 前 必 须 首 先 选 中 文 本 菜 单 项 的 有 效 性 用 来 表 示 对 应 的 操 作 是 否 可 行 对 于 例 12.1, 添 加 以 下 代 码 : Private Sub SetEditMenu() ' 设 置 编 辑 菜 单 的 有 效 性 Dim b As Boolean b = IIf(txtContent.SelLength > 0, True, False) ' 是 否 有 文 本 被 选 中 mnucut.enabled = b ' 如 果 以 选 中 若 干 字 符, 则 剪 切 复 制 命 令 有 效 mnucopy.enabled = b ' 否 则, 不 能 进 行 类 似 操 作 ' 根 据 剪 贴 板 中 是 否 文 本, 决 定 能 否 实 施 粘 贴 操 作 ' ClipBoard 是 系 统 对 象, 代 表 剪 贴 板, 其 GetText 方 法 用 于 返 回 剪 贴 板 上 的 字 符 mnupaste.enabled = IIf(Len(Clipboard.GetText(vbCFText)) > 0, True, False) Private Sub mnuall_click() txtcontent.selstart = 0 ' 设 置 从 第 1 个 字 符 开 始 的 文 本 被 选 中 txtcontent.sellength = Len(txtContent.Text) ' 选 中 所 有 字 符 SetEditMenu ' 设 置 复 制 剪 切 菜 单 项, 使 他 们 有 效 ' 以 下 过 程 在 单 击 鼠 标 后 触 发 Private Sub txtcontent_mouseup(button As Integer, Shift As Integer, _ X As Single, Y As Single) SetEditMenu ' 判 断 是 否 选 中 了 文 本 其 中, 通 用 过 程 SetEditMenu 用 来 设 置 剪 切 复 制 粘 贴 三 个 菜 单 项 的 有 效 性 mnuall_click 过 程 用 来 选 中 所 有 文 本, 并 设 置 菜 单 有 效 txtcontent_mouseup 过 程 则 根 据 是 否 使 用 鼠 标 选 中 了 文 本 来 确 定 菜 单 的 有 效 性 请 读 者 自 己 编 写 代 码, 实 现 对 用 键 盘 选 择 文 本 的 响 应 读 者 可 将 下 列 程 序 代 码 添 加 到 程 序 中, 以 实 现 编 辑 菜 单 的 功 能 : Private Sub mnucopy_click() ' 复 制 Clipboard.SetText txtcontent.seltext ' 将 选 中 的 文 本 复 制 到 剪 贴 板 上 Private Sub mnucut_click() ' 剪 切

252 第 12 章 菜 单 设 计 239 Clipboard.SetText txtcontent.seltext ' 将 选 中 的 文 本 复 制 到 剪 贴 板 上 txtcontent.seltext = "" ' 并 删 除 选 中 的 文 本 Private Sub mnupaste_click() ' 粘 贴 Dim s1 As String, s2 As String Dim loc As Integer loc = txtcontent.selstart ' 读 取 光 标 位 置 s1 = Left(txtContent.Text, loc) ' 将 剪 贴 板 内 容 插 入 到 光 标 处 s2 = Mid(txtContent.Text, loc + 1) txtcontent.text = s1 & Clipboard.GetText(vbCFText) & s2 txtcontent.selstart = loc ' 恢 复 光 标 位 置 这 里,Clipboard 为 系 统 对 象 系 统 对 象 是 不 需 要 用 户 定 义 就 可 以 使 用 的 对 象,Visual Basic 中 定 义 的 系 统 对 象 有 5 个, 他 们 是 ClipBoard( 剪 贴 板 ) Debug( 调 试 器 ) Err( 出 错 集 ) Printer( 打 印 机 ) Screen( 屏 幕 ) 关 于 系 统 对 象 的 使 用, 请 读 者 参 考 Visual Basic 联 机 帮 助 或 其 他 参 考 书 3. 菜 单 的 可 见 性 可 见 性 和 有 效 性 有 许 多 相 似 的 地 方, 其 作 用 也 类 似 不 可 见 的 菜 单 一 定 无 效, 但 无 效 的 菜 单 不 一 定 不 可 见 由 于 将 菜 单 的 Visible 属 性 设 置 为 False, 在 隐 藏 菜 单 项 的 同 时, 改 变 了 屏 幕 上 的 菜 单 结 构, 要 注 意 可 能 出 现 的 副 作 用, 比 如, 可 能 会 遇 到 多 出 一 个 分 割 条 的 情 况, 此 时 应 将 分 割 条 也 隐 藏 起 来 菜 单 项 的 动 态 增 加 和 删 除 许 多 程 序 都 具 有 最 近 使 用 的 文 件 菜 单, 如 Visual Basic MS Word 等, 第 一 次 使 用 程 序 时, 它 是 空 的 以 后 随 着 使 用 次 数 的 增 加, 逐 次 增 加 到 一 定 数 量, 然 后 每 次 打 开 不 同 的 文 件, 该 菜 单 做 动 态 调 整 Visual Basic 中, 实 现 菜 单 的 动 态 增 加 或 减 少 有 两 种 方 法, 或 者 利 用 菜 单 项 的 Visible 属 性, 或 者 利 用 动 态 控 件 数 组 前 一 种 方 法 比 较 简 单, 但 不 太 灵 活 下 面 学 习 第 二 种 方 法 首 先 介 绍 一 下 菜 单 控 件 数 组 通 过 上 面 的 例 子, 我 们 已 经 可 以 感 觉 到, 如 果 不 使 用 数 组, 设 计 复 杂 的 菜 单 时, 可 能 遇 到 麻 烦 比 如, 如 果 可 供 选 择 的 字 体 比 较 多, 每 个 子 菜 单 的 命 名 和 编 程 就 会 很 困 难 使 用 控 件 数 组 可 以 很 好 地 解 决 这 一 问 题, 方 法 是 将 所 有 子 菜 单 项 的 名 称 改 用 同 一 个 名 字, 如 mnufontname, 不 同 菜 单 项 用 不 同 的 Index 属 性 的 值 区 分 通 常 第 一 个 菜 单 项 的 Index 属 性 为 0, 第 二 个 菜 单 项 的 Index 属 性 为 1, 依 此 类 推 这 就 是 菜 单 控 件 数 组 利 用 菜 单 控 件 数 组 和 Load Unload 语 句 可 以 实 现 菜 单 项 的 动 态 添 加 和 删 除 例 12.2 最 近 使 用 的 文 件 功 能 的 实 现 (1) 创 建 一 个 标 准 EXE 工 程, 添 加 一 个 窗 体 Form1; (2) 为 Form1 添 加 一 个 菜 单, 菜 单 项 的 属 性 见 下 表 :

253 240 Visual Basic 程 序 设 计 教 程 标 题 及 层 次 名 称 可 见 索 引 文 件 (&F). 打 开 (&O) mnufile mnuopen.- mnusp11 False. mnurecentfile False 0.- mnusp12. 退 出 (&X) mnuexit 其 中, 分 割 条 mnusp11 用 于 分 割 最 近 的 文 件, 开 始 是 不 可 见 ;mnurecentfile 为 菜 单 控 件 数 组, 用 来 存 放 最 近 的 文 件 显 然, 设 计 时 至 少 已 经 创 建 了 一 个 菜 单 控 件 mnurecentfile(0), 可 以 把 它 设 置 为 不 可 见 的, 这 样, 它 的 标 题 也 就 无 关 紧 要 了 (3) 编 写 程 序 代 码, 实 现 菜 单 功 能 程 序 代 码 如 下 : Private Sub mnuexit_click() Unload Me Private Sub mnuopen_click() Dim s As String, c As Integer s = InputBox(" 输 入 文 件 名 :", " 打 开 文 件 ") ' 模 拟 打 开 文 件 过 程, 获 取 文 件 名 If s <> "" Then c = mnurecentfile.ubound() + 1 ' UBound 方 法 返 回 控 件 数 组 的 最 高 索 引 值 If c = 1 Then mnusp11.visible = True ' 为 最 近 的 文 件 菜 单 添 加 分 割 条 If c > 4 Then ' 只 显 示 最 近 的 4 个 文 件 Unload mnurecentfile(c - 4) ' 更 早 的 文 件 的 菜 单 被 删 除 End If Load mnurecentfile(c) ' 添 加 一 个 新 的 菜 单 mnurecentfile(c).caption = s ' 设 置 菜 单 标 题 mnurecentfile(c).visible = True ' 该 菜 单 可 见 End If Private Sub mnurecentfile_click(index As Integer) MsgBox " 当 前 文 件 是 :" & mnurecentfile(index).caption ' 模 拟 打 开 最 近 的 文 件 在 单 击 打 开 菜 单 时, 程 序 中 InputBox 函 数 模 拟 了 打 开 文 件 的 过 程, 所 打 开 的 文 件 的 文 件 名 作 为 菜 单 标 题 显 示 在 最 近 的 文 件 中 最 近 的 文 件 最 多 只 给 出 最 近 的 4 个 文 件 的 文 件 名, 程 序 模 拟 了 打 开 更 多 文 件 时 的 处 理 方 法 mnurecentfile 为 菜 单 控 件 数 组, 其 Click 事 件 过 程 有 一 个 参 数 Index 表 示 点 击 的 是 哪 一 个 控 件, 程 序 中 演 示 了 该 事 件 过 程 的 编 程 方 法 程 序 的 运 行 情 况 如 图 12.5 所 示

254 第 12 章 菜 单 设 计 241 图 12.5 例 12.2 的 运 行 情 况 12.4 弹 出 式 菜 单 设 计 弹 出 式 菜 单 是 独 立 于 菜 单 栏 显 示 在 窗 体 上 的 浮 动 菜 单 程 序 运 行 时, 任 何 包 含 一 个 以 上 菜 单 项 的 菜 单 都 可 以 作 为 弹 出 式 菜 单 显 示 要 为 当 前 窗 体 设 计 弹 出 式 菜 单, 需 要 首 先 用 菜 单 编 辑 器 创 建 菜 单 如 果 已 经 建 立 了 下 拉 式 菜 单, 可 以 再 添 加 一 个 不 可 见 的 菜 单 作 为 弹 出 式 菜 单 如 果 弹 出 式 菜 单 与 下 拉 式 菜 单 中 的 某 一 菜 单 相 同, 也 可 以 直 接 将 该 菜 单 作 为 弹 出 式 菜 单 通 常, 弹 出 式 菜 单 不 在 菜 单 栏 中 显 示, 可 以 将 弹 出 式 菜 单 的 主 菜 单 项 设 置 为 不 可 见, 即 将 Visible 属 性 设 置 为 False 创 建 的 弹 出 式 菜 单 需 要 在 程 序 中 用 窗 体 的 PopupMenu 方 法 显 示 PopupMenu 方 法 的 语 法 为 : [ 窗 体 名 ].PopupMenu 菜 单 名 [,Flags [,x [,y [,boldcommand ] ] ] 其 中 : (1)x,y 为 所 弹 出 的 菜 单 在 窗 体 上 的 位 置 坐 标, 具 体 代 表 菜 单 上 的 哪 一 个 点, 还 要 看 Flags 参 数 的 取 值 如 果 省 略 x,y 则 取 鼠 标 指 针 的 位 置 (2)Flags 参 数 用 来 指 定 弹 出 式 菜 单 的 位 置 和 行 为, 表 12.2 给 出 了 指 定 菜 单 位 置 的 Flags 参 数 值, 表 12.3 给 出 了 表 示 行 为 的 Flags 参 数 值 如 果 需 要 同 时 指 定 弹 出 菜 单 的 位 置 和 行 为, 可 以 分 别 选 取 一 个 参 数 值, 再 用 + 运 算 符 或 者 OR 运 算 符 连 接 起 来 表 12.2 表 示 菜 单 位 置 的 Flags 参 数 的 值 及 含 义 符 号 常 量 参 数 值 含 义 vbpopupmenuleftalign 0 ( 默 认 ) 指 定 的 x 参 数 定 义 了 该 弹 出 式 菜 单 的 左 边 界 vbpopupmenucenteralign 4 指 定 的 x 参 数 定 义 了 该 弹 出 式 菜 单 的 中 心 位 置 vbpopupmenurightalign 8 指 定 的 x 参 数 定 义 了 该 弹 出 式 菜 单 的 右 边 界

255 242 Visual Basic 程 序 设 计 教 程 表 12.3 表 示 菜 单 行 为 的 Flags 参 数 的 值 及 含 义 符 号 常 量 参 数 值 含 义 vbpopupmenuleftbutton 0 ( 默 认 ) 弹 出 菜 单 只 接 受 鼠 标 左 键 单 击 vbpopupmenurightbutton 8 既 接 受 鼠 标 左 键 单 击 也 接 受 鼠 标 右 键 单 击 (3)Boldcommand 参 数 用 来 指 定 弹 出 式 菜 单 中 想 以 粗 体 字 体 出 现 的 菜 单 控 件 的 名 称 在 弹 出 式 菜 单 中 只 能 有 一 个 菜 单 项 被 加 粗 程 序 中, 通 常 把 PopupMenu 方 法 放 在 控 件 的 MouseUp 事 件 过 程 中 该 事 件 过 程 有 一 个 参 数 Button, 表 示 所 按 下 的 鼠 标 键 是 哪 一 个, 当 按 下 左 键 时 Button 为 1(vbLeftButton), 按 下 右 键 时 Button 为 2(vbRightButton) 弹 出 式 菜 单 应 该 只 在 单 击 鼠 标 右 键 时 才 显 示 出 来 例 12.3 文 本 编 辑 器 的 快 捷 菜 单 (1) 新 建 一 个 标 准 EXE 工 程, 在 窗 体 Form1 添 加 一 个 文 本 框 txtdocument, 并 将 MultiLine 属 性 设 置 为 True 如 图 12.6 所 示 图 12.6 例 12.3 的 运 行 情 况 (2) 启 动 菜 单 编 辑 器, 按 下 表 为 Form1 设 计 一 个 菜 单 : 标 题 及 层 次 名 称 可 见 对 齐 方 式 mnualign False. 左 对 齐 (&L) mnuleftalign. 居 中 对 齐 (&C) mnucenteralign. 右 对 齐 (&R) mnurightalign (3) 切 换 到 代 码 编 辑 窗 口, 输 入 以 下 代 码 : Private Sub mnucenteralign_click() txtdocument.alignment = vbcenter ' 设 置 文 本 框 居 中 对 齐 Private Sub mnuleftalign_click() txtdocument.alignment = vbleftjustfy ' 左 对 齐 Private Sub mnurightalign_click() txtdocument.alignment = vbrightjustfy ' 右 对 齐

256 第 12 章 菜 单 设 计 243 Private Sub txtdocument_mouseup(button As Integer, Shift As Integer, _ X As Single, Y As Single) If Button = vbrightbutton Then ' 是 否 是 右 键 单 击 PopupMenu mnualign ' 弹 出 菜 单 End If 程 序 的 运 行 情 况 如 图 12.6 所 示 12.5 MDI 界 面 程 序 菜 单 设 计 对 于 MDI 界 面 应 用 程 序, 所 有 子 窗 体 的 菜 单 都 会 显 示 在 MDI 窗 体 上, 而 不 是 在 子 窗 体 上 当 某 一 子 窗 体 获 得 焦 点 时, 如 果 该 子 窗 体 有 菜 单, 就 将 取 代 MDI 窗 体 的 菜 单 只 有 没 有 可 见 的 子 窗 体 或 者 当 前 子 窗 体 没 有 菜 单 时, 才 会 显 示 MDI 窗 体 的 菜 单 设 计 MDI 界 面 应 用 程 序 时, 既 要 给 子 窗 体 创 建 菜 单, 也 要 给 MDI 窗 体 创 建 菜 单 通 常, 将 任 何 时 候 都 可 以 使 用 的 菜 单 放 在 MDI 窗 体 中, 如 文 件 的 新 建 打 开 和 帮 助 菜 单 等 例 12.4 MDI 界 面 的 文 本 编 辑 器 (1) 打 开 例 12.1 的 工 程, 添 加 一 个 MDI 窗 体 MDIForm1; (2) 将 工 程 的 启 动 对 象 改 为 MDIForm1; (3) 将 窗 体 Form1 的 MDIChild 属 性 设 置 为 True; (4) 按 下 表 给 MDIForm1 窗 体 设 计 菜 单 : 标 题 及 层 次 名 称 文 件 (&F) mnufile. 新 建 (&N). 打 开 (&O).-. 退 出 (&X) (5) 切 换 到 代 码 编 辑 窗 口, 输 入 以 下 代 码 : Private Sub mnuexit_click() End Private Sub mnunewfile_click() Form1.Show ' 显 示 子 窗 体 程 序 的 运 行 结 果 如 图 12.7 所 示 mnunewfile mnuopenfile mnusp11 mnuexit

257 244 Visual Basic 程 序 设 计 教 程 (a)mdi 窗 体 及 其 菜 单 (b) 子 窗 体 及 其 菜 单 图 12.7 例 12.4 的 运 行 情 况 MDI 界 面 应 用 程 序 允 许 同 时 打 开 多 个 文 档 可 以 在 菜 单 中 显 示 所 打 开 的 文 档 的 列 表 请 读 者 将 窗 体 Form1 的 mnufile 菜 单 设 置 为 显 示 窗 口 列 表, 再 观 察 一 下 运 行 结 果 12.6 工 具 栏 设 计 工 具 栏 是 Windows 应 用 程 序 常 见 的 组 成 部 分, 工 具 栏 包 含 若 干 图 像 按 钮 工 具 栏 的 作 用 与 菜 单 相 似, 但 更 直 观, 操 作 更 方 便 为 窗 体 添 加 工 具 栏 需 要 使 用 ToolBar 控 件 和 ImageList 控 件, 他 们 是 ActiveX 控 件, 使 用 时 需 要 手 工 添 加 到 控 件 箱 中 例 12.5 工 具 栏 的 设 计 (1) 打 开 例 12.4 的 工 程, 再 打 开 MDIForm1 窗 体 (2) 在 控 件 箱 上 单 击 鼠 标 右 键, 选 择 部 件 命 令, 在 打 开 的 控 件 选 项 卡 中, 选 中 Microsoft Windows Common Controls 6.0 后 单 击 确 定 按 钮, 控 件 箱 如 图 12.8 所 示 图 12.8 包 含 ToolBar 控 件 的 控 件 箱 (3) 选 择 ImageList 控 件, 在 窗 体 MDIForm1 中 添 加 一 个 图 像 列 表 控 件 ImageList1, 在 ImageList1 上 单 击 鼠 标 右 键, 选 择 属 性 命 令, 打 开 ImageList 属 性 对 话 框, 如 图 12.9 所 示 单 击 插 入 图 片 按 钮, 将 需 要 的 图 片 ( 在 Visual Basic 的 安 装 目 录 中 找 ) 添 加 到 图 像 列 表 中 为 便 于 使 用, 为 每 一 个 图 片 制 定 一 个 关 键 字, 如 Save New 等

258 单 击 确 定 按 钮 回 到 窗 体 设 计 窗 口 第 12 章 菜 单 设 计 245 图 12.9 ImageList 控 件 的 属 性 对 话 框 注 意, 要 记 住 每 个 图 片 的 索 引 或 关 键 字 (4) 选 择 ToolBar 控 件, 在 MDIForm1 窗 体 中 添 加 一 个 工 具 栏 ToolBar1, 在 ToolBar1 上 单 击 鼠 标 右 键, 选 择 属 性 打 开 属 性 对 话 框, 如 图 所 示 在 通 用 选 项 卡 中, 指 定 图 像 列 表 为 ImageList1 在 按 钮 选 项 卡 中, 单 击 插 入 按 钮 若 干 次, 并 为 每 一 个 按 钮 指 定 标 题 关 键 字, 提 示 图 像 等, 其 中 图 像 为 所 用 图 片 在 ImageList1 中 的 索 引 或 关 键 字 单 击 确 定 按 钮 关 闭 该 对 话 框 图 ToolBar 控 件 的 属 性 对 话 框 (5) 双 击 工 具 栏 ToolBar1, 输 入 程 序 编 码 单 击 工 具 栏 时, 将 触 发 工 具 栏 控 件 的 ButtonClick 事 件 ToolBar1 的 ButtonClick 事 件 过 程 如 下 所 示 : Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)

259 246 Visual Basic 程 序 设 计 教 程 Select Case Button.Key Case "New" Form1.Show Case "Open" End Select 其 中,Button 参 数 代 表 所 单 击 的 按 钮, 可 以 根 据 Button 参 数 的 Key( 关 键 字 ) 属 性 或 者 Index( 索 引 ) 属 性 的 值 区 分 程 序 的 运 行 情 况 如 图 所 示 图 具 有 工 具 栏 的 程 序 习 题 1. 将 例 12.2 的 弹 出 菜 单 添 加 到 例 12.1 的 工 程 中 2. 仿 照 Windows 的 写 字 板 程 序 为 窗 体 建 立 菜 单, 并 添 加 类 似 的 工 具 栏

260 第 13 章 对 话 框 设 计 13.1 概 述 在 Windows 应 用 程 序 中, 对 话 框 用 来 实 现 人 机 交 互, 提 示 用 户 输 入 应 用 程 序 继 续 运 行 所 需 的 数 据 或 者 向 用 户 显 示 信 息 对 话 框 是 一 种 特 殊 类 型 的 窗 体 通 常, 对 话 框 窗 体 的 边 框 是 固 定 的, 也 就 是 说 不 能 改 变 对 话 框 窗 体 的 大 小, 对 话 框 中 也 没 有 最 大 化 按 钮 (MaxButton) 和 最 小 化 按 钮 (MinButton), 没 有 菜 单 栏 工 具 栏 和 状 态 栏 等 对 话 框 中 一 般 都 包 含 确 定 和 取 消 两 个 按 钮, 单 击 任 一 按 钮 都 可 以 退 出 或 关 闭 对 话 框 但 二 者 的 作 用 不 同, 确 定 按 钮 用 来 接 受 用 户 的 输 入, 取 消 按 钮 则 会 放 弃 用 户 的 输 入 通 常, 将 确 定 按 钮 的 Default 属 性 设 置 为 True, 响 应 Enter 键 操 作, 而 将 取 消 按 钮 的 Cancel 属 性 设 置 为 True, 响 应 Esc 键 操 作 对 话 框 不 是 模 式 的 就 是 无 模 式 的 (1) 模 式 对 话 框 在 可 以 继 续 操 作 应 用 程 序 的 其 他 部 分 之 前, 必 须 被 关 闭 ( 隐 藏 或 卸 载 ) 例 如,Visual Basic 的 关 于 对 话 框 是 模 式 的 通 常, 显 示 重 要 消 息 的 对 话 框 总 应 当 是 模 式 的, 也 就 是 说, 在 继 续 其 他 操 作 以 前, 总 是 要 求 用 户 必 须 先 关 闭 对 话 框 或 者 对 它 的 消 息 作 出 响 应 (2) 无 模 式 对 话 框 允 许 在 对 话 框 与 其 他 窗 体 之 间 切 换 焦 点 而 不 用 关 闭 对 话 框 无 模 式 对 话 框 很 少 使 用, 主 要 用 于 显 示 频 繁 使 用 的 命 令 与 信 息 Visual Basic 中 编 辑 菜 单 中 的 查 找 对 话 框 就 是 一 个 无 模 式 对 话 框,Word 中 的 拼 写 与 语 法 对 话 框 也 是 无 模 式 对 话 框 在 Visual Basic 中, 按 创 建 方 式 不 同, 可 以 把 对 话 框 分 为 三 类, 即 预 定 义 对 话 框 自 定 义 对 话 框 和 通 用 对 话 框 (1) 预 定 义 对 话 框 是 指 利 用 InputBox 函 数 建 立 的 输 入 对 话 框 和 利 用 MsgBox 函 数 建 立 的 输 出 对 话 框 (2) 自 定 义 对 话 框 是 使 用 窗 体 和 控 件 由 用 户 根 据 需 要 设 计 的 对 话 框 (3) 通 用 对 话 框 是 利 用 Visual Basic 的 CommonDialog 控 件 建 立 的 对 话 框 13.2 预 定 义 对 话 框 在 应 用 程 序 中 添 加 对 话 框 最 容 易 的 方 法 是 使 用 预 定 义 对 话 框, 因 为 不 必 考 虑 设 计 装 载 或 者 显 示 等 方 面 的 问 题 然 而, 预 定 义 对 话 框 在 外 观 上 要 受 到 限 制, 而 且 预 定 义 对 话 框 总 是 模 式 的

261 248 Visual Basic 程 序 设 计 教 程 Visual Basic 的 预 定 义 对 话 框 主 要 使 用 InputBox 函 数 和 MsgBox 函 数 建 立 InputBox 函 数 InputBox 函 数 在 对 话 框 中 显 示 一 个 命 令 提 示, 并 返 回 所 接 收 的 任 何 东 西 程 序 中 添 加 如 下 代 码 : strname = InputBox(" 请 输 入 您 的 姓 名?", " 欢 迎 ") 将 显 示 图 13.1 所 示 的 对 话 框 图 13.1 InputBox 函 数 对 话 框 MsgBox 函 数 MsgBox 函 数 在 对 话 框 中 显 示 一 条 消 息, 并 返 回 一 个 表 示 所 单 击 的 命 令 按 钮 的 值 程 序 中 添 加 以 下 代 码 : btn = MsgBox(" 您 好," & strname, vbinformation + vbokonly, " 欢 迎 ") 将 显 示 图 13.2 所 示 的 对 话 框 图 13.2 MsgBox 函 数 对 话 框 其 中,vbInformation 表 示 对 话 框 中 包 含 一 个 信 息 图 标 vbokonly 表 示 只 有 一 个 确 定 按 钮 13.3 自 定 义 对 话 框 自 定 义 对 话 框 就 是 用 户 所 创 建 的 含 有 控 件 的 窗 体, 对 话 框 中 的 控 件 包 括 命 令 按 钮 文 本 框 复 选 框 单 选 按 钮 组 合 框 等, 可 以 为 应 用 程 序 接 收 信 息 要 创 建 对 话 框, 可 以 从 创 建 窗 体 开 始, 也 可 以 将 已 有 的 窗 体 设 置 为 对 话 框

262 第 13 章 对 话 框 设 计 对 话 框 窗 体 的 属 性 通 常, 对 话 框 包 含 标 题 及 确 定 取 消 按 钮, 没 有 控 制 菜 单 最 大 化 最 小 化 按 钮, 边 框 是 固 定 的 表 13.1 给 出 了 对 话 框 窗 体 的 部 分 常 用 属 性 设 置 表 13.1 对 话 框 窗 体 的 常 用 属 性 设 置 属 性 名 称 属 性 值 含 义 Caption ( 自 定 义 ) 对 话 框 的 标 题 BorderStyle 3-Fixed Dialog 固 定 的 对 话 框 边 框 ( 还 可 以 是 0- 无 边 框 ;1- 固 定 的 单 线 边 框 ) ControlBox False 删 除 控 制 菜 单 MaxButton False 删 除 最 大 化 按 钮 MinButton False 删 除 最 小 化 按 钮 说 明 : 如 果 BorderStyle 属 性 为 0, 将 忽 略 其 他 属 性 如 Caption ControlBox 等 对 话 框 窗 体 的 控 件 对 话 框 中 可 以 包 括 各 种 Visual Basic 控 件 通 常, 对 话 框 应 至 少 包 含 一 个 退 出 该 对 话 框 的 命 令 按 钮 一 般 情 况 下, 命 令 按 钮 有 两 个, 一 个 按 钮 接 受 用 户 输 入 并 继 续 执 行, 而 另 一 个 按 钮 只 关 闭 该 对 话 框 而 不 做 任 何 改 变 典 型 的 情 况 是, 两 个 按 钮 的 Caption 属 性 设 置 为 确 定 与 取 消 通 常, 确 定 按 钮 的 Default 属 性 设 置 为 True, 而 取 消 按 钮 的 Cancel 属 性 设 置 为 True 当 然, 也 可 以 使 用 其 他 的 按 钮 标 题, 例 如, 如 果 对 话 框 中 用 标 签 控 件 显 示 错 误 消 息 或 者 命 令 提 示, 两 个 命 令 按 钮 的 Caption 属 性 可 以 分 别 设 置 为 是 与 否 对 话 框 中 通 常 包 含 一 个 缺 省 按 钮 和 一 个 取 消 按 钮 缺 省 按 钮 是 当 用 户 按 下 回 车 键 时 选 中 的 按 钮, 其 Default 属 性 为 True 按 下 回 车 键 将 触 发 缺 省 按 钮 的 Click 事 件 取 消 按 钮 是 当 按 下 Esc 键 时 选 中 的 按 钮 取 消 按 钮 的 Cancel 属 性 为 True 按 下 Esc 键 时 调 用 取 消 按 钮 的 Click 事 件 过 程 对 话 框 窗 体 的 显 示 应 用 程 序 中, 使 用 显 示 其 他 窗 体 同 样 的 方 法 来 显 示 对 话 框 程 序 运 行 时, 启 动 窗 体 会 自 动 装 入, 其 他 窗 体 或 对 话 框 要 用 代 码 来 实 现 装 入 显 示 卸 载 隐 藏 等 表 13.2 给 出 了 与 对 话 框 窗 体 的 显 示 有 关 的 编 码 方 法 表 13.2 与 对 话 框 显 示 有 关 的 编 码 方 法 任 务 方 法 装 载 对 话 框, 但 不 显 示 装 载 并 显 示 无 模 式 对 话 框 装 载 并 显 示 模 式 对 话 框 显 示 已 装 载 的 对 话 框 隐 藏 对 话 框 隐 藏 并 卸 载 对 话 框 用 Load 语 句, 或 者 引 用 对 话 框 的 属 性 或 控 件 用 不 带 参 数 或 参 数 为 vbmodaless 的 Show 方 法 用 参 数 为 vbmodal 的 Show 方 法 设 置 对 话 框 窗 体 的 Visible 属 性 为 True, 或 者 使 用 Show 方 法 设 置 对 话 框 的 Visible 属 性 为 False, 或 者 使 用 Hide 方 法 用 Unload 语 句

263 250 Visual Basic 程 序 设 计 教 程 应 用 举 例 例 13.1 程 序 的 关 于 对 话 框 (1) 新 建 一 个 标 准 EXE 工 程, 为 窗 体 Form1 添 加 下 表 所 示 的 菜 单 : 标 题 及 层 次 名 称 帮 助 (&H) mnuhelp. 关 于 (&A) mnuabout (2) 添 加 窗 体 frmabout, 主 要 属 性 见 下 表 : 属 性 名 称 BorderStyle Caption ControlBox StartUpPosition 属 性 值 3-Fixed Dialog 关 于 False 2- 屏 幕 中 心 (3) 在 窗 体 frmabout 上 添 加 一 个 标 签 和 一 个 命 令 按 钮 btnok,caption 属 性 分 别 为 欢 迎 使 用 Visual Basic! 和 确 定 (&O),btnOK 按 钮 的 Default 属 性 和 Cancel 属 性 都 设 置 为 True, 如 图 13.3 所 示 图 13.3 关 于 对 话 框 设 计 (4) 单 击 frmabout 窗 体 的 确 定 按 钮, 输 入 以 下 代 码 : Private Sub btnok_click() Unload Me ' 关 闭 并 卸 载 对 话 框 (5) 单 击 窗 体 Form1 的 关 于 菜 单, 输 入 以 下 代 码 : Private Sub mnuabout_click() frmabout.show vbmodal ' 显 示 模 式 对 话 框 例 13.2 程 序 启 动 时 显 示 关 于 对 话 框 可 以 将 程 序 的 关 于 对 话 框 作 为 程 序 启 动 时 显 示 的 快 速 提 示 窗 体, 这 种 窗 体 通 常 是 无 边 框 的 对 例 13.1 稍 作 修 改 即 可 实 现 这 一 功 能

264 第 13 章 对 话 框 设 计 251 (1) 打 开 例 13.1 的 工 程, 添 加 一 个 标 准 模 块, 代 码 为 : Sub main() Dim t As Double Form1.Show frmabout.show ' 装 载 并 显 示 窗 体 frmabout.caption = "" ' 设 置 对 话 框 窗 体 的 标 题 为 空 将 删 除 标 题 栏 frmabout.btnok.visible = False ' 删 除 确 定 按 钮 t = Timer Do While t + 10 > Timer ' 闲 置 循 环, 延 时 10 秒 DoEvents Loop Unload frmabout (2) 将 工 程 的 启 动 对 象 设 置 为 sub main 启 动 程 序 时, 将 显 示 图 13.4 所 示 的 效 果 图 13.4 例 13.2 的 启 动 情 况 请 注 意 对 比 启 动 程 序 时 的 屏 幕 显 示 与 单 击 关 于 按 钮 时 的 不 同 13.4 通 用 对 话 框 预 定 义 对 话 框 使 用 方 便, 但 只 能 用 来 输 入 或 显 示 简 单 信 息, 受 到 一 定 限 制 而 自 定 义 对 话 框 结 构 灵 活, 适 应 性 强, 能 满 足 各 种 各 样 的 要 求, 但 需 要 进 行 复 杂 的 设 计 Visual Basic 将 一 些 常 用 的 对 话 框, 如 文 件 的 打 开 保 存 与 打 印, 字 体 的 选 择, 调 色 板 等 定 义 为 通 用 对 话 框, 为 用 户 的 使 用 提 供 了 方 便 通 用 对 话 框 控 件 要 使 用 通 用 对 话 框, 就 必 须 利 用 通 用 对 话 框 控 件 通 用 对 话 框 控 件 是 Visual Basic

265 252 Visual Basic 程 序 设 计 教 程 的 众 多 ActiveX 控 件 之 一, 根 据 前 面 的 学 习, 我 们 已 经 知 道 要 使 用 这 类 控 件 必 须 首 先 将 相 应 的 控 件 工 具 添 加 到 Visual Basic 的 控 件 箱 中, 方 法 是 : 在 控 件 箱 上 单 击 鼠 标 右 键, 单 击 部 件 菜 单, 选 中 Microsoft Common Dialog Control 6.0 后 按 回 车 键 控 件 箱 中, 通 用 对 话 框 控 件 的 外 观 为 通 用 对 话 框 控 件 的 使 用 方 法 和 标 准 控 件 一 样, 要 在 程 序 中 使 用 通 用 对 话 框, 首 先 将 通 用 对 话 框 控 件 添 加 到 程 序 的 窗 体 中 程 序 运 行 时, 通 用 对 话 框 控 件 是 不 可 见 的, 所 以 控 件 在 窗 体 中 的 位 置 无 关 紧 要, 通 常 放 置 在 容 易 操 作 的 位 置, 以 便 设 置 控 件 的 属 性 通 用 对 话 框 控 件 可 以 添 加 到 各 种 窗 体 上, 包 括 MDI 窗 体 Visual Basic 为 在 窗 体 上 添 加 的 通 用 对 话 框 控 件 设 置 的 缺 省 名 称 为 CommonDialogX(X 为 1,2,3, ) 通 用 对 话 框 控 件 定 义 了 6 种 不 同 的 对 话 框, 程 序 运 行 时, 可 以 通 过 设 置 控 件 的 Action 属 性 或 调 用 不 同 的 方 法 来 显 示, 表 13.3 给 出 了 通 用 对 话 框 控 件 的 Action 属 性 和 显 示 方 法 程 序 中 设 置 Action 属 性 的 作 用 和 调 用 显 示 方 法 相 同, 例 如, 和 的 作 用 相 同 CommonDialog1.Action = 1 CommonDialog1.ShowOpen 表 13.3 通 用 对 话 框 控 件 的 Action 属 性 和 显 示 方 法 Action 属 性 值 功 能 方 法 0 没 有 作 用 1 显 示 打 开 文 件 对 话 框 ShowOpen 2 显 示 文 件 另 存 为 对 话 框 ShowSave 3 显 示 颜 色 对 话 框 ( 调 色 板 ) ShowColor 4 显 示 字 体 对 话 框 ShowFont 5 显 示 打 印 对 话 框 ShowPrinter 6 显 示 Windows 帮 助 对 话 框 ShowHelp 通 用 对 话 框 控 件 的 属 性 较 多, 可 以 按 控 件 的 功 能 分 类, 见 表 13.4 其 中,CancelError 属 性 用 来 设 置 或 返 回 对 选 择 通 用 对 话 框 中 的 取 消 操 作 的 响 应, 显 示 对 话 框 之 前, 将 CancelError 属 性 设 置 为 True, 若 选 择 取 消, 将 出 错 Flags 属 性 是 一 个 组 合 值, 用 来 设 置 对 话 框 的 附 加 选 项 设 置 通 用 对 话 框 控 件 的 属 性 值 最 好 的 方 法 是 使 用 控 件 的 属 性 页 对 话 框, 方 法 是 : 在 窗 体 中 的 通 用 对 话 框 控 件 上 单 击 鼠 标 右 键, 再 单 击 快 捷 菜 单 中 的 属 性 命 令, 或 者 首 先 选 中 窗 体 中 的 通 用 对 话 框 控 件, 再 单 击 属 性 窗 口 中 自 定 义 属 性 的 文 本 框 右 端 的 按 钮 属 性 页 对 话 框 包 含 打 开 / 另 存 为 颜 色 字 体 打 印 和 帮 助 5 个 选 项 卡, 如 图 13.5 所 示

266 第 13 章 对 话 框 设 计 253 表 13.4 通 用 对 话 框 的 常 用 属 性 分 类 属 性 名 称 作 用 共 有 属 性 CancelError 设 置 或 返 回 一 个 值, 标 识 当 选 取 取 消 时 是 否 出 错 Flags 与 对 话 框 有 关 的 附 加 选 项, 参 见 表 13.7 DefaultExt 缺 省 的 文 件 扩 展 名 ( 文 件 类 型 ) DialogTitle 对 话 框 的 标 题 若 省 略, 标 题 为 打 开 或 另 存 为 FileName 用 来 设 置 或 返 回 带 路 径 的 文 件 名 文 件 对 话 框 FileTitle 用 来 返 回 不 待 路 径 的 文 件 名 Filter 文 件 过 滤 器 FilterIndex 设 置 默 认 的 文 件 过 滤 器 InitDir 设 置 对 话 框 中 查 找 范 围 的 起 始 位 置, 缺 省 为 当 前 目 录 MaxFileSize 设 置 FileName 属 性 的 最 大 长 度, 单 位 为 字 节, 缺 省 为 260 颜 色 对 话 框 Color 返 回 所 选 择 的 颜 色 Color 返 回 字 体 的 颜 色 ( 必 须 将 Flags 属 性 设 置 为 cdlcfeffects) FontBold 是 否 加 黑 FontItalic 是 否 为 斜 体 FontName 字 体 名 称 字 体 对 话 框 FontSize 字 体 的 大 小 FontStrikeThru 是 否 加 删 除 线 FontUnderline 是 否 加 下 划 线 Max Min 设 置 在 大 小 列 表 框 显 示 的 字 体 的 最 大 最 小 尺 寸 ( 必 须 将 Flags 属 性 设 置 为 cdlcflimitsize) Copies 打 印 的 份 数 FromPage ToPage 设 置 或 返 回 起 始 终 止 打 印 的 页 号 hdc Windows 运 行 环 境 的 设 备 关 联 句 柄 打 印 对 话 框 Max Min 设 置 页 码 文 本 框 中, 可 以 输 入 的 最 大 最 小 页 码 Orientation 设 置 或 返 回 一 个 值, 标 识 以 纵 向 或 横 向 模 式 打 印 PrinterDefault 设 置 或 返 回 一 个 值, 标 识 在 对 话 框 中 的 选 择 是 否 用 于 改 变 系 统 缺 省 的 打 印 机 设 置 文 件 对 话 框 文 件 对 话 框 有 两 种 : 打 开 文 件 对 话 框 和 文 件 另 存 为 对 话 框 可 以 利 用 打 开 文 件 对 话 框 指 定 一 个 文 件 名 称, 供 程 序 读 取 文 件 时 用 典 型 的 打 开 文 件 对 话 框 如 图 13.6 所 示 文 件 另 存 为 对 话 框 与 打 开 文 件 对 话 框 基 本 相 同, 可 以 用 来 获 得 一 个 文 件 名, 以 便 将 程 序 的 数 据 存 放 到 磁 盘 上 文 件 对 话 框 的 属 性 主 要 有 DefaultExt FileName FileTitle Filter FilterIndex Flags

267 254 Visual Basic 程 序 设 计 教 程 InitDir MaxFileSize 等, 设 计 窗 体 时 可 以 在 通 用 对 话 框 控 件 的 属 性 页 对 话 框 中 设 置, 见 图 13.5(a) DefaultExt 属 性 定 义 了 在 文 件 对 话 框 中 输 入 的 文 件 名 不 包 括 扩 展 名 时 缺 省 的 扩 展 名 (a) 打 开 / 另 存 为 选 项 卡 (b) 颜 色 选 项 卡 (c) 字 体 选 项 卡 图 13.5 通 用 对 话 框 的 属 性 页 对 话 框 (d) 打 印 选 项 卡 图 13.6 打 开 文 件 对 话 框 Filter 属 性 定 义 了 文 件 列 表 中 的 文 件 类 型, 称 为 文 件 过 滤 器 形 式 上, 文 件 过 滤 器 为 两 个 用 符 号 隔 开 的 字 符 串, 如 文 本 文 件 (*.TXT) *.TXT, 左 边 的 字 符 串 为 显 示 在 对 话 框 的 文 件 类 型 中 的 描 述 性 文 本, 右 边 的 字 符 串 为 由 * 通 配 符 和 文 件 扩 展 名 构 成 的 类 型 说 明 Filter 属 性 可 以 包 含 多 个 用 符 号 隔 开 的 过 滤 器, 如 文 本 文 件 (*.TXT) (*.TXT) Web 页 (*.html) (*.html) Word 文 档 (*.DOC) (*.DOC) 缺 省 的 过 滤 器 由 FilterIndex 属 性 设 置, 例 如,

268 第 13 章 对 话 框 设 计 255 如 果 设 置 FilterIndex 属 性 为 2, 显 示 对 话 框 时, 文 件 类 型 中 显 示 Web 页 (*.html) Flags 属 性 用 于 设 置 文 件 对 话 框 的 附 加 选 项,Flags 属 性 的 取 值 及 作 用 见 表 13.5 表 13.5 文 件 对 话 框 的 Flags 属 性 的 取 值 及 作 用 符 号 常 数 值 描 述 cdlofnallowmultiselect &H200 指 定 文 件 名 列 表 框 允 许 多 重 选 择 运 行 时, 通 过 按 Shift 键 和 上 下 光 标 键 可 选 择 多 个 文 件 选 择 确 定 后,FileName 属 性 包 含 全 部 所 选 文 件 名, 各 文 件 名 用 空 格 隔 开 cdlofncreateprompt &H2000 当 文 件 不 存 在 时 对 话 框 要 提 示 创 建 文 件 该 标 志 自 动 设 置 cdlofnpathmustexist 和 cdlofnfilemustexist 标 志 cdlofnexplorer &H80000 使 用 类 似 资 源 管 理 器 的 打 开 一 个 文 件 的 对 话 框 模 板 CdlOFNExtensionDifferent &H400 表 示 返 回 的 文 件 扩 展 名 与 DefaultExt 属 性 指 定 的 扩 展 名 不 一 致 如 果 DefaultExt 属 性 为 空, 或 者 扩 展 相 匹 配, 或 者 没 有 扩 展 时, 此 标 志 不 设 置 关 闭 对 话 框 时, 可 以 检 查 这 个 标 志 的 值 cdlofnfilemustexist &H1000 表 示 只 能 输 入 文 件 名 列 表 框 中 已 经 存 在 的 文 件 名 如 果 该 标 志 被 设 置, 则 当 用 户 输 入 非 法 的 文 件 名 时, 要 显 示 一 个 警 告 该 标 志 自 动 设 置 cdlofnpathmustexist 标 志 cdlofnhelpbutton &H10 显 示 帮 助 按 钮 cdlofnhidereadonly &H4 隐 藏 只 读 复 选 框 cdlofnlongnames &H 使 用 长 文 件 名 cdlofnnochangedir &H8 强 制 对 话 框 将 对 话 框 打 开 时 的 目 录 置 成 当 前 目 录 CdlOFNNoDereferenceLinks &H 不 要 间 接 引 用 外 壳 链 接 ( 也 称 作 快 捷 方 式 ) 缺 省 时, 选 取 外 壳 链 接 会 引 起 它 被 外 壳 间 接 引 用 cdlofnnolongnames &H40000 无 长 文 件 名 CdlOFNNoReadOnlyReturn &H8000 表 示 返 回 的 文 件 不 能 具 有 只 读 属 性, 也 不 能 在 写 保 护 目 录 中 cdlofnnovalidate &H100 允 许 返 回 的 文 件 名 中 含 有 非 法 字 符 cdlofnoverwriteprompt &H2 设 置 另 存 为 对 话 框 当 选 择 的 文 件 已 经 存 在 时 应 产 生 一 个 信 息 框, 用 户 必 须 确 认 是 否 覆 盖 该 文 件 cdlofnpathmustexist &H800 表 示 只 能 输 入 有 效 路 径 如 果 设 置 该 标 志, 输 入 非 法 路 径 时, 将 显 示 一 个 警 告 信 息 cdlofnreadonly &H1 表 示 将 只 读 复 选 框 初 始 化 为 选 定 也 用 来 返 回 对 话 框 关 闭 后 只 读 复 选 框 的 状 态 cdlofnshareaware &H4000 忽 略 共 享 冲 突 错 误 例 13.3 显 示 图 片 (1) 新 建 一 个 标 准 EXE 工 程, 在 窗 体 Form1 中 添 加 一 个 打 开 (&O) 命 令 按 钮 btnopen 一 个 标 签 Label1 和 一 个 图 像 框 Image1, 如 图 13.7 所 示 ;

269 256 Visual Basic 程 序 设 计 教 程 图 13.7 例 13.3 的 设 计 窗 体 (2) 将 通 用 对 话 框 控 件 dlgimage 添 加 窗 体 中 ; (3) 切 换 到 代 码 编 辑 窗 口, 输 入 以 下 程 序 代 码 : Private Sub btnopen_click() With dlgimage.filename = "".Flags = cdlofnfilemustexist + cdlofnreadonly.filter = " 位 图 格 式 (*.bmp) *.bmp GIF 格 式 (*.gif) *.gif JPEG 格 式 (*.jpg) *.jpg".filterindex = 3 ' 显 示 *.JPG 文 件 列 表.DialogTitle = " 选 择 图 片 ".ShowOpen ' 显 示 打 开 对 话 框 End With If dlgimage.filename <> "" Then Label1.Caption = dlgimage.filename Image1.Picture = LoadPicture(dlgImage.FileName) End If Private Sub Form_Load() Label1.Caption = "" 其 中,Filter 属 性 中 定 义 了 3 个 文 件 过 滤 器, 通 过 FilterIndex 属 性 将 默 认 的 文 件 类 型 设 置 为 *.JPG 例 13.4 保 存 图 片 (1) 打 开 例 13.3 的 工 程, 在 窗 体 Form1 中 添 加 另 一 个 命 令 按 钮 btnsaveas,captions 属 性 设 置 为 保 存 (&S), 适 当 调 整 窗 体 中 控 件 的 布 局, 如 图 13.8 所 示 (2) 切 换 到 代 码 编 辑 窗 口, 添 加 以 下 代 码 : Private Sub btnsaveas_click() Dim s As String, ext As String, i As Integer i = InStrRev(Label1.Caption, "\") s = Mid(Label1.Caption, i + 1) ' 获 取 文 件 名 i = InStrRev(s, ".")

270 第 13 章 对 话 框 设 计 257 ext = UCase(Mid(s, i)) ' 获 取 文 件 扩 展 名 s = Left(s, i - 1) ' 删 除 扩 展 名 On Error GoTo errhandler ' 捕 捉 错 误 With dlgimage.cancelerror = True ' 按 取 消 则 出 错, 跳 转 到 标 识 符 errhandler 后 执 行.DialogTitle = " 保 存 图 片 ".DefaultExt = ".bmp" ' 设 置 默 认 的 扩 展 名 If ext = ".BMP" Then.FileName = s Else.FileName = s & ".bmp" End If.Filter = " 位 图 文 件 (*.bmp) *.bmp".flags = cdlofnoverwriteprompt ' 若 文 件 已 存 在, 提 示 确 认 覆 盖.ShowSave ' 显 示 另 存 为 对 话 框 End With If dlgimage.filename <> "" Then Label1.Caption = dlgimage.filetitle SavePicture Image1.Picture, dlgimage.filename ' 将 所 显 示 的 图 片 存 盘 End If errhandler: 图 13.8 例 13.4 的 设 计 窗 体 程 序 中 使 用 了 SavePicture 语 句 将 所 显 示 的 文 件 存 盘 对 于 图 像 框 控 件, 不 论 原 始 文 件 是 什 么 格 式, 都 将 存 为 Windows 位 图 文 件 (.bmp 文 件 ) 为 此, 程 序 中 对 原 文 件 的 类 型 进 行 了 判 断, 保 证 文 件 的 扩 展 名 为.bmp 为 防 止 在 用 户 选 择 了 取 消 后 仍 执 行 文 件 存 盘 操 作, 程 序 中 使 用 了 错 误 陷 阱 技 术, 请 读 者 注 意 理 解 并 掌 握 这 一 重 要 技 术 从 例 13.4 可 以 看 出, 尽 管 程 序 中 使 用 了 两 种 不 同 的 对 话 框, 只 要 添 加 一 个 标 准 控 件 就 足 够 了, 这 也 是 使 用 通 用 控 件 的 方 便 之 处

271 258 Visual Basic 程 序 设 计 教 程 颜 色 对 话 框 通 过 将 通 用 对 话 框 控 件 的 Action 属 性 设 置 为 3, 或 者 调 用 ShowColor 方 法, 可 以 显 示 颜 色 对 话 框 颜 色 对 话 框 用 来 从 调 色 板 中 选 择 颜 色, 或 者 创 建 和 选 择 自 定 义 颜 色, 如 图 13.9 所 示 图 13.9 颜 色 对 话 框 对 于 颜 色 对 话 框, 最 常 用 的 属 性 是 Color 属 性, 用 来 返 回 选 定 的 颜 色 值, 它 是 一 个 长 整 数 也 可 以 在 显 示 对 话 框 以 前, 设 置 缺 省 的 Color 属 性 的 值, 但 必 须 将 Flags 属 性 的 值 设 置 为 cdlccrgbinit 颜 色 对 话 框 的 Flags 属 性 的 取 值 及 作 用 见 表 13.6 表 13.6 颜 色 对 话 框 的 Flags 属 性 的 取 值 及 作 用 符 号 常 数 值 描 述 cdlccfullopen &H2 显 示 全 部 的 对 话 框, 包 括 定 义 自 定 义 颜 色 部 分 cdlccshowhelpbutton &H8 显 示 帮 助 按 钮 cdlccpreventfullopen &H4 使 规 定 自 定 义 颜 色 命 令 按 钮 无 效, 且 不 能 自 定 义 颜 色 cdlccrgbinit &H1 允 许 设 置 初 始 颜 色 值 例 13.5 动 态 设 置 窗 体 的 背 景 颜 色 创 建 一 个 标 准 的 EXE 工 程, 在 窗 体 Form1 上 添 加 一 个 通 用 对 话 框 控 件 CommonDialog1, 输 入 以 下 代 码 : Private Sub Form_Click() With CommonDialog1.Flags = cdlccrgbinit.color = BackColor ' 以 当 前 背 景 色 为 缺 省 颜 色.ShowColor ' 显 示 颜 色 对 话 框 BackColor =.Color ' 背 景 采 用 新 颜 色 End With 程 序 中,Backcolor 为 窗 体 的 背 景 色

272 第 13 章 对 话 框 设 计 字 体 对 话 框 通 过 将 CommonDialog 控 件 的 Action 属 性 设 置 为 4, 或 者 调 用 ShowFont 方 法 可 显 示 字 体 对 话 框 字 体 对 话 框 用 来 设 置 和 返 回 字 体 的 名 称 大 小 颜 色 样 式 和 效 果 等, 如 图 所 示 图 字 体 对 话 框 字 体 对 话 框 的 主 要 属 性 包 括 Color FontBold FontItalic FontName FontSize FontStrikeThru FontUnderline Max Min 等, 多 数 属 性 我 们 已 经 熟 悉, 这 里 学 习 Max 和 Min 属 性 Windows 中, 字 体 的 大 小 用 磅 (Point) 做 单 位,1 磅 等 于 1/72 英 寸 默 认 情 况 下, 字 体 大 小 的 取 值 范 围 是 1 到 2048 磅, 可 以 使 用 Min 属 性 和 Max 属 性 来 修 改 字 体 的 最 小 和 最 大 尺 寸 需 要 注 意, 要 在 设 置 Min Max 属 性 前 将 Flags 属 性 设 置 为 cdlcflimitsize 表 13.7 给 出 了 可 以 使 用 的 Flags 属 性 的 取 值 及 作 用 例 13.5 文 字 编 辑 器 的 字 体 设 置 功 能 上 一 章, 我 们 设 计 实 现 了 一 个 简 易 的 文 字 编 辑 器, 字 体 的 设 置 采 用 了 固 定 的 菜 单 形 式 这 里 改 用 字 体 对 话 框, 可 以 从 中 体 会 到 使 用 该 对 话 框 控 件 的 便 利 (1) 创 建 一 个 标 准 EXE 工 程, 为 窗 体 Form1 添 加 下 表 所 示 的 菜 单 : 标 题 及 层 次 名 称 格 式 (&O) mnuoption. 字 体 (&F) mnufont (2) 在 窗 体 中 添 加 一 个 通 用 对 话 框 控 件 dlgfont 和 一 个 文 本 框 txtdocument, 文 本 框 的 MultiLine 属 性 为 True, 如 图 所 示 (3) 切 换 到 代 码 窗 口, 输 入 以 下 代 码 : Private Sub Form_Resize() txtdocument.height = Me.ScaleHeight ' 设 置 文 本 框 最 大 txtdocument.width = Me.ScaleWidth

273 260 Visual Basic 程 序 设 计 教 程 表 13.7 字 体 对 话 框 的 Flags 属 性 的 取 值 及 作 用 符 号 常 数 值 描 述 cdlcfansionly &H400 只 允 许 选 择 Windows 字 符 集 的 字 体 如 果 设 置 该 标 志, 就 不 能 选 择 仅 含 符 号 的 字 体 cdlcfapply &H200 使 对 话 框 中 的 应 用 按 钮 有 效 cdlcfboth &H3 列 出 可 用 的 打 印 机 和 屏 幕 字 体 用 hdc 属 性 标 识 打 印 机 cdlcfeffects &H100 允 许 设 置 删 除 线 下 划 线 及 颜 色 效 果 cdlcffixedpitchonly &H4000 只 能 选 择 固 定 间 距 的 字 体 cdlcfforcefontexist &H10000 表 示 如 果 试 图 选 择 一 个 并 不 存 在 的 字 体 或 样 式, 显 示 出 错 信 息 cdlcfhelpbutton &H4 显 示 帮 助 按 钮 cdlcflimitsize &H2000 只 能 在 由 Min 和 Max 属 性 规 定 的 范 围 内 选 择 字 体 大 小 cdlcfnofacesel &H80000 没 有 选 择 字 体 名 称 cdlcfnosimulations &H1000 不 允 许 图 形 设 备 接 口 (GDI) 字 体 模 拟 cdlcfnosizesel &H 没 有 选 择 字 体 大 小 cdlcfnostylesel &H 没 有 选 择 样 式 cdlcfnovectorfonts &H800 不 允 许 矢 量 字 体 选 择 cdlcfprinterfonts &H2 使 对 话 框 只 列 出 由 hdc 属 性 指 定 的 打 印 机 支 持 的 字 体 cdlcfscalableonly &H20000 只 允 许 选 择 可 缩 放 的 字 体 cdlcfscreenfonts &H1 只 列 出 系 统 支 持 的 屏 幕 字 体 cdlcfttonly &H40000 只 允 许 选 择 TrueType 字 体 cdlcfwysiwyg &H8000 只 允 许 选 择 在 打 印 机 和 屏 幕 上 均 可 用 的 字 体 如 果 该 标 志 被 设 置, 则 cdlcfboth 和 cdlcfscalableonly 标 志 也 应 设 置 Private Sub mnufont_click() On Error GoTo errhandler ' 启 动 错 误 处 理 With dlgfont.cancelerror = True ' 如 果 选 择 取 消 将 出 错.Flags = cdlcfboth + cdlcfeffects ' 显 示 所 有 字 体 和 全 部 效 果.ShowFont ' 显 示 字 体 对 话 框 If.FontName <> "" Then txtdocument.fontname =.FontName End If txtdocument.fontbold =.FontBold txtdocument.fontitalic =.FontItalic txtdocument.fontsize =.FontSize txtdocument.fontstrikethru =.FontStrikethru txtdocument.fontunderline =.FontUnderline txtdocument.forecolor =.Color ' 设 置 字 体 颜 色 End With

274 第 13 章 对 话 框 设 计 261 errhandler: 图 3.11 例 13.5 的 设 计 窗 体 打 印 对 话 框 通 过 调 用 CommonDialog 控 件 的 ShowPrinter 方 法 可 显 示 打 印 对 话 框, 如 图 所 示 打 印 对 话 框 用 来 设 置 打 印 输 出 方 式, 如 打 印 范 围 打 印 质 量 打 印 份 数 等 打 印 对 话 框 还 包 含 当 前 安 装 的 打 印 机 的 信 息, 并 允 许 配 置 或 重 新 安 装 缺 省 打 印 机 图 打 印 对 话 框 打 印 对 话 框 同 样 具 有 CancelError Flags 属 性, 另 外 还 有 Copies FromPage hdc Max Min Orientation PrinterDefault ToPage 等 属 性 FromPage 属 性 和 ToPage 属 性 分 别 用 来 设 置 由 起 始 页 和 终 止 页 组 成 的 打 印 范 围, 但 首 先 要 设 置 Flags 属 性 为 cdlpdpagenum PrinterDefault 属 性 用 来 确 定 是 否 将 在 打 印 对 话 框 中 的 确 定 选 择 更 新 到 系 统 的 设

275 262 Visual Basic 程 序 设 计 教 程 置 中 默 认 情 况 下,PrinterDefault 属 性 为 True, 如 果 选 择 了 不 同 的 打 印 设 置,Visual Basic 将 修 改 Windows 的 设 置 如 果 改 为 False, 当 前 的 选 择 不 仅 不 会 保 存 在 Windows 系 统 中, 而 且 也 不 会 成 为 打 印 机 的 默 认 设 置 Copies 属 性 用 来 设 置 打 印 份 数, 如 果 Flags 属 性 设 置 为 cdlpdusedevmodecopies, 则 Copies 属 性 始 终 返 回 1 Flags 属 性 的 其 他 取 值 及 作 用 见 表 13.8 表 13.8 打 印 对 话 框 的 Flags 属 性 的 取 值 及 作 用 常 数 值 描 述 cdlpdallpages &H0 返 回 或 设 置 全 部 页 单 选 按 钮 的 状 态 cdlpdcollate &H10 返 回 或 设 置 分 页 复 选 框 的 状 态 cdlpddisableprinttofile &H80000 使 打 印 到 文 件 复 选 框 无 效 cdlpdhelpbutton &H800 显 示 帮 助 按 钮 cdlpdhideprinttofile &H 隐 藏 打 印 到 文 件 复 选 框 cdlpdnopagenums &H8 使 页 选 项 按 钮 和 相 关 的 编 辑 控 件 无 效 cdlpdnoselection &H4 使 选 择 选 项 按 钮 无 效 cdlpdnowarning &H80 没 有 缺 省 打 印 机 时 不 显 示 警 告 信 息 cdlpdpagenums &H2 返 回 或 设 置 页 选 项 按 钮 的 状 态 cdlpdprintsetup &H40 显 示 打 印 设 置 对 话 框 而 不 是 打 印 对 话 框 cdlpdprinttofile &H20 返 回 或 设 置 打 印 到 文 件 复 选 框 的 状 态 cdlpdreturndc &H100 为 选 择 的 打 印 机 返 回 一 个 设 备 句 柄 设 备 句 柄 返 回 到 hdc 属 性 中 cdlpdreturndefault &H400 返 回 缺 省 的 打 印 机 名 称 cdlpdreturnic &H200 为 选 择 的 打 印 机 返 回 一 个 信 息 上 下 文 信 息 上 下 文 提 供 了 一 个 不 用 建 立 设 备 句 柄 就 能 得 到 设 备 信 息 的 快 速 方 法 信 息 上 下 文 返 回 到 对 话 框 的 hdc 属 性 中 cdlpdselection &H1 返 回 或 设 置 选 择 选 项 按 钮 的 状 态 如 果 cdlpdpagenums 或 cdlpdselection 均 未 指 定, 全 部 选 项 按 钮 就 处 于 被 选 状 态 CdlPDUseDevModeCopies &H40000 如 果 打 印 机 驱 动 程 序 不 支 持 多 份 数 打 印, 则 设 置 该 属 性 将 使 打 印 对 话 中 的 份 数 微 调 控 件 的 数 值 无 效 如 果 驱 动 程 序 支 持 多 份 数 打 印, 则 设 置 该 属 性 指 示 对 话 框 将 所 要 的 份 数 值 存 放 在 Copies 属 性 中 需 要 注 意 的 是, 在 打 印 对 话 框 中 选 择 确 定 并 不 给 打 印 机 传 送 数 据, 只 是 设 置 希 望 打 印 数 据 的 情 况 如 果 PrinterDefault 属 性 为 True, 可 以 使 用 Printer 对 象 按 选 定 的 格 式 打 印 数 据 例 13.6 文 字 编 辑 器 的 打 印 功 能

276 第 13 章 对 话 框 设 计 263 文 字 处 理 程 序 离 不 开 文 档 的 打 印 输 出, 许 多 程 序 都 支 持 打 印 输 出 这 里 给 例 13.5 的 程 序 添 加 打 印 功 能 (1) 打 开 例 13.5 的 工 程, 利 用 菜 单 编 辑 器 给 窗 体 Form1 添 加 下 表 所 示 的 菜 单 ; 标 题 及 层 次 名 称 文 件 (&F) mnufile. 打 印 (&P) mnuprint (2) 单 击 打 印 菜 单, 输 入 以 下 程 序 代 码 : Private Sub mnuprint_click() On Error GoTo errhandler With dlgfont.cancelerror = True.ShowPrinter ' 显 示 打 印 对 话 框 End With Printer.Print txtdocument.text ' 将 数 据 发 送 到 打 印 机 Printer.EndDoc ' 完 成 打 印 errhandler: 值 得 一 提 的 是, 在 Windows 应 用 程 序 中, 打 印 是 最 复 杂 的 任 务 之 一, 不 可 能 通 过 这 么 简 单 的 一 个 例 子 把 所 有 问 题 都 讲 清 楚, 希 望 有 能 力 的 读 者 自 学 相 关 内 容 习 题 1. 为 程 序 添 加 一 个 关 于 对 话 框, 其 中 包 含 一 个 计 时 器 控 件, 实 现 在 对 话 框 打 开 后 15 秒 自 动 关 闭 要 求 在 运 行 程 序 时, 自 动 打 开 关 于 对 话 框, 即 作 为 快 速 启 动 窗 口, 也 可 以 通 过 菜 单 的 关 于 命 令 打 开 2. 用 驱 动 器 控 件 (Driver) 文 件 夹 控 件 (Folder) 和 文 件 控 件 (File) 等 创 建 一 个 标 准 对 话 框, 实 现 类 似 通 用 对 话 框 控 件 (CommonDialog) 的 功 能

277 第 14 章 键 盘 与 鼠 标 14.1 概 述 在 运 行 Windows 应 用 程 序 的 过 程 中, 当 用 户 按 下 键 盘 的 某 个 键 ( 包 括 字 符 键 和 各 种 控 制 键 及 其 组 合 ) 时, 会 产 生 键 盘 事 件 ; 当 用 户 移 动 单 击 双 击 或 拖 放 鼠 标 时, 会 产 生 鼠 标 事 件 Windows 应 用 程 序 能 够 及 时 获 取 这 些 事 件 并 作 出 响 应 键 盘 事 件 和 鼠 标 事 件 是 用 户 使 用 程 序 输 入 数 据 实 现 交 互 操 作 的 主 要 手 段, 是 数 据 输 入 控 制 程 序 运 行 状 态 的 基 本 形 式 Visual Basic 应 用 程 序 能 够 响 应 多 种 键 盘 事 件 和 鼠 标 事 件 例 如, 窗 体 图 片 框 与 图 像 控 件 都 能 检 测 鼠 标 指 针 的 位 置, 并 可 判 定 其 左 右 键 是 否 已 经 按 下, 还 能 响 应 鼠 标 按 钮 与 Shift Ctrl 或 Alt 键 的 各 种 组 合 利 用 键 盘 事 件 可 以 编 程 响 应 多 种 键 盘 操 作, 也 可 以 解 释 处 理 ASCII 字 符 Visual Basic 应 用 程 序 还 支 持 大 多 数 控 件 及 OLE 的 拖 放 功 能 可 用 控 件 的 Drag 方 法 连 同 某 些 属 性 和 事 件 来 实 现 控 件 的 拖 放 操 作 OLE 的 拖 放 使 应 用 程 序 的 数 据 交 换 功 能 大 大 增 强 14.2 键 盘 事 件 键 盘 事 件 有 三 种, 即 KeyPress KeyUp 和 KeyDown 事 件 窗 体 和 可 接 受 键 盘 输 入 的 控 件 ( 如 文 本 框 TextBox 命 令 按 钮 CommandButton 图 片 框 PictureBox 组 合 框 ComboBox 等 ) 都 可 识 别 这 些 事 件 值 得 注 意 的 是, 只 有 获 得 焦 点 的 对 象 才 能 够 接 受 键 盘 事 件 对 于 窗 体, 只 有 成 为 活 动 窗 体 并 且 窗 体 中 的 任 何 控 件 均 未 获 得 焦 点 时, 才 会 产 生 窗 体 的 键 盘 事 件 窗 体 中 任 何 控 件 已 经 获 得 焦 点 时, 会 产 生 控 件 的 键 盘 事 件 可 以 将 窗 体 上 的 控 件 ( 如 果 有 ) 都 设 为 无 效, 或 者 将 窗 体 的 KeyPreview 属 性 设 置 为 True, 使 窗 体 在 控 件 之 前 接 受 键 盘 事 件 KeyPress 事 件 检 测 的 键 对 应 于 所 有 标 准 ASCII 字 符, 包 括 标 准 键 盘 的 字 母 数 字 和 标 点 符 号 键 以 及 Enter Tab Backspace 等 通 常, 编 写 KeyPress 事 件 的 代 码 比 较 容 易 使 用 KeyUp 和 KeyDown 事 件 之 前 要 确 保 KeyPress 事 件 的 功 能 不 被 使 用 键 盘 事 件 不 是 相 互 排 斥 的 通 常, 按 下 某 一 键 时 将 同 时 产 生 KeyDown 和 KeyPress 事 件, 而 松 开 此 键 后 生 成 KeyUp 事 件 如 果 用 户 按 下 的 是 一 个 KeyPress 不 能 检 测 的 键 ( 如 Shift Alt Ctrl 等 ) 将 只 触 发 KeyDown 事 件, 松 开 此 键 后 时 同 样 产 生 KeyUp 事 件 KeyPress 事 件 接 受 KeyPress 事 件 的 对 象 包 括 窗 体 文 本 框 复 选 框 组 合 框 命 令 按 钮 列 表 框 图 片 框 滚 动 条 和 文 件 系 统 控 件 等

278 第 14 章 键 盘 与 鼠 标 265 在 按 下 与 ASCII 字 符 对 应 的 键 时 将 触 发 KeyPress 事 件 ASCII 字 符 集 中 除 了 代 表 标 准 键 盘 的 字 母 数 字 和 标 点 符 号, 也 代 表 大 多 数 控 制 键 但 是 KeyPress 事 件 只 识 别 Enter Tab 和 Backspace 键 KeyDown 和 KeyUp 事 件 能 够 检 测 控 制 键 无 论 何 时, 要 处 理 标 准 ASCII 字 符 都 应 首 先 考 虑 使 用 KeyPress 事 件 KeyPress 事 件 过 程 的 一 般 格 式 是 : Private Sub 对 象 名 _KeyPress(KeyAscii as Integer ) 其 中, 对 象 是 接 受 键 盘 事 件 的 对 象, KeyAscii 是 所 按 下 的 键 的 ASCII 码 值 在 KeyPress 事 件 过 程 中, 将 KeyAscii 的 值 改 为 0, 可 以 取 消 该 字 符 和 这 次 按 键 操 作 如 果 接 受 KeyPress 事 件 的 对 象 为 控 件 数 组, 对 应 的 事 件 过 程 的 格 式 为 : Private Sub 控 件 名 _KeyPress(Index as Integer,KeyAscii as Integer ) 其 中, Index 是 数 组 元 素 的 下 标 例 14.1 将 输 入 到 文 本 框 中 的 所 有 字 符 都 强 制 转 换 为 大 写 字 符 分 析 : 可 使 用 KeyPress 事 件 将 输 入 的 每 一 个 字 符 转 换 为 大 写 代 码 如 下 : Private Sub Text1_KeyPress (KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) 这 里 通 过 设 置 KeyAscii 参 数, 返 回 转 换 后 的 大 写 字 符 的 ASCII 码 值 Chr 函 数 将 ASCII 码 转 换 成 对 应 的 字 符,UCase 函 数 将 字 符 转 换 为 大 写,Asc 函 数 将 字 符 转 换 为 ASCII 码 例 14.2 用 回 车 键 切 换 输 入 焦 点 的 表 格 式 输 入 在 图 14.1 所 示 的 表 格 式 输 入 窗 口 中, 用 户 经 常 要 求 用 回 车 键 而 不 是 VB 默 认 的 Tab 键 实 现 不 同 文 本 框 间 的 切 换, 如 输 入 姓 名 后 按 回 车 键 自 动 转 到 年 龄 的 输 入 图 14.1 表 格 式 输 入 部 分 代 码 如 下 : Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer) If KeyAscii = vbkeyreturn Then KeyAscii = 0 Index = (Index + 1) Mod Text1.Count Text1(Index).SetFocus

279 266 Visual Basic 程 序 设 计 教 程 End If 其 中, 四 个 文 本 框 组 成 控 件 数 组 Ttext1,vbKeyReturn 为 VB 定 义 的 常 量 符 号, 值 为 13( 回 车 键 的 ASCII 码 ) 可 以 在 输 入 字 符 时 限 制 字 符 的 范 围, 虽 然 并 不 建 议 这 么 做 例 14.3 限 制 输 入 字 符 的 范 围 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii < 48 or KeyAscii>57 Then ' 按 键 是 不 是 0~9? MsgBox " 数 字 非 法! 只 能 输 入 数 字 字 符 " KeyAscii = 0 ' 撤 销 该 字 符, 也 不 显 示 End If KeyDown 事 件 和 KeyUp 事 件 KeyDown 事 件 在 按 下 按 键 时 触 发,KeyUp 事 件 则 在 释 放 按 键 时 产 生 KeyDown 事 件 和 KeyUp 事 件 提 供 了 最 低 级 的 键 盘 响 应, 可 以 报 告 键 盘 的 物 理 状 态 不 同 的 是,KeyPress 事 件 只 提 供 按 键 所 代 表 的 字 符 而 不 识 别 键 的 按 下 或 释 放 状 态, 例 如, 输 入 大 写 "A" 和 小 写 "a" 时, KeyDown 事 件 获 得 "A" 的 ASCII 码, 在 输 入 小 写 "a" 时,KeyDown 事 件 获 得 相 同 的 ASCII 码, 即 KeyDown 事 件 不 区 分 大 小 写, 而 KeyPress 事 件 将 字 母 的 大 小 写 作 为 两 个 不 同 的 ASCII 字 符 处 理 KeyDown 和 KeyUp 事 件 过 程 的 一 般 格 式 是 : Private Sub 对 象 名 _KeyDown(KeyCode As Integer, Shift As Integer) Private Sub 对 象 名 _KeyUp(KeyCode As Integer, Shift As Integer) 其 中, 对 象 是 窗 体 和 能 接 受 键 盘 事 件 的 控 件 KeyCode 是 所 按 键 的 扫 描 码, 表 14.1 给 出 了 常 用 的 按 键 的 扫 描 码 Shift 是 描 述 Shift Ctrl 和 Alt 键 的 状 态 的 一 个 整 数,Shift 参 数 是 一 个 位 域, 由 三 个 二 进 制 位 组 成, 最 低 位 ( 位 0) 表 示 Shift 键 的 状 态, 中 间 位 ( 位 1) 表 示 Ctrl 键 的 状 态, 最 高 位 ( 位 2) 表 示 Alt 键 的 状 态 VB 定 义 了 三 个 位 屏 蔽 常 数 vbshiftmask vbctrlmask vbaltmask, 用 来 测 试 三 个 键 的 组 合 表 14.2 列 出 了 Shift 参 数 的 取 值 例 14.4 判 断 是 否 按 下 了 某 个 键 以 下 程 序 代 码 可 判 断 是 否 按 下 了 Y 键 : Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbkeyy Then MsgBox " 您 按 下 了 Y 键 " 请 读 者 用 KeyPress 事 件 过 程 实 现 类 似 功 能, 考 虑 一 下 有 什 么 不 同

280 第 14 章 键 盘 与 鼠 标 267 表 14.1 常 用 的 KeyCode 参 数 值 ( 键 码 ) 分 类 键 码 常 数 值 说 明 标 准 键 区 数 字 小 键 盘 区 vbkeyback 8 Backspace 键 vbkeytab 9 Tab 键 vbkeyclear 12 Clear 键 vbkeyreturn 13 Enter 键 vbkeyshift 16 Shift 键 vbkeycontrol 17 Ctrl 键 vbkeymenu 18 菜 单 键 vbkeypause 19 Pause 键 vbkeycapital 20 Caps Lock 键 vbkeyescape 27 Esc 键 vbkeyspace 32 Spacebar 键 vbkeypageup 33 Page Up 键 vbkeypagedown 34 Page Down 键 vbkeyend 35 End 键 vbkeyhome 36 Home 键 vbkeyleft 37 Left Arrow 键 vbkeyup 38 Up Arrow 键 vbkeyright 39 Right Arrow 键 vbkeydown 40 Down Arrow 键 vbkeyselect 41 Select 键 vbkeyprint 42 Print Screen 键 vbkeyexecute 43 Execute 键 vbkeysnapshot 44 Snap Shot vbkeyinser 45 Ins 键 vbkeydelete 46 Del 键 vbkeyhelp 47 Help 键 vbkey0~ vbkey9 48~57 0~9 键 vbkeya~ vbkeyz 65~90 A~z 键 vbkeynumpad0~vbkeynumpad9 96~105 0~9 键 vbkeymultiply 106 乘 号 (*) 键 vbkeyadd 107 加 号 (+) 键 vbkeyseparator 108 Enter 键 vbkeysubtract 109 减 号 (-) 键 vbkeydecimal 110 小 数 点 (.) 键 vbkeydivide 111 除 号 (/) 键 vbkeynumlock 144 Num Lock 键 功 能 键 vbkeyf1~ vbkeyf16 112~127 F1~F16 键

281 268 Visual Basic 程 序 设 计 教 程 表 14.2 键 盘 事 件 过 程 的 Shift 参 数 的 取 值 二 进 制 值 十 进 制 值 常 数 意 义 vbshiftmask 按 Shift 键 vbctrlmask 按 Ctrl 键 vbaltmask 按 Alt 键 vbshiftmask+vbctrlmask 按 Shift 键 和 Ctrl 键 vbshiftmask+vbaltmask 按 Shift 键 和 Alt 键 vbctrlmask+vbaltmask 按 Ctrl 键 和 Alt 键 vbctrlmask+vbaltmask+vbshiftmask 按 Shift Ctrl 和 Alt 键 例 14.5 上 档 符 号 键 的 监 测 要 监 测 是 否 按 下 了 键 盘 上 的 上 档 符 号 键, 只 使 用 KeyCode 是 不 够 的, 需 要 使 用 Shift 参 数 下 面 的 程 序 可 判 断 是 否 按 下 了 * 键 : Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbkey8 And Shift = 1 Then MsgBox " 您 按 下 了 * 键 " End If 利 用 位 屏 蔽 常 数 和 位 运 算 符 AND 可 以 根 据 Shift 的 值 确 定 是 否 按 下 了 某 个 特 殊 键 例 14.6 判 断 是 否 按 下 了 Ctrl 键 下 面 的 程 序 用 来 监 测 是 否 按 下 了 Ctrl+A 组 合 键 : Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbkeya And (Shift And vbctrlmask) > 0 Then Print Shift End If 容 易 理 解, 通 常 Shift 参 数 是 和 KeyCode 参 数 结 合 使 用 的, 如 果 单 独 使 用 可 能 会 遇 到 麻 烦 请 观 察 下 面 的 程 序 的 运 行 情 况, 并 分 析 运 行 结 果 Private Sub form_keydown(keycode As Integer, Shift As Integer) Select Case Shift Case 1 Print " 按 下 了 Shift" Case 2 Print " 按 下 了 Ctrl" Case 4 Print " 按 下 了 Alt" Case 3 Print " 按 下 了 Shift 和 Ctrl" Case 5

282 第 14 章 键 盘 与 鼠 标 269 Print " 按 下 了 Shift 和 Alt" Case 6 Print " 按 下 了 Ctrl 和 Alt" Case 7 Print " 按 下 了 Shift,Ctrl 和 Alt" End Select 例 14.7 用 键 盘 拖 放 窗 体 创 建 一 个 标 准 程 序, 窗 体 中 包 含 一 个 标 签 Label1 如 图 14.2 所 示 图 14.2 键 盘 拖 放 程 序 代 码 如 下 : Dim bdrag As Boolean ' 状 态 标 志 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Dim idirx As Integer, idiry As Integer Dim istep As Integer idirx = 0: idiry = 0 Select Case KeyCode Case vbkeyreturn bdrag = False ' 结 束 拖 放 Label1.Caption = " 按 空 格 键 开 始 拖 放 " Case vbkeyspace bdrag = True ' 开 始 拖 放 Label1.Caption = " 按 回 车 键 结 束 拖 放 " & vbcrlf & " 按 下 Shift 键 快 速 拖 放 " Case vbkeyescape End Case vbkeyup idirx = 0: idiry = -1 Case vbkeydown idirx = 0: idiry = 1 Case vbkeyleft

283 270 Visual Basic 程 序 设 计 教 程 idirx = -1: idiry = 0 Case vbkeyright idirx = 1: idiry = 0 End Select If (Shift And vbshiftmask) > 0 Then istep = 100 Else istep = 10 If bdrag Then Me.Top = Me.Top + idiry * istep Me.Left = Me.Left + idirx * istep End If Private Sub Form_Load() bdrag = False Label1.Caption = " 按 空 格 键 开 始 拖 放 " 14.3 鼠 标 事 件 Windows 程 序 中, 与 鼠 标 操 作 相 关 的 事 件 较 多, 如 单 击 事 件 Click 双 击 事 件 DblClick 鼠 标 事 件 (MouseDown MouseUp MouseMove) 和 拖 动 事 件 (DragDrop DragOver) 等 如 果 程 序 中 需 要 检 测 和 控 制 鼠 标 的 位 置 和 状 态 的 改 变, 就 需 要 使 用 鼠 标 事 件 鼠 标 事 件 1. 鼠 标 事 件 鼠 标 事 件 有 三 种, 即 MouseDown MouseUp 和 MouseMove 事 件 按 下 鼠 标 按 钮 时 产 生 MouseDown 事 件, 释 放 鼠 标 按 钮 时 产 生 MouseUp 事 件, 移 动 鼠 标 ( 指 针 位 置 改 变 ) 时 产 生 MouseMove 事 件 鼠 标 事 件 过 程 的 一 般 格 式 是 : Private Sub 对 象 _MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Private Sub 对 象 _MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Private Sub 对 象 _MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 其 中 : (1) 对 象 可 以 是 窗 体 及 能 接 受 鼠 标 事 件 的 大 多 数 控 件 当 鼠 标 指 针 位 于 窗 体 上 时, 窗 体 将 识 别 鼠 标 事 件 当 鼠 标 指 针 在 控 件 上 时, 控 件 将 识 别 鼠 标 事 件 如 果 按 下 鼠 标 按 钮 不 放, 则 即 使 指 针 已 移 离 对 象, 对 象 仍 将 继 续 识 别 所 有 鼠 标 事 件, 直 到 用 户 释 放 按 钮 为 止 (2)Button 参 数 是 一 个 整 数, 是 一 个 由 3 个 二 进 制 位 组 成 的 位 域, 分 别 表 示 鼠 标 的 3 个 按 钮 的 状 态, 如 果 某 个 按 钮 按 下, 其 对 应 的 二 进 制 位 就 被 设 置 为 1, 否 则 为 0 Button 参 数 最 低 位 ( 位 0) 对 应 左 按 钮, 中 间 位 ( 位 1) 对 应 右 按 钮, 最 高 位 ( 位 2) 对 应 中 间 按 钮 表 14.3

284 第 14 章 键 盘 与 鼠 标 271 给 出 了 Button 参 数 的 取 值 及 对 应 的 含 义 表 14.3 鼠 标 事 件 过 程 的 Button 参 数 的 取 值 二 进 制 值 十 进 制 值 常 数 意 义 未 按 下 任 何 按 钮 vbleftbutton 按 下 了 左 键 vbrightbutton 按 下 了 右 键 vbmiddlebutton 按 下 了 中 间 键 vbleftbutton+vbrightbutton 按 下 了 左 键 和 右 键 vbleftbutton+vbmiddlebutton 按 下 了 左 键 和 中 间 键 vbrightbutton+vbmiddlebutton 按 下 了 右 键 和 中 间 键 vbrightbutton+vbmiddlebutton+vbleftbutton 按 下 了 左 中 右 三 键 (3)Shift 参 数 用 来 监 测 键 盘 上 Shift Ctrl 和 Alt 键 的 状 态, 与 键 盘 事 件 的 Shift 参 数 相 同 (4)X Y 参 数 表 示 鼠 标 指 针 的 坐 标 位 置,X Y 的 值 与 当 前 对 象 的 坐 标 系 有 关 2. MouseDown 事 件 MouseDown 事 件 是 三 种 鼠 标 事 件 中 最 常 使 用 的 事 件 例 如, 在 运 行 时 可 用 它 的 坐 标 参 数 调 整 对 象 的 位 置, 还 可 用 它 实 现 某 些 图 形 效 果 改 变 对 象 位 置 的 方 法 有 两 种, 设 置 Left Top 属 性 的 值 或 者 调 用 Move 方 法 例 14.8 用 MouseDown 事 件 和 Move 方 法 移 动 窗 体 的 命 令 按 钮 部 分 代 码 如 下 : Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Command1.Move X, Y 例 14.9 用 MouseDown 事 件 和 Line 方 法 实 现 绘 图 代 码 如 下 : Dim bdraw As Boolean ' 绘 图 状 态 标 志 Private Sub Form_Load() bdraw = False Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Select Case Button Case vbleftbutton If bdraw Then Line -(X, Y) ' 划 直 线 到 当 前 位 置 Else PSet (X, Y) ' 开 始 划 线, 设 置 起 点

285 272 Visual Basic 程 序 设 计 教 程 bdraw = True End If Case vbrightbutton bdraw = False ' 结 束 划 线 End Select 程 序 的 运 行 情 况 如 图 14.3 所 示 图 14.3 用 MouseDown 事 件 画 图 3. MouseMove 事 件 当 鼠 标 指 针 在 屏 幕 上 移 动 时 就 会 发 生 MouseMove 事 件 只 要 鼠 标 指 针 移 到 了 窗 体 或 控 件 等 对 象 的 边 框 内, 该 对 象 就 会 接 受 MouseMove 事 件 移 动 鼠 标 时,MouseMove 事 件 会 按 一 定 的 时 间 间 隔 连 续 不 断 地 产 生, 并 不 是 屏 幕 上 的 每 个 像 素 点 都 发 生 MouseMove 事 件, 如 果 鼠 标 移 动 越 快, 发 生 MouseMove 事 件 的 两 个 点 的 间 距 就 会 越 大 因 此, 不 要 在 MouseMove 事 件 过 程 中 完 成 较 复 杂 的 任 务 例 用 MouseMove 事 件 画 图 代 码 如 下 : Dim bdraw As Boolean ' 绘 图 状 态 标 志 Private Sub Form_Load() bdraw = False Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Select Case Button Case vbleftbutton Circle (X, Y), 50 ' 开 始 划 线, 设 置 起 点 bdraw = True Case vbrightbutton

286 第 14 章 键 盘 与 鼠 标 273 bdraw = False ' 结 束 划 线 End Select Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If bdraw Then Line -(X, Y) ' 划 直 线 到 当 前 位 置 Circle (X, Y), 50 End If 4. MouseUp 事 件 释 放 鼠 标 按 钮 时, 产 生 MouseUp 事 件 MouseUp 事 件 与 MouseDown MouseMove 事 件 搭 配 使 用, 往 往 相 得 益 彰 例 如, 按 下 鼠 标 左 键 开 始 画 线, 释 放 鼠 标 则 结 束 画 线 例 在 鼠 标 事 件 中 画 图 Dim bdraw As Boolean ' 绘 图 状 态 标 志 Private Sub Form_Load() bdraw = False Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) CurrentX = X: CurrentY = Y ' 设 置 起 始 点 bdraw = True ' 开 始 Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) If bdraw Then Line -(X, Y) ' 划 线 End If Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) bdraw = False ' 结 束 鼠 标 指 针 Windows 程 序 中, 经 常 利 用 不 同 形 状 的 鼠 标 指 针 反 映 信 息, 如 I 型 棒 十 字 线 沙 漏 等 VB 中, 可 以 通 过 MousePointer 属 性 和 MouseIcon 属 性 来 设 置 鼠 标 指 针 的 形 状 1. MousePointer 属 性 对 象 的 MousePointer 属 性 用 来 设 置 鼠 标 指 向 该 对 象 时 的 鼠 标 指 针 形 状,MousePointer 属

287 274 Visual Basic 程 序 设 计 教 程 性 的 取 值 见 表 14.4 缺 省 设 置 值 为 0-Default 并 显 示 成 标 准 的 Windows 箭 头 指 针 表 14.4 MousePointer 属 性 的 取 值 和 鼠 标 指 针 的 形 状 常 数 值 描 述 vbdefault 0 ( 缺 省 值 ) 形 状 由 系 统 决 定 VbArrow 1 箭 头 VbCrosshair 2 十 字 线 VbIbeam 3 I 型 棒 VbIconPointer 4 图 标 ( 矩 形 内 的 小 矩 形 ) VbSizePointer 5 尺 寸 线 ( 指 向 东 南 西 北 四 个 方 向 的 箭 头 ) VbSizeNESW 6 右 上 - 左 下 尺 寸 线 ( 指 向 东 北 和 西 南 方 向 的 双 箭 头 ) VbSizeNS 7 垂 直 尺 寸 线 ( 指 向 南 和 北 的 双 箭 头 ) VbSizeNWSE 8 左 上 - 右 下 尺 寸 线 ( 指 向 东 南 和 西 北 方 向 的 双 箭 头 ) VbSizeWE 9 水 平 尺 寸 线 ( 指 向 东 和 西 两 个 方 向 的 双 箭 头 ) VbUpArrow 10 向 上 的 箭 头 VbHourglass 11 沙 漏 ( 表 示 等 待 状 态 ) VbNoDrop 12 不 允 许 放 下 VbArrowHourglass 13 箭 头 和 沙 漏 VbArrowQuestion 14 箭 头 和 问 号 VbSizeAll 15 四 向 尺 寸 线 ( 表 示 缩 放 ) VbCustom 99 通 过 MouseIcon 属 性 所 指 定 的 自 定 义 图 标 例 设 置 鼠 标 指 针 的 形 状 Private Sub Form_Click() Dim c As Integer, i As Integer, j As Integer Me.MousePointer = vbhourglass For c = 0 To 15 Me.ForeColor = QBColor(c) For i = 0 To Me.ScaleHeight Step 50 Line (0, i)-(me.scalewidth, Me.ScaleHeight - i) For j = 0 To Next Next Next Me.MousePointer = vbdefault 2. MouseIcon 属 性 当 MousePointer 属 性 为 99 时, 可 以 用 MouseIcon 属 性 将 鼠 标 指 针 设 置 为 任 意 形 状 设 置 MouseIcon 属 性 的 方 法 有 两 种 : 设 计 状 态 下 在 属 性 窗 口 中 设 置, 或 者 在 运 行 状 态 下

288 第 14 章 键 盘 与 鼠 标 275 用 LoadPicture 函 数 加 载 图 形 文 件 设 置 可 以 使 用 图 标 或 光 标 文 件 来 设 置 鼠 标 指 针 图 标 就 是.ico 文 件, 与 VB 的 图 标 文 件 相 同 光 标 就 是.cur 文 件, 本 质 上 象 图 标 一 样 是 位 图 但 是, 光 标 主 要 是 表 示 鼠 标 指 针 的 形 状 而 创 建 的 14.4 对 象 拖 放 在 运 行 Windows 程 序 时, 可 以 使 用 鼠 标 拖 放 功 能 方 便 地 改 变 某 些 对 象 的 位 置 VB 支 持 两 种 拖 放, 即 控 件 拖 放 和 OLE 拖 放 拖 放 包 括 两 个 操 作, 按 下 鼠 标 按 钮 并 移 动 控 件 的 操 作 叫 拖 动 (Dragging), 释 放 按 钮 的 操 作 叫 放 下 (Dropping) 控 件 拖 放 控 件 拖 放 是 指 程 序 运 行 时 将 控 件 拖 动 到 新 的 位 置 VB 中, 除 菜 单 计 时 器 对 话 框 控 件 图 形 控 件 等 以 外 的 控 件 都 支 持 拖 放 表 14.5 给 出 了 与 控 件 拖 放 有 关 的 属 性 事 件 和 方 法 表 14.5 与 拖 放 有 关 的 控 件 属 性 事 件 和 方 法 类 别 项 目 描 述 DragMode 启 动 自 动 拖 动 控 件 或 手 工 拖 动 控 件 属 性 DragIcon 指 定 拖 动 控 件 时 显 示 的 图 标 DragDrop 识 别 何 时 将 控 件 拖 动 到 对 象 上 事 件 DragOver 识 别 何 时 在 对 象 上 拖 动 控 件 方 法 Drag 启 动 或 停 止 手 工 拖 动 在 讨 论 拖 放 时, 常 把 被 拖 动 的 控 件 称 为 源, 而 把 拖 动 结 束 时 在 其 上 放 下 被 拖 控 件 的 对 象 称 为 目 标 拖 动 时, 若 鼠 标 指 针 位 于 某 控 件 边 框 内 时 释 放 按 钮, 则 该 控 件 成 为 目 标 若 指 针 位 于 窗 体 上 无 控 件 的 区 域 时, 该 窗 体 成 为 目 标 1. DragMode 属 性 控 件 的 拖 放 模 式 有 两 种 : 自 动 模 式 (Automatic) 和 手 动 模 式 (Manual) 当 DragMode 属 性 设 置 为 0( 默 认 值 ) 时 表 示 手 工 拖 动, 当 DragMode 属 性 为 1 时 表 示 自 动 拖 动, 拖 动 控 件 时, 控 件 不 能 正 常 响 应 鼠 标 事 件 2. DragIcon 属 性 在 拖 动 控 件 的 过 程 中, 被 拖 动 的 控 件 并 没 有 移 动, 随 鼠 标 移 动 的 是 代 表 该 控 件 的 图 标 拖 动 控 件 时,VB 将 控 件 的 灰 色 轮 廓 作 为 缺 省 的 拖 动 图 标 对 DragIcon 属 性 进 行 设 置, 就 可 用 其 他 图 片 代 替 该 轮 廓 设 置 DragIcon 属 性 的 方 法 与 MouseIcon 属 性 类 似, 参 见 节 3. DragDrop 事 件 将 源 控 件 ( 图 标 ) 拖 动 到 目 标 对 象 上 后, 松 开 鼠 标 按 钮, 则 产 生 DragDrop 事 件 DragDrop

289 276 Visual Basic 程 序 设 计 教 程 事 件 过 程 的 一 般 格 式 为 : Private Sub 对 象 _DragDrop(Source As Control, X As Single, Y As Single) 这 里, 对 象 为 目 标,Source 参 数 为 正 在 被 拖 动 的 控 件, 即 源 X Y 是 拖 放 结 束 时 鼠 标 指 针 的 位 置 例 自 动 方 式 拖 放 图 片 创 建 一 个 新 的 标 准 EXE 工 程, 在 窗 体 Form1 上 添 加 两 个 图 片 框 Picture1 和 Picture2, 设 置 Picture1 的 Picture 为 某 一 图 片, 如 图 14.4 所 示 图 14.4 拖 放 图 片 程 序 代 码 如 下 : Private Sub Form_Load() Picture1.DragMode = 1 ' 自 动 拖 放 Private Sub Picture2_DragDrop(Source As Control, X As Single, Y As Single) If TypeOf Source Is PictureBox Then ' 源 对 象 是 不 是 图 片 框 Picture2.Picture = Source.Picture End If 由 于 Source 参 数 的 类 型 为 Control, 可 以 是 任 何 可 拖 放 的 控 件, 程 序 中 需 要 用 TypeOf 和 Is 判 断 Source 参 数 的 具 体 类 型 4. DragOver 事 件 在 拖 动 对 象 的 过 程 中, 当 鼠 标 指 针 越 过 一 个 控 件 时, 被 越 过 的 控 件 将 产 生 DragOver 事 件 DragOver 事 件 过 程 的 一 般 格 式 是 : Private Sub 对 象 _DragOver(Source As Control, X As Single, Y As Single, State As Integer) 其 他 参 数 的 含 义 和 DragDrop 事 件 相 同,State 参 数 是 一 个 整 数, 若 为 0 表 示 鼠 标 指 针 正 在 进 入 控 件 的 边 框 ; 若 为 1 表 示 正 在 离 开 控 件 的 边 框 ; 若 为 2 表 示 正 位 于 控 件 的 边 框 内 例 在 窗 体 上 添 加 3 个 图 片 框, 设 置 Picture1 的 Picture 属 性 为 某 一 图 片 输 入 以 下 代 码 : Dim icolor As Long Private Sub Form_Load()

290 第 14 章 键 盘 与 鼠 标 277 Picture1.DragMode = 1 ' 自 动 拖 放 icolor = Picture2.BackColor ' 保 留 背 景 色 Private Sub Picture2_DragOver(Source As Control, X As Single, _ Y As Single, State As Integer) Select Case State Case 0: Picture2.BackColor = vbblack ' 设 置 为 黑 色 背 景 Case 1: Picture2.BackColor = icolor ' 恢 复 背 景 色 End Select Private Sub Picture3_DragDrop(Source As Control, X As Single, Y As Single) If TypeOf Source Is PictureBox Then ' 源 对 象 是 不 是 图 片 框 Picture2.Picture = Source.Picture End If 运 行 程 序 时, 拖 动 Picture1 经 过 Picture2 到 Picture3 上 再 释 放 鼠 标 5. Drag 方 法 不 管 DragMode 属 性 如 何 设 置, 程 序 中 都 可 以 使 用 Drag 方 法 启 动 停 止 或 取 消 拖 放 操 作 Drag 方 法 的 使 用 格 式 为 : 对 象 _Drag [Action] 可 选 的 Action 参 数 是 一 个 整 数, 为 0-vbCancel 时 表 示 取 消 拖 动 操 作, 为 1-vbBeginDrag 时 表 示 开 始 拖 动 对 象, 为 2-vbEndDrag 时 表 示 停 止 拖 放 对 象 ( 将 产 生 Drop 事 件 ) 6. 自 动 拖 放 和 手 动 拖 放 将 控 件 的 DragMode 属 性 设 置 为 1 时, 在 程 序 运 行 过 程 中, 用 户 拖 动 该 控 件 时, 系 统 将 自 动 启 动 拖 放 过 程, 该 控 件 可 以 直 接 被 拖 动 同 时, 在 放 下 对 象 时, 系 统 会 自 动 停 止 拖 放 过 程 这 就 是 自 动 拖 放 将 DragMode 属 性 设 置 为 0 时, 在 程 序 运 行 过 程 中, 系 统 不 会 自 动 启 动 或 停 止 拖 放 过 程, 什 么 时 候 启 动, 什 么 时 候 停 止, 完 全 由 用 户 决 定 例 手 工 方 式 拖 放 图 片 打 开 例 的 程 序, 将 程 序 代 码 改 为 : Private Sub Form_Load() Picture1.DragMode = 0 ' 手 动 拖 放 Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Picture1.Drag 1 ' 开 始 拖 放 Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Picture1.Drag 2 ' 结 束 拖 放

291 278 Visual Basic 程 序 设 计 教 程 Private Sub Picture2_DragDrop(Source As Control, X As Single, Y As Single) If TypeOf Source Is PictureBox Then ' 源 对 象 是 不 是 图 片 框 Picture2.Picture = Source.Picture End If OLE 拖 放 OLE 拖 放 是 Visual Basic 提 供 的 最 强 大 最 有 用 的 功 能 之 一, 支 持 在 控 件 和 控 件 之 间 在 控 件 和 其 他 Windows 应 用 程 序 之 间 拖 动 文 本 和 图 形 OLE 拖 放 包 括 从 对 象 拖 动 数 据 和 将 拖 动 数 据 放 入 对 象 Visual Basic 的 几 乎 所 有 控 件 都 支 持 OLE 拖 放 OLE 拖 放 也 分 为 自 动 拖 放 和 手 动 拖 放 自 动 拖 动 无 需 编 写 任 何 代 码, 因 此 比 较 容 易 实 现 例 文 字 的 拖 放 创 建 一 个 标 准 EXE 程 序, 在 Form1 窗 体 中 添 加 两 个 文 本 框 Text1 和 Text2, 输 入 以 下 代 码 : Private Sub Form_Load() Text1.OLEDragMode = 1 ' 自 动 拖 动 源 Text2.OLEDropMode = 2 ' 自 动 接 收 OLE 拖 动 放 下 运 行 程 序, 文 本 框 中 输 入 若 干 字 符, 用 鼠 标 选 中 Text1 中 的 部 分 字 符, 然 后 拖 动 这 些 选 中 的 字 符 到 Text2 上, 释 放 鼠 标 习 题 1. 在 窗 体 上 添 加 一 个 文 本 框, 要 求 输 入 地 址, 即 只 允 许 输 入 字 母 数 字 减 号 (-) 下 划 线 和 点 (.) 2. 在 窗 体 下 方 设 置 一 个 标 签, 显 示 移 动 鼠 标 时, 鼠 标 指 针 在 窗 体 中 的 位 置 坐 标 (x,y) 3. 在 窗 体 中 添 加 一 个 图 片 框, 并 加 入 一 图 片, 编 程 实 现 由 鼠 标 拖 动 图 片 到 窗 体 的 任 意 位 置 4. 为 程 序 设 计 一 个 通 用 函 数 CheckInput, 判 断 字 符 型 输 入 参 数 是 否 为 数 值 型 ( 整 数 或 实 数 ) 在 窗 体 中 加 入 若 干 文 本 框, 在 每 个 文 本 框 的 LostFocus 事 件 过 程 中 调 用 通 用 函 数 CheckInput, 检 查 所 输 入 的 字 符 的 合 法 性 5. 在 窗 体 中 添 加 一 个 较 大 的 文 本 框 ( 允 许 换 行 ), 输 入 字 符 时, 自 动 将 每 一 段 ( 用 回 车 符 划 分 段 落 ) 每 一 句 ( 以 句 号 结 束 ) 的 第 一 个 小 写 字 母 转 化 为 大 写 字 母, 其 他 字 母 不 变

292 第 15 章 文 件 15.1 文 件 概 述 文 件 是 存 储 在 计 算 机 存 储 器 中 的 信 息 的 集 合, 是 程 序 数 据 和 文 档 的 统 称 程 序 运 行 时, 从 文 件 中 读 取 数 据, 并 把 处 理 结 果 存 放 到 文 件 中 例 如, 用 Word Excel 等 编 辑 制 作 的 文 档 表 格 都 是 文 件, 将 文 件 存 放 在 磁 盘 中 就 成 为 磁 盘 文 件, 输 出 到 打 印 机 将 产 生 打 印 机 文 件 因 此, 广 义 地 讲, 计 算 机 中 能 实 现 数 据 输 入 输 出 的 任 何 设 备 都 是 文 件 存 储 在 磁 盘 中 的 文 件 叫 磁 盘 文 件, 简 称 文 件, 与 输 入 输 出 设 备 对 应 的 是 设 备 文 件 每 个 文 件 具 有 惟 一 的 文 件 标 识, 即 文 件 全 称 Windows 下 的 格 式 为 : 文 件 路 径 \ 文 件 名 文 件 路 径 由 磁 盘 盘 符 和 文 件 夹 名 构 成 文 件 名 由 主 文 件 名 和 扩 展 名 构 成 例 如 : D:\MyData\Score.DAT 表 示 文 件 Score.DAT 存 放 在 D 盘 的 \MyData 文 件 夹 中, 文 件 的 扩 展 名 为.DAT Visual Basic 的 每 个 数 据 文 件 由 若 干 记 录 构 成, 每 个 记 录 可 以 有 若 干 字 段, 每 个 字 段 可 包 含 若 干 字 符 字 符 是 组 成 数 据 的 最 小 单 位, 可 以 是 一 个 字 节 数 字 字 母 标 点 符 号 或 汉 字 ( 双 字 节 字 符 ) 字 段 ( 也 叫 域 ) 是 数 据 的 基 本 形 式, 字 段 值 ( 数 据 项 ) 可 以 是 整 数 实 数 字 符 串 对 象 数 据 等 记 录 是 数 据 处 理 ( 数 据 存 取 ) 的 基 本 单 位, 由 相 关 的 字 段 构 成 例 如, 在 学 生 的 档 案 中 需 要 存 储 每 个 同 学 的 学 号 姓 名 班 级 专 业 家 庭 住 址 等, 可 以 用 下 面 的 表 格 表 示 : 学 号 姓 名 性 别 班 级 家 庭 住 址 王 刚 男 管 理 02-1 山 东 济 南 王 晓 娟 女 会 计 02-3 山 东 青 岛 每 行 对 应 一 个 同 学 的 信 息, 构 成 一 条 记 录 Visual Basic 下 有 两 种 不 同 的 方 法 来 处 理 文 件 : 使 用 传 统 的 方 法 或 者 使 用 文 件 系 统 对 象 (FSO) 模 型, 前 者 提 供 了 对 早 期 的 BASIC 语 言 的 兼 容 性, 后 者 使 用 了 最 新 的 面 向 对 象 技 术 VB 下 存 取 文 件 的 方 式 有 三 种 : 1. 顺 序 方 式 顺 序 方 式 是 为 存 取 文 本 文 件 设 计 的 文 本 文 件 中 每 一 个 字 符 都 被 假 设 为 代 表 一 个 文 本 字 符 或 者 文 本 格 式 序 列 文 本 文 件 中 记 录 与 行 对 应, 行 的 长 度 是 可 变 的 数 据 的 存 取 按 行 的 先 后 顺 序 进 行 2. 随 机 方 式 可 随 机 访 问 的 文 件 由 相 同 长 度 的 记 录 组 成 记 录 的 构 成 通 常 由 用 户 根 据 需 要 自 行 定 义, 可 表 示 为 自 定 义 的 记 录 类 型 数 据 以 二 进 制 形 式 存 储 在 文 件 中 可 以 随 机 存 取 任 意 一 个 记 录,

293 280 Visual Basic 程 序 设 计 教 程 而 不 考 虑 记 录 的 存 储 顺 序 存 取 记 录 时, 必 须 指 明 所 存 取 记 录 的 记 录 号 3. 二 进 制 方 式 将 数 据 作 为 二 进 制 的 字 节 来 存 取, 没 有 数 据 类 型 和 记 录 长 度 的 含 义 为 了 能 够 正 确 地 存 取 数 据 必 须 精 确 地 知 道 数 据 是 如 何 写 到 文 件 中 的 与 随 机 方 式 类 似, 可 以 存 取 任 意 位 置 的 数 据 VB 中 存 取 文 件 的 一 般 步 骤 是 : 1. 打 开 ( 或 创 建 ) 文 件 任 何 文 件 必 须 先 打 开 或 创 建 后 才 能 使 用 如 果 要 使 用 的 文 件 已 经 存 在, 可 以 直 接 打 开 该 文 件 ; 若 文 件 还 不 存 在, 就 要 创 建 一 个 新 的 文 件 并 打 开 2. 对 文 件 进 行 读 写 操 作 即 在 打 开 的 文 件 上 执 行 所 需 要 的 数 据 输 入 输 出 操 作 通 常, 把 将 数 据 存 放 到 文 件 中 的 操 作 叫 作 写 数 据, 而 把 从 文 件 中 获 取 数 据 到 内 存 的 操 作 称 作 读 数 据 3. 关 闭 文 件 完 成 文 件 的 读 写 后, 应 该 及 时 关 闭 文 件 文 件 被 打 开 以 后, 系 统 在 内 存 中 自 动 为 文 件 的 读 写 开 辟 了 一 个 缓 冲 区, 程 序 执 行 写 文 件 操 作 时, 只 是 简 单 地 将 数 据 输 出 到 缓 冲 区, 然 后 由 系 统 对 缓 冲 区 进 行 管 理, 在 必 要 时 将 数 据 存 到 磁 盘 上 程 序 执 行 读 操 作 时, 只 是 到 缓 冲 区 中 读 取 数 据, 由 系 统 决 定 是 否 需 要 将 磁 盘 上 的 数 据 读 入 缓 冲 区 关 闭 文 件 可 以 将 缓 冲 区 中 需 要 保 留 的 数 据 存 到 磁 盘 上, 并 释 放 缓 冲 区 的 内 存 空 间 供 以 后 使 用 15.2 文 件 的 打 开 与 关 闭 顺 序 文 件 的 打 开 打 开 文 件 使 用 Open 语 句 为 顺 序 方 式 读 写 打 开 的 文 件 叫 顺 序 文 件, 打 开 顺 序 文 件 的 Open 语 句 的 格 式 是 : Open 文 件 名 For 方 式 [ 锁 定 ] As [#] 文 件 号 [ Len = 记 录 长 度 ] 其 中,Open For As Len 都 是 VB 关 键 字,[ ] 中 的 部 分 是 可 选 的 (1) 文 件 名 是 由 字 符 串 表 示 ( 括 在 双 引 号 中 ) 的 被 打 开 的 文 件 的 文 件 名, 可 以 采 用 绝 对 路 径 形 式 或 者 相 对 路 径 形 式, 相 对 路 径 是 相 对 程 序 所 在 的 文 件 夹 的 (2) 方 式 可 以 取 Input Output Append 三 种 之 一, 含 义 为 : Input: 为 读 操 作 打 开 文 件, 即 打 开 文 件 的 目 的 是 读 取 文 件 中 的 数 据 要 打 开 的 文 件 必 须 存 在, 如 果 不 存 在 将 产 生 文 件 未 找 到 的 错 误 Output: 为 写 操 作 打 开 文 件, 即, 目 的 是 向 文 件 中 存 入 数 据 要 打 开 的 文 件 如 果 不 存 在, 将 创 建 该 文 件 ; 如 果 已 经 存 在, 将 覆 盖 该 文 件, 文 件 的 旧 数 据 将 被 删 除 Append: 目 的 是 向 文 件 中 追 加 数 据 如 果 要 打 开 的 文 件 不 存 在,Append 方 式 与 Output 方 式 相 同 如 果 文 件 存 在, 将 打 开 该 文 件, 并 将 文 件 指 针 定 位 到 文 件 的 尾 部, 所 添 加 的 数 据 将 存 放 到 原 来 的 数 据 的 后 面, 原 来 的 数 据 将 被 保 留 下 来 (3) 锁 定 用 来 在 网 络 或 多 任 务 环 境 下 限 制 其 他 程 序 对 该 文 件 的 操 作, 有 四 种 选 择 :

294 第 15 章 文 件 281 Shared( 共 享 ) Lock Read( 禁 止 读 ) Lock Write( 禁 止 写 ) Lock Read Write( 禁 止 读 写 ) (4) 文 件 号 是 一 个 整 数, 介 于 1 和 511 之 间 用 Open 语 句 打 开 文 件 时, 必 须 为 被 打 开 的 文 件 分 配 一 个 有 效 的 文 件 号, 对 文 件 的 读 写 操 作 等 都 是 通 过 文 件 号 进 行 的 任 何 两 个 已 经 打 开 的 文 件 的 文 件 号 都 不 能 相 同 调 用 Open 语 句 以 前, 可 以 使 用 FreeFile 函 数 获 得 一 个 有 效 的 文 件 号 (5) 记 录 长 度 是 一 个 整 数, 表 示 读 写 操 作 的 缓 冲 区 大 小, 缓 冲 区 越 大, 占 用 的 内 存 就 越 多, 读 写 速 度 就 越 快 默 认 的 记 录 长 度 为 512, 最 大 不 能 超 过 记 录 长 度 不 需 要 与 顺 序 文 件 的 记 录 长 度 相 对 应 例 如 : Open "D:\MyData\Test.TXT" For Input As #1 表 示 要 以 读 方 式 打 开 D:\MyData 文 件 夹 下 的 Test.TXT 文 件, 并 指 定 文 件 号 为 1 Open "Test.TXT" For Output As #2 表 示 要 以 写 方 式 在 当 前 文 件 夹 中 创 建 新 文 件 Test.TXT, 指 定 文 件 号 为 2 ifile = FreeFile Open "Test.TXT" For Append As ifile 表 示 要 以 追 加 方 式 打 开 当 前 文 件 夹 下 的 文 件 Test.TXT, 并 自 动 分 配 一 个 有 效 的 文 件 号 随 机 文 件 的 打 开 用 Open 语 句 打 开 随 机 文 件 的 语 法 格 式 是 : Open 文 件 名 [ For Random ] [ Access 存 取 类 型 ] As 文 件 号 Len = 记 录 长 度 其 中,Open For Random Access As Len 等 为 关 键 字 (1) For Random 表 示 以 随 机 方 式 打 开 ( 或 创 建 ) 文 件 要 打 开 的 文 件 可 以 存 在 也 可 以 不 存 在 For Random 是 可 选 的, 也 就 是 说, 对 于 Open 语 句, 如 果 不 指 定 文 件 的 访 问 方 式, 就 采 用 随 机 方 式 (2) 存 取 类 型 有 三 种 :Read( 只 读 ) Write( 只 写 ) 和 ReadWrite( 读 写, 默 认 类 型 ) (3) 记 录 长 度 表 示 对 文 件 进 行 随 机 存 取 时 记 录 的 确 定 长 度 对 于 随 机 文 件, 每 一 记 录 长 度 都 相 同, 是 固 定 的 记 录 中 每 个 字 段 的 长 度 也 是 固 定 的, 记 录 长 度 为 所 有 字 段 的 长 度 之 和, 以 字 节 为 单 位 记 录 长 度 可 以 用 Len 函 数 计 算, 格 式 是 : Len = Len( 记 录 的 类 型 说 明 ) 其 中, 记 录 的 类 型 说 明 是 用 户 用 Type End Type 语 句 定 义 的 记 录 类 型 例 如 : Type MyType Name as String*10 Age as Integer End Type ifile = FreeFile Open "Test.DAT" for Random as ifile Len = Len( MyType )

295 282 Visual Basic 程 序 设 计 教 程 表 示 以 随 机 方 式 打 开 ( 或 创 建 ) 当 前 文 件 夹 下 的 Test.DAT 文 件, 记 录 的 类 型 为 MyType, 自 动 分 配 文 件 号 二 进 制 文 件 的 打 开 打 开 二 进 制 文 件 的 Open 语 句 的 格 式 是 : Open 文 件 名 For Binary [ Access 存 取 类 型 ] As 文 件 号 其 中,Open For Binary Access As 等 是 系 统 关 键 字, For Binary 表 示 以 二 进 制 方 式 打 开 ( 或 创 建 ) 文 件 文 件 的 关 闭 关 闭 文 件 使 用 Close 语 句, 格 式 为 : Close [ [#] 文 件 号 ] [,[#] 文 件 号 ] 说 明 : (1) 若 省 略 文 件 号, 则 关 闭 所 有 打 开 的 文 件 ; 否 则, 只 关 闭 指 定 的 文 件 (2) 关 闭 文 件 不 仅 可 以 将 缓 冲 区 中 的 数 据 写 入 文 件 中, 释 放 文 件 缓 冲 区, 而 且 也 释 放 了 相 应 的 文 件 号 如 果 不 显 式 地 关 闭 文 件, 即 使 包 含 Open 语 句 的 过 程 或 函 数 已 经 结 束, 打 开 的 文 件 也 不 会 关 闭 程 序 结 束 时, 自 动 关 闭 所 有 打 开 的 文 件 15.3 文 件 指 针 文 件 指 针 的 概 念 要 进 行 读 写 操 作 的 文 件 被 打 开 以 后, 系 统 自 动 生 成 一 个 文 件 指 针, 用 来 表 示 文 件 的 读 写 位 置 文 件 读 写 总 是 从 文 件 指 针 所 指 向 的 位 置 开 始 的 打 开 文 件 的 方 式 不 同, 文 件 指 针 的 初 始 位 置 也 不 同 用 Append 方 式 打 开 文 件 时, 文 件 指 针 指 向 文 件 的 末 尾, 而 用 其 他 方 式 (Input Output Random Binary 等 ) 打 开 文 件 时, 文 件 指 针 指 向 文 件 的 开 始 每 一 次 读 写 对 文 件 后, 文 件 指 针 都 自 动 向 后 移 动 到 下 一 个 读 写 操 作 的 位 置, 移 动 的 距 离 由 Open 语 句 和 读 写 操 作 语 句 的 参 数 决 定 对 于 随 机 文 件, 文 件 指 针 的 最 小 移 动 单 位 是 一 个 记 录 的 长 度 对 于 顺 序 文 件, 文 件 指 针 的 移 动 以 字 符 为 单 位, 决 定 于 读 写 的 字 符 串 的 长 度 在 二 进 制 文 件 中, 文 件 指 针 的 移 动 单 位 为 字 节 文 件 指 针 的 操 作 1. Loc 函 数 Loc 函 数 用 于 返 回 指 定 文 件 的 最 后 一 次 读 写 的 指 针 位 置, 格 式 为 : Loc( 文 件 号 ) 函 数 的 返 回 值 为 一 个 整 数 对 于 随 机 文 件,Loc 函 数 返 回 的 是 一 个 记 录 号, 表 示 最 后 一 次 读 写 的 记 录 对 于 顺 序 文 件,Loc 函 数 返 回 的 是 文 件 中 文 件 指 针 的 当 前 位 置 除 以 128 的 值

296 第 15 章 文 件 283 需 要 说 明 的 是, 对 于 顺 序 文 件 一 般 不 会 使 用 Loc 函 数, 也 不 需 要 使 用 Loc 函 数 对 于 二 进 制 文 件,Loc 函 数 返 回 最 后 一 次 读 写 的 字 节 位 置 2. Seek 函 数 Seek 函 数 返 回 文 件 指 针 的 当 前 位 置, 格 式 为 : Seek( 文 件 号 ) Seek 函 数 的 返 回 值 是 一 个 整 数, 在 1 到 之 间 对 于 随 机 文 件,Seek 函 数 返 回 下 一 个 要 读 写 的 记 录 号 对 于 其 他 文 件 (Binary Input Output Append 等 ),Seek 函 数 返 回 下 一 次 读 写 的 字 节 位 置, 文 件 中 的 第 一 个 字 节 位 于 位 置 1, 第 二 个 字 节 位 于 位 置 2, 依 此 类 推 3. Seek 语 句 Seek 语 句 用 来 实 现 文 件 指 针 的 移 动 定 位, 格 式 为 : Seek [#] 文 件 号, 位 置 文 件 号 是 已 经 用 Open 语 句 打 开 的 文 件 的 文 件 号, 位 置 是 下 一 次 读 写 的 位 置 位 置 是 一 个 数 值 表 达 式, 取 值 在 1 到 之 间 对 于 随 机 文 件, 位 置 是 下 一 次 读 写 的 记 录 号, 若 为 0 或 负 数, 将 产 生 错 误 的 记 录 号 错 误, 如 果 超 出 了 文 件 中 的 记 录 总 数, 则 对 文 件 的 读 和 写 操 作 会 扩 展 该 文 件 对 于 顺 序 文 件 和 二 进 制 文 件, 位 置 是 从 文 件 开 头 到 指 定 位 置 的 字 节 数 4. Loc 函 数 Seek 函 数 Seek 语 句 的 对 比 对 于 顺 序 文 件,Seek 语 句 把 文 件 指 针 移 到 指 定 的 字 节 位 置 上, 而 Seek 函 数 将 返 回 与 下 一 次 文 件 读 写 有 关 的 文 件 指 针 位 置 Loc 函 数 不 适 用 于 顺 序 文 件 对 于 随 机 文 件,Seek 语 句 只 是 把 文 件 指 针 指 向 下 一 次 读 写 的 记 录 的 开 头, 而 Seek 函 数 返 回 要 读 写 的 记 录 的 记 录 号,Loc 函 数 返 回 上 一 次 读 写 操 作 的 记 录 号 对 于 二 进 制 文 件,Seek 语 句 将 文 件 指 针 移 动 到 指 定 的 字 节 位 置, 而 Seek 函 数 返 回 下 一 次 读 写 操 作 的 字 节 位 置,Loc 函 数 返 回 上 一 次 读 写 操 作 的 字 节 位 置 15.4 顺 序 文 件 的 读 写 当 要 处 理 的 文 件 是 以 字 符 为 主 的 文 本 文 件 时, 使 用 顺 序 方 式 读 写 文 件 最 合 适 顺 序 方 式 不 太 适 合 于 存 取 有 很 多 数 字 组 成 的 文 件, 因 为 每 个 数 字 都 要 按 字 符 串 存 储, 不 仅 浪 费 存 储 空 间, 而 且 读 写 速 度 也 会 较 慢 顺 序 文 件 的 写 操 作 向 顺 序 文 件 写 数 据 可 以 使 用 Print # 语 句 或 Write # 语 句 1. Print # 语 句 Print # 语 句 用 来 将 一 个 或 多 个 格 式 化 的 数 据 写 入 顺 序 文 件, 格 式 为 : Print # 文 件 号,[ 表 达 式 列 表 ] 其 中, 文 件 号 对 应 已 经 用 Open 语 句 打 开 的 文 件 (Output 或 Append 方 式 ), 文 件 号 和 后 面 的 逗 号 不 能 省 略 表 达 式 列 表 由 以 逗 号 或 分 号 ( 或 空 白 ) 分 隔 的 输 出 项 表 达 式 组

297 284 Visual Basic 程 序 设 计 教 程 成 用 分 号 分 隔 时, 后 面 的 数 据 跟 在 上 一 数 据 的 后 面 输 出 采 用 逗 号 分 隔 时, 输 出 的 数 据 按 制 表 位 对 齐 例 如 : Print #1,"abc",-123,456 输 出 结 果 为 :abc Print #1,"abc"; -123; 456 输 出 结 果 为 :abc 也 可 以 用 Spc 函 数 或 Tab 函 数 控 制 输 出 格 式, 例 如 : Print #1,"abc"; Spc(11); -123; Spc(9); 456 Print #1,"abc"; Tab(15); -123; Tab(29); 456 Print #1,"abc"; Tab; -123; Tab; 456 ' 使 用 不 带 参 数 的 Tab 函 数 输 出 结 果 都 是 :abc 通 常 每 个 Print # 语 句 执 行 后 自 动 插 入 回 车 换 行 符 如 果 表 达 式 列 表 的 最 后 是 逗 号 或 分 号, 下 一 个 Print # 语 句 的 输 出 将 跟 在 同 一 行 的 后 面 写 入 文 件 的 所 有 数 据 的 格 式 都 是 国 际 化 的 对 于 Boolean 型 数 据, 输 出 的 是 True 或 False Date 型 数 据 采 用 标 准 短 日 期 格 式, 如 果 未 指 定 日 期 或 时 间 或 者 设 置 为 零, 则 只 将 指 定 的 部 分 写 入 文 件 中 如 果 输 出 的 数 据 是 Empty, 则 不 将 任 何 数 据 写 入 文 件 如 果 输 出 的 是 Null, 则 将 Null 写 入 文 件 2. Write # 语 句 Write # 语 句 用 来 将 数 据 写 入 文 件, 格 式 为 : Write # 文 件 号,[ 表 达 式 列 表 ] Write # 语 句 的 用 法 和 Print # 语 句 相 似, 不 同 的 是 : (1) 输 出 的 数 据 采 用 紧 凑 格 式 存 放, 数 据 项 之 间 自 动 用 逗 号 分 开 ; (2) 输 出 的 字 符 串 自 动 用 引 号 扩 起 来 例 如 :Write #1,"abc",-123,456 输 出 结 果 是 :"abc",-123,456 例 15.1 建 立 一 个 通 讯 录 创 建 一 个 标 准 EXE 文 件, 在 Form1 窗 体 中 添 加 4 个 标 签 3 个 文 本 框 (txtname txtbirth txtaddr) 2 个 单 选 按 钮 (optfemal optmale) 2 个 命 令 按 钮 (cmdsave cmdexit), 各 控 件 的 属 性 设 置 参 考 图 15.1 图 15.1 创 建 通 讯 录

298 第 15 章 文 件 285 程 序 代 码 如 下 : Dim ifile As Integer ' 文 件 号 Private Sub Init() txtname.text = "": optfemal.value = True txtbirth.text = "": txtaddr.text = "" Private Sub cmdexit_click() End ' 退 出 程 序 Private Sub cmdsave_click() Dim ssex As String If Not IsDate(txtBirth.Text) Then ' 数 据 格 式 控 制 MsgBox " 生 日 非 法! 请 输 入 年 - 月 - 日 " txtbirth.setfocus Exit Sub End If If optfemal.value = True Then ssex = " 男 " Else ssex = " 女 " Write #ifile, txtname.text, ssex, CDate(txtBirth.Text), txtaddr.text ' 写 文 件 Init ' 初 始 化 Private Sub Form_Load() Init ' 初 始 化 ifile = FreeFile Open "d:\txl.txt" For Output As ifile ' 打 开 文 件 Private Sub Form_Unload(Cancel As Integer) Close ifile ' 关 闭 文 件 运 行 程 序, 输 入 一 个 人 的 信 息 后 按 保 存 按 钮 将 数 据 存 入 文 件, 再 输 入 另 一 个 人 的 信 息, 如 此 反 复 最 后, 按 退 出 按 钮 结 束 程 序 的 运 行 程 序 运 行 后, 在 D:\ 上 可 以 找 到 txl.txt 文 件, 双 击 文 件 名 可 以 用 记 事 本 程 序 打 开, 文 件 的 内 容 如 下 : " 王 峰 "," 男 ",# #," 山 东 济 南 " " 李 丽 萍 "," 女 ",# #," 山 东 青 岛 " 向 顺 序 文 件 中 追 加 数 据, 同 样 使 用 Print # 语 句 和 Write # 语 句, 只 是 文 件 的 打 开 方 式 为 Append 对 于 例 15.1, 只 要 将 Open 语 句 中 的 Output 改 为 Append 即 可 实 现 通 讯 录 追 加

299 286 Visual Basic 程 序 设 计 教 程 顺 序 文 件 的 读 操 作 从 顺 序 文 件 中 读 取 数 据 可 以 使 用 Input # 语 句 Line Input # 语 句 或 Input 函 数 1. Input # 语 句 格 式 :Input # 文 件 号, 变 量 名 表 功 能 : 从 指 定 的 顺 序 文 件 中 读 取 数 据, 并 把 数 据 分 别 赋 给 变 量 名 表 中 的 变 量 读 取 数 据 时,Input # 语 句 忽 略 空 格 制 表 符 回 车 换 行 符 和 逗 号 数 值 型 数 据 和 字 符 串 可 以 直 接 读 入 并 赋 给 相 应 的 变 量, 双 引 号 被 看 作 字 符 串 的 定 界 符 ( 不 是 必 需 的 ), 也 将 被 忽 略 括 在 两 个 # 号 间 的 标 准 日 期 时 间 可 以 直 接 转 化 为 时 间 日 期 True 和 False 可 以 转 化 为 逻 辑 值 两 个 逗 号 之 间 的 空 白 或 空 行, 将 转 化 为 Empty 为 了 能 够 用 Input # 语 句 将 文 件 的 数 据 正 确 读 入 到 变 量 中, 在 将 数 据 写 入 文 件 时, 要 使 用 Write # 语 句 而 不 使 用 Print # 语 句 使 用 Write # 语 句 可 以 确 保 将 各 个 数 据 正 确 分 隔 开 在 读 取 数 据 时, 如 果 已 到 达 文 件 末 尾, 继 续 读 会 被 终 止 并 产 生 一 个 错 误 为 了 避 免 出 错, 常 在 读 操 作 前 用 EOF 函 数 检 测 是 否 已 经 到 达 文 件 末 尾 例 15.2 读 取 并 打 印 通 讯 录 建 立 一 个 标 准 EXE 工 程, 在 窗 体 Form1 种 添 加 一 个 命 令 按 钮, 输 入 以 下 程 序 : Private Sub Command1_Click() Dim ifile As Integer Dim sname As String, ssex As String, dbirth As Date, saddr As String ifile = FreeFile Open "d:\txl.txt" For Input As ifile While Not EOF(iFile) Input #ifile, sname, ssex, dbirth, saddr Debug.Print sname, ssex, dbirth, saddr Wend Close ifile 2. Line Input # 语 句 格 式 :Line Input # 文 件 号, 字 符 串 变 量 名 功 能 : 顺 序 文 件 中 读 取 一 整 行 字 符 并 赋 给 后 面 的 变 量 说 明 : (1) 字 符 串 变 量 名 是 一 个 字 符 串 型 的 简 单 变 量 名 或 数 组 元 素 名 (2)Line Input # 以 行 为 单 位 读 取 信 息, 每 行 对 应 一 个 字 符 串 文 件 中 的 行 以 回 车 换 行 符 作 为 结 束 符 行 中 的 所 有 字 符 均 不 经 转 换 地 赋 给 变 量 利 用 Line Input # 语 句 可 以 实 现 文 本 文 件 的 复 制 例 15.3 复 制 文 本 文 件 新 建 一 个 标 准 EXE 工 程, 窗 体 Form1 包 含 一 个 命 令 按 钮, 程 序 代 码 为 : Private Sub Command1_Click() Dim if1 As Integer, if2 As Integer

300 第 15 章 文 件 287 Dim sline As String if1 = FreeFile Open "d:\txl.txt" For Input As if1 ' 打 开 源 文 件 if2 = FreeFile Open "d:\txl_new.txt" For Output As if2 ' 创 建 目 标 文 件 While Not EOF(if1) Line Input #if1, sline ' 从 源 文 件 中 读 取 一 行 Debug.Print sline Print #if2, sline ' 写 入 目 标 文 件 Wend Close ' 关 闭 所 有 打 开 的 文 件 运 行 程 序, 单 击 窗 体 中 的 按 钮 后, 在 D:\ 产 生 一 个 文 本 文 件 txt_new.txt, 其 内 容 和 txl.txt 完 全 相 同 3. Input 函 数 格 式 :Input(n, [#] 文 件 号 ) 功 能 : 从 指 定 文 件 中 读 取 n 个 字 符 的 字 符 串 与 Input # 语 句 不 同,Input 函 数 返 回 它 所 读 出 的 所 有 字 符, 包 括 逗 号 回 车 符 空 格 制 表 符 换 行 符 引 号 等 也 就 是 说,Input 函 数 把 文 件 作 为 无 格 式 的 字 符 流 来 读 取, 不 把 回 车 换 行 符 看 作 一 次 读 操 作 的 结 束 标 志 Input 函 数 可 以 用 来 读 取 二 进 制 文 件, 而 且, 通 常 不 用 于 顺 序 文 件 读 操 作 15.5 随 机 文 件 的 读 写 随 机 文 件 是 以 随 机 方 式 打 开 的 文 件, 由 一 组 长 度 相 同 的 记 录 组 成 随 机 文 件 的 特 点 是 : (1) 随 机 文 件 的 记 录 长 度 是 固 定 的, 打 开 文 件 时 必 须 指 定 文 件 长 度 ; (2) 每 条 记 录 都 可 包 含 若 干 字 段, 字 段 具 有 标 准 类 型 或 用 户 定 义 类 型 ; (3) 随 机 文 件 打 开 后 既 可 以 读 也 可 以 写, 读 写 随 机 文 件 必 须 指 定 记 录 号, 但 可 以 按 任 何 次 序 读 写 记 录, 而 不 必 像 顺 序 文 件 那 样 按 顺 序 进 行 要 使 用 随 机 文 件, 就 要 先 定 义 记 录 的 数 据 类 型 用 Type End Type 语 句 定 义 的 自 定 义 类 型 可 以 作 为 随 机 文 件 的 记 录 类 型 Type End Type 语 句 通 常 放 在 标 准 程 序 模 块 中, 也 可 以 加 上 Private 放 在 窗 体 模 块 中 随 机 文 件 的 读 写 操 作 1. 随 机 文 件 的 写 操 作 将 记 录 写 入 随 机 文 件 使 用 Put # 语 句, 格 式 为 : Put # 文 件 号,[ 记 录 号 ], 变 量 名 其 功 能 是 把 变 量 的 值 作 为 第 记 录 号 条 记 录 写 入 指 定 的 随 机 文 件 如 果 省 略 了 记

301 288 Visual Basic 程 序 设 计 教 程 录 号 ( 逗 号 不 能 省 略 ), 则 使 用 最 近 一 次 执 行 Get # 语 句 或 Put # 语 句 后 的 记 录, 或 者 用 Seek 函 数 指 定 的 记 录 例 15.4 建 立 可 随 机 存 取 的 通 讯 录 创 建 一 个 标 准 EXE 工 程, 参 照 例 15.1 设 计 程 序 的 界 面, 切 换 到 代 码 窗 口, 输 入 以 下 程 序 : Private Type Person ' 记 录 类 型 Name As String * 20 Sex As String * 2 Birth As Date Addr As String * 40 End Type Dim ifile As Integer ' 文 件 号 Dim irec As Integer ' 记 录 号 Private Sub Init() txtname.text = "": optfemal.value = True txtbirth.text = "": txtaddr.text = "" Private Sub cmdexit_click() End ' 退 出 程 序 Private Sub cmdsave_click() Dim p As Person ' 记 录 类 型 p.name = txtname.text If optfemal.value = True Then p.sex = " 男 " Else p.sex = " 女 " If Not IsDate(txtBirth.Text) Then MsgBox " 生 日 非 法! 请 输 入 年 - 月 - 日 " txtbirth.setfocus Exit Sub Else p.birth = txtbirth.text End If p.addr = txtaddr.text Put #ifile, irec, p ' 写 文 件 irec = irec + 1 ' 下 一 记 录 Init ' 初 始 化 Private Sub Form_Load() Dim p As Person Init ' 初 始 化

302 第 15 章 文 件 289 ifile = FreeFile: irec = 1 Open "d:\txl.dat" For Random As ifile Len = Len(p) ' 打 开 随 机 文 件 Private Sub Form_Unload(Cancel As Integer) Close ifile ' 关 闭 文 件 运 行 程 序, 输 入 两 条 记 录, 退 出 程 序 后 会 在 D:\ 下 找 到 txl.dat 文 件, 检 查 文 件 属 性 会 发 现 文 件 的 大 小 为 140 字 节, 正 好 是 自 定 义 数 据 类 型 Person 的 长 度 的 2 倍 2. 随 机 文 件 的 读 操 作 从 随 机 文 件 中 读 取 记 录 使 用 Get # 语 句, 格 式 为 : Get # 文 件 号,[ 记 录 号 ], 变 量 其 作 用 是 从 指 定 的 随 机 文 件 中 读 取 第 记 录 号 条 记 录 并 把 读 取 到 的 数 据 赋 给 变 量 Get # 语 句 的 用 法 与 Put # 语 句 相 似, 不 再 赘 述 例 15.5 任 意 读 取 通 讯 录 中 的 记 录 创 建 一 个 标 准 EXE 程 序, 在 窗 体 Form1 上 添 加 一 个 文 本 框 和 若 干 标 签, 如 图 15.2 所 示 程 序 代 码 如 下 : Private Type Person Name As String * 20 Sex As String * 2 Birth As Date Addr As String * 40 End Type 图 15.2 随 机 读 取 通 讯 录 Private Sub Command1_Click() Dim ifile As Integer Dim p As Person If Not IsNumeric(Text1.Text) Then MsgBox " 记 录 号 非 法!" Text1.Text = "": Text1.SetFocus

303 290 Visual Basic 程 序 设 计 教 程 Exit Sub End If ifile = FreeFile Open "d:\txl.dat" For Random As ifile Len = Len(p) Get #ifile, Text1.Text, p Label2.Caption = " 姓 名 :" & p.name Debug.Print p.name, p.birth, p.sex, p.addr Close ifile 随 机 文 件 的 增 删 改 增 加 删 除 修 改 是 数 据 处 理 的 基 本 操 作 文 件 的 随 机 访 问 方 式 为 记 录 的 增 删 改 提 供 了 方 便 1. 增 加 记 录 在 随 机 文 件 中 增 加 记 录, 就 是 向 文 件 的 末 尾 追 加 记 录 方 法 是 首 先 求 出 文 件 中 最 后 一 条 记 录 的 记 录 号 ( 总 的 记 录 数 ), 再 向 下 一 记 录 号 位 置 写 记 录 要 计 算 文 件 中 的 记 录 数, 可 以 先 求 文 件 的 长 度, 再 用 公 式 记 录 数 = 文 件 长 度 / 记 录 长 度 计 算 文 件 的 长 度 可 以 用 Lof 函 数 求 得 例 如 : Open "d:\txl.dat" For Random as #ifile Len=Len(p) irec = Lof(iFile) / Len(p) + 1 Put #ifile, irec, p Close 2. 删 除 记 录 通 过 清 除 字 段 的 值 可 以 形 式 地 删 除 一 个 记 录, 但 是 该 记 录 仍 占 据 存 储 空 间, 没 有 被 彻 底 删 除 通 常 文 件 中 不 能 有 空 记 录, 因 为 会 浪 费 空 间 影 响 正 常 操 作 删 除 记 录 的 方 法 是 将 要 保 留 的 记 录 拷 贝 到 一 个 新 文 件, 然 后 删 除 老 文 件, 可 参 照 以 下 步 骤 进 行 : (1) 创 建 一 个 新 文 件 ; (2) 把 有 用 的 所 有 记 录 从 原 文 件 复 制 到 新 文 件 ; (3) 关 闭 原 文 件 并 用 Kill 语 句 删 除 它 ; (4) 使 用 Name 语 句 把 新 文 件 以 原 文 件 的 名 字 重 新 命 名 3. 修 改 记 录 修 改 记 录 包 括 三 个 过 程 : (1) 从 文 件 中 读 取 指 定 的 记 录 到 内 存 中 ; (2) 在 内 存 中 修 改 记 录 的 字 段 值 ;

304 第 15 章 文 件 291 (3) 将 修 改 后 的 记 录 写 回 到 文 件 的 原 来 位 置 例 15.6 完 整 的 通 讯 录 程 序 参 照 图 15.3 创 建 程 序 和 窗 体 程 序 代 码 如 下 : Private Type Person Name As String * 20 Sex As String * 2 Birth As Date Addr As String * 40 End Type Dim p As Person Dim ifile As Integer Dim irec As Integer 图 15.3 完 整 的 通 讯 录 程 序 ' 记 录 类 型 ' 文 件 号 ' 记 录 号 Private Sub Clear() ' 清 除 显 示 txtname.text = "": optmale.value = True txtbirth.text = "": txtaddr.text = "" Private Sub Display() ' 读 取 并 显 示 当 前 记 录 Get #ifile, irec, p txtname.text = p.name: txtbirth.text = p.birth: txtaddr.text = p.addr If Left(p.Sex, 1) = " 男 " Then optmale.value = True Else optmale.value = False optfemal.value = Not optmale Private Sub Save() ' 将 数 据 存 入 文 件

305 292 Visual Basic 程 序 设 计 教 程 p.name = txtname.text If optmale.value = True Then p.sex = " 男 " Else p.sex = " 女 " If Not IsDate(txtBirth.Text) Then MsgBox " 生 日 非 法! 请 输 入 年 - 月 - 日 " txtbirth.setfocus Exit Sub Else p.birth = txtbirth.text End If p.addr = txtaddr.text Put #ifile, irec, p Private Sub cmdnew_click() irec = LOF(iFile) / Len(p) + 1 ' 添 加 新 记 录 Save Clear Private Sub cmdnext_click() irec = irec + 1 If irec > LOF(iFile) / Len(p) Then MsgBox " 已 经 是 最 后 一 条 记 录 了 " irec = LOF(iFile) / Len(p) Exit Sub End If Display Private Sub cmdprior_click() irec = irec - 1 If irec < 1 Then MsgBox " 已 经 是 第 一 条 记 录 了 " irec = 1 Exit Sub End If Display

306 第 15 章 文 件 293 Private Sub cmdupdate_click() Save ' 修 改 原 记 录 Private Sub Form_Load() ifile = FreeFile Open "d:\txl.dat" For Random As ifile Len = Len(p) ' 打 开 随 机 文 件 irec = LOF(iFile) / Len(p) + 1 Clear Private Sub Form_Unload(Cancel As Integer) Close ifile ' 关 闭 文 件 二 进 制 文 件 的 读 写 使 用 文 件 时, 二 进 制 方 式 提 供 最 大 的 灵 活 性 任 何 类 型 的 文 件 都 可 以 用 二 进 制 方 式 打 开 和 读 写 用 二 进 制 方 式 存 储 数 据 可 以 最 大 限 度 地 减 少 对 存 储 空 间 的 占 用, 加 快 数 据 的 读 写 速 度 二 进 制 文 件 的 读 写 同 样 使 用 Get # 语 句 和 Put # 语 句, 不 同 之 处 在 于, 二 进 制 方 式 可 以 将 文 件 指 针 定 位 到 文 件 的 任 意 字 节 位 置 ; 文 件 以 二 进 制 方 式 存 取 时, 所 存 取 的 数 据 的 长 度 取 决 于 Get # 语 句 或 Put # 语 句 中 变 量 的 长 度 ; 打 开 二 进 制 文 件 的 Open 语 句 中 不 需 要 指 定 记 录 长 度, 即 使 指 定 了 也 会 被 忽 略 例 15.7 二 进 制 方 式 文 件 复 制 例 15.3 的 方 法 只 适 用 于 文 本 文 件, 对 于 其 他 文 件 采 用 顺 序 方 式 复 制 会 出 错 下 面 的 程 序 代 码 可 实 现 任 意 文 件 的 复 制 : Private Sub Command1_Click() Dim if1 As Integer, if2 As Integer Dim sf1 As String, sf2 As String Dim buffer() As Byte 使 用 动 态 数 组 sf1 = InputBox(" 请 输 入 源 文 件 名 :", " 源 文 件 ") sf2 = InputBox(" 请 输 入 目 标 文 件 名 :", " 目 标 文 件 ") If sf1 = "" Or sf2 = "" Then Exit Sub if1 = FreeFile Open sf1 For Binary As if1 ' 打 开 源 文 件 if2 = FreeFile Open sf2 For Binary As if2 ' 创 建 目 标 文 件 ReDim buffer(1 To LOF(if1)) ' 分 配 内 存

307 294 Visual Basic 程 序 设 计 教 程 Get #if1,, buffer ' 读 源 文 件 Put #if2,, buffer ' 写 目 标 文 件 Close ' 关 闭 所 有 打 开 的 文 件 MsgBox " 完 成 复 制 " 15.6 文 件 操 作 文 件 系 统 支 持 文 件 的 复 制 移 动 删 除 命 名 等 操 作,VB 中 也 提 供 了 类 似 的 语 句 供 程 序 中 使 用 1. Kill 语 句 格 式 :Kill 文 件 名 功 能 : 删 除 指 定 的 文 件 Kill 语 句 的 用 法 与 Windows 文 件 系 统 的 命 令 行 命 令 Del 相 似, 支 持 通 配 符 * 和? 说 明 : (1) 文 件 名 是 字 符 串, 放 在 引 号 中 ; (2) 要 删 除 的 文 件 必 须 没 有 被 打 开 ; (3)Kill 语 句 执 行 时 没 有 任 何 提 示, 因 此 要 小 心 使 用 2. FileCopy 语 句 格 式 :FileCOpy 源 文 件 名, 目 标 文 件 名 功 能 : 把 源 文 件 复 制 到 目 标 文 件, 源 文 件 仍 保 留 FileCopy 语 句 用 法 与 Windows 命 令 Copy 相 似, 但 不 支 持 通 配 符 3. Name 语 句 格 式 :Name 原 名 As 新 名 功 能 : 重 新 命 名 一 个 文 件 目 录 或 文 件 夹 说 明 : (1) 原 名 必 须 是 已 经 存 在 的 文 件 名 或 文 件 夹 名, 可 以 包 含 磁 盘 符 和 路 径 ; (2) 新 名 必 须 是 未 被 使 用 的 文 件 名 和 文 件 夹 名, 也 可 以 包 含 磁 盘 符 和 路 径 ; (3)Name 语 句 重 新 命 名 文 件, 必 要 时 将 其 移 动 到 一 个 不 同 的 文 件 夹 中, 还 可 以 跨 磁 盘 移 动 文 件 但 是,Name 语 句 只 能 重 新 命 名 已 经 存 在 的 文 件 或 文 件 夹, 不 能 创 建 新 文 件 或 文 件 夹 ; (4) 在 一 个 已 打 开 的 文 件 上 使 用 Name 命 令, 将 会 产 生 错 误 ; (5)Name 语 句 不 支 持 通 配 符 4. 其 他 语 句 VB 提 供 的 文 件 文 件 夹 操 作 语 句 还 有 Dir ChDir MkDir RmDir FileLen GetAttr SetAttr FileDateTime 等, 请 读 者 查 阅 VB 的 帮 助 系 统 自 学 例 15.8 一 个 简 单 的 文 件 管 理 器 创 建 一 个 标 准 EXE 工 程, 在 窗 体 Form1 中 添 加 必 要 的 控 件, 如 图 15.4 所 示 部 分 控 件 的 Name 属 性 设 置 见 下 表 :

308 第 15 章 文 件 295 控 件 Name 属 性 值 控 件 Name 属 性 值 驱 动 器 控 件 drvsource 退 出 按 钮 cmdexit 文 件 夹 控 件 dirsource 复 制 按 钮 cmdcopy 文 件 列 表 fsource 删 除 按 钮 cmdkill 改 名 按 钮 cmdname 图 15.4 一 个 简 单 的 文 件 管 理 器 程 序 代 码 为 : Private Sub cmdcopy_click() Dim destfile As String If fsource.filename = "" Then Exit Sub ' 先 选 定 文 件 destfile = InputBox(" 输 入 目 标 文 件 名 :") If destfile <> "" Then ' 不 为 空 FileCopy fsource.filename, destfile ' 复 制 文 件 End If Private Sub cmdexit_click() End Private Sub cmdkill_click() Dim res If fsource.filename = "" Then Exit Sub ' 首 先 选 定 文 件 res = MsgBox(" 确 定 要 删 除 文 件 " & fsource.filename & " 了 吗?", vbokcancel) If res = vbok Then ' 确 认 操 作 Kill fsource.filename ' 删 除 文 件 End If

309 296 Visual Basic 程 序 设 计 教 程 Private Sub cmdname_click() Dim destfile As String If fsource.filename = "" Then Exit Sub destfile = InputBox(" 输 入 新 文 件 名 :") If destfile <> "" Then Name fsource.filename As destfile End If ' 首 先 选 定 文 件 ' 命 名 ( 移 动 ) 文 件 Private Sub dirsource_change() fsource.path = dirsource.path ' 与 文 件 列 表 关 联 Private Sub drvsource_change() dirsource.path = drvsource.drive ' 与 文 件 夹 关 联 请 注 意, 进 行 文 件 的 复 制 改 名 等 操 作 时, 可 能 因 为 各 种 意 外, 或 者 输 入 的 文 件 名 不 合 法, 导 致 程 序 出 错, 无 法 继 续 运 行 为 了 避 免 发 生 类 似 错 误, 应 设 置 错 误 处 理 程 序, 见 第 16 章 15.7 FSO 对 象 模 型 文 件 系 统 对 象 (FSO) 模 型 是 VB 的 新 功 能, 提 供 了 一 个 基 于 对 象 的 工 具, 用 来 处 理 文 件 夹 和 文 件 FSO 模 型 为 文 件 文 件 夹 操 作 提 供 了 传 统 方 式 以 外 的 使 用 属 性 方 法 和 事 件 的 面 向 对 象 方 法 FSO 模 型 使 应 用 程 序 能 够 创 建 文 件, 插 入 删 除 更 改 和 输 出 数 据, 使 文 件 处 理 变 得 非 常 方 便 处 理 文 件 时, 主 要 的 目 标 是 以 高 效 的 易 于 访 问 的 格 式 存 储 数 据 虽 然 可 在 数 据 库 中 存 储 数 据, 但 这 样 做 会 给 应 用 程 序 带 来 相 当 数 量 的 系 统 开 销 在 不 使 用 数 据 库 的 情 况 下, 在 文 本 文 件 或 二 进 制 文 件 中 存 储 数 据 是 最 有 效 的 解 决 方 案 FSO 模 型 也 使 应 用 程 序 能 够 创 建 更 改 移 动 和 删 除 文 件 夹, 或 者 确 定 特 定 文 件 夹 是 否 存 在 以 及 位 于 何 处, 获 取 有 关 文 件 夹 的 信 息, 如 文 件 夹 的 名 称 创 建 日 期 等 FSO 对 象 FSO 模 型 由 以 下 对 象 构 成 : (1)FileSystemObject 对 象 : 提 供 一 整 套 用 于 创 建 删 除 收 集 相 关 信 息 以 及 通 常 的 操 作 驱 动 器 文 件 夹 和 文 件 的 方 法, 是 FSO 模 型 的 主 要 对 象, 许 多 方 法 在 其 他 对 象 中 被 重 复 (2)Drive 对 象 : 用 来 收 集 附 加 到 系 统 的 驱 动 器 的 信 息, 例 如 有 多 少 可 用 空 间 以 及 其 共 享

310 第 15 章 文 件 297 名 称 是 什 么 请 注 意,FSO 模 型 下 的 驱 动 器 不 一 定 是 硬 盘, 可 以 是 CD-ROM 驱 动 器 RAM 磁 盘 等 驱 动 器 也 不 必 以 物 理 方 式 附 加 到 系 统 上, 可 以 通 过 网 络 以 逻 辑 方 式 进 行 连 接 (3)Folder 对 象 : 用 来 创 建 删 除 或 移 动 文 件 夹, 查 询 文 件 夹 的 名 称 路 径 和 其 他 信 息 (4)File 对 象 : 用 来 创 建 删 除 或 移 动 文 件, 查 询 文 件 的 名 称 路 径 和 其 他 信 息 (5)TextStream 对 象 : 用 来 读 取 和 写 入 文 本 文 件 FSO 模 型 支 持 通 过 TextStream 对 象 创 建 和 操 作 文 本 文 件, 但 是 不 支 持 二 进 制 文 件 FSO 模 型 编 程 在 FSO 模 型 中 编 程 需 要 三 个 主 要 任 务 : (1) 通 过 使 用 CreateObject 方 法 或 者 通 过 将 变 量 标 定 为 FileSystemObject 对 象 来 创 建 FileSystemObject 对 象 ; (2) 对 新 创 建 的 对 象 使 用 适 当 的 方 法 ; (3) 访 问 该 对 象 的 属 性 1. 创 建 对 脚 本 类 型 库 的 引 用 FSO 模 型 包 含 在 脚 本 (Scripting) 类 型 库 (Scrrun.dll) 中, 需 要 作 为 外 部 引 用 添 加 到 工 程 中 才 能 引 用 FSO 对 象 方 法 是 : 选 择 工 程 菜 单 下 的 引 用 命 令, 打 开 引 用 对 话 框, 如 图 15.5 所 示, 选 中 Microsoft Scripting Runtime 图 15.5 引 用 FSO 模 型 2. 创 建 FileSystemObject 对 象 通 过 将 变 量 标 定 为 FileSystemObject 类 型 创 建 FileSystemObject 对 象 的 方 法 如 下 面 的 代 码 所 示 : Dim fso As New FileSystemObject 使 用 CreateObject 方 法 创 建 FileSystemObject 对 象 的 方 法 如 下 面 的 代 码 中 所 示 : fso = CreateObject("Scripting.FileSystemObject") 在 第 二 个 方 法 中,Scripting 是 类 型 库 的 名 称,FileSystemObject 是 要 创 建 其 实 例 的 对 象 的 名 称

311 298 Visual Basic 程 序 设 计 教 程 3. FSO 对 象 的 方 法 表 15.1 显 示 了 FSO 对 象 的 方 法 和 功 能 表 15.1 FSO 对 象 的 方 法 和 功 能 任 务 命 令 创 建 新 对 象 删 除 文 件 或 文 件 夹 复 制 对 象 移 动 对 象 访 问 现 有 驱 动 器 文 件 夹 或 文 件 CreateFolder 或 CreateTextFile DeleteFile 或 File.Delete;DeleteFolder 或 Folder.Delete CopyFile 或 File.Copy;CopyFolder 或 Folder.Copy MoveFile 或 File.Move;MoveFolder 或 Folder.Move GetDrive GetFolder 或 GetFile 显 然,FSO 模 型 中 的 一 些 功 能 是 冗 余 的 例 如, 可 以 用 FileSystemObject 对 象 的 CopyFile 方 法, 也 可 以 用 File 对 象 的 Copy 方 法 来 复 制 文 件 这 些 方 法 同 时 存 在, 为 编 程 提 供 了 最 大 的 灵 活 性 注 意,FSO 模 型 不 支 持 创 建 或 删 除 驱 动 器 4. 获 得 FSO 对 象 句 柄 使 用 FileSystemObject 对 象 中 相 应 的 Get 方 法 (GetDriver GetFolder GetFile) 可 以 获 得 已 有 的 驱 动 器 文 件 夹 或 文 件 对 象 的 句 柄, 然 后 访 问 对 象 的 属 性 (1)GetDriver 方 法 : 格 式 : 对 象.GetDriver( 驱 动 器 ) 功 能 : 返 回 与 指 定 的 驱 动 器 对 应 的 Driver 对 象 句 柄 说 明 : 对 象 必 须 是 一 个 FileSystemObject 对 象 ( 下 同 ) (2)GetFolder 方 法 : 格 式 : 对 象.GetFolder( 文 件 夹 路 径 ) 功 能 : 返 回 一 个 和 指 定 路 径 中 文 件 夹 相 对 应 的 Folder 对 象 句 柄 说 明 : 如 果 指 定 的 文 件 夹 不 存 在, 则 发 生 一 个 错 误 (3)GetFile 方 法 : 格 式 : 对 象.GetFile( 文 件 路 径 ) 功 能 : 返 回 一 个 和 指 定 路 径 中 文 件 相 对 应 的 File 对 象 句 柄 说 明 : 如 果 指 定 的 文 件 不 存 在, 则 发 生 一 个 错 误 不 需 要 为 新 创 建 的 对 象 使 用 Get 方 法, 因 为 Create 函 数 已 经 具 有 相 同 的 功 能 例 如, 如 果 使 用 CreateFolder 方 法 创 建 一 个 新 文 件 夹, 则 不 需 要 使 用 GetFolder 方 法 访 问 其 属 性, 只 需 设 一 个 变 量 给 CreateFolder 函 数, 来 获 得 新 创 建 的 文 件 夹 的 句 柄, 然 后 访 问 它 的 属 性 方 法 和 事 件 5. FSO 对 象 的 属 性 在 获 得 了 FSO 对 象 的 句 柄 以 后, 就 可 以 访 问 对 象 的 属 性 和 方 法 了 FSO 对 象 的 属 性 很 多, 例 如,Driver 对 象 的 属 性 有 TotalSize DriverLetter AvailableSpace FileSystem IsReady 等 ;Folder 对 象 有 Name Path Driver Attributes 等 ;File 对 象 有 Name Path Size Driver Type 等

312 第 15 章 文 件 文 件 操 作 通 过 使 用 FSO 对 象 可 以 方 便 地 使 用 和 操 作 文 本 文 件 文 件 的 操 作 包 括 : (1) 创 建 添 加 或 删 除 数 据 和 阅 读 文 件 ; (2) 移 动 复 制 和 删 除 文 件 FSO 模 型 的 FileSystemObject 对 象 支 持 顺 序 文 本 文 件 ( 又 称 为 文 本 流 ) 的 操 作, 主 要 方 法 见 表 15.2 表 15.2 FSO 模 型 的 文 件 操 作 方 法 方 法 任 务 CreateTextFile OpenTextFile 或 OpenAsTextStream Write 或 WriteLine Read ReadLine 或 ReadAll File.Move 或 MoveFile File.Copy 或 CopyFile File.Delete 或 DeleteFile 创 建 顺 序 文 本 文 件 向 文 本 文 件 添 加 数 据 从 文 本 文 件 读 取 数 据 移 动 文 件 复 制 文 件 删 除 文 件 1. 创 建 文 件 有 三 种 不 同 方 法 来 创 建 一 个 顺 序 文 本 文 件 一 种 方 法 就 是 使 用 CreateTextFile 方 法 例 如 : Dim fso As New FileSystemObject, fil As File Set fil = fso.createtextfile("c:\test.txt", True ) 另 一 种 方 法 是 使 用 OpenTextFile 方 法, 例 如 : Dim fso As New FileSystemObject, ts As New TextStream Set ts = fso.opentextfile("c:\test.txt", ForWriting ) 或 者 使 用 带 ForWriting 标 志 设 置 的 OpenAsTextStream 方 法, 例 如 : Dim fso As New FileSystemObject, fil As File, ts As TextStream Set fil = fso.createtextfile ("test1.txt") Set ts = fil.openastextstream( ForWriting ) 2. 读 写 文 件 读 写 文 本 文 件 时 需 要 创 建 TextStream 对 象 文 件 一 经 创 建, 就 可 以 向 其 中 写 入 数 据 写 文 件 的 过 程 分 三 步 : 打 开 文 件 写 入 数 据 关 闭 文 件 写 文 件 可 以 使 用 Write 方 法 或 WriteLine 方 法 读 文 件 的 过 程 也 分 为 三 步 : 打 开 文 件 读 取 数 据 关 闭 文 件 读 文 件 可 以 使 用 Read 方 法 ReadLine 方 法 和 ReadAll 方 法 关 闭 文 件 使 用 Close 方 法 例 15.9 用 FSO 对 象 读 写 文 件 创 建 一 个 标 准 EXE 工 程, 窗 体 Form1 中 包 含 文 本 框 Text1 命 令 按 钮 Command1 和 Command2, 如 图 15.6 所 示

313 300 Visual Basic 程 序 设 计 教 程 图 15.6 用 FSO 模 型 读 写 文 件 代 码 如 下 : Private Sub Command1_Click() Dim fso As New FileSystemObject ' 声 明 并 创 建 对 象 Dim ts As TextStream ' 定 义 文 本 流 Set ts = fso.createtextfile("d:\test.txt", True) ' 建 立 流 ( 覆 盖 原 有 数 据 ) ts.write Text1.Text ' 输 出 流 ( 写 文 件 ) ts.close ' 关 闭 流 ( 文 件 ) Text1.Text = "" Private Sub Command2_Click() Dim fso As New FileSystemObject Dim ts As TextStream Set ts = fso.opentextfile("d:\test.txt", ForReading) ' 建 立 流 ( 读 方 式 ) Text1.Text = ts.readall ' 获 得 流 ( 读 取 所 有 数 据 ) ts.close ' 关 闭 流 3. File 对 象 File 对 象 可 以 是 任 何 类 型 的 文 件, 不 一 定 是 文 本 文 件 File 对 象 的 Copy Delete Move 方 法 实 现 了 文 件 的 复 制 删 除 和 移 动 操 作 例 如 : Private Sub Command1_Click() Dim fso As New FileSystemObject, f1 As File, f2 As File Set f1 = fso.getfile("d:\test.txt") ' 创 建 File 对 象 f1.copy ("c:\temp\test1.txt") ' 复 制 文 件 f1.move ("c:\temp\test2.txt") ' 移 动 文 件 Set f1 = fso.getfile("c:\temp\test1.txt") ' 重 建 File 对 象 Set f2 = fso.getfile("c:\temp\test2.txt") f1.delete ' 删 除 文 件 f2.delete

314 第 15 章 文 件 301 习 题 1. 创 建 一 个 简 单 的 记 事 本 程 序, 将 用 户 输 入 的 文 本 以 文 件 形 式 存 放, 文 件 扩 展 名 为 缺 省 的.txt, 文 件 名 和 存 放 位 置 由 用 户 指 定 2. 对 于 第 1 题 的 记 事 本 程 序, 在 编 辑 菜 单 下 添 加 查 找 命 令, 用 InputBox 函 数 输 入 要 查 找 的 字 符, 搜 索 整 个 文 件, 将 所 有 查 找 到 的 字 符 位 置 存 入 一 个 文 本 文 件 3. 将 调 用 随 机 数 函 数 RND 得 到 的 若 干 个 数 存 入 文 件 rnd.dat, 然 后 打 开 该 文 件, 按 从 小 到 大 顺 序 排 序, 结 果 存 入 seq.dat 文 件 4. 创 建 一 个 简 单 的 学 生 成 绩 管 理 系 统 : (1) 学 生 信 息 包 括 姓 名 和 学 号 等, 分 班 级 存 放 在 不 同 的 文 件 中, 每 班 对 应 一 个 文 件 ; 程 序 中 包 括 学 生 信 息 管 理 模 块, 可 以 进 行 简 单 的 修 改 ; (2) 成 绩 信 息 包 括 学 号 姓 名 成 绩, 每 门 课 每 个 班 对 应 一 个 文 件 ; 输 入 成 绩 时, 学 生 的 姓 名 和 学 号 采 用 列 表 方 式 选 择 输 入 ; (3) 成 绩 分 析 模 块 包 括 求 平 均 成 绩 按 成 绩 档 次 统 计 人 数 等, 统 计 结 果 存 放 到 文 件 中 5. 对 于 第 4 题 中 的 成 绩 文 件, 尝 试 采 用 不 同 的 文 件 访 问 形 式 编 程, 体 会 它 们 的 不 同 6. 为 第 4 题 的 程 序 添 加 排 序 功 能, 即 按 成 绩 从 高 到 低 显 示 成 绩 单, 尝 试 将 结 果 输 出 到 打 印 机 上 打 印 7. 用 FSO 对 象 模 型 显 示 C 盘 根 目 录 的 文 件 信 息 8. 某 文 本 文 件 包 含 许 多 空 白 行, 用 FSO 对 象 模 型 实 现 按 行 读 取 文 件 内 容, 删 除 空 白 行, 并 把 结 果 存 入 另 一 文 本 文 件

315 第 16 章 程 序 调 试 与 错 误 处 理 在 程 序 设 计 过 程 中, 无 论 程 序 员 多 么 仔 细, 都 可 能 会 出 现 错 误, 如 除 零 错 数 据 溢 出 等 而 且, 随 着 程 序 规 模 ( 代 码 长 度 ) 的 逐 渐 增 加, 出 错 的 概 率 也 会 大 大 增 加 另 外, 就 理 想 情 况 而 言, 一 段 完 美 的 程 序 可 能 不 存 在 错 误, 遗 憾 的 是, 还 可 能 出 现 意 外, 有 时 文 件 会 被 误 删 除 磁 盘 驱 动 器 空 间 会 溢 出 网 络 驱 动 器 会 意 外 的 分 离 等 等 在 应 用 程 序 中 查 找 并 修 改 错 误 的 过 程 叫 程 序 调 试 程 序 调 试 是 为 了 发 现 错 误 而 执 行 程 序, 以 发 现 并 修 正 错 误 为 根 本 目 的 程 序 调 试 需 要 程 序 员 对 程 序 有 清 醒 的 认 识, 还 需 要 借 助 各 种 工 具 Visual Basic 提 供 了 几 种 调 试 工 具, 对 方 便 快 捷 地 查 找 错 误 特 别 有 效 对 于 意 外 事 故 的 防 范 可 以 在 程 序 中 设 计 错 误 处 理 程 序 16.1 错 误 类 型 VB 程 序 错 误 可 分 为 三 种 : 编 译 错 误 逻 辑 错 误 和 运 行 时 错 误 编 译 错 误 编 译 错 误 是 由 于 违 反 Visual Basic 的 语 法 而 产 生 的 错 误, 也 叫 语 法 错 误, 如 关 键 字 拼 写 错 误 分 隔 符 号 遗 漏 块 控 制 结 构 不 完 整 或 不 匹 配 等 编 译 错 误 可 以 通 过 程 序 编 译 发 现, 是 比 较 容 易 查 找 的 错 误 1. 编 程 时 的 编 译 错 误 单 击 工 具 菜 单 下 的 选 项 命 令, 显 示 如 图 16.1 所 示 的 对 话 框, 选 择 编 辑 器 选 项 卡 中 的 自 动 语 法 检 测 在 输 入 程 序 代 码 时, 每 输 入 一 行 代 码 ( 按 回 车 或 移 动 光 标 到 其 他 行 ) 后,VB 都 会 自 动 对 该 行 进 行 语 法 检 查, 系 统 自 动 检 测 出 错 误, 将 错 误 加 亮, 并 显 示 出 错 对 话 框, 如 图 16.2 所 示 容 易 理 解, 系 统 不 能 自 动 检 测 出 下 面 代 码 中 的 错 误 : Private Sub Form_Load() Dim i As Integer For i = 0 To 100 Print i 程 序 中 For 语 句 不 完 整, 缺 少 Next 部 分 该 程 序 不 会 被 执 行, 因 为 编 译 时 VB 编 译 程 序 能 够 检 测 出 该 错 误

316 第 16 章 程 序 调 试 与 错 误 处 理 303 图 16.1 自 动 语 法 检 测 选 项 设 置 图 16.2 代 码 编 辑 过 程 中 发 现 的 语 法 错 误 2. 编 译 程 序 时 检 测 错 误 如 果 选 择 文 件 菜 单 的 生 成 EXE 命 令, 或 者 运 行 菜 单 的 启 动 或 全 编 译 执 行, 都 会 启 动 VB 的 编 译 程 序 编 译 程 序 可 以 检 测 所 有 语 法 错 误 直 接 运 行 上 面 的 程 序 将 显 示 图 16.3 所 示 的 出 错 信 息, 按 确 定 按 钮 后, 程 序 将 暂 停 执 行, 进 入 调 试 状 态, 同 时 显 示 发 现 错 误 的 过 程 代 码, 过 程 的 第 一 行 将 显 示 为 黄 色 背 景 图 16.3 程 序 编 译 过 程 中 发 现 的 语 法 错 误

317 304 Visual Basic 程 序 设 计 教 程 对 程 序 进 行 全 程 编 译, 虽 然 提 高 了 程 序 的 健 壮 性, 但 程 序 员 对 调 试 程 序 时 频 繁 地 重 复 慢 速 编 译 过 程 很 反 感 为 此,VB 提 供 了 两 个 编 译 选 项, 如 图 16.4 所 示 图 16.4 请 求 时 编 译 选 项 设 置 请 求 时 编 译 是 指 运 行 程 序 时, 不 进 行 全 程 编 译, 而 只 对 将 要 执 行 的 过 程 进 行 编 译 显 然, 对 于 较 大 的 程 序 或 者 较 慢 的 计 算 机 系 统, 这 一 选 项 十 分 有 用 但 是, 可 能 隐 藏 某 些 错 误, 而 导 致 程 序 失 败 同 时, 随 着 程 序 代 码 的 增 加, 出 错 概 率 将 大 大 增 加, 频 繁 地 中 断 程 序 运 行 会 引 起 程 序 员 的 不 满 特 别 是 执 行 生 成 EXE 操 作 时, 更 是 如 此 程 序 员 可 能 更 希 望 显 示 所 有 错 误 后 台 编 译 选 项 在 选 中 请 求 时 编 译 时 有 效, 可 以 实 现 在 系 统 空 闲 时 对 其 他 过 程 进 行 编 译, 以 加 快 编 译 速 度 请 求 时 编 译 选 项 对 全 编 译 执 行 命 令 不 起 作 用, 执 行 该 命 令 时 总 会 对 程 序 进 行 全 程 编 译 逻 辑 错 误 逻 辑 错 误 是 程 序 设 计 或 实 现 中, 由 于 所 编 写 的 代 码 不 能 实 现 预 期 的 功 能 而 产 生 的 错 误 程 序 中 的 语 句 是 合 法 的, 编 译 程 序 不 能 发 现 错 误, 程 序 也 可 以 被 执 行, 但 执 行 结 果 却 不 正 确 例 如, 下 面 的 程 序 要 打 印 0 到 10 的 阶 乘, 由 于 存 在 逻 辑 错 误 而 无 法 正 常 执 行 : ' 注 意 : 不 要 直 接 运 行 该 程 序 Function Fact(n As Integer) As Double Fact = 1 While (n > 0) Fact = Fact * n n = n 1 Wend End Function Private Sub Form_Load() Dim i As Integer, f As Double

318 第 16 章 程 序 调 试 与 错 误 处 理 305 Show For i = 0 To 10 f = Fact(i) Print i & "! = " & f Next 思 考 : 您 能 找 出 这 个 错 误 吗? 逻 辑 错 误 通 常 难 于 查 找, 需 要 对 程 序 的 深 层 次 分 析, 或 使 用 专 门 的 程 序 测 试 工 具 运 行 时 错 误 运 行 时 错 误 是 指 程 序 在 运 行 时, 由 不 可 预 料 的 原 因 导 致 的 错 误, 如 输 入 非 法 数 据 要 读 写 的 文 件 被 意 外 删 除 等 运 行 时 错 误 可 能 在 程 序 交 付 使 用 很 久 以 后 才 被 发 现 VB 能 够 捕 获 大 多 数 运 行 时 错 误, 产 生 错 误 时,VB 将 中 止 应 用 程 序, 并 显 示 出 错 信 息, 如 图 16.5 所 示 若 选 择 调 试, 将 切 换 到 程 序 调 试 状 态 ; 若 选 择 结 束, 将 退 出 程 序 图 16.5 运 行 错 误 如 果 运 行 的 是 可 执 行 的.EXE 文 件, 发 生 错 误 时 只 能 选 择 结 束 程 序 运 行, 除 非 事 先 采 取 了 预 防 措 施 为 避 免 运 行 时 错 误 影 响 程 序 运 行, 可 以 设 置 错 误 陷 阱, 即 在 程 序 中 设 置 错 误 处 理 程 序 16.2 程 序 调 试 工 具 VB 程 序 调 试 工 具 1. 程 序 调 试 工 具 栏 Visual Basic 在 可 选 的 调 试 工 具 栏 上 提 供 了 几 个 很 有 用 的 按 钮 图 16.6 显 示 了 这 些 工 具 要 显 示 调 试 工 具 栏, 可 在 Visual Basic 工 具 栏 上 单 击 鼠 标 右 键 并 选 定 快 捷 菜 单 的 调 试 选 项 调 试 工 具 包 括 : 切 换 断 点 : 设 置 或 取 消 断 点 断 点 是 一 个 可 执 行 的 语 句 行, 程 序 执 行 到 断 点 处 将 中 断 运 行 进 入 调 试 状 态

319 306 Visual Basic 程 序 设 计 教 程 逐 语 句 : 每 次 执 行 程 序 代 码 的 一 行, 可 以 跟 踪 到 过 程 中 逐 过 程 : 每 次 执 行 程 序 代 码 的 一 行, 但 不 跟 踪 到 过 程 中 跳 出 : 执 行 当 前 过 程 的 其 他 部 分, 在 调 用 其 他 过 程 处 中 断 执 行 本 地 窗 口 : 显 示 局 部 变 量 的 当 前 值 立 即 窗 口 : 当 程 序 处 于 中 断 模 式 时, 允 许 执 行 代 码 或 查 询 值 监 视 窗 口 : 显 示 选 定 表 达 式 的 值 快 速 监 视 : 当 程 序 处 于 中 断 模 式 时, 列 出 表 达 式 的 当 前 值 调 用 堆 栈 : 当 程 序 处 于 中 断 模 式 时, 呈 现 一 个 对 话 框 来 显 示 所 有 已 被 调 用 但 尚 未 完 成 运 行 的 过 程 中 断 逐 语 句 跳 出 立 即 窗 口 调 用 堆 栈 启 动 结 束 逐 过 程 本 地 窗 口 快 速 监 视 切 换 断 点 监 视 窗 口 图 16.6 调 试 工 具 栏 2. 调 试 菜 单 VB 的 菜 单 中 包 含 全 部 测 试 工 具 在 调 试 菜 单 中, 包 括 逐 语 句 逐 过 程 运 行 到 光 标 处 添 加 监 视 切 换 断 点 清 除 所 有 断 点 等, 在 视 图 菜 单 中 包 括 本 地 窗 口 立 即 窗 口 调 用 堆 栈 等 中 断 模 式 VB 程 序 有 三 种 工 作 模 式, 即 设 计 模 式 运 行 模 式 和 中 断 模 式, 反 映 不 同 的 工 作 状 态 VB 的 标 题 栏 总 是 显 示 当 前 的 工 作 模 式 程 序 在 执 行 过 程 中 被 暂 停 执 行, 称 为 中 断, 进 入 中 断 模 式 在 中 断 模 式 下, 可 以 查 看 各 个 变 量 及 属 性 的 当 前 值, 从 而 了 解 程 序 的 执 行 情 况 可 以 查 看 并 编 辑 代 码 检 查 或 修 改 数 据 重 新 启 动 结 束 执 行 或 从 中 止 处 继 续 运 行 程 序 程 序 运 行 时, 出 现 下 列 情 况 之 一 就 可 以 进 入 中 断 模 式 : (1) 发 生 运 行 时 错 误, 被 VB 捕 获 而 中 断 ( 已 选 择 发 生 错 误 时 中 断, 见 图 16.4); (2) 用 户 按 下 了 Ctrl+Break 键, 或 者 单 击 运 行 菜 单 的 中 断 命 令, 或 者 单 击 工 具 栏 的 中 断 按 钮 ; (3) 程 序 中 设 置 了 断 点, 并 且 运 行 到 了 断 点 处 ; (4) 程 序 的 执 行 方 式 为 逐 语 句 或 逐 过 程 等, 并 且 执 行 完 一 行 语 句 或 一 个 过 程 ; (5) 添 加 监 视 对 话 框 中 定 义 的 中 断 表 达 式 将 发 生 变 化 或 变 成 真 ; (6) 程 序 中 使 用 了 Stop 语 句 ( 已 很 少 使 用 ) 要 退 出 中 断 模 式, 可 以 选 择 继 续 执 行 程 序, 进 入 运 行 模 式, 或 者 选 择 结 束 程 序, 进 入 设 计 模 式

320 第 16 章 程 序 调 试 与 错 误 处 理 控 制 程 序 的 运 行 程 序 调 试 中 最 重 要 的 是 控 制 程 序 的 运 行 1. 启 动 即 开 始 运 行 程 序, 单 击 启 动 菜 单 或 工 具 按 钮, 或 者 按 F5 功 能 键 可 以 启 动 程 序 2. 逐 语 句 运 行 即 单 步 执 行, 指 一 条 语 句 一 条 语 句 地 执 行 代 码 每 执 行 一 条 语 句 就 发 生 中 断, 从 而 可 以 逐 条 语 句 地 检 查 执 行 状 况 或 执 行 结 果 当 程 序 执 行 到 过 程 调 用 语 句 时, 将 进 入 到 被 调 用 的 过 程 中, 继 续 按 逐 语 句 方 式 执 行 在 设 计 模 式 和 中 断 模 式 下, 都 可 以 通 过 按 F8 功 能 键 或 调 试 菜 单 的 逐 语 句 命 令 进 入 逐 语 句 运 行 方 式 请 自 己 观 察 程 序 的 运 行 状 态 和 屏 幕 显 示 3. 逐 过 程 运 行 与 逐 语 句 运 行 类 似, 不 同 的 是 调 用 过 程 时, 不 跟 踪 到 过 程 内 部, 而 是 把 所 调 用 的 过 程 看 作 一 个 整 体 来 执 行, 从 而 减 少 了 对 所 调 过 程 的 调 试 进 入 逐 过 程 运 行 方 式 的 方 法 是 按 Shift+F8 组 合 键 4. 从 过 程 跳 出 逐 语 句 运 行 方 式 下 进 入 过 程 内 部 后, 可 以 选 择 从 过 程 跳 出 结 束 该 过 程 的 调 试 回 到 原 来 的 过 程 中 5. 运 行 到 光 标 处 用 光 标 定 位 程 序 的 某 一 位 置, 然 后 选 择 运 行 到 光 标 处, 可 以 避 免 对 前 面 的 代 码 的 逐 语 句 运 行 带 来 的 繁 琐 6. 设 置 下 一 条 要 执 行 的 语 句 在 调 试 程 序 时, 可 以 使 用 设 置 下 一 条 语 句 命 令 跳 过 部 分 代 码 例 如, 包 含 已 知 错 误 的 某 部 分 代 码 从 而 可 继 续 跟 踪 其 他 问 题 也 可 返 回 到 前 面 的 语 句 处, 用 不 同 的 属 性 或 变 量 的 值 测 试 程 序 的 某 部 分 7. 结 束 即 停 止 程 序 运 行, 返 回 设 计 模 式 调 试 窗 口 调 试 程 序 时, 经 常 要 做 的 是 分 析 数 据 到 底 发 生 了 什 么 变 化, 为 什 么 会 得 到 这 些 值,VB 的 调 试 窗 口 用 来 监 视 表 达 式 和 变 量 的 值 1. 本 地 窗 口 本 地 窗 口 显 示 当 前 过 程 中 所 有 变 量 的 值 当 程 序 的 执 行 从 一 个 过 程 切 换 到 另 一 个 过 程 时, 本 地 窗 口 的 内 容 会 发 生 改 变, 它 只 反 映 当 前 过 程 中 可 用 的 变 量 如 图 16.7 所 示 2. 立 即 窗 口 立 即 窗 口 所 示 为 代 码 中 正 在 调 试 的 语 句 所 产 生 的 信 息, 或 直 接 在 窗 口 中 键 入 的 命 令 所 产 生 的 信 息 在 立 即 窗 口 中 可 以 交 互 地 执 行 VB 语 句, 可 以 显 示 或 修 改 程 序 中 变 量 的 值 如 图 16.8 所 示

321 308 Visual Basic 程 序 设 计 教 程 图 16.7 本 地 窗 口 图 16.8 立 即 窗 口 在 程 序 中, 可 以 使 用 Debug.Print 方 法 将 程 序 的 调 试 信 息 输 出 到 立 即 窗 口, 以 便 对 变 量 或 表 达 式 进 行 监 控 但 在 程 序 完 成 以 后, 应 将 所 有 Debug.Print 语 句 删 除 3. 监 视 窗 口 监 视 窗 口 显 示 当 前 的 监 视 表 达 式, 在 代 码 运 行 过 程 中 可 决 定 是 否 监 控 这 些 表 达 式 的 值 中 断 表 达 式 是 一 个 监 视 表 达 式, 当 定 义 的 某 个 条 件 为 真 时, 它 将 使 VB 进 入 中 断 模 式 在 监 视 窗 口 中, 上 下 文 列 指 出 过 程 模 块, 每 个 监 视 表 达 式 都 在 这 些 过 程 或 模 块 中 进 行 计 算 只 有 当 前 语 句 在 指 定 的 上 下 文 中 时, 监 视 窗 口 才 能 显 示 监 视 表 达 式 的 值 否 则, Value 列 只 显 示 一 条 消 息, 指 出 语 句 不 在 上 下 文 中 如 图 16.9 所 示 图 16.9 监 视 窗 口 使 用 快 速 监 视 监 视 表 达 式 的 值 有 时 会 更 方 便 在 中 断 模 式 下, 在 代 码 编 辑 器 窗 口 中 选 择 要 监 视 的 表 达 式, 再 选 择 调 试 菜 单 下 的 快 速 监 视 命 令, 或 单 击 工 具 栏 的 快 速 监 视 工 具, 或 按 Shift+F9 组 合 键 就 可 在 弹 出 的 对 话 框 中 看 到 相 应 的 值, 如 图 所 示

322 第 16 章 程 序 调 试 与 错 误 处 理 309 图 快 速 监 视 对 话 框 16.3 错 误 处 理 程 序 程 序 调 试 可 以 发 现 和 修 正 程 序 中 的 编 译 错 误 和 逻 辑 错 误, 包 括 部 分 可 能 发 生 的 运 行 时 错 误, 但 不 能 彻 底 消 除 所 有 错 误 错 误 处 理 程 序 是 应 用 程 序 中 捕 获 和 响 应 错 误 的 例 程 对 于 可 能 会 出 错 的 任 何 过 程 ( 应 该 假 定 任 何 语 句 都 可 能 导 致 错 误 ), 都 要 添 加 错 误 处 理 程 序 Err 对 象 在 编 写 错 误 处 理 代 码 之 前, 有 必 要 了 解 和 掌 握 Visual Basic 的 Err 对 象 Err 对 象 是 个 运 行 期 对 象, 包 含 了 关 于 最 新 错 误 的 信 息 表 16.1 列 出 了 Err 对 象 的 属 性 和 方 法 与 App Debug Printer Screen 一 样,Err 对 象 是 具 有 全 局 范 围 的 固 有 对 象, 无 需 建 立 就 可 引 用 当 程 序 运 行 时 遇 到 一 个 错 误, 或 者 使 用 Err 对 象 的 Raise 方 法 故 意 引 发 一 个 错 误 时, 便 形 成 Err 对 象 的 属 性 当 遇 到 On Error 语 句 ( 比 如 On Error Resume Next), 并 且 在 使 用 Exit Sub Exit Function 或 Exit Property 语 句 退 出 一 个 过 程 后,Err 对 象 的 属 性 值 就 被 清 除 表 16.1 Err 对 象 的 属 性 和 方 法 类 别 名 称 说 明 属 性 方 法 Number Source Description HelpFile HelpContext Clear Raise 用 于 标 识 该 错 误 的 专 用 号 码 产 生 错 误 的 对 象 或 程 序 的 名 称 表 义 性 的 错 误 描 述 与 错 误 相 关 的 帮 助 文 件 所 在 的 驱 动 器 路 径 和 文 件 名 帮 助 文 件 用 于 该 错 误 的 上 下 文 ID 清 除 Err 对 象 的 所 有 属 性 设 置 生 成 指 定 的 运 行 时 错 误 当 引 发 一 个 错 误 时,Err 对 象 的 属 性 被 设 置 为 该 错 误 的 相 应 值 如 果 需 要 使 用 这 些 值 中 的 任 何 一 个 值, 应 该 立 即 对 它 们 进 行 操 作, 或 者 在 执 行 其 他 操 作 之 前 将 它 们 存 放 在 一 个 变 量 中, 因 为 Err 对 象 的 属 性 值 可 能 被 清 除 另 外,Err 对 象 中 的 属 性 值 只 能 反 映 最 新 错 误 的 情 况,Err 对 象 并 不 维 护 错 误 历 史 信 息 列 表 若 要 显 式 清 除 Err 对 象 的 属 性, 可 以 调 用 它 的 Clear 方 法

323 310 Visual Basic 程 序 设 计 教 程 错 误 处 理 程 序 错 误 处 理 过 程 包 括 设 置 错 误 陷 阱 捕 获 错 误 设 计 错 误 处 理 程 序 处 理 ( 响 应 ) 错 误 退 出 错 误 处 理 恢 复 程 序 运 行 三 个 步 骤 1. 设 置 错 误 陷 阱 当 Visual Basic 执 行 On Error 语 句 时 激 活 错 误 捕 获, 即 设 置 错 误 陷 阱 一 旦 设 置 错 误 陷 阱, 除 非 执 行 Exit Sub Exit Function Exit Property End Function 或 End Property 语 句 时, 才 会 取 消 错 误 陷 阱 也 可 以 使 用 On Error GoTo 0 语 句 取 消 错 误 陷 阱 在 任 一 时 刻 任 一 过 程 中 只 能 激 活 一 个 错 误 陷 阱 在 设 置 错 误 陷 阱 的 同 时 还 需 要 指 定 错 误 的 处 理 方 法 指 定 用 一 段 程 序 处 理 错 误 的 方 法 是 采 用 带 GoTo 子 句 的 On Error 语 句, 格 式 为 : On Error Goto 语 句 标 号 行 号 其 中, 语 句 标 号 ( 或 行 号 ) 定 义 了 错 误 处 理 程 序 的 起 始 位 置 2. 编 写 错 误 处 理 代 码 错 误 处 理 代 码 是 过 程 中 的 一 段 程 序, 不 是 独 立 的 过 程 错 误 处 理 代 码 的 前 面 应 包 含 一 个 标 号 ( 或 行 号 ), 标 示 错 误 处 理 开 始 错 误 处 理 代 码 通 常 放 置 在 过 程 末 端, 在 标 号 ( 或 行 号 ) 的 前 面 设 置 Exit Sub Exit Function 或 Exit Property 语 句, 以 避 免 在 未 出 现 错 误 时 执 行 错 误 处 理 代 码 错 误 处 理 代 码 通 常 以 Select Case 或 If...Then...Else 语 句 的 形 式 出 现, 使 用 Err 对 象 的 属 性, 确 定 发 生 了 什 么 错 误 并 对 每 种 错 误 提 供 操 作 方 法 为 了 处 理 所 有 意 想 不 到 的 错 误, 总 应 使 用 Case Else 或 Else 语 句 提 供 选 项 3. 退 出 错 误 处 理 错 误 处 理 程 序 执 行 后, 需 要 退 出 错 误 处 理 并 恢 复 程 序 的 执 行 主 要 方 式 有 两 种, 一 是 退 出 发 生 错 误 的 过 程 而 执 行 其 他 过 程, 二 是 恢 复 该 过 程 的 执 行 退 出 过 程 可 使 用 Exit Sub Exit Function Exit Property End Function End Property 语 句 等 恢 复 该 过 程 的 运 行 可 以 采 用 以 下 语 句 : (1)Resume [0]: 在 产 生 错 误 的 语 句 处 恢 复 程 序 执 行, 重 新 执 行 产 生 错 误 的 语 句 (2)Resume Next: 在 紧 接 着 出 错 语 句 之 后 的 那 条 语 句 处 恢 复 程 序 执 行, 跳 过 产 生 错 误 的 语 句 (3)Resume 语 句 标 号 : 在 语 句 标 号 指 定 的 位 置 恢 复 程 序 执 行, 语 句 标 号 必 须 与 错 误 处 理 程 序 在 同 一 过 程 中 (4)Err.Raise 错 误 号 : 产 生 错 误 号 指 定 的 运 行 时 错 误, 转 而 执 行 相 应 的 错 误 处 理 程 序 一 般 来 说, 错 误 处 理 程 序 无 论 何 时 修 正 错 误, 都 可 使 用 Resume, 而 在 错 误 处 理 程 序 不 能 修 正 错 误 时 使 用 Resume Next 也 可 以 编 写 这 样 一 个 错 误 处 理 程 序, 隐 藏 任 何 运 行 时 错 误, 既 不 显 示 错 误 信 息, 也 不 允 许 修 改 错 误 例 如, 下 列 代 码 实 现 文 件 复 制 操 作, 利 用 错 误 处 理 程 序 忽 略 可 能 产 生 的 任 何 错 误, 如 : (1) 原 文 件 不 存 在 ; (2) 文 件 名 错 误 ;

324 第 16 章 程 序 调 试 与 错 误 处 理 311 (3) 磁 盘 空 间 不 足 ; (4) 文 件 的 读 写 被 意 外 中 断, 等 等 Sub CopyFile(src As String, dest As String) On Error Goto ErrHandler ' 设 置 错 误 陷 阱 FileCopy src, dest ' 执 行 文 件 复 制 Exit Sub ' 退 出 过 程 ErrHandler: Resume Next ' 忽 略 任 何 错 误, 执 行 下 一 句 可 以 改 写 为 : Sub CopyFile(src As String, dest As String) On Error Resume Next ' 设 置 错 误 陷 阱, 忽 略 错 误, 继 续 执 行 FileCopy src, dest ' 执 行 文 件 复 制 又 如, 在 以 下 代 码 中,Divide 函 数 过 程 用 错 误 处 理 来 对 参 数 施 行 安 全 除 法, 却 不 揭 示 可 能 发 生 的 错 误 当 施 行 除 法 时, 可 能 产 生 的 错 误 有 : (1) 被 零 除 : 分 子 非 零, 但 分 母 为 零 (2) 溢 出 : 分 子 和 分 母 都 为 零 (3) 非 法 的 过 程 调 用 : 分 子 或 分 母 不 是 数 值 ( 或 不 能 认 为 是 数 值 ) 在 这 三 种 情 况 中,Divide 函 数 过 程 捕 获 这 些 错 误 并 返 回 Null: Function Divide (numer, denom) as Variant Dim Msg as String Const mnerrdivbyzero = 11, mnerroverflow = 6, mnerrbadcall = 5 On Error GoTo MathHandler Divide = numer / denom Exit Function MathHandler: If Err.Number = mnerrdivbyzero Or Err.Number = mnerroverflow Or _ Err.Number = mnerrbadcall Then Divide = Null ' 如 果 错 误 是 被 零 除 溢 出 或 非 法 过 程 调 用, 则 返 回 NULL Else ' 显 示 意 想 不 到 的 错 误 信 息 Msg = " 未 知 错 误 (" & Err.Number & "):" & Err.Description MsgBox Msg, vbexclamation End If Resume Next End Function 再 如, 可 用 以 下 代 码 处 理 无 效 驱 动 器 或 空 软 盘 驱 动 器 等 诸 如 此 类 的 装 置 问 题 :

325 312 Visual Basic 程 序 设 计 教 程 Function FileExists (filename) As Boolean Dim Msg As String ' 如 果 检 测 到 任 何 一 个 错 误, 则 开 始 捕 获 错 误, 从 而 响 应 错 误 处 理 程 序 On Error GoTo CheckError FileExists = (Dir(filename) <> "") ' 如 果 未 出 现 错 误, 则 避 免 使 用 错 误 处 理 程 序 Exit Function CheckError: ' 如 果 出 现 错 误, 则 在 此 分 支 ' 定 义 常 数 以 表 示 固 定 的 错 误 代 码 Const mnerrdisknotready = 71, mnerrdeviceunavailable = 68 If (Err.Number = mnerrdisknotready) Then Msg = " 磁 盘 未 准 备 好, 请 插 入 磁 盘 " If MsgBox(Msg, vbexclamation & vbokcancel) = vbok Then Resume ' 选 择 确 定 则 重 试 Else Resume Next ' 选 择 取 消 则 跳 过 End If ElseIf Err.Number = mnerrdeviceunavailable Then Msg = " 指 定 的 磁 盘 或 路 径 非 法 :" & filename MsgBox Msg, vbexclamation ' 显 示 警 告 信 息 Resume Next Else Msg = " 未 知 错 误 (" & Str(Err.Number) & "):" & Err.Description MsgBox Msg, vbcritical+vbokonly Stop ' 中 止 程 序 运 行 End If End Function 集 中 化 的 错 误 处 理 将 错 误 处 理 功 能 添 加 给 程 序 中 的 所 有 过 程, 是 件 令 人 感 到 乏 味 的 工 作, 但 却 是 必 须 做 的 一 件 事 情 意 料 之 外 的 所 有 错 误 都 必 须 以 相 同 格 式 显 示 出 来, 因 而 需 要 编 写 相 当 长 的 代 码 如 果 增 加 一 个 集 中 化 的 错 误 处 理 程 序, 事 情 就 会 好 办 些 集 中 化 的 错 误 处 理 程 序 是 在 出 现 错 误 时 调 用 的 一 个 通 用 过 程, 它 至 少 能 够 显 示 格 式 一 致 的 出 错 信 息, 也 可 以 增 添 一 些 特 殊 功 能 例 如, 每 当 出 现 意 料 之 外 的 错 误 时, 将 一 个 电 子 邮 件 发 送 给 技 术 支 持 人 员, 还 可 以 增 加 一 些 代 码, 将 机 器 的 运 行 状 态 已 加 载 的 应 用 程 序 和 文 件 版 本 等 记 录 下 来 但 是 需 要 注 意, 集 中 化 的 错 误 处 理 并 不 能 完 全 替 代 各 过 程 中 的 代 码 每 个 过 程 中 仍 需 要 设 置 错 误 陷 阱 和 调 用 错 误 处 理 程 序 的 代 码

326 第 16 章 程 序 调 试 与 错 误 处 理 调 试 程 序 时 的 错 误 处 理 在 调 试 程 序 时 可 能 会 发 现 错 误 处 理 程 序 捕 获 发 生 的 错 误, 而 搅 乱 了 对 程 序 自 身 特 点 的 分 析 虽 然 通 过 注 释, 可 以 取 消 每 个 模 块 中 的 On Error 语 句, 但 显 然 这 是 十 分 繁 琐 的 VB 允 许 在 调 试 程 序 时 关 闭 错 误 处 理 程 序, 即 忽 略 程 序 中 设 置 的 错 误 陷 阱, 使 得 在 每 次 有 错 误 的 时 候 都 进 入 中 断 模 式 要 为 调 试 当 前 程 序 关 闭 错 误 处 理 程 序, 可 以 在 代 码 窗 口 上 单 击 鼠 标 右 键, 选 取 切 换 命 令, 选 择 发 生 错 误 时 中 断 命 令 要 为 所 有 VB 程 序 的 调 试 关 闭 错 误 处 理 程 序, 可 以 选 择 工 具 菜 单 下 的 选 项 命 令, 在 弹 出 的 对 话 框 中, 选 择 通 用 选 项 卡, 选 择 发 生 错 误 时 中 断, 见 图 16.4

327 附 录 A 发 布 VB 应 用 程 序 创 建 VB 应 用 程 序 后, 需 要 将 程 序 打 包, 以 便 自 由 地 发 布 给 最 终 用 户 VB 应 用 程 序 可 以 通 过 磁 盘 CD 网 络 以 及 Internet 等 途 径 来 发 布 发 布 应 用 程 序 时, 必 须 经 过 下 述 两 个 步 骤 : (1) 打 包 : 将 应 用 程 序 文 件 打 包 为 一 个 或 多 个 可 以 部 署 到 选 定 位 置 的.cab 文 件, 对 于 某 些 类 型 的 软 件 包, 还 必 须 为 其 创 建 安 装 程 序.cab 文 件 是 一 种 经 过 压 缩 的 适 合 通 过 磁 盘 或 Internet 进 行 发 布 的 文 件 (2) 发 布 : 将 打 包 的 应 用 程 序 ( 软 件 包 ) 放 置 到 适 当 的 位 置, 以 便 用 户 可 以 从 该 位 置 安 装 应 用 程 序 可 以 将 软 件 包 复 制 到 软 盘 上 或 网 络 上 VB 提 供 两 个 工 具 来 打 包 和 发 布 应 用 程 序 : (1) 打 包 和 展 开 向 导 (Package and Deployment Wizard): 通 过 提 供 有 关 如 何 配 置.cab 文 件 的 选 项, 使 发 布 应 用 程 序 所 包 含 的 许 多 步 骤 得 以 自 动 进 行 (2) 安 装 工 具 包 : 可 以 自 定 义 程 序 的 安 装 过 程 A.1 打 包 和 展 开 向 导 将 应 用 程 序 打 包 为 一 个 软 件 包, 可 以 将 应 用 程 序 安 装 到 用 户 的 计 算 机 上 软 件 包 由 一 个 或 多 个.cab 文 件 组 成, 文 件 中 包 含 了 用 户 安 装 和 运 行 应 用 程 序 所 需 的 被 压 缩 的 工 程 文 件 和 任 何 其 他 必 需 的 文 件 包 括 安 装 程 序 辅 助 的.cab 文 件 或 其 他 必 需 的 文 件 这 些 附 加 的 文 件 根 据 创 建 的 软 件 包 的 类 型 不 同 而 不 同 可 以 创 建 两 种 软 件 包 : 标 准 软 件 包 或 Internet 软 件 包 如 果 计 划 通 过 磁 盘 CD 或 网 络 共 享 来 发 布 应 用 程 序, 则 应 创 建 一 个 标 准 软 件 包 如 果 计 划 通 过 Internet Web 站 点 来 发 布, 则 应 创 建 一 个 Internet 软 件 包 Internet 软 件 包 是 专 为 从 Web 站 点 下 载 而 设 计 的 多 数 情 况 下, 使 用 打 包 和 展 开 向 导 就 足 以 创 建 一 个 可 发 布 的 软 件 包 1. 启 动 打 包 和 展 开 向 导 有 三 种 方 式 启 动 打 包 和 展 开 向 导 : (1) 在 VB 中 将 该 向 导 作 为 一 个 外 接 程 序 运 行 该 方 式 启 动 需 要 两 个 条 件 : 1 已 经 在 外 接 程 序 管 理 器 中 将 该 向 导 加 载 为 外 接 程 序 将 打 包 和 展 开 向 导 加 载 为 外 接 程 序 的 方 法 是 : 选 择 VB 的 外 接 程 序 菜 单 的 外 接 程 序 管 理 器, 从 列 表 中 选 择 打 包 和 展 开 向 导, 然 后 单 击 确 定 2 在 启 动 该 向 导 之 前 需 要 先 打 开 要 发 布 的 应 用 程 序 工 程 (2) 将 该 向 导 作 为 一 个 独 立 的 部 件 在 开 发 环 境 外 部 运 行 该 方 式 不 需 要 启 动 VB 开 发 环 境, 如 果 已 经 启 动 VB, 必 须 首 先 关 闭 要 打 包 和 发 布 的 应 用 程 序 工 程

328 附 录 A 发 布 VB 应 用 程 序 315 (3) 在 命 令 行 状 态, 以 静 态 模 式 来 启 动 该 向 导 采 用 外 接 程 序 方 式 启 动 打 包 和 展 开 向 导 的 方 法 是 : 1 打 开 想 要 使 用 向 导 来 打 包 或 部 署 的 工 程 ; 2 从 外 接 程 序 菜 单 中 选 择 打 包 和 展 开 向 导 来 启 动 该 向 导 打 包 和 展 开 向 导 启 动 后, 显 示 图 A.1 所 示 的 对 话 框 有 三 个 选 择 : 1 打 包 : 为 该 工 程 创 建 一 个 标 准 软 件 包 或 Internet 软 件 包 ; 2 展 开 : 将 打 包 后 的 软 件 包 发 布 到 磁 盘 或 Web 站 点 ; 3 管 理 脚 本 : 查 看 编 辑 或 删 除 打 包 脚 本 图 A.1 打 包 和 展 开 向 导 (1) 2. 打 包 应 用 程 序 为 当 前 工 程 打 包 的 方 法 是 : (1) 在 图 A.1 中 选 择 打 包 如 果 没 有 打 包 前 没 有 执 行 文 件 菜 单 下 的 生 成 EXE, 则 弹 出 图 A.2 的 对 话 框, 选 择 编 译 将 生 成 该 可 执 行 文 件 (2) 选 择 打 包 类 型 ( 如 图 A.3 所 示 ) 图 A.2 打 包 和 展 开 向 导 (2)

329 316 Visual Basic 程 序 设 计 教 程 图 A.3 打 包 和 展 开 向 导 (3) (3) 指 定 软 件 包 的 存 储 位 置 ( 如 图 A.4 所 示 ) 图 A.4 打 包 和 展 开 向 导 (4) 说 明, 为 加 快 打 包 速 度, 建 议 采 用 硬 盘 作 为 存 储 介 质 (4) 选 择 软 件 包 中 包 含 的 文 件 ( 如 图 A.5 所 示 ), 选 择 下 一 步 说 明 : 打 包 和 展 开 向 导 可 以 根 据 当 前 程 序 的 工 程 文 件 自 动 决 定 主 要 的 包 含 文 件, 包 括 可 执 行 程 序 文 件 和 允 许 程 序 必 需 的 DLL 文 件, 一 般 这 就 足 够 了 如 果 需 要 包 含 其 他 文 件, 如 Readme.TXT 图 片 数 据 库 等, 则 要 一 个 个 添 加 到 文 件 列 表 中 要 排 除 文 件 列 表 中 的 某 个 文 件, 只 要 取 消 对 该 文 件 的 选 取 即 可

330 附 录 A 发 布 VB 应 用 程 序 317 图 A.5 打 包 和 展 开 向 导 (5) (5) 选 择 文 件 的 压 缩 方 式 ( 如 图 A.6 所 示 ) 图 A.6 打 包 和 展 开 向 导 (6) 说 明 : 如 果 通 过 CD 或 网 络 发 布 程 序, 可 以 选 择 单 个 的 压 缩 文 件, 如 果 使 用 软 盘, 则 必 须 选 择 多 个 压 缩 文 件, 并 适 当 设 置 每 个 压 缩 文 件 的 大 小 ( 取 决 于 磁 盘 容 量 ) (6) 设 置 安 装 标 题 (7) 指 定 程 序 组 和 程 序 项 ( 如 图 A.7 所 示 ) (8) 指 定 文 件 的 安 装 位 置 ( 如 图 A.8 所 示 ) 说 明 : 通 常 DLL 文 件 被 安 装 在 系 统 文 件 夹 中, 应 用 程 序 被 安 装 在 Program Files 文 件

331 318 Visual Basic 程 序 设 计 教 程 夹 下 的 某 个 子 文 件 夹 中 一 般 取 默 认 设 置 图 A.7 打 包 和 展 开 向 导 (7) 图 A.8 打 包 和 展 开 向 导 (8) (9) 设 置 共 享 文 件 (10) 设 置 脚 本 文 件 名, 存 储 脚 本 文 件, 完 成 打 包 过 程 软 件 包 以.cab 文 件 形 式 存 放 在 指 定 的 文 件 夹 中 ( 图 A.4), 该 文 件 夹 中 主 要 包 括 三 个 文 件 (Setup.exe Setup.lst 和 *.cab) 和 一 个 文 件 夹 (Support, 包 含 已 打 包 的 所 有 文 件 ) 可 以 使 用 Windows 的 文 件 管 理 或 其 他 方 式 实 现 软 件 包 的 发 布, 不 过 较 方 便 的 是 使 用 打 包 和 展 开 向 导

332 附 录 A 发 布 VB 应 用 程 序 发 布 应 用 程 序 发 布 软 件 包 的 方 法 是 : (1) 启 动 打 包 和 展 开 向 导, 并 选 择 展 开 ( 如 图 A.1 所 示 ); (2) 选 择 要 发 布 的 软 件 包 ; (3) 选 择 展 开 方 式 ( 如 图 A.9 所 示 ); 图 A.9 打 包 和 展 开 向 导 (9) (4) 选 择 展 开 文 件 夹 ( 即 文 件 的 发 布 位 置, 如 软 盘 CD 或 Web 网 站 等 ); (5) 保 存 展 开 脚 本, 并 结 束 展 开 操 作 A.2 安 装 应 用 程 序 经 打 包 和 展 开 向 导 创 建 的 软 件 包 可 以 和 标 准 Windows 应 用 程 序 一 样 安 装 在 不 同 的 计 算 机 上, 只 要 运 行 Setup.exe 文 件, 按 照 屏 幕 提 示 操 作 就 可 以 完 成 安 装 已 安 装 的 应 用 程 序 可 以 在 控 制 面 板 的 添 加 或 删 除 程 序 中 删 除, 具 体 步 骤 请 读 者 自 己 练 习

333 附 录 B 从 VB 6.0 到 VB.NET Visual Basic.NET( 简 称 VB.NET) 是 从 Visual Basic 发 展 而 来 的, 但 又 有 很 多 不 同 VB.NET 提 供 了 对 最 新 的 编 程 技 术 的 支 持, 如 快 速 应 用 开 发 (RAD) 多 语 言 的 互 操 作 等 VB.NET 是 完 全 的 面 向 对 象 编 程 语 言, 可 广 泛 用 于 Windows 应 用 程 序 和 XML( 可 扩 展 标 记 语 言 )Web 服 务 的 开 发, 支 持 移 动 电 子 设 备 ( 如 个 人 数 字 助 理 PDA 手 机 ) 应 用 开 发 VB.NET 是 Visaul Studio.NET( 简 称 VS.NET) 的 一 部 分,VS.NET 是 Microsoft 公 司 2000 年 推 出 的.NET 策 略 的 主 要 产 品 之 一 VS.NET 是 一 套 完 整 的 开 发 工 具, 用 于 生 成 ASP Web 应 用 程 序 XML Web 服 务 桌 面 应 用 程 序 和 移 动 应 用 程 序 除 了 VB.NET,VS.NET 还 包 括 了 Visual C++.NET 和 Visual C#.NET 等, 全 都 使 用 相 同 的 集 成 开 发 环 境 (IDE) VS.NET 的 IDE 提 供 了 对 共 享 工 具 和 混 合 语 言 编 程 的 支 持 所 有 VS.NET 的 编 程 语 言 都 利 用 了.NET 框 架 (Framework) 的 功 能.NET 框 架 是.NET 策 略 的 核 心 B.1.NET 框 架.NET 框 架 是 一 种 新 的 计 算 平 台, 旨 在 简 化 在 高 度 分 布 式 Internet 环 境 中 的 应 用 程 序 开 发, 实 现 下 列 目 标 : (1) 提 供 一 个 一 致 的 面 向 对 象 的 编 程 环 境, 而 无 论 对 象 代 码 是 在 本 地 存 储 和 执 行, 还 是 在 本 地 执 行 但 在 Internet 上 分 布, 或 者 是 在 远 程 执 行 (2) 提 供 一 个 将 软 件 部 署 和 版 本 控 制 冲 突 最 小 化 的 代 码 执 行 环 境 (3) 提 供 一 个 保 证 代 码 ( 包 括 由 未 知 的 或 不 完 全 受 信 任 的 第 三 方 创 建 的 代 码 ) 安 全 执 行 的 代 码 执 行 环 境 (4) 提 供 一 个 可 消 除 脚 本 环 境 或 解 释 环 境 的 性 能 问 题 的 代 码 执 行 环 境 (5) 使 开 发 人 员 的 经 验 在 面 对 类 型 大 不 相 同 的 应 用 程 序 ( 如 基 于 Windows 的 应 用 程 序 和 基 于 Web 的 应 用 程 序 ) 时 保 持 一 致 (6) 按 照 工 业 标 准 生 成 所 有 通 讯, 以 确 保 基 于.NET 框 架 的 代 码 可 与 任 何 其 他 代 码 集 成.NET 框 架 是 建 立 在 公 共 语 言 规 范 (Common Language Specification,CLS) 基 础 上 的, CLS 规 范 已 被 ECMA( 欧 洲 计 算 机 制 造 协 会 ) 接 受 并 标 准 化, 所 以.NET 框 架 并 不 仅 限 于 Windows 平 台.NET 框 架 具 有 两 个 主 要 组 件 : 公 共 语 言 运 行 库 (Common Language Runtime,CLR) 和.NET 框 架 类 库 (Framework Class Library,FCL) 1. 公 共 语 言 运 行 库 CLR 是.NET 框 架 的 基 础 CLR 提 供 一 个 运 行 时 环 境, 管 理 代 码 的 执 行 并 提 供 使 开 发 过 程 更 轻 松 的 服 务 用 VB.NET 等 语 言 编 写 的 程 序, 首 先 被 语 言 编 译 器 编 译 成 中 间 语 言 (Microsoft Intermediate

334 附 录 B 从 VB 6.0 到 VB.NET 321 Language,MSIL) 代 码, 运 行 时 由 CLR 的 编 译 器 将 MSIL 翻 译 成 特 定 平 台 的 指 令 代 码 采 用 MSIL 的 好 处 在 于 解 决 了 不 同 系 统 之 间 的 可 移 植 性 问 题 和 不 同 语 言 的 互 操 作 性 问 题 MSIL 代 码 是 与 平 台 无 关 的, 可 以 运 行 在 已 经 安 装 了.NET 框 架 的 任 何 平 台 上 语 言 的 互 操 作 性 为 软 件 开 发 带 来 许 多 好 处, 比 如 人 员 组 织 代 码 重 用 等, 使 用 不 同 语 言 的 开 发 人 员 可 以 组 合 在 一 起 完 成 同 一 个 项 目, 原 有 的 代 码 或 组 件 也 可 以 方 便 地 移 植 到 新 的 项 目 中 CLR 还 具 有 执 行 管 理 特 性, 即 内 存 管 理 特 性, 便 于 开 发 者 专 心 关 注 系 统 开 发, 而 不 必 担 心 内 存 的 使 用 CLR 的 内 存 管 理 具 有 安 全 可 靠 的 特 点 2..NET 框 架 类 库 类 库 是.NET 框 架 的 另 一 个 主 要 组 件, 是 一 个 综 合 性 的 面 向 对 象 的 可 重 用 类 型 集 合, 可 以 使 用 它 开 发 包 含 从 传 统 的 命 令 行 或 图 形 用 户 界 面 (GUI) 应 用 程 序 到 基 于 ASP.NET 所 提 供 的 最 新 创 新 的 应 用 程 序 ( 如 Web 窗 体 和 XML Web 服 务 ) 在 内 的 应 用 程 序 开 发 工 具 < Visual Studio.NET CLS 兼 容 语 言 (VB.NET C# VC.NET ) 编 程 模 型 ASP.NET Web 应 用 程 序 Web 服 务 Win 窗 体.NET 框 架 <.NET 框 架 类 库 (FCL) 通 用 语 言 运 行 库 (CLR) TCP/IP SOAP HTTP 图 B.1.NET 框 架 体 系 结 构 B.2 VB.NET 的 新 特 点 VB.NET 是 新 一 代 的 Visual Basic 语 言, 是 一 种 可 简 便 快 捷 地 创 建.NET 应 用 程 序 ( 包 括 XML Web 服 务 和 ASP.NET Web 应 用 程 序 ) 的 语 言 VB.NET 是 功 能 强 大 的 面 向 对 象 的 编 程 语 言, 具 有 许 多 新 功 能 和 改 进 功 能 已 经 改 进 的 语 言 功 能 包 括 对 象 的 继 承 接 口 和 重 载 等 新 增 加 的 语 言 功 能 包 括 自 由 线 程 处 理 结 构 化 异 常 处 理 自 定 义 属 性 和 符 合 CLS 规 范 等 Visual Basic.NET 完 全 集 成 了.NET 框 架 和 公 共 语 言 运 行 库.NET 框 架 和 公 共 语 言 运 行 库 共 同 提 供 语 言 互 操 作 性 垃 圾 回 收 增 强 的 安 全 性 和 改 进 的 版 本 支 持 与 以 前 的 Visual Basic 相 比, 由 于 采 用 了 新 的 开 发 环 境 更 新 的 编 程 语 言 和 新 的 窗 体 包,

335 322 Visual Basic 程 序 设 计 教 程 从 Visual Basic 6.0 升 级 到 Visual Basic.NET 最 初 看 来 可 能 十 分 困 难 事 实 上,Visual Basic 的 多 数 与 众 不 同 的 特 征 都 得 到 了 保 留 和 改 进, 特 别 是 使 用 Visual Basic 开 发 所 需 的 总 的 知 识 和 技 能 基 本 未 变, 少 量 细 微 的 更 改 使 Visual Basic.NET 比 以 前 更 容 易 使 用 功 能 更 强 大 B.3 VB.NET 的 语 言 改 进 Visual Basic 的 早 期 版 本 的 目 标 是 创 建 Windows 客 户 端 应 用 程 序, 而 VB.NET 旨 在 创 建 XML Web 服 务 应 用 程 序, 这 就 需 要 更 改 语 言 本 身 下 面 介 绍 部 分 主 要 变 化 1. 命 名 空 间 (Namespace) 与 以 前 的 VB 不 同 的 是 VB.NET 是 在 CRL 的 上 下 文 中 运 行 的, 因 此 必 须 遵 守 CLR 相 容 的 语 言 规 范 VB.NET 本 身 被 封 装 在 Microsoft Visual Basic 的 命 名 空 间 Assembly 中, 使 用 VB.NET 编 程 实 际 是 在 引 用 Assembly 命 名 空 间 并 不 是 一 个 新 概 念, 在 概 念 上 与 Visual Basic 6.0 中 的 对 象 库 相 似 在 VB.NET 中, 对 象 包 含 在 程 序 集 中, 程 序 集 是.NET 框 架 类 库 的 一 部 分 每 个 程 序 集 表 示 一 个 命 名 空 间 例 如, 窗 体 和 控 件 对 象 包 含 在 System.Windows.Forms 命 名 空 间 中 命 名 空 间 名 称 是 类 型 的 完 全 限 定 名 ( 形 式 为 Namespace.Typename) 的 一 部 分 所 有 Microsoft 提 供 的 命 名 空 间 都 是 以 名 称 System 或 Microsoft 开 头 的 在 VB.NET 中, 要 创 建 一 个 对 象 必 须 说 明 对 象 的 命 名 空 间 例 如, 如 果 需 要 定 义 一 个 Button 对 象, 则 : Dim b As System.Windows.Forms.Button 因 为,Button 对 象 被 封 装 在 了 System.Windows.Forms 命 名 空 间 中 也 可 以 在 程 序 中 使 用 Imports 语 句 引 用 该 命 名 空 间, 这 样 定 义 Button 对 象 的 形 式 变 为 : Dim b As Button 在 VS.NET 的 集 成 开 发 环 境 IDE 中, 可 以 通 过 添 加 引 用 将 需 要 的 命 名 空 间 引 入 项 目 在 创 建 Windows 应 用 程 序 时,System.Windows.Forms 命 名 空 间 已 被 自 动 引 用 大 家 习 惯 的 MsgBox InputBox 函 数 都 是 该 命 名 空 间 中 Form 对 象 的 方 法 2. 数 据 类 型 由 于 对 语 言 互 操 作 性 的 需 要,VB.NET 的 数 据 类 型 有 许 多 变 化 在 VB.NET 中, 数 据 类 型 都 是 从 System.Object 派 生 出 来 的, 因 此 都 是 对 象 例 如 : Dim s As String s = "Hello World " MsgBox ( s.length ) 这 里,s 为 String 对 象, 在 MsgBox 方 法 中, 引 用 了 s 对 象 的 Length 属 性 表 B.1 对 VB.NET 的 数 据 类 型 进 行 了 简 要 说 明 VB.NET 不 再 支 持 用 Type 语 句 定 义 的 用 户 自 定 义 数 据 类 型 (UDT), 而 改 为 功 能 更 强 大 的 Structure Structure 不 仅 包 含 域, 而 且 包 含 方 法 属 性 事 件 等, 甚 至 可 以 包 含 接 口, 因 而 可 以 看 作 是 一 个 类

336 附 录 B 从 VB 6.0 到 VB.NET 323 表 B.1 VB.NET 的 数 据 类 型 VB.NET 的 数 据 类 型 VB 6.0 的 数 据 类 型 改 进 说 明 Boolean Boolean 用 1 表 示 True, 兼 容 用 -1 表 示 True Byte Byte Char 新 增, 表 示 1 个 Unicode 字 符 (16 位, 无 符 号 ) Date Date 改 用 64 位 无 符 号 整 数 表 示,1 表 示 100 纳 秒 Decimal(@) 新 增, 最 大 长 度 128 位, 定 点 数 Double(#) Double(#) Integer(%) Integer(%) 长 度 改 为 4 字 节 (32 位 ) Long(&) Long(&) 长 度 改 为 8 字 节 (64 位 ) Short 新 增, 长 度 为 2 字 节 (16 位 ) Single(!) Single(!) String($) String($) 不 支 持 定 长 字 符 串 Currency Variant 改 用 Decimal 表 示 改 用 Object 表 示 3. 运 算 符 VB.NET 支 持 新 的 运 算 符, 用 来 减 少 代 码 长 度 例 如 : Dim s As String s = "Hello, " s &= "Word" ' 相 当 于 s = s & "Word" 类 似 的 用 法 还 可 用 于 加 减 乘 除 和 幂 运 算 4. 变 量 VB.NET 的 最 明 显 的 变 化 与 变 量 的 声 明 和 实 例 化 有 关 VB.NET 建 议 不 使 用 变 量 的 隐 式 声 明 (Option Explicit 的 缺 省 设 置 为 On), 也 就 是 说 任 何 变 量 必 须 在 使 用 前 显 式 地 声 明 同 时, 为 了 符 合 CLR 的 约 定,VB.NET 建 议 将 Option Strict 设 置 为 On, 即 不 允 许 隐 式 类 型 转 换, 此 时 : Dim a 是 错 误 的 如 果 将 Option Strict 设 置 为 Off, 则 a 为 Object 类 型 VB.NET 支 持 对 多 个 相 同 类 型 的 变 量 的 简 化 声 明, 如 : Dim x, y, z As Single 同 时 声 明 了 三 个 Single 类 型 的 变 量 x y 和 z, 显 然 这 一 简 化 是 有 益 的 VB.NET 允 许 在 变 量 的 声 明 中 对 变 量 初 始 化, 即 变 量 的 实 例 化, 如 : Dim x As Integer = 5 5. 数 组 VB.NET 的 数 组 具 有 固 定 的 下 标 下 限 0, 也 就 是 说, 声 明 数 组 时 不 能 说 明 下 标 的 下 限, 也 不 能 使 用 Option Base 语 句 来 设 置, 因 为 该 语 句 已 不 再 被 支 持 声 明 数 组 的 方 法 是 : Dim 数 组 名 ( 下 标 的 上 限 ) As 数 据 类 型

337 324 Visual Basic 程 序 设 计 教 程 如 : Dim x(10) As Integer 这 里, 数 组 x 有 11 个 元 素, 下 标 从 0 到 10 VB.NET 支 持 数 组 的 初 始 化, 例 如 : Dim x() As Integer = {1, 2, 3, 4, 5} 这 里 x 是 数 组 变 量, 其 元 素 个 数 为 5, 元 素 的 下 标 为 从 0 到 4 VB.NET 的 数 组 的 大 小 不 是 固 定 的, 因 此 任 何 数 组, 不 论 是 否 声 明 了 下 标 上 限, 都 可 以 用 Redim 语 句 改 变 其 大 小 在 VB.NET 中, 数 组 是 对 象, 因 此 数 组 变 量 中 含 有 指 向 数 据 的 指 针, 这 些 数 据 包 含 元 素 秩 和 长 度 信 息 例 如 : Dim x() As Integer = {1, 2, 3, 4, 5} Dim y As Integer = x.length y 的 初 始 值 为 数 组 x 的 长 度 ( 元 素 个 数 ) VB.NET 不 支 持 Array 函 数, 因 为 Array 是 一 个 类, 所 有 数 组 都 是 从 Array 派 生 来 的,Array 提 供 几 个 有 益 的 方 法, 如 Copy Sort 等 6. 过 程 VB.NET 关 于 过 程 的 改 进 主 要 有 : (1) 参 数 的 传 递 机 制 : 默 认 方 式 为 ByVal, 而 不 是 ByRef 实 际 使 用 时, 即 使 没 有 显 式 地 使 用 ByVal 关 键 字,IDE 也 会 自 动 添 加 ByVal 方 式 增 强 了 系 统 的 安 全 性 (2) 过 程 的 使 用 : VB.NET 中, 调 用 任 何 过 程, 包 括 Function 和 Sub, 只 要 参 数 非 空 ( 有 参 数 ), 就 必 须 使 用 括 号 把 参 数 括 起 来 只 有 参 数 为 空 ( 没 有 参 数 ) 时, 可 以 省 略 括 号, 也 可 以 不 省 略 (3) 过 程 的 声 明 : VB.NET 支 持 可 选 参 数, 但 是 每 个 可 选 参 数 都 必 须 声 明 一 个 默 认 值, 如 果 调 用 程 序 不 提 供 该 参 数, 该 默 认 值 会 传 递 给 过 程 例 如 : Sub Calculate(Optional ByVal Switch As Boolean = False) 在 VB.NET 中,Static 关 键 字 不 能 用 于 Function 或 Sub 语 句, 任 何 静 态 局 部 变 量 必 须 单 独 声 明 为 Static 7. 对 象 (1) 对 象 的 创 建 : VB.NET 不 支 持 隐 式 对 象 的 创 建, 可 以 使 用 声 明 对 象 变 量 的 相 同 语 句 来 创 建 对 象 以 下 两 行 代 码 的 每 一 行 都 从 已 在 应 用 程 序 中 定 义 的 类 EmpObj 中 创 建 一 个 对 象, 它 们 是 等 效 的, 第 一 行 代 码 可 作 为 第 二 行 代 码 的 简 写 形 式 : Dim Emp As New EmpObj Dim Emp As EmpObj = New EmpObj 在 这 两 种 情 况 下, 只 要 执 行 Dim 语 句, 就 会 立 即 创 建 EmpObj 类 的 实 例 Emp, 且 将 Emp 初 始 化 为 对 新 对 象 的 引 用 (2) 对 象 的 属 性 : VB 6.0 中, 经 常 使 用 对 象 的 默 认 属 性, 如 Label 控 件 的 Caption 属 性 在 VB.NET 中,

338 附 录 B 从 VB 6.0 到 VB.NET 325 不 再 支 持 默 认 属 性 因 此 : Label1 = " 欢 迎 " 是 错 误 的 多 数 控 件 的 Caption 属 性 用 Text 属 性 替 代 8. 异 常 处 理 在 VB 6.0 中, 使 用 非 结 构 化 异 常 处 理 来 处 理 代 码 中 的 错 误, 包 括 On Error 语 句 和 Resume 语 句 等 VB.NET 改 用 结 构 化 的 异 常 处 理, 通 过 将 控 制 结 构 与 异 常 受 保 护 的 代 码 块 和 筛 选 器 结 合 起 来, 在 执 行 过 程 中 检 测 和 响 应 错 误 结 构 化 异 常 处 理 是 通 过 Try 语 句 完 成 的, 该 语 句 由 3 种 块 组 成 :Try Catch 和 Finally Try 块 是 包 含 要 执 行 语 句 的 语 句 块 Catch 块 是 处 理 异 常 的 语 句 块 Finally 块 包 含 在 Try 语 句 退 出 后 要 运 行 的 语 句, 无 论 是 否 发 生 异 常 与 Catch 块 一 起 使 用 的 Throw 语 句 引 发 由 System.Exception 类 派 生 的 类 型 的 实 例 表 示 的 异 常 B.4 VB.NET 程 序 设 计 下 面 简 单 介 绍 VB.NET 程 序 的 编 写 方 法 1. 启 动 Visual Studio.NET 在 成 功 安 装 了 Visual Studio.NET 的 计 算 机 上, 单 击 开 始 按 钮, 选 择 程 序, 选 择 Microsoft Visual Studio.NET, 单 击 Microsoft Visual Studio.NET, 即 可 启 动 VS.NET, 如 图 B.2 所 示 图 B.2 Visual Studio.Net 的 起 始 页 在 VS.NET 的 起 始 页 中, 可 以 执 行 最 常 用 的 操 作, 如 打 开 创 建 项 目 等

339 326 Visual Basic 程 序 设 计 教 程 2. 创 建 VB.NET 项 目 单 击 新 建 项 目 按 钮, 或 执 行 文 件 / 新 建 / 项 目 菜 单 命 令, 显 示 图 B.3 所 示 的 对 话 框 图 B.3 新 建 项 目 对 话 框 选 择 模 板 中 的 Windows 应 用 程 序, 在 名 称 栏 输 入 程 序 ( 项 目 ) 名 称, 并 设 置 适 当 的 位 置, 单 击 确 定 按 钮, 将 建 立 一 个 空 白 的 VB.NET 项 目, 如 图 B.4 所 示 图 B.4 VB.NET 窗 体 设 计 器 窗 口 可 见,VB.NET 集 成 开 发 环 境 IDE 的 构 成 和 用 法 与 VB 6.0 相 比, 并 没 有 太 多 变 化, 要 说

340 附 录 B 从 VB 6.0 到 VB.NET 327 变, 可 能 更 方 便 更 人 性 化 了 3. 添 加 控 件 分 别 从 工 具 箱 中 将 标 签 (Label) 文 本 框 (TextBox) 和 按 钮 (Button) 拖 放 到 窗 体 上, 并 适 当 设 置 控 件 的 属 性, 如 图 B.5 所 示 4. 输 入 代 码 图 B.5 应 用 程 序 界 面 设 计 双 击 确 定 按 钮, 切 换 到 代 码 编 辑 页, 输 入 程 序 代 码, 如 图 B.6 所 示 图 B.6 VB.NET 的 代 码 编 辑 器 窗 口 与 VB 6.0 不 同,VB.NET 的 窗 体 在 代 码 窗 口 中 显 示 为 一 个 对 象, 以 Class 语 句 开 始,End Class 语 句 结 束 所 有 代 码 被 封 装 在 Class End Class 结 构 中 窗 口 中 的 第 二 行 : Inherits System.Windows.Forms.Form 表 明 当 前 窗 体 继 承 了 System.Windows.Forms.Form 类 的 属 性 方 法 和 事 件 等

341 328 Visual Basic 程 序 设 计 教 程 窗 口 的 第 三 行 : +" Windows 窗 体 设 计 器 生 成 的 代 码 " 表 明 窗 口 中 隐 藏 了 部 分 由 窗 体 设 计 器 自 动 生 成 的 代 码 如 果 单 击 左 边 的 展 开 符 号 +, 可 以 显 示 这 些 代 码, 同 时 + 变 为 ( 折 迭 符 号 ), 再 次 单 击 可 重 新 隐 藏 这 些 代 码 另 外, 将 解 决 方 案 资 源 管 理 器 中 的 引 用 展 开, 可 以 看 到 该 项 目 引 用 了 System.Windows.Forms 命 名 空 间, 因 此 程 序 中 直 接 使 用 了 该 命 名 空 间 的 MsgBox 方 法 5. 运 行 程 序 单 击 工 具 栏 的 启 动 按 钮 或 按 F5 功 能 键, 系 统 开 始 编 译 程 序 编 译 成 功 后, 自 动 运 行 程 序 在 文 本 框 中 输 入 某 个 姓 名, 按 确 定 按 钮, 将 显 示 一 个 消 息 框 ( 请 读 者 自 己 尝 试 ) 选 择 退 出 按 钮, 可 以 结 束 程 序 运 行, 返 回 IDE

MVB-1001.DOC

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

More information

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

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

More information

心理障碍防治(下).doc

心理障碍防治(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...2...3...4...5...6...7...8...9...10... 11...12...13...15...16...17...19...21 I ...23...24...26...27...28...30...32...34...37...39...40...42...42...44...47...50...52...56...58...60...64...68

More information

Microsoft PowerPoint - OPVB1基本VB.ppt

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

More information

全 国 高 等 职 业 教 育 规 划 教 材 21 世 纪 高 职 高 专 规 划 教 材 系 列 高 等 职 业 教 育 计 算 机 专 业 规 划 教 材 选 题 征 集 通 知 一 选 题 范 围 ( 不 仅 限 于 此 ) 选 题 方 向 选 题 名 计 算 机 基 础 计 算 机 应 用

全 国 高 等 职 业 教 育 规 划 教 材 21 世 纪 高 职 高 专 规 划 教 材 系 列 高 等 职 业 教 育 计 算 机 专 业 规 划 教 材 选 题 征 集 通 知 一 选 题 范 围 ( 不 仅 限 于 此 ) 选 题 方 向 选 题 名 计 算 机 基 础 计 算 机 应 用 刘 瑞 新 金 牌 作 者 经 典 作 品 教 授, 计 算 机 专 业 资 深 学 科 带 头 人, 多 部 著 作 获 得 全 国 优 秀 畅 销 书 奖 他 所 编 写 的 教 材 内 容 均 来 自 教 学 实 践, 是 对 编 写 讲 义 教 学 修 改 教 学 讲 义 再 次 教 学 整 个 过 程 的 精 确 提 炼, 因 此 对 促 进 教 师 教 学 学 生 学 习 发 挥 了 重

More information

中医疗法(下).doc

中医疗法(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...3...4...13...15...17...17...24...25...26...26...28...28...29...31...31...33...33

More information

眼病防治

眼病防治 ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...2...3...5...5...6...7...9... 11...13...14...15...17...18...19...20...21 I II...21...22...23...24...25...27...27...28...29...30...31...33...33...34...36...38...39...40...41...42...43...45

More information

中国南北特色风味名菜 _八)

中国南北特色风味名菜 _八) ( 20 010010) 7871092 1/32 356.25 4 760 2004 8 1 2004 8 1 11 000 ISBN 7-204-05943-3/Z102 1026.00 ( 18.00 ) ...1...2...2...4...6...7...8...9... 10... 11... 12... 13... 13... 14... 15... 17... 18... 19...

More information

中医疗法(上).doc

中医疗法(上).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...1...2...4...5...7...13...15...17...18...19...21...23...24...24...26...26...27 I ...28...29...30...30...31...32...33...34...35...36...37...39...40...41...42...43...43...45...46...47...47...48

More information

2

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

More information

穨ecr2_c.PDF

穨ecr2_c.PDF i ii iii iv v vi vii viii 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 1 26 27 2 28 29 30 31 32 33 34 35 36 37 38 39 40 3 4 41 42 43 5 44 45 46 6 47 48 49 50 51 52 1 53 2 54 55 3 56

More information

電腦相關罪行跨部門工作小組-報告書

電腦相關罪行跨部門工作小組-報告書 - ii - - iii - - iv - - v - - vi - - vii - - viii - (1) 2.1 (2) (3) 13.6 (4) 1.6 (5) 21 (6) (7) 210 (8) (9) (10) (11) ( ) ( 12) 20 60 16 (13) ( ) (

More information

i

i i ii iii iv v vi vii viii ===== 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 ==== ====

More information

发展党员工作手册

发展党员工作手册 发 展 党 员 工 作 问 答 目 录 一 总 论...9 1. 发 展 党 员 工 作 的 方 针 是 什 么? 如 何 正 确 理 解 这 个 方 针?... 9 2. 为 什 么 强 调 发 展 党 员 必 须 保 证 质 量?... 9 3. 如 何 做 到 慎 重 发 展?... 10 4. 如 何 处 理 好 发 展 党 员 工 作 中 的 重 点 与 一 般 的 关 系?...11 5.

More information

i

i 9 1 2 3 4 i 5 6 ii iii iv v vi vii viii 1 1 1 2 3 4 2 5 6 2 3 2.10 ( 2.11 ) ( 2.11 ) ( 2.9 ) 7 8 9 3 10 5% 2% 4 11 93% (2001 02 2003 04 ) ( ) 2,490 (100%) 5 12 25% (2.57% 25%) 6 (2001 02 2003 04 ) 13 100%

More information

39898.indb

39898.indb 1988 4 1998 12 1990 5 40 70.................................................. 40.............................................................. 70..............................................................

More information

untitled

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

More information

untitled

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

More information

Microsoft Word - Panel Paper on T&D-Chinese _as at 6.2.2013__final_.doc

Microsoft Word - Panel Paper on T&D-Chinese _as at 6.2.2013__final_.doc 二 零 一 三 年 二 月 十 八 日 會 議 討 論 文 件 立 法 會 CB(4)395/12-13(03) 號 文 件 立 法 會 公 務 員 及 資 助 機 構 員 工 事 務 委 員 會 公 務 員 培 訓 及 發 展 概 況 目 的 本 文 件 介 紹 公 務 員 事 務 局 為 公 務 員 所 提 供 培 訓 和 發 展 的 最 新 概 況, 以 及 將 於 二 零 一 三 年 推 出

More information

Microsoft Word - 13院21号.doc

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

More information

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

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

More information

ebook43-11

ebook43-11 11 Excel 4 E x c e l Access A c c e s s Access Access / Access 2000 / Paradox S Q L A c c e s s SQL Lotus Org a n i z e r A c c e s s A c c e s s Wo r d Word for Windows O D B C ODBC O ffice A c c e s

More information

四川省普通高等学校

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

More information

509 (ii) (iii) (iv) (v) 200, , , , C 57

509 (ii) (iii) (iv) (v) 200, , , , C 57 59 (ii) (iii) (iv) (v) 500,000 500,000 59I 18 (ii) (iii) (iv) 200,000 56 509 (ii) (iii) (iv) (v) 200,000 200,000 200,000 500,000 57 43C 57 (ii) 60 90 14 5 50,000 43F 43C (ii) 282 24 40(1B) 24 40(1) 58

More information

榫 卯 是 什 麼? 何 時 開 始 應 用 於 建 築 中? 38 中 國 傳 統 建 築 的 屋 頂 有 哪 幾 種 形 式? 40 大 內 高 手 的 大 內 指 什 麼? 42 街 坊 四 鄰 的 坊 和 街 分 別 指 什 麼? 44 北 京 四 合 院 的 典 型 格 局 是 怎 樣 的

榫 卯 是 什 麼? 何 時 開 始 應 用 於 建 築 中? 38 中 國 傳 統 建 築 的 屋 頂 有 哪 幾 種 形 式? 40 大 內 高 手 的 大 內 指 什 麼? 42 街 坊 四 鄰 的 坊 和 街 分 別 指 什 麼? 44 北 京 四 合 院 的 典 型 格 局 是 怎 樣 的 目 錄 中 華 醫 藥 以 醫 術 救 人 為 何 被 稱 為 懸 壺 濟 世? 2 什 麼 樣 的 醫 生 才 能 被 稱 為 華 佗 再 世? 4 中 醫 如 何 從 臉 色 看 人 的 特 質? 6 中 醫 怎 樣 從 五 官 看 病? 8 中 醫 看 舌 頭 能 看 出 些 什 麼 來? 10 中 醫 真 的 能 靠 一 個 枕 頭, 三 根 指 頭 診 病 嗎? 12 切 脈 能 判 斷

More information

尿路感染防治.doc

尿路感染防治.doc ...1...1...2...4...6...7...7...10...12...13...15...16...18...19...24...25...26...27...28 I II...29...30...31...32...33...34...36...37...37...38...40...40...41...43...44...46...47...48...48...49...52 III...55...56...56...57...58

More information

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc 人 力 資 源 推 算 報 告 香 港 特 別 行 政 區 政 府 二 零 一 二 年 四 月 此 頁 刻 意 留 空 - 2 - 目 錄 頁 前 言 詞 彙 縮 寫 及 注 意 事 項 摘 要 第 一 章 : 第 二 章 : 第 三 章 : 第 四 章 : 附 件 一 : 附 件 二 : 附 件 三 : 附 件 四 : 附 件 五 : 附 件 六 : 附 件 七 : 引 言 及 技 術 大 綱 人

More information

南華大學數位論文

南華大學數位論文 1 i -------------------------------------------------- ii iii iv v vi vii 36~39 108 viii 15 108 ix 1 2 3 30 1 ~43 2 3 ~16 1 2 4 4 5 3 6 8 6 4 4 7 15 8 ----- 5 94 4 5 6 43 10 78 9 7 10 11 12 10 11 12 9137

More information

李天命的思考藝術

李天命的思考藝術 ii iii iv v vi vii viii ix x 3 1 2 3 4 4 5 6 7 8 9 5 10 1 2 11 6 12 13 7 8 14 15 16 17 18 9 19 20 21 22 10 23 24 23 11 25 26 7 27 28 12 13 29 30 31 28 32 14 33 34 35 36 5 15 3 1 2 3 4 5 6 7 8 9 10 11

More information

皮肤病防治.doc

皮肤病防治.doc ...1...1...2...3...4...5...6...7...7...9...10... 11...12...14...15...16...18...19...21 I ...22...22...24...25...26...27...27...29...30...31...32...33...34...34...36...36...37...38...40...41...41...42 II

More information

性病防治

性病防治 ...1...2...3...4...5...5...6...7...7...7...8...8...9...9...10...10... 11... 11 I ...12...12...12...13...14...14...15...17...20...20...21...22...23...23...25...27...33...34...34...35...35 II ...36...38...39...40...41...44...49...49...53...56...57...57...58...58...59...60...60...63...63...65...66

More information

中国南北特色风味名菜 _一)

中国南北特色风味名菜 _一) ...1...1...2...3...3...4...5...6...7...7...8...9... 10... 11... 13... 13... 14... 16... 17 I ... 18... 19... 20... 21... 22... 23... 24... 25... 27... 28... 29... 30... 32... 33... 34... 35... 36... 37...

More information

全唐诗24

全唐诗24 ... 1... 1... 2... 2... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 9... 9...10...10...10...11...12...12...12...13...13 I II...14...14...14...15...15...15...16...16...16...17...17...18...18...18...19...19...19...20...20...20...21...21...22...22...23...23...23...24

More information

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

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

More information

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

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

More information

14A 0.1%5% 14A 14A.52 1 2 3 30 2

14A 0.1%5% 14A 14A.52 1 2 3 30 2 2389 30 1 14A 0.1%5% 14A 14A.52 1 2 3 30 2 (a) (b) (c) (d) (e) 3 (i) (ii) (iii) (iv) (v) (vi) (vii) 4 (1) (2) (3) (4) (5) 400,000 (a) 400,000300,000 100,000 5 (b) 30% (i)(ii) 200,000 400,000 400,000 30,000,000

More information

穨_2_.PDF

穨_2_.PDF 6 7.... 9.. 11.. 12... 14.. 15.... 3 .. 17 18.. 20... 25... 27... 29 30.. 4 31 32 34-35 36-38 39 40 5 6 : 1. 2. 1. 55 (2) 2. : 2.1 2.2 2.3 3. 4. ( ) 5. 6. ( ) 7. ( ) 8. ( ) 9. ( ) 10. 7 ( ) 1. 2. 3. 4.

More information

(Chi)_.indb

(Chi)_.indb 1,000,000 4,000,000 1,000,000 10,000,000 30,000,000 V-1 1,000,000 2,000,000 20,000,00010,000,0005,000,000 3,000,000 30 20% 35% 20%30% V-2 1) 2)3) 171 10,000,00050% 35% 171 V-3 30 V-4 50,000100,000 1) 2)

More information

樹 木 管 理 專 責 小 組 報 告 人 樹 共 融 綠 滿 家 園

樹 木 管 理 專 責 小 組 報 告 人 樹 共 融 綠 滿 家 園 樹 木 管 理 專 責 小 組 報 告 人 樹 共 融 綠 滿 家 園 序 言 我 們 都 愛 樹, 愛 那 鬱 鬱 葱 葱 的 綠 意, 愛 那 股 清 新 的 氣 息, 更 愛 那 溽 暑 中 遍 地 搖 曳 的 斑 斕 樹 蔭 人 與 樹 本 應 是 那 麼 近, 但 去 年 8 月 赤 柱 塌 樹 意 外, 卻 令 我 們 赫 然 發 現, 樹 木 原 來 也 可 以 潛 藏 著 危 險,

More information

女性减肥健身(四).doc

女性减肥健身(四).doc ...1...2...3...4...6...7...8...10... 11...14...16...17...23...25...26...28...30...30 I ...31 10...33...36...39...40...42...44...47...49...53...53 TOP10...55...58...61...64...65...66...68...69...72...73

More information

Teaching kit_A4_part4.indd

Teaching kit_A4_part4.indd 4 ( 學 生 ) i. 認 識 專 題 研 習 甚 麽 是 專 題 研 習? 專 題 研 習 是 學 會 學 習 的 其 中 一 個 關 鍵 項 目 學 生 根 據 自 己 或 老 師 所 訂 立 的 主 題, 依 照 本 身 的 興 趣 和 能 力, 在 老 師 的 指 導 下, 擬 定 研 習 題 目, 設 定 探 討 的 策 略 和 方 法, 進 行 一 系 列 有 意 義 的 探 索 歷

More information

穨ac3-3.PDF

穨ac3-3.PDF 3-1 Access 3-1-1 Event Click OnClick Click OnClick AfterUpdate BeforeUpdate On After Before > VBA( ) 3-1 3-1 Access Open Load Sub Funtion 3-1-2 Sub Funtion Private Me Me Forms Reports Form Report VisualBasic

More information

「香港中學文言文課程的設計與教學」單元設計範本

「香港中學文言文課程的設計與教學」單元設計範本 1. 2. 3. (1) (6) ( 21-52 ) (7) (12) (13) (16) (17) (20) (21) (24) (25) (31) (32) (58) 1 2 2007-2018 7 () 3 (1070) (1019-1086) 4 () () () () 5 () () 6 21 1. 2. 3. 1. 2. 3. 4. 5. 6. 7. 8. 9. ( ) 7 1. 2.

More information

全唐诗28

全唐诗28 ... 1... 1... 1... 2... 2... 2... 3... 3... 4... 4... 4... 5... 5... 5... 5... 6... 6... 6... 6... 7... 7... 7... 7... 8... 8 I II... 8... 9... 9... 9...10...10...10...11...11...11...11...12...12...12...13...13...13...14...14...14...15...15...15...16...16...16...17...17

More information

穨學前教育課程指引.PDF

穨學前教育課程指引.PDF i 1 1.1 1 1.2 1 4 2.1 4 2.2 5 2.3 7 2.4 9 2.5 11 2.6 1 2 1 5 3.1 1 5 3.2 1 5 19 4.1 19 4.2 19 4.3 2 1 4.4 29 4.5 38 4.6 4 3 4.7 47 50 5.1 5 0 5.2 5 0 5.3 6 2 5.4 9 4 5.5 1 2 6 ( ) 1 2 7 ( ) 1 31 ( ) 1

More information

公 務 員 事 務 局

公 務 員 事 務 局 公 務 員 事 務 局 2004 至 05 年 度 環 保 報 告 引 言 本 報 告 載 述 本 局 在 二 零 零 四 至 零 五 年 度 採 取 的 環 保 管 理 措 施 和 取 得 的 成 果, 並 載 列 二 零 零 五 至 零 六 年 度 的 環 保 工 作 目 標 環 保 政 策 本 局 致 力 確 保 局 方 的 運 作 符 合 環 保 原 則 本 局 的 施 政 方 針 及 職

More information

基于UML建模的管理管理信息系统项目案例导航——VB篇

基于UML建模的管理管理信息系统项目案例导航——VB篇 PowerBuilder 8.0 PowerBuilder 8.0 12 PowerBuilder 8.0 PowerScript PowerBuilder CIP PowerBuilder 8.0 /. 2004 21 ISBN 7-03-014600-X.P.. -,PowerBuilder 8.0 - -.TP311.56 CIP 2004 117494 / / 16 100717 http://www.sciencep.com

More information

ZYWGML

ZYWGML 21 世 纪 高 职 高 专 教 材 供 中 医 中 西 医 结 合 类 专 业 用 中 医 五 官 科 学 毋 桂 花 主 编 北 京 内 容 简 介 本 书 是 21 世 纪 高 职 高 专 教 材 ( 供 中 医 中 西 医 结 合 类 专 业 用 ) 中 的 一 种, 主 要 论 述 耳 鼻 咽 喉 口 腔 疾 病 及 眼 科 疾 病 的 发 生 发 展 诊 断 治 疗 本 书 的 编 写

More information

HKAS 002C

HKAS 002C HKAS 002C 認 可 處 認 可 規 例 ( 第 四 版 ) 香 港 認 可 處 二 零 一 一 年 十 一 月 ( 二 零 一 六 年 五 月 第 二 修 訂 版 ) 香 港 特 別 行 政 區 政 府 創 新 科 技 署 出 版 香 港 灣 仔 告 士 打 道 七 號 入 境 事 務 大 樓 三 十 六 樓 版 權 屬 香 港 特 別 行 政 區 政 府 所 有 (2011) ISBN 978-988-18955-4-7

More information

第 2 頁 (a) 擔 任 機 場 擴 建 統 籌 辦 總 監 的 首 席 政 府 工 程 師 職 位 第 3 點 ) ; (b) 擔 任 ( 機 場 擴 建 統 籌 辦 ) 的 首 長 級 丙 級 政 務 官 職 位 ; 以 及 (c) 擔 任 總 助 理 ( 機 場 擴 建 統 籌 辦 ) 的

第 2 頁 (a) 擔 任 機 場 擴 建 統 籌 辦 總 監 的 首 席 政 府 工 程 師 職 位 第 3 點 ) ; (b) 擔 任 ( 機 場 擴 建 統 籌 辦 ) 的 首 長 級 丙 級 政 務 官 職 位 ; 以 及 (c) 擔 任 總 助 理 ( 機 場 擴 建 統 籌 辦 ) 的 財 務 委 員 會 人 事 編 制 小 組 委 員 會 討 論 文 件 2015 年 11 月 4 日 總 目 158- 政 府 總 部 : 運 輸 及 房 屋 局 ( 運 輸 科 ) 分 目 000 運 作 開 支 請 各 委 員 向 財 務 委 員 會 提 出 下 述 建 議, 即 由 財 務 委 員 會 批 准 當 日 起, 在 運 輸 及 房 屋 局 運 輸 科 機 場 擴 建 工 程 統

More information

1. 血 液 對 身 體 細 胞 的 重 要 性 身 體 得 以 健 康 運 作, 最 主 要 靠 的 是 血 管 內 的 血 液 ; 它 帶 著 養 分 與 氧 給 細 胞, 並 帶 回 廢 雜 物 及 二 氧 化 碳 排 出 體 外, 若 此 血 管 阻 塞 導 致 運 作 不 順 時, 各 部

1. 血 液 對 身 體 細 胞 的 重 要 性 身 體 得 以 健 康 運 作, 最 主 要 靠 的 是 血 管 內 的 血 液 ; 它 帶 著 養 分 與 氧 給 細 胞, 並 帶 回 廢 雜 物 及 二 氧 化 碳 排 出 體 外, 若 此 血 管 阻 塞 導 致 運 作 不 順 時, 各 部 慢 性 疾 病 真 相 大 揭 開 作 者 : 陳 鴻 烈 自 然 療 法 醫 師 著 作 : 協 和 岩 寶 的 神 奇 療 效 慢 性 病 的 醫 療 革 命 排 毒 與 細 胞 修 護 現 任 : 中 日 負 離 子 協 會 理 事 長 協 和 溫 泉 ( 股 ) 公 司 董 事 長 手 機 ( 台 灣 )0936914100,( 大 陸 )15816194647 1. 血 液 對 身 體 細

More information

前 言 根 据 澳 门 特 别 行 政 区 第 11/1999 号 法 律 第 三 条 规 定, 审 计 长 执 行 其 职 责, 已 经 对 财 政 局 提 交 的 2011 年 度 澳 门 特 别 行 政 区 总 帐 目 ( 总 帐 目 ) 进 行 了 审 计 与 2010 年 度 相 同, 本 年 度 的 总 帐 目 由 政 府 一 般 综 合 帐 目 及 特 定 机 构 汇 总 帐 目, 两

More information

Microsoft Word - 報告.doc

Microsoft Word - 報告.doc 德 蘭 中 學 同 行 萬 里 高 中 學 生 內 地 交 流 計 劃 2011-2012 湖 北 水 利 及 工 業 規 劃 與 文 化 探 索 之 旅 日 期 : 2012 年 2 月 22 日 至 26 日 隨 團 老 師 : 葉 美 寶 團 員 姓 名 : 楊 綺 婷 胡 夢 吟 關 可 瑤 蔡 沅 汶 黎 佩 霖 梅 如 霞 吳 長 虹 劉 綺 霞 胡 子 祈 李 詠 詩 1 ( 一 )

More information

FEELING COMFORTABLE ABOUT SEX

FEELING COMFORTABLE ABOUT SEX 轻 松 性 谈 只 要 你 轻 松 自 然 的 面 对 自 己 的 性 生 活, 就 能 轻 松 自 然 的 与 人 谈 性 " 1. 自 幼 开 始 用 直 接 而 尊 重 的 态 度 来 解 释 男 孩 子 割 包 皮 和 女 孩 子 的 生 殖 器 官 是 什 么 回 事 让 儿 女 明 白 上 帝 所 创 造 的 身 体 是 可 爱 的. 当 幼 儿 开 始 对 自 己 的 身 体 产 生

More information

cgn

cgn 3654 ( 571 ) 88(4) 2014 3 31 10766 10778 2014 3 31 ( ) 2 21 ( ) 2014 3 31 10768 10778 6 9 1. ( ) 2. 3. 4. 5. 2014 6 3 ( ) 10768 10778 ( ) 2014 3 31 ( 622 ) 11 80 2014 3 31 2014 6 3 10 8 2014 3 31 ( ) 2014

More information

untitled

untitled CHONGQING INTERNATIONAL ENTERPRISE INVESTMENT CO.,LTD. I II III IV V VI ...7...10...11...13...13...14...15...15...21...32...50...53...54...56...56...56.59...61...61...66...69...72...74...74...75...75...75...77

More information

Microsoft Word - report final.doc

Microsoft Word - report final.doc 殘 疾 人 士 無 障 礙 運 輸 需 要 研 究 調 查 報 告 書 目 錄 I. 撮 要 II. III. IV. 前 言 調 查 目 的 文 獻 回 顧 V. 調 查 方 法 VI. 調 查 結 果 VII. 分 析 及 討 論 VIII. 建 議 IX. 鳴 謝 I. 撮 要 殘 疾 人 士 在 日 常 生 活 上 面 對 不 少 困 難 與 挑 戰, 健 全 人 士 未 必 可 以 身 同

More information

上海市教育考试院关于印发新修订的

上海市教育考试院关于印发新修订的 沪 教 考 院 社 考 2012 7 号 上 海 市 教 育 考 试 院 关 于 印 发 上 海 市 高 等 学 校 计 算 机 等 级 考 试 大 纲 (2012 年 修 订 ) 的 通 知 各 有 关 高 校 : 为 进 一 步 加 强 本 市 高 校 计 算 机 基 础 教 学 工 作, 推 进 学 校 更 加 科 学 合 理 地 设 置 计 算 机 基 础 课 程 及 安 排 教 学 内 容,

More information

名人养生.doc

名人养生.doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) I...1...3...4...6... 11...14...18...22...26...29...31...38...45...49...56...57...59...61...67

More information

常见病防治(二).doc

常见病防治(二).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...9...17...25...34...41...49...54...55...55...57...64...65...67...68...69...69...70...71

More information

香 港 舞 蹈 總 會    北 京 舞 蹈 學 院

香 港 舞 蹈 總 會    北 京 舞 蹈 學 院 報 名 規 則 : I. 保 送 教 師 資 格 : 香 港 舞 蹈 總 會 主 辦 二 零 一 六 年 秋 季 趣 學 堂 幼 兒 舞 蹈 課 程 評 核 報 名 及 規 則 ( 請 於 報 名 前 詳 細 閱 讀 整 份 文 件 ) 學 生 必 須 由 認 可 教 師 保 送 參 加 評 核, 而 以 下 為 認 可 教 師 的 資 格 : i. 持 有 由 香 港 舞 蹈 總 會 頒 發 之

More information

一、

一、 ... 1...24...58 - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - i. ii. iii. iv. i. ii. iii. iv. v. vi. vii. viii. ix. x. - 9 - xi. - 10 - - 11 - -12- -13- -14- -15- C. @ -16- @ -17- -18- -19- -20- -21- -22-

More information

(As at 28

(As at 28 内 地 与 香 港 关 于 建 立 更 紧 密 经 贸 关 系 的 安 排 ( 安 排 ) 常 见 问 答 个 别 行 业 : 法 律 服 务 法 律 服 务 ( 18) I 受 聘 于 内 地 律 师 事 务 所 1 II 律 师 事 务 所 联 营 组 织 2 III 香 港 律 师 事 务 所 驻 内 地 代 表 机 构 ( 代 表 处 ) 4 I V 最 低 居 留 条 件 6 V 律 师

More information

Microsoft Word - EDB Panel Paper 2016 (Chi)_finalr

Microsoft Word - EDB Panel Paper 2016 (Chi)_finalr 2016 年 1 月 15 日 會 議 討 論 文 件 立 法 會 教 育 事 務 委 員 會 2016 年 施 政 報 告 教 育 局 的 政 策 措 施 行 政 長 官 在 2016 年 1 月 13 日 發 表 其 2016 年 施 政 報 告 本 文 件 旨 在 闡 述 施 政 報 告 中 有 關 教 育 事 務 的 主 要 措 施 2. 培 育 人 才 始 於 教 育 在 教 育 政 策

More information

Adobe Photoshop PDF

Adobe Photoshop PDF i ii iii 1 2 3 4 5 6 7 8 9 10 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 16000 12000 8000 4000 8,592 6,860 9,368 7,703 8,472 10,510 9,422 12,299 10,493 13,944

More information

2015 2 104 109 110 112 113 113 113 114 1 (1) 9,654,346,443 6,388,650,779 4,183,429,633 1,183,342,128 (2) 47,710,000 41,600,000 16,600,000 13,200,000 (3), (1) 371,147,787 125,421,629 749,150,179 565,001,961

More information

-i-

-i- -i- -ii- -iii- -iv- -v- -vi- -vii- -viii- -ix- -x- -xi- -xii- 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9 1-10 1-11 1-12 1-13 1-14 1-15 1-16 1-17 1-18 1-19 1-20 1-21 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11

More information

Microsoft Word - 强迫性活动一览表.docx

Microsoft Word - 强迫性活动一览表.docx 1 1 - / 2 - / 3 - / 4 - / 5 - I. 1. / 2. / 3. 4. 5. 6. 7. 8. 9 10 11. 12. 2 13. 14. 15. 16. 17. 18. 19. 20 21. 22 23. 24. / / 25. 26. 27. 28. 29. 30. 31. II. 1. 2 3. 4 3 5. 6 7 8. 9 10 11 12 13 14. 15.

More information

厨房小知识(四)

厨房小知识(四) I...1...2...3...4...4...5...6...6...7...9...10... 11...12...12...13...14...15...16...17...18...18...19...22...22 II...23...24...25...26...27...27...28...29...29...30...31...31?...32...32...33?...33...34...34...35...36...36...37...37...38...38...40

More information

妇女更年期保健.doc

妇女更年期保健.doc ...1...2...3...5...6...7 40...8... 11...13...14...16...17...19...20...21...26...29...30...32 I ...34...35...37...41...46...50...51...52...53...54...55...58...64...65 X...67...68...70...70...74...76...78...79

More information

小儿传染病防治(上)

小儿传染病防治(上) ...1...2...3...5...7...7...9... 11...13...14...15...16...32...34...34...36...37...39 I ...39...40...41...42...43...48...50...54...56...57...59...59...60...61...63...65...66...66...68...68...70...70 II

More information

<4D6963726F736F667420576F7264202D2031303430333234B875B9B5A448ADFBBADEB27AA740B77EA4E2A5555FA95EAED6A641ADD75F2E646F63>

<4D6963726F736F667420576F7264202D2031303430333234B875B9B5A448ADFBBADEB27AA740B77EA4E2A5555FA95EAED6A641ADD75F2E646F63> 聘 僱 人 員 管 理 作 業 參 考 手 冊 行 政 院 人 事 行 政 總 處 編 印 中 華 民 國 104 年 3 月 序 人 事 是 政 通 人 和 的 關 鍵 是 百 事 俱 興 的 基 礎, 也 是 追 求 卓 越 的 張 本 唯 有 人 事 健 全, 業 務 才 能 順 利 推 動, 政 府 施 政 自 然 績 效 斐 然 本 總 處 做 為 行 政 院 人 事 政 策 幕 僚 機

More information

女性青春期保健(下).doc

女性青春期保健(下).doc ...1...4...10... 11...13...14...15...17...18...19...20...21...22...23...24...26...27...30...31 I ...32...33...36...37...38...40...41...43...44...45...46...47...50...51...51...53...54...55...56...58...59

More information

避孕知识(下).doc

避孕知识(下).doc ...1...3...6...13...13...14...15...16...17...17...18...19...19...20...20...23...24...24...25 I ...25...26...26...27...28...28...29...30...30...31...32...34...35 11...36...37...38...40...42...43...44...44...46

More information

孕妇饮食调养(下).doc

孕妇饮食调养(下).doc ...1...2...5...9 7...9...14...15...16...18...22...23...24...25...27...29...31...32...34 I ...35...36...37...39...40...40...42...44...46...48...51...52...53...53...54...55...56...56...58...61...64 II ...65...66...67...68...69...70...71...72...73...74...75...76...77...80...83...85...87...88

More information

禽畜饲料配制技术(一).doc

禽畜饲料配制技术(一).doc ( ) ...1...1...4...5...6...7...8...9...10... 11...13...14...17...18...21...23...24...26 I ...28 70...30...33...35...36...37...39...40...41...49...50...52...53...54...56...58...59...60...67...68...70...71

More information

中老年保健必读(十一).doc

中老年保健必读(十一).doc ...1...2...4...6...8...9...10...12...14...15...17...18...20...22...23...25...27...29 I ...30...32...35...38...40...42...43...45...46...48...52...55...56...59...62...63...66...67...69...71...74 II ...76...78...79...81...84...86...87...88...89...90...91...93...96...99...

More information

怎样使孩子更加聪明健康(七).doc

怎样使孩子更加聪明健康(七).doc ...1...2...2...4...5 7 8...6...7...9 1 3... 11...12...14...15...16...17...18...19...20...21...22 I II...23...24...26 1 3...27...29...31...31...33...33...35...35...37...39...41...43...44...45 3 4...47...48...49...51...52

More information

i

i i ii iii iv v vi 1 g j 2 3 4 ==== ==== ==== 5 ==== ======= 6 ==== ======= 7 ==== ==== ==== 8 [(d) = (a) (b)] [(e) = (c) (b)] 9 ===== ===== ===== ===== ===== ===== 10 11 12 13 14 15 16 17 ===== [ ] 18 19

More information

二零零六年一月二十三日會議

二零零六年一月二十三日會議 附 件 B 有 关 政 策 局 推 行 或 正 在 策 划 的 纾 缓 及 预 防 贫 穷 措 施 下 文 载 述 有 关 政 策 局 / 部 门 为 加 强 纾 缓 及 预 防 贫 穷 的 工 作, 以 及 为 配 合 委 员 会 工 作, 在 过 去 十 一 个 月 公 布 及 正 在 策 划 的 新 政 策 和 措 施 生 福 利 及 食 物 局 (i) 综 合 儿 童 发 展 服 务 2.

More information

马太亨利完整圣经注释—雅歌

马太亨利完整圣经注释—雅歌 第 1 页 目 录 雅 歌 简 介... 2 雅 歌 第 一 章... 2 雅 歌 第 二 章... 10 雅 歌 第 三 章... 16 雅 歌 第 四 章... 20 雅 歌 第 五 章... 25 雅 歌 第 六 章... 32 雅 歌 第 七 章... 36 雅 歌 第 八 章... 39 第 2 页 雅 歌 简 介 我 们 坚 信 圣 经 都 是 神 所 默 示 的 ( 提 摩 太 后 书

More information

新婚夫妇必读(九).doc

新婚夫妇必读(九).doc ...1...3...4...5...9...9...10...12...14 3...19...20...22...27...28...30...31...35...37 I 13...39...44...48...49...50...51...54...55...58...60...62...63...66...67...68...70...71 TOP10...73...77...79...80

More information

江苏宁沪高速公路股份有限公司.PDF

江苏宁沪高速公路股份有限公司.PDF - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - 33.33% ( ) ( ) ( ) 33.33% ( ) ( ) ( ) 1 1 1992 8 3200001100976 1997 6 27 H 12.22 2001 1 16 A 1.5 2001 12 3 503,774.75 14,914,399,845.00 13,445,370,274.00

More information

建築物拆卸作業守則2004年

建築物拆卸作業守則2004年 建 築 物 拆 卸 作 業 守 則 ㆓ 零 零 ㆕ 年 前 言 建 築 物 拆 卸 作 業 守 則 ( 擬 稿 ) 於 ㆒ 九 九 八 年 ㆓ 月 首 次 出 版, 提 供 指 引, 確 保 於 進 行 拆 卸 工 程 時 按 安 全 及 良 好 的 做 法 行 事, 以 及 工 程 合 符 建 築 物 ( 管 理 ) 規 例 及 建 築 物 ( 拆 卸 工 程 ) 規 例 有 關 拆 卸 工 程

More information

<4D F736F F D20CAB5D1E9CAD2B9DCC0EDC6BDCCA856342E315FD1A7C9FAD3C3BBA7B2D9D7F7D6B8C4CF2E646F63>

<4D F736F F D20CAB5D1E9CAD2B9DCC0EDC6BDCCA856342E315FD1A7C9FAD3C3BBA7B2D9D7F7D6B8C4CF2E646F63> 议 用 户 许 可 协 实 验 室 管 理 平 台 学 生 用 户 操 作 指 南 (V4.1) 国 泰 安 信 息 技 术 有 限 公 司 GTA Information Technology Co., Ltd. 国 泰 安 信 息 技 术 有 限 公 司 1 用 户 许 可 协 议 用 户 许 可 协 议 版 权 与 所 有 权 声 明 实 验 室 管 理 平 台 是 由 国 泰 安 信 息 技

More information

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的 附 錄 美 國 國 家 兒 童 健 康 與 人 類 發 展 中 心 (NICHD) 偵 訊 指 導 手 冊 I. 開 場 白 1. 你 好, 我 的 名 字 是, 我 是 警 察 [ 介 紹 房 間 內 的 其 他 人, 不 過, 在 理 想 狀 態 下, 房 間 裡 不 該 有 其 他 人 ] 今 天 是 ( 年 月 日 ), 現 在 是 ( 幾 點 幾 分 ) 我 是 在 ( 地 點 ) 問 你

More information

前言

前言 作 为 新 中 国 最 早 设 立 的 专 业 教 育 出 版 机 构, 高 等 教 育 出 版 社 始 终 坚 持 植 根 教 育 弘 扬 学 术 繁 荣 文 化 服 务 社 会 的 办 社 理 念, 开 拓 创 新, 砥 砺 前 行, 伴 随 着 新 中 国 教 育 事 业 的 不 断 发 展 壮 大, 经 过 60 年 的 奋 斗, 高 教 社 已 经 发 展 成 为 以 出 版 高 等 教

More information

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx 立 法 會 發 展 事 務 委 員 會 二 零 一 六 年 施 政 報 告 及 施 政 綱 領 有 關 發 展 局 的 措 施 引 言 行 政 長 官 在 二 零 一 六 年 一 月 十 三 日 發 表 題 為 創 新 經 濟 改 善 民 生 促 進 和 諧 繁 榮 共 享 的 二 零 一 六 年 施 政 報 告 施 政 報 告 夾 附 施 政 綱 領, 臚 列 政 府 推 行 的 新 措 施 和

More information

《Visual Basic程序设计》实验课

《Visual Basic程序设计》实验课 Visual Basic Visual Basic [email protected] 0 Visual Basic 1 0...1 1 Visual Basic...2 2...3 3...6 4...9 5...13 6...16 7...18 8...22 9...24 10...27 11...29 12 API...31 13...34 14...35 15...38 1 1 Visual

More information

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63>

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63> 98 年 3 月 11 日 依 本 校 98 學 年 度 招 生 委 員 會 第 1 次 會 議 核 定 大 同 技 術 學 院 98 學 年 度 重 點 運 動 項 目 績 優 學 生 單 獨 招 生 簡 章 大 同 技 術 學 院 招 生 委 員 會 編 印 校 址 :600 嘉 義 市 彌 陀 路 253 號 電 話 :(05)2223124 轉 203 教 務 處 招 生 專 線 :(05)2223124

More information