📄 vb程式设计内功讲座.htm
字号:
<br>
VB 允 许 我 们 在 不 必 事 先 宣 告 变 数 之 下 , 就 使 用 变 数 ,例 如 :<br>
<br>
Dim X As Integer ' 事 先 宣 告 变 数 X<br>
Y = X + 2 ' Y变 数 未 事 先 宣 告 , 也 是 对 的<br>
<br>
但 这 样 的 程 式 撰 写 习 惯 却 可 能 引 起 一 些 不 容 易 侦 测 的错 误 , 例 如 :<br>
<br>
For i = 1 to 10<br>
Arr(i) = Arr(j)+10<br>
Next I<br>
<br>
以 上 程 式 中 的 Arr(j) 应 该 是 Arr(i) 才 对 , 但 由於 VB 允 许 未 宣 告 而 直 接 使 用 变 数 , 以 致 j 被 视 为 合 法 的变 数 , 但 j 在 回 圈 中 却 一 直 等 於 0。<br>
<br>
在 不 必 事 先 宣 告 变 数 之 下 就 使 用 变 数 , 就 好 像 变 数 随时 随 地 都 会 冒 起 来 , 跑 到 我 们 的 程 式 中 , 而 从 以 上 的 例子 中 , 我 们 发 现 这 种 作 法 其 实 是 有 缺 点 的 , 为 了 改 善 这个 缺 点 , VB 提 供 给 我 们 另 一 种 选 择 , 那 就 是 在 所 有 程 序之 外 加 上 Option Explicit 的 叙 述 , 加 上 Option Explicit 的 作 用是 :「要 求 VB 把 未 事 先 宣 告 的 变 数 视 为 错 误」, 因 此 以 上程 式 若 修 改 成 :<br>
<br>
Option Explicit<br>
Dim i As Integer ' 事 先 宣 告 i<br>
For i = 1 to 10<br>
Arr(i) = Arr(j)+10<br>
Next I<br>
<br>
则 由 於 j 变 数 未 事 先 宣 告 , 会 被 VB 视 为 错 误 , 因 此 可在 编 译 阶 段 提 早 被 侦 察 出 来 。<br>
<br>
模 组 与 全 域变 数<br>
<br>
对 VB 而 言 , 一 个 专 案 可 以 含 有 多 个 模 组 , 如 果 我 们 在某 一 个 模 组 之 中 宣 告 了 全 域 变 数 , 那 麽 这 个 全 域 变 数 可以 提 供 给 该 模 组 的 所 有 程 序 使 用 , 是 无 庸 置 疑 的 事 , 但是 在 多 模 组 的 专 案 中 , 我 们 则 要 考 虑 另 一 个 问 题 : 某 一个 模 组 的 全 域 变 数 可 以 给 其 他 模 组 使 用 吗 ?<br>
<br>
模 组 私 用 全 域 变 数<br>
<br>
在 表 单 模 组 或 一 般 模 组 中 , 如 果 我 们 利 用 Private 或 Dim 保 留 字 来 宣 告 全 域 变 数 , 例 如 : (注 : 一 般 模组 指 的 是 利 用 功 能 表 的「专 案 /新 增 模 组」而 加 入 於 专 案 之中 的 模 组 , 此 类 模 组 将 来 会 以 .bas 的 副 档 名 来 储 存 )<br>
<br>
Private x As Integer<br>
Sub SubX()<br>
…<br>
End Sub<br>
<br>
则 此 一 变 数 为「模 组 私 用」全 域 变 数 , 也 就 是 说 , 此 一全 域 变 数 只 有 该 模 组 的 程 序 可 以 使 用 , 其 他 模 组 则 不 可以 使 用 。<br>
<br>
模 组 公 用 全 域 变 数<br>
<br>
在 表 单 模 组 中 , 如 果 我 们 利 用 Public 保 留 字 来 宣告 全 域 变 数 , 例 如 :<br>
<br>
Public x As Integer<br>
Sub SubX()<br>
…<br>
End Sub<br>
<br>
则 此 一 变 数 为「模 组 公 用」全 域 变 数 , 也 就 是 说 , 此 一全 域 变 数 也 可 以 给 其 他 模 组 使 用 。 但 请 注 意 , 使 用 的 语法 必 须 在 变 数 之 前 冠 上 表 单 名 称 , 假 设 以 上 例 子 中 的 全域 变 数 宣 告 在 Form1 之 中 , 则 以 下 是 Form1 模 组 中 的 程 序 与 Form2 模 组 中 的 程 序 , 在 使 用 变 数 x 上 的 差 异 :<br>
<br>
' Form1 模 组<br>
Sub SubX()<br>
x = x + 100 ' 像 平 常 使 用 变 数 的 方 法 一 样<br>
End Sub<br>
<br>
' Form2 模 组<br>
Sub SubY()<br>
Form1.x = Form1.x + 100<br>
End Sub<br>
<br>
由 於 Form2 模 组 使 用 的 是 Form1 模 组 的 全 域 变 数 , 所 以 必须 在 变 数 之 前 冠 上「Form1.」。<br>
<br>
专 案 全 域 变 数<br>
<br>
在 一 般 模 组 中 , 如 果 我 们 利 用 Public 保 留 字 来 宣告 全 域 变 数 , 则 此 一 变 数 为「专 案」全 域 变 数 。 所 谓 专 案全 域 变 数 , 指 的 是 同 一 专 案 中 , 所 有 模 组 的 所 有 程 序 均可 使 用 的 变 数 , 因 此 以 这 种 方 式 所 宣 告 的 变 数 其 活 动 范围 将 扩 及 整 个 专 案 。<br>
<br>
最 後 我 们 以 一 个 实 例 来 整 理 以 上 各 种 变 数 在 程 式 中 的活 动 范 围 , 假 设 专 案 中 有 含 有 两 个 表 单 模 组 — Form1、 Form2 及 一 个 一 般 模 组 Module1, 而 这 几 个 模 组 中 的 所 宣 告 的 变 数如 下 :<br>
<br>
Form1<br>
Private A1<br>
Dim A2<br>
Public A3<br>
Sub SubX1()<br>
Dim A4<br>
End Sub<br>
Sub SubX2()<br>
Dim A5<br>
End Sub<br>
Form2<br>
Private B1<br>
Dim B2<br>
Public B3<br>
Sub SubY1()<br>
Dim B4<br>
End Sub<br>
Sub SubY2()<br>
Dim B5<br>
End Sub<br>
Module1<br>
Private C1<br>
Dim C2<br>
Public C3<br>
Sub SubZ1()<br>
Dim C4<br>
End Sub<br>
Sub SubZ2()<br>
Dim C5<br>
End Sub<br>
<br>
则 这 些 变 数 在 几 个 副 程 式 中 的 可 使 用 性 如 下 表 : (「?? 」符 号 表 示 可 使 用 、「F1」表 示 必 须 冠 上「Form1.」才 可 以 使 用、「F2」表 示 必 须 冠 上「Form2.」才 可 以 使 用 , 空 白 者 表 示 不可 使 用 )<br>
<br>
副 程 式 A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5<br>
SubX1 ?? ?? ?? ?? F2 ?? <br>
SubX2 ?? ?? ?? ?? F2 ?? <br>
SubY1 F1 ?? ?? ?? ?? ?? <br>
SubY2 F1 ?? ?? ?? ?? ?? <br>
SubZ1 F1 F2 ?? ?? ?? ?? <br>
SubZ2 F1 F2 ?? ?? ?? ??<br>
<br>
物 件 的 活 动 范 围<br>
<br>
物 件 按 性 质 可 分 成 控 制 元 件 、 表 单 物 件 、 及 一 般 物 件叁 种 , 其 中 一 般 物 件 与 变 数 一 样 , 可 分 成 区 域 物 件 、 静态 物 件 、 及 全 域 物 件 叁 种 , 活 动 范 围 也 与 变 数 一 样 , 以下 让 笔 者 来 说 明 控 制 元 件 与 表 单 的 活 动 范 围 。<br>
<br>
控 制 元 件 的 活 动 范 围 与 表 单 完 全 相 同 , 当 表 单 被 载 入时 , 表 单 上 的 控 制 元 件 即 会 被 载 入 , 当 表 单 被 载 出 时 ,控 制 元 件 即 会 被 载 出 , 若 与 变 数 做 比 较 , 则 与 全 域 变 数的 活 动 范 围 完 全 相 同 。<br>
<br>
由 於 表 单 中 全 域 (静 态 )变 数 及 控 制 元 件 的 诞 生 (灭 亡 )取决 於 表 单 的 载 入 (载 出 ), 因 此 我 们 必 须 特 别 注 意 表 单 载入 与 载 出 的 时 机 。 导 致 表 单 被 载 入 的 叙 述 有「Load 表 单 名」、「表单 .Show」、 及「使 用 表 单 的 属 性 、 全 域 变 数 、 控 制 元 件」叙述 ; 至 於 表 单 被 载 出 的 情 况 则 有「Unload 表 单 名」叙 述 及「使用 者 关 闭 表 单」。<br>
<br>
当 表 单 被 载 出 系 统 时 , 全 域 变 数 的 变 数 值 会 归 零 , 表单 及 控 制 元 件 的 属 性 值 会 还 原 成 设 计 阶 段 时 的 设 定 值 ,因 此 如 果 我 们 想 保 留 变 数 值 及 属 性 值 , 不 要 使 用「Unload 表 单 名」关 闭 表 单 , 须 使 用「表 单 名 .Hide」或「Form.Visible = False」隐藏 表 单 。 但 笔 者 必 须 特 别 提 醒 您 一 点 , 如 果 有 表 单 被 隐藏 , 则 程 式 结 束 前 应 该 使 用 以 下 方 法 载 出 所 有 的 表 单 :<br>
<br>
For I = 0 To Forms.Count - 1<br>
<br>
Unload Forms(I)<br>
<br>
Next<br>
<br>
否 则 表 面 上 所 有 的 表 单 已 经 被 关 闭 , 让 人 误 以 为 程 式结 束 了 , 而 实 际 上 却 还 有 表 单 在 系 统 之 中 。<br>
<br>
变 数 与 系 统记 忆 体<br>
<br>
由 於 变 数 执 行 时 会 占 用 记 忆 体 , 因 此 如 何 正 确 地 使 用变 数 , 也 会 影 响 系 统 的 运 作 , 首 先 让 我 们 思 考 一 个 问 题:「当 程 式 越 写 越 大 时 , 程 式 所 使 用 的 变 数 也 越 来 越 多 ,会 不 会 演 变 成 程 式 执 行 所 需 之 记 忆 体 超 过 系 统 记 忆 体 ,而 不 能 执 行」, 例 如 我 们 就 经 常 看 到 某 些 产 品 在 包 装 盒 上面 会 标 明「至 少 须 16MB 记 忆 体」之 类 的 字 眼 。<br>
<br>
需 要 使 用 大 量 记 忆 体 的 软 体 通 常 是 功 能 强 大 的 知 名 软体 , 我 们 自 己 写 的 程 式 是 不 是 也 会 出 现 越 来 越 吃 记 忆 体的 情 事 呢 ? 感 觉 应 该 不 会 , 但 实 际 不 然 , 如 果 使 用 变 数时 不 了 解 系 统 内 部 的 基 本 运 作 , 则 即 使 是 小 程 式 也 可 能会 把 系 统 记 忆 体 吃 光 。<br>
<br>
全 域 变 数 与 静 态 变 数<br>
<br>
就 我 们 所 讨 论 的 叁 种 变 数 而 言 , 全 域 变 数 及 静 态 变 数会 在 所 属 之 模 组 被 载 入 系 统 时 , 占 据 一 块 记 忆 体 , 参 考以 下 程 式 :<br>
<br>
Dim X(1024) As Integer ' X 占 有 2 KB 记忆 体<br>
<br>
Sub SubX()<br>
<br>
Static Y(2048) As Integer ' X 占 有 4 KB 记 忆 体<br>
…<br>
<br>
End Sub<br>
<br>
如 果 以 上 程 式 附 属 於「一 般 模 组」(会 在 程 式 被 载 入 时 ,即 载 入 系 统 ), 则 程 式 被 载 入 系 统 时 , X 及 Y 阵 列 将 占 据 6 KB 的 记 忆 体 , 而 直 到 程 式 被 载 出 时 , 这 6KB 的 记 忆 体 才会 归 还 给 系 统 ; 如 果 以 上 程 式 附 属 於「表 单 模 组」, 则 必须 等 到 表 单 被 载 入 时 , X 及 Y 阵 列 才 会 占 据 6 KB 的 记 忆 体, 而 当 表 单 被 载 出 时 , 这 6KB 的 记 忆 体 即 会 归 还 给 系 统 。<br>
<br>
了 解 以 上 的 基 本 特 性 之 後 , 笔 者 想 特 别 说 明 以 下 两 种通 病 :<br>
<br>
(1) 将 所 有 的 全 域 变 数 都 放 在「一 般 模 组」中 : 的 确 , 将共 用 的 变 数 放 在 一 般 模 组 中 最 为 简 便 , 但 由 於 一 般 模 组中 的 变 数 会 在 程 式 被 执 行 时 即 占 用 系 统 记 忆 体 , 而 在 程式 结 束 时 才 归 还 记 忆 体 , 这 使 得 变 数 在 程 式 执 行 期 间 一定 会 占 用 记 忆 体 , 而 减 少 了 系 统 可 运 用 之 记 忆 体 。 要 避免 此 一 问 题 , 宣 告 大 型 变 数 (例 如 Dim Y(40960) As Integer会 占用 80 KB)时 , 想 一 想 被 宣 告
的 变 数 是 不 是 只 有 某 一「表 单 模组」需 要 使 用 , 如 果 是 , 则 将 那 些 变 数 放 在 表 单 模 组 中 ,若 是 小 型 变 数 (例 如 Dim X As Integer 只 占 用 2 bytes), 则 可 不必 顾 虑 此 一 问 题 。<br>
<br>
(2) 将 其 他 模 组 可 能 使 用 的 变 数 放 在 某 一「表 单 模 组」 中, 然 後 使 用「Form名 .变 数 名」的 格 式 来 使 用 变 数 : 此 一 方 式并 没 有 什 麽 错 误 , 但 请 注 意 当 表 单 被 载 出 时 , 表 单 中 所有 变 数 的 记 忆 体 将 会 归 还 系 统 , 而 使 得 变 数 值 全 部 归 零, 如 果 这 些 变 数 的 用 途 是 记 录 程 式 执 行 的 状 况 , 则 在 表单 被 载 出 时 , 将 会 失 去 记 录 的 功 效 。<br>
<br>
区 域 变 数<br>
<br>
当 程 式 进 入 某 一 区 域 时 , 系 统 会 为 该 区 域 的 区 域 变 数配 置 好 记 忆 体 , 而 程 式 执 行 过 该 区 域 时 , 变 数 所 占 用 之记 忆 体 又 会 归 还 给 系 统 。<br>
<br>
区 域 变 数 可 能 占 用 的 记 忆 体 有「堆 叠」及「系 统 记 忆 体」两种 , 其 中 堆 叠 是 程 式 载 入 时 就 配 置 给 程 式 的 (通 常 小 於 64KB),不 管 怎 麽 使 用 都 不 会 影 响 系 统 记 忆 体 , 对 於 小 型 变 数 而言 , 使 用 的 是 堆 叠 中 的 记 忆 体 , 但 如 果 是 大 型 变 数 , 则须 占 用 系 统 记 忆 体 。<br>
<br>
由 於 区 域 变 数 所 使 用 的 记 忆 体 在 不 使 用 时 即 归 还 系 统, 一 般 而 言 并 不 会 出 现 耗 尽 系 统 记 忆 体 的 现 象 , 须 特 别注 意 的 是 递 回 呼 叫 (例 如 副 程 式 呼 叫 自 己 , 或 者 副 程 式 A 呼 叫 副 程 式 B, 而 副 程 式 B 又 呼 叫 回 副 程 式 A), 如 果 程 式没 有 设 计 好 递 回 呼 叫 的 出 口 , 则 副 程 式 会 一 直 呼 叫 下 去, 则 位 於 该 副 程 式 中 的 变 数 将 会 持 续 地 占 用 记 忆 体 , 而可 能 用 尽 堆 叠 或 系 统
记 忆 体 。<br>
<br>
物 件 与 系 统 记 忆 体<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -