📄 vb程式设计内功讲座.htm
字号:
<head>
<title>VB 程式设计内功讲座</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
</head>
<body bgcolor="#AAD3F2">
<font color="#000000" size="2">VB 程式设计内功讲座(一)/王国荣<br>
资料整理 VB编程乐园 <a href="http://vbboshi.126.com" target="_blank">http://vbboshi.126.com</a><br>
--------------------------------------------------------------------------------<br>
<br>
近 几 年 来 , 视 觉 化 软 体 开 发 工 具 大 行 其 道 , 尤 其 自 "Visual" Basic 成 功 以 来 , 其 他 软 体 开 发 工 具 亦 纷 纷 起 而 效 之 , 除了 在 名 称 上 冠 上 Visual 之 外 , 视 觉 化 设 计 亦 无 不 成 为 必 备之 功 能 , 宛 如 视 觉 化 设 计 就 是 软 体 开 发 的 万 灵 丹 。 <br>
笔 者 相 信 视 觉 化 设 计 可 协 助 我 们 更 快 速 地 开 发 出 应 用软 体 , 但 不 可 否 认 的 , 软 体 的 开 发 过 程 中 , 最 常 遭 遇 的问 题 还 是 : 程 式 有 没 有 bug、 执 行 效 能 如 何 、 是 否 符 合 使用 者 的 需 求 … 等 , 而 如 何 克 服 这 些 问 题 则 取 决 於 程 式 设计 者 的 功 力 , 而 不 在 视 觉 化 开 发 工 具 上 面 。 <br>
<br>
怎 样 加 强 程 式 设 计 的 功 力 呢 ? 闭 门 苦 修 个 叁 年 五 载 ?那 倒 不 必 , 有 没 有 速 成 班 呢 ? 笔 者 觉 得 没 有 , 但 的 确 有若 干 重 要 的 环 节 , 若 能 打 通 , 则 可 缩 短 苦 练 的 功 夫 , 本期 就 让 笔 者 为 您 节 说 这 些 环 节 。 <br>
--------------------------------------------------------------------------------<br>
本 文 大 纲<br>
<br>
变数 表 单<br>
物 件 结 语<br>
控 制 元 件<br>
--------------------------------------------------------------------------------<br>
<br>
变数<br>
变 数 , 这 应 该 是 基 础 的 基 础 吧 , 这 麽 简 单 的 东 西 也 能够 增 强 程 式 设 计 的 功 力 ? 如 果 您 这 麽 想 , 那 就 大 错 特 错了 , 变 数 犹 如 程 式 中 的 血 液 , 如 果 程 式 病 了 , 最 可 能 的原 因 就 是 血 液 遭 受 病 毒 的 侵 袭 , 不 彻 底 研 究 血 液 , 便 很难 把 生 病 的 程 式 治 好 。<br>
<br>
组成变数的四大要素<br>
什 麽 是 变 数 ? 我 们 写 一 个 数 学 方 程 式 , 假 设 是 :<br>
<br>
<br>
X = Y + 10<br>
<br>
这 里 面 就 有 两 个 变 数 , 一 个 是 X, 一 个 是 Y。 X 及 Y 在 这里 是 变 数 的 「 名 称 」 ; 而 当 Y 等 於 2 时 , X 等 於 12, 此 时 2 及 12 分 别 是 变 数 X 与 Y 的 「 值 」 。<br>
<br>
以 上 是 我 们 从 数 学 方 程 式 中 所 看 到 的 变 数 , 它 包 含 两个 元 素 : 名 称 与 值 。 若 从 电 脑 的 角 度 来 看 , X 的 值 12 必须 储 存 在 某 一 个 地 方 , 也 就 是 记 忆 体 的 某 一 个 「 位 址 」之 下 , 所 以 位 址 又 是 变 数 的 另 一 个 元 素 。<br>
<br>
为 了 表 达 一 个 变 数 , 只 有 以 上 叁 个 元 素 往 往 还 是 不 够的 , 举 例 来 说 :<br>
<br>
<br>
A = "RUN!VB "<br>
<br>
这 时 候 储 存 变 数 A(等 於 "RUN!VB")所 需 的 空 间 , 显然 比 储 存 变 数 X(等 於 12)所 需 的 空 间 来 得 大 , 而 且 连 操 作两 种 变 数 的 方 式 也 会 有 所 差 异 , 例 如 我 们 可 以 这 样 写 X/2,但 如 果 我 们 这 样 写 A/2 就 没 有 意 义 了 , 为 了 区 别 特 性 不 同的 变 数 , 程 式 语 言 中 的 变 数 必 须 再 增 加 一 个 元 素 「 资 料型 别 」 , 以 前 面 的 例 子 来 看 , 变 数 X 是 整 数 (Integer)型 别, 而 变 数 A 是 字 串 (String)型 别
。<br>
<br>
综 合 以 上 的 讨 论 , 我 们 可 以 用 以 下 四 个 元 素 : 「 名 称」 、 「 资 料 型 别 」 、 「 位 址 」 、 及 「 值 」 来 表 示 一 个 变数 , 如 图 -1, 在 图 -1中 , 由 於 「 值 」 是 储 存 在 某 一 个 「 位址 」 的 记 忆 体 里 面 的 , 所 以 把 它 画 在 位 址 的 框 框 里 面 。<br>
<br>
图 -1 变 数 的 四 个 组 成 元 素<br>
<br>
利 用 以 上 四 个 元 素 来 表 示 变 数 , 可 以 解 释 一 些 平 常 想当 然 尔 的 叙 述 , 如 图 -2 的 「 X = Y + 10」 : (假 设 Y 的 值 等 於 123)<br>
<br>
<br>
图 -2 叙 述 「 X = Y + 10」 的 运 算 过 程<br>
<br>
这 里 顺 便 介 绍 两 个 术 语 : r-value 及 l-value。 r-value 是 right value 的 缩 写 , 表 示 等 号 右 边 的 变 数 , 如 例 子 中 的 Y, 实 质上 代 表 的 是 变 数 的 「 值 」 , l-value 是 left value 的 缩 写 , 表示 等 号 左 边 的 变 数 , 如 例 子 中 的 X, 实 质 上 代 表 的 是 变 数的 「 位 址 」 。<br>
<br>
以 上 我 们 用 变 数 的 组 成 元 素 来 解 释 简 单 的 例 子 , 看 起来 没 有 特 别 的 价 值 , 但 这 是 变 数 的 根 本 道 理 , 它 同 时 可以 用 来 解 说 复 杂 、 以 及 容 易 让 人 搞 错 的 例 子 , 请 务 必 了解 这 几 个 元 素 的 意 义 。<br>
<br>
了 解 变 数 的 组 成 元 素 之 後 , 就 不 容 易 被 VB 的 「 定 型 变数 」 及 「 不 定 型 变 数 」 给 搞 晕 了 , 兹 说 明 如 下 :<br>
<br>
◆ 定型变数<br>
<br>
此 一 类 型 的 变 数 在 宣 告 时 会 指 明 变 数 的 「 资 料 型 别 」, 例 如 :<br>
<br>
<br>
Dim X As Integer ' X 是整数型别<br>
Dim S As String ' S 是字串型别<br>
<br>
<br>
图-3 定型变数<br>
<br>
此 一 类 型 变 数 最 大 的 特 色 在 於 其 资 料 型 别 是 「 固 定 的」 , 也 就 是 说 , 当 我 们 宣 告 变 数 时 , 指 定 给 它 某 一 型 别後 , 它 就 永 远 是 那 个 型 别 , 而 且 将 来 就 只 能 与 型 别 「 相同 」 或 「 相 容 」 的 变 数 做 运 算 , 举 例 来 说 , 以 下 的 例 子会 出 现 错 误 :<br>
<br>
<br>
Dim X as Integer<br>
X = "这是字串" ' 执行时会出现「型态不符合」的讯息<br>
<br>
<br>
◆ 不定型变数<br>
<br>
什 麽 是 不 定 型 变 数 ? 请 看 以 下 例 子 :<br>
<br>
<br>
Dim X ' 宣告一个变数 X,但未指定资料型别<br>
X = 123 ' 此时 X 的资料是「整数」型别<br>
...<br>
X = "VB" ' 後来又变成了「字串」型别<br>
<br>
<br>
图 -4 不 定 型 变 数 在 不 同 时 间 被 指定 成 不 同 的 资 料 型 别<br>
<br>
变 数 X 在 某 一 个 时 间 被 指 定 成 「 整 数 」 的 资 料 型 别 ,但 是 後 来 它 又 被 指 定 成 另 一 种 资 料 型 别 — 「 字 串 」 , 像 X 这 样 , 资 料 型 别 可 以 变 来 变 去 的 变 数 就 是 「 不 定 型 」变 数 。<br>
<br>
不 定 型 变 数 的 缺 点 是 执 行 效 率 比 较 差 , 为 什 麽 呢 ? 由於 它 的 资 料 型 别 是 可 变 动 的 , 因 此 每 次 执 行 时 必 须 先 判断 变 数 当 时 的 资 料 型 别 , 无 形 中 增 加 了 执 行 上 的 负 担 。<br>
<br>
不 过 您 也 别 把 不 定 型 变 数 想 得 太 糟 糕 , 上 述 的 「 额 外负 担 」 对 大 部 份 的 程 式 来 说 , 其 影 响 都 相 当 有 限 , 一 般而 言 需 要 注 意 的 地 方 是 避 免 在 费 时 较 久 的 回 圈 中 使 用 不定 型 变 数 , 例 如 :<br>
<br>
Dim X<br>
Dim I<br>
<br>
For I = 0 To 30000<br>
<br>
X = "AAAA"<br>
<br>
Next I<br>
<br>
如 果 我 们 将 Dim X 及 Dim I 分 别 修 改 成 Dim X As String 及 Dim I As Integer, 则 执 行 速 度 将 有 明 显 的 改 善 。<br>
<br>
反 观 不 定 型 变 数 有 什 麽 优 点 呢 ? 首 先 是 它 比 较 接 近 人类 的 思 考 模 式 。 谁 规 定 变 数 一 旦 被 指 定 成 某 一 种 资 料 型别 後 , 就 不 能 改 变 了 , 所 以 变 数 的 型 别 可 以 变 来 变 去 本来 就 比 较 容 易 使 用 , 此 外 , 它 也 比 定 型 变 数 更 容 易 应 用到 物 件 导 向 的 程 式 中 , 举 个 例 子 : 假 设 我 们 在 程 式 中 会使 用 到 许 多 物 件 , 而 这 些 物 件 各 具 有 不 同 的 资 料 型 别 ,为 了 管 理 这 些 物 件
, 我 们 想 把 它 们 集 中 放 在 一 起 , 其 中最 简 便 的 方 式 就 是 采 用 阵 列 , 所 以 程 式 可 能 是 :<br>
<br>
Set ObjArr(1) = 物件_1<br>
Set ObjArr(2) = 物件_2<br>
...<br>
Set ObjArr(N) = 物件_N<br>
<br>
由 於 ObjArr 是 一 个 阵 列 , 假 如 我 们 把 它 宣 告 成 「 定 型 变数 」 , 那 麽 该 将 它 定 义 成 「 物 件 _1」 的 资 料 型 别 、 还 是「 物 件 _2」 的 资 料 型 别 , 还 是 … , 显 然 是 行 不 通 的 , 如果 把 这 个 阵 列 宣 告 成 「 不 定 型 变 数 」 , 则 阵 列 中 的 每 一个 元 素 就 可 以 依 程 式 执 行 时 的 状 况 来 改 变 其 资 料 型 别 ,自 然 而 然 就 满 足 了 这 个 需 求 。<br>
<br>
<br>
不同资料型别的「值」转换<br>
当 我 们 将 一 个 单 精 准 度 型 别 (Single)的 数 值 9.8 指 定 给 一个 「 不 定 型 」 变 数 X 时 , 此 一 不 定 型 变 数 X 除 了 「 值 」 元素 会 变 成 9.8 之 外 , 「 资 料 型 别 」 元 素 则 会 变 成 Single,但 如 果 我 们 将 同 样 的 9.8 指 定 给 一 个 整 数 (Integer)型 别 的 变数 Y, 结 果 又 如 何 呢 ? 此 时 由 於 Y 为 「 定 型 」 变 数 , 其 「资 料 型 别 」 元 素 (等 於 Integer)是 不 可 变 的 , 因 此 , 9.8 必 须被 转 换 成 整 数 , 然 後 才 指 定
到 Y 的「值 」 元 素 中 。<br>
<br>
<br>
图-5 同一数值,指定给不同型别变数後的差异<br>
<br>
由 於 不 同 型 别 的 变 数 能 够 互 相 指 定 与 运 算 , 所 以 我 们经 常 可 以 在 VB 程 式 中 看 到 「 值 」 转 换 的 例 子 , 如 :<br>
<br>
Dim I As Integer<br>
I = "123" ' 字串 "123" 先转换成 123,再指定给 I<br>
I = 9.8 ' 9.8 先四舍五入转换成 10,再指定给 I<br>
<br>
Dim S As String<br>
S = 123 ' 123 先转换成 "123" 再指定给 S<br>
<br>
Dim D As Date<br>
D = "1997/7/1" ' "1997/7/1" 先转换成 #1997/7/1# 再指定给 D<br>
<br>
当 然 , 我 们 也 经 常 遇 到 转 换 失 败 的 例 子 :<br>
<br>
Dim I As Integer<br>
I = "123A" ' "123A" 无法转换成整数,将产生错误<br>
I = 99999 ' 99999 超过整数的最大值 32767,也会产生错误<br>
<br>
在 此 笔 者 想 说 明 几 个 因 为 「 值 」 转 换 所 产 生 的 陷 阱 :<br>
<br>
◆ 值转换之陷阱一<br>
<br>
Dim L As Long, I As Integer, J As Integer<br>
L = I * J<br>
<br>
以 上 的 「 L = I*J」 , 乍 看 之 下 并 没 有 问 题 , 因 为 I 及 J 为 整 数 , 均 占 有 2 bytes, 而 L 为 长 整 数 , 占 有 4 bytes, 因 此 I*J 怎 样 也 不 会 超 过 L 的 数 值 范 围 , 但 实 际 上 , 当 I*J>32767 或 I*J<-32768 时 , 就 会 产 生 「 溢 位 」 , 这 是 怎 麽 一 回 事 呢?<br>
<br>
L=I*J 虽 然 只 是 一 个 简 单 的 运 算 式 , 但 对 电 脑 而 言 , 却至 少 包 含 以 下 的 运 算 过 程 :<br>
<br>
<br>
(1) I*J, 然 後 将 结 果 储 存 於 「 暂 存 记 忆体 」 中 。<br>
(2) 将 「 暂 存 记 忆 体 」 的 值 指 定 给 L。<br>
<br>
由 於 I 及 J 均 为 整 数 型 别 , 因 此 在 以 上 的 运 算 过 程 中 ,系 统 也 会 配 置 与 整 数 型 别 等 大 小 的 「 暂 存 记 忆 体 」 来 储存 I*J 的 结 果 , 而 如 果 I*J 超 出 整 数 型 别 的 范 围 (-32768~ 32767),则 暂 存 於 「 暂 存 记 忆 体 」 时 就 会 产 生 「 溢 位 」 的 错 误 。解 决 的 方 法 十 分 简 单 , 只 要 将 I 或 J 的 数 值 强 制 转 换 成 长整 数 , 再 作 运 算 即 可 , 例 如 :<br>
<br>
L = CLng(I) * J<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -