⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vb程式设计内功讲座.htm

📁 VB设计内功讲座
💻 HTM
📖 第 1 页 / 共 5 页
字号:
Sub SubX()<br>
  Dim X As Object<br>
<br>
  ' 建立 ClassX 的具体物件给 X<br>
  Set X As new ClassX<br>
  ' 结束副程式之前,忘了执行 Set X = Nothing<br>
End Sub<br>
<br>
结 果 以 上 副 程 式 每 被 呼 叫 一 次 , 就 会 建 立 一 个 具 体 物件 , 但 它 并 不 会 在 副 程 式 结 束 前 , 将 具 体 物 件 归 还 系 统, 所 以 被 呼 叫 的 次 数 越 多 , 吃 掉 的 记 忆 体 就 越 多 , 而 使得 系 统 可 用 之 记 忆 体 越 来 越 少 。<br>
 <br>
<br>
控制元件(control)<br>
控 制 元 件 是 VB 之 中 非 常 重 要 的 物 件 , 但 笔 者 必 须 强 调一 点 , 控 制 元 件 的 行 径 与 前 面 介 绍 过 的 标 准 物 件 有 极 大的 差 异 , 首 先 从 控 制 元 件 的 建 立 与 破 坏 谈 起 , 当 我 们 在表 单 (Form) 布 置 一 个 控 制 元 件 之 後 , 将 来 只 要 这 个 表 单 被载 入 , 控 制 元 件 就 会 跟 着 被 载 入 (建 立 ), 而 当 表 单 被 载出 时 , 控 制 元 件 也 会 跟 着 被 载 出 (破 坏 ), 完 全 不 劳 程 式设 计 者 费 心 , 由 於 很 多 
人 是 从 控 制 元 件 开 始 学 习 VB 的 ,以 致 後 来 使 用 标 准 物 件 时 , 很 容 易 忘 了 执 行「Set 物 件 变数 = Nothing」破 坏 具 体 物 件 。<br>
<br>
使 用 控 制 元 件 时 , 常 见 的 问 题 是 :「如 何 动 态 地 建 立 控制 元 件 ?」, 例 如 表 单 上 一 开 始 没 有 控 制 元 件 或 只 有 少 数的 控 制 元 件 , 而 程 式 希 望 随 着 执 行 时 的 状 况 动 态 地 建 立所 需 之 控 制 元 件 。 如 果 使 用 上 一 个 段 落 所 介 绍 的 方 法 ,可 能 有 人 会 撰 写 以 下 叙 述 :<br>
<br>
   Dim X As Object<br>
   Set X = New TextBox ' 建立 TextBox 控制元件<br>
<br>
但 实 际 上 是 行 不 通 的 , 为 什 麽 ? 因 为 控 制 元 件 是 表 单的 子 物 件 , 而 利 用「Set 物 件 变 数 = New 物 件 类 别 名」所 建 立的 物 件 则 属 於「程 式」所 管 辖 , 而 VB 并 不 允 许 我 们 建 立 附属 於「程 式」的 控 制 元 件 , 因 此 以 上 叙 述 会 产 生 错 误 , 但怎 样 在 表 单 上 面 动 态 地 建 立 控 制 元 件 呢 ?<br>
<br>
以 TextBox 控 制 元 件 的 建 立 为 例 , 至 少 必 须 在 表 单 上 先布 置 一 个 TextBox 控 制 元 件 , 并 且 设 定 它 的 Index 属 性 , 然後 使 用 Load 叙 述 建 立 控 制 元 件 : (假 设 此 一 TextBox 名 称 为 Text1, 而 Index 属 性 设 定 为 0)<br>
<br>
   Load Text1(I) ' I 可以是 0 以外的正整数<br>
   Text1(I).Visible = True ' 将 Text1(I) 显示出来<br>
   ' 此外,可能还需要设定 Left、Top 属性以决定座标位置<br>
<br>
假 设 我 们 执 行 了 以 下 叙 述 :<br>
<br>
  Load Text1(1)<br>
  Load Text1(3)<br>
<br>
则 Text1 阵 列 的「值」元 素 可 以 表 达 成 图 -13:<br>
<br>
图-13 经过 Load 叙述之後的「值」元素结构<br>
<br>
至 於 破 坏 Text1 阵 列 中 的 某 一 个 控 制 元 件 , 方 法 则 是 :<br>
<br>
   Unload Text1(I)<br>
<br>
以 上 被 破 坏 之 控 制 元 件 必 须 是 利 用 程 式 建 立 出 来 的  Text1(I), 假 设 Text1(0) 是 设 计 阶 段 就 已 经 布 置 在 表 单 上 面的 控 制 元 件 , 则「Unload Text1(0)」将 会 产 生 错 误 。<br>
 <br>
<br>
「Set X = 控制元件名」的意义<br>
在「建 立 具 体 物 件 的 几 个 方 法」的 段 落 中 , 我 们 介 绍 过「Set 物 件 变 数 1 = 物 件 变 数 2」的 叙 述 , 此 一 叙 述 的 作 用 是 复 制物 件 变 数 2 的 具 体 物 件 给 物 件 变 数 1, 在 控 制 元 件 之 中 ,也 有 类 似 的 叙 述「Set 物 件 变 数 名 =控 制 元 件 名」, 例 如 :<br>
<br>
   Dim X As Object<br>
   Set X = Text1<br>
<br>
但 它 的 作 用 不 是「复 制」Text1 的 具 体 物 件 给 X, 而 是 将  Text1 的 具 体 物 件 与 X 的「值」元 素 产 生 连 结 关 系 , 如 图 -14:<br>
<br>
图-14「Set X = Text1」的意义<br>
<br>
也 就 是 说 ,「Set X = Text1」并 不 会 建 立 具 体 物 件 , 而 执 行此 一 叙 述 之 後 , X 与 Text1 指 的 将 是 同 一 个 具 体 物 件 , 所以 以 下 叙 述 会 将 Text1 的 内 容 变 成 &quot;ChangeIt!&quot;:<br>
<br>
   X.Text = &quot;ChangeIt!&quot;<br>
   ' 作用相当於 Text1.Text = &quot;ChangeIt!&quot;<br>
 <br>
<br>
表单(Form)<br>
表 单 也 是 物 件 , 但 它 又 跟 标 准 物 件 及 控 制 元 件 又 有 些出 入 , 以 下 让 我 们 来 比 较 几 个 操 作 表 单 的 叙 述 :<br>
<br>
◆ Load FormX: 载 入 FormX。 与「Load 控 制 元 件 (I)」不 同 的 是 ,「Load FormX」只 能 载 入 既 有 的 表 单, 而 无 法 动 态 地 建 立 表 单 。 此 外 请 注 意 , 载 入 并 不 等 於显 示 出 来 , 若 要 显 示 出 来 还 要 执 行 以 下 叙 述 :<br>
<br>
   FormX.Visible = True  或<br>
   FormX.Show<br>
<br>
◆ FormX.Show: 显 示 表 单 , 若 表 单尚 未 载 入 , 则 此 一 叙 述 会 先 载 入 表 单 再 显 示 。<br>
<br>
◆ Unload FormX: 载 出 表 单 。<br>
<br>
◆ Set X = New FormX: 复 制 FormX 的 具体 物 件 给 物 件 变 数 X, 执 行 此 一 叙 述 後 , X 与 FormX 为 两 个独 立 的 物 件 。 (注 : 想 要 将 X 所 指 到 的 表 单 显 示 出 来 , 还是 要 将 X.Visible 设 定 为 True)<br>
<br>
◆ Set X = FormX: 将 X 指 到 FormX 的具 体 物 件 , 也 就 是 说 , X 与 FormX 指 的 是 同 一 个 表 单 物 件, 举 例 来 说 , 若 执 行 此 一 叙 述 後 , 接 着 又 执 行「X.Caption = &quot;NewTitle&quot;」, 则 FormX 的 标 题 将 会 变 成 &quot;NewTitle&quot;。<br>
<br>
◆ Set X = Nothing: 将 X 所 指 到 的 表单 具 体 物 件 归 还 给 系 统 。<br>
 <br>
<br>
结 语<br>
本 期 介 绍 了 变 数 及 物 件 在 系 统 内 部 的 组 成 , 虽 然 没 有程 式 设 计 的 技 巧 , 却 是 改 善 程 式 体 质 不 可 或 缺 的 观 念 。了 解 变 数 及 物 件 的 组 成 , 就 好 像 了 解 血 液 是 由 红 血 球 、白 血 球 、 血 小 板 … 所 组 成 的 一 样 , 但 血 液 不 是 静 止 的 ,同 样 的 , 变 数 及 物 件 在 程 式 中 也 不 是 静 止 的 , 静 止 的 变数 及 物 件 是 没 有 bug 的 , 唯 有 到 处 流 窜 的 变 数 及 物 件 才 会造 成 程 式 的 错 误 , 
下 一 期 笔 者 将 介 绍 变 数 与 物 件 在 程 式中 的 流 窜 模 式 。<br>
<br>
--------------------------------------------------------------------------------<br>
VB 程 式 设 计 内 功 讲 座 (二 )<br>
<br>
<br>
变 数 (物 件)在 程 式 中 的 活 动模 式<br>
<br>
有 时 候 觉 得 写 程 式 的 工 作 跟 侦 探 差 不 多 , 因 为 在 程 式的 开 发 过 程 中 , 总 免 不 了 会 有 bug 发 生 , 而 程 式 设 计 者 的责 任 就 是 把 制 造 bug 的 元 凶 找 出 来 。 别 以 为 当 个 侦 探 很 好玩 , 除 了 必 须 绞 尽 脑 汁 找 出 问 题 之 外 , 还 要 做 到 勿 枉 勿纵 , 如 果 程 式 是 一 组 人 开 发 出 来 的 , 有 问 题 的 时 候 , 每个 人 都 不 希 望 问 题 出 在 自 己 所 写 的 程 式 中 , 身 为 一 个 组长 , 必 须 要 有 足 够 
的 能 力 判 断 可 能 是 元 凶 的 程 式 是 哪 一个 , 然 後 要 求 组 员 进 行 检 测 , 以 求 正 确 地 找 出 问 题 的 原因 , 否 则 没 有 问 题 的 程 式 检 测 了 半 天 , 不 仅 劳 民 伤 财 ,还 会 延 误 程 式 开 发 的 商 机 。<br>
<br>
程 式 错 误 的 原 因 很 多 , 但 根 本 道 理 却 在 资 料 (变 数 或 物件 )上 面 。 我 们 可 以 把 程 式 简 单 地 分 成「程 式 码」(code)及 「资料」(data)两 部 分 , 虽 然 两 者 都 可 能 是 造 成 错 误 的 原 因 , 但程 式 码 的 部 分 在 执 行 阶 段 是 死 的 , 比 较 容 易 侦 测 , 而 资料 的 部 分 则 会 随 着 程 式 执 行 的 状 况 来 改 变 , 是 比 较 难 掌握 的 部 分 , 笔 者 作 个 比 喻 , 某 一 大 楼 发 生 了 窃 案 , 那 麽侦 察 的 方 向 有 二 : 
(1) 检 查 保 全 系 统 是 否 有 漏 洞 : 由 於 保全 系 统 是 固 定 的 , 所 以 比 较 容 易 检 查 , 如 果 与 程 式 作 个比 较 , 它 像 是 程 式 码 的 部 分 , (2) 嫌 疑 犯 的 调 查 : 对 於 可能 进 出 大 楼 的 人 员 进 行 调 查 , 但 由 於 人 的 行 为 是 自 由 的, 所 以 这 个 部 分 的 调 查 工 作 要 比 保 全 系 统 的 检 查 来 得 困难 , 如 果 与 程 式 作 个 比 较 , 它 像 是 资 料 的 部 分 。<br>
<br>
上 一 期 我 们 介 绍 了 变 数 的 组 成 元 素 , 藉 以 了 解 资 料 的基 本 特 性 , 本 文 让 我 们 继 续 探 讨 资 料 在 程 式 中 的 活 动 模式 , 藉 以 在 程 式 出 状 况 时 能 够 抓 出 造 成 程 式 错 误 的 元 凶。<br>
<br>
--------------------------------------------------------------------------------<br>
本 文 大 纲<br>
<br>
变 数的 活 动 范 围 变 数 与 系 统 记忆 体<br>
模 组 与 全 域 变数 变 数 与 参 数 传递<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
变 数 的 活 动范 围<br>
<br>
记 得 有 一 种 活 动 , 是 在 湖 里 抓 鸭 子 , 别 小 看 鸭 子 笨 笨的 , 水 中 的 鸭 子 其 实 是 很 难 抓 的 , 所 以 比 较 常 用 的 技 巧是 将 鸭 子 赶 到 角 落 , 以 缩 小 鸭 子 的 活 动 范 围 , 最 样 子 就比 较 容 易 抓 到 鸭 子 了 。 变 数 的 道 理 也 高 深 不 到 哪 里 去 ,但 如 果 我 们 连 变 数 的 活 动 范 围 都 搞 不 清 楚 , 那 麽 就 别 想抓 到 因 为 变 数 所 产 生 的 错 误 。<br>
<br>
区 域 变 数<br>
<br>
区 域 变 数 (local variable)顾 名 思 义 就 是 指 在 某 一 个 区 域 里面 活 动 的 变 数 , 当 程 式 进 入 此 一 区 域 时 , 区 域 中 的 变 数便 会 诞 生 , 但 是 当 程 式 执 行 过 此 一 区 域 时 , 变 数 即 告 消失 , 典 型 的 例 子 是 程 序 (副 程 式 、 函 数 、 或 事 件 程 序 )中的 变 数 , 例 如 :<br>
<br>
Sub SubX()<br>
    Dim x As Integer ' x 是 SubX 副 程 式 区 域 内 的 变 数<br>
    x = x + 100<br>
    Print x ' 每 次 都 印 出 100<br>
End Sub<br>
<br>
以 上 面 这 个 SubX 副 程 式 为 例 , 每 次 呼 叫 进 入 时 , 变 数 x 才 会 诞 生 , 而 当 程 式 执 行 过 End Sub 叙 述 时 (也 就 是 程 式结 束 此 一 区 域 的 执 行 时 ), 变 数 x 即 告 消 失 , 因 此 每 次 当 SubX 副 程 式 再 度 被 呼 叫 时 , 变 数 x 的 初 值 都 等 於 0。<br>
<br>
区 域 变 数 由 於 活 动 范 围 仅 局 限 於 某 一 程 序 , 因 此 只 要这 个 程 序 不 是 写 得 太 大 , 变 数 的 变 化 情 形 就 很 容 易 掌 握, 也 就 很 容 易 侦 错 了 , 这 是 程 式 设 计 中 最 常 使 用 的 变 数类 型 。<br>
<br>
全 域 变 数<br>
<br>
所 谓 全 域 变 数 , 指 的 是 所 有 区 域 皆 可 使 用 的 变 数 , 也就 是 说 不 受「程 序」范 围 所 限 制 的 变 数 。 在 VB 里 面 凡 是 撰写 在 程 序 之 外 的 变 数 均 属 於 全 域 变 数 , 例 如 :<br>
<br>
Dim x As Integer ' 全 域 变 数 , 可 供 多 个程 序 共 用<br>
Sub SubX()<br>
    … ' 可 以 使 用 变 数 x<br>
End Sub<br>
Sub SubY()<br>
    … ' 也 可 以 使 用 变 数 x<br>
End Sub<br>
<br>
在 VB 里 面 , 全 域 变 数 又 可 分 成「模 组 私 用」全 域 变 数 、「模组 公 用」全 域 变 数 、 及「专 案」全 域 变 数 , 稍 後 笔 者 会 有 更一 进 步 的 说 明 。<br>
<br>
静 态 变 数<br>
<br>
所 谓 静 态 变 数 , 在 VB 里 面 是 指 利 用 Static 保 留 字 宣 告 的区 域 变 数 , 例 如 :<br>
<br>
Sub SubX()<br>
    Static x As Integer ' 静 态 变 数<br>
    Dim y As Integer ' 区 域 变 数<br>
    x = x + 100<br>
    y = y + 100<br>
    Print x ' 印 出 值 依 序 是 100、 200、 300…<br>
    Print y ' 每 一 次 都 是 印 出 100<br>
End Sub<br>
<br>
以 上 的 静 态 变 数 x 与 区 域 变 数 y 一 样 , 其 活 动 范 围 都 限定 於 SubX 副 程 式 之 中 , 但 每 次 进 入 SubX 副 程 式 时 变 数 y 的值 都 会 归 0, 而 x 则 保 有 其 原 来 之 数 值 , 所 以 SubX 副 程 式中 的 Print x 每 次 列 印 的 数 值 都 会 累 加 100。<br>
<br>
选 择 变 数 类 型 的 基 本 原 则<br>
<br>
当 我 们 决 定 使 用 某 个 变 数 时 , 该 将 它 宣 告 成 区 域 、 静态 、 还 是 全 域 变 数 呢 ? 请 参 考 以 下 的 基 本 原 则 :<br>
<br>
1.是 否 要 提 供 给多 个 程 序 共 用 , 如 果 是 , 才 将 变 数 宣 告 成 全 域 变 数 。<br>
<br>
有 些 人 可 能 会 觉 得 将 变 数 宣 告 成 全 域 变 数 最 方 便 , 因为 任 何 程 序 都 可 以 使 用 , 但 是 全 域 变 数 的 缺 点 是 不 容 易侦 错 , 以 抓 鸭 子 的 活 动 为 例 , 鸭 子 的 活 动 范 围 越 大 , 就越 难 抓 到 , 同 样 的 , 任 何 程 序 都 可 以 使 用 的 变 数 , 万 一其 变 数 值 与 我 们 预 期 的 结 果 不 一 样 时 (这 当 然 是 bug), 就必 须 逐 一 对 每 一 个 程 序 进 行 侦 错 , 无 形 中 增 加 了 程 式 侦错 的 困 难 度 。<br>
<br>
2.是 否 必 须 记 录程 式 执 行 的 状 态 , 如 果 是 , 则 必 须 变 数 宣 告 成 静 态 变 数, 因 为 区 域 变 数 每 次 进 入 程 序 的 值 都 会 归 0, 所 以无 法 一 直 纪 录 着 程 式 的 执 行 状 态 。<br>
<br>
3. 如 果 不 属 於情 况 1、 2,则 将 变 数 宣 告 成 区 域 变 数 。<br>
<br>
Option Explicit: 强 制 变数 宣 告<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -