📄 visual foxpro3.txt
字号:
Visual FoxPro3.0 经 验14 条
华 北 石 油 设 计 院 计 算 机 室
吴 会 松
---- 1. 怎 样 解 决 不 可 视 类 库 操 作 中 库 容 量 的“ 恶 性 膨 涨”
---- 程 序 员 用 面 向 对 象 编 程 都 会 涉 及 到 类 库, 但 当 对 象 的 继 承 关 系 达 到 两 层 以 上 时( 这 是 很 平 常 的 现 象), 只 要 一 修 改 两 层 以 上 某 个 对 象 中 的 内 容, 就 会 惊 奇 地 发 现: 尽 管 修 改 量 极 小 ( 有 时 只 是 简 单 的 删 除), 但 每 一 次 的 存 盘 操 作 都 会 使 类 库 的 容 量( 即 用DIR 看 到 的 字 节 数) 增 加 很 多, 有 时 一 次 存 盘 操 作 可 使 其“ 容 量” 增 加 几 十K ! 笔 者 有 一 个 实 际 内 容 只 有50K 的 类 库, 当 调 试 完 成 后, 发 现 该 类 库 的“ 容 量” 是800 多K。 笔 者 曾 在 多 台 机 器 的 多 个 版 本 上 做 过 试 验, 问 题 依 旧。 在 排 除 了 病 毒 骚 扰 的 因 素 后, 可 以 肯 定: 这 是Visual FoxPro 自 身 固 有 的 缺 陷。
---- 显 然, 这 个 问 题 给 程 序 开 发 带 来 了 不 小 的 麻 烦。 怎 样 解 决 呢 ? 笔 者 查 过 不 少 资 料, 做 过 多 次 试 验, 都 不 得 要 领。 后 来 在 一 次 偶 然 的 操 作 中, 却 发 现 了 一 个 简 单 而 有 效 的“ 类 库 消 肿” 方 法:
---- ①. 打 开 这 个 待 处 理 的 类 库, 进 入 其 中 的 一 个 继 承 关 系 最 复 杂 且 最 高 层 的 对 象( 即 最 上 层 的 父 类);
---- ②. 修 改 一 下 该 对 象 中 的 任 一 个 方 法 或 属 性 ( 即 增 加 一 个 字 符, 然 后 再 删 除 该 字 符);
---- ③. 保 存 并 退 出;
---- ④. 用 Close all 和 Clear all 彻 底 关 闭 类 库。
---- 此 时 再 观 察 该 类 库 的 字 节 数, 可 以 发 现 该 类 库 的“ 容 量” 已 恢 复 正 常。
---- 2. 怎 样 为 备 注 型 字 段 建 索 引
---- Visual FpxPro3.0 不 支 持 长 度 变 化 的 关 键 字, 但 笔 者 在 实 验 后 发 现, 如 果 所 建 索 引 的 备 注 型 字 段 的 长 度 在 建 完 索 引 后 不 再 变 化, 那 么 建 立 备 注 型 字 段 的 索 引 还 是 可 行 的。 但 在 建 索 引 时 必 须 注 意: 索 引 的 表 达 式 不 能 直 接 用 备 注 型 的 字 段 名, 还 要 略 加 变 通, 如 用TRIM() 函 数 把 备 注 型 字 段 括 起 来, 就 能 顺 利 地 为 备 注 型 字 段 建 索 引。
---- 3. 建 立 索 引 的 字 符 型 字 段 允 许 的 最 大 宽 度
---- 资 料 中 对 此 没 做 说 明, 经 试 验 发 现, 此 时 索 引 允 许 的 最 大 宽 度 为240 个 字 符。
---- 4. 当 某 个 对 象( 中 的) 方 法 的 形 参 过 多 时, 最 好 用 属 性 数 组 来 代 替 形 参
---- 这 种 手 段 可 以 使 主 要 处 理 过 程 的 逻 辑 性 更 加 清 楚 可 读。
---- 为 了 保 证 实 质 上 的 封 闭 性, 属 性 数 组 应 该 定 义 在 主 控 方 法 所 在 的 对 象 中; 为 了 保 证“ 视 觉” 上 的 封 闭 性( 即 增 强 程 序 代 码 的 可 性), 可 以 让 属 性 数 组 与 主 控 方 法 同 名。
---- 为 了 进 一 步 加 强 主 控 方 法 的 可 读 性, 可 为 其 专 门 增 加 一 个 附 加 方 法---- 只 用 于 给 做 形 参 的 属 性 数 组 赋 值。
---- 5. 怎 样 在 对 象 中 定 义 属 性 数 组
---- 在 定 义 属 性 时, 直 接 用 方 括 号 给 出 行 列 值 即 可。 如:A[5,9], 即 定 义 了 一 个5 行9 列 的 属 性 数 组。
---- 6. 怎 样 快 速 地 建 立Grid 表 格
---- 在 程 序 中 使 用 过Grid 表 格 的 程 序 员 都 觉 得 这 种 表 格 的 建 立 方 法 有 些 麻 烦, 特 别 是 当 表 格 的 个 数 及 表 格 项 很 多 的 时 候, 甚 至 会 产 生“ 恐 惧 感”。 其 实, 只 要 能 灵 活 地 利 用VFP 的“ 表 单 生 成 器”, 就 能 大 大 提 高Grid 表 格 的 制 作 效 率。
---- 这 里 假 设 需 要 以TTT. DBF 为 处 理 对 象 建 立 一 个Grid 表 格, 因 为 字 段 很 多,Grid 表 格 的 表 格 项 数 也 相 应 的 多, 所 以 只 能 采 用“ 变 通” 的 方 法, 步 骤 如 下:
---- ①. 建 立 一 个 只 有 两 个 字 段 的 自 由 表aa.dbf, 并 使 其 中 的 一 个 字 段 能 与TTT.DBF 中 的 某 个 字 段 相 关;
---- ②. 启 动“ 表 单 生 成 器”, 选 择“ 向 导 方 式” 中 的“ 一 对 多 表 单 向 导”;
---- ③. 在“ 一 对 多 表 单 向 导” 的 操 作 引 导 下, 以aa.dbf 为 父 表、TTT.DBF 为 子 表 的 基 本 模 式 制 作 表 单。 在 选 择 子 表 字 段 时, 以 未 来Grid 表 格 的 需 要 来 进 行TTT.DBF 字 段 的 选 取。
---- ④. 打 开 由 第 ③ 步 制 作 的 表 单, 剪 切 表 单 上 的Grid 表 格, 然 后 再 退 出 该 表 单;
---- ⑤. 打 开 您 程 序 中 需 要 使 用Grid 表 格 的 表 单, 把 在 第 ④ 步 上 剪 切 的Grid 表 格 复 制 到 当 前 表 单 上。
---- 至 此, 一 个 符 合 程 序 要 求 的Grid 表 格 即 制 作 完 毕。 无 论Grid 表 格 多 么 大, 用 本 方 法 都 能 在 两 分 钟 内 做 出 一 个 符 合 要 求 的Grid 表 格。 而 用“ 手 工” 制 作 一 个 仅50 个 字 段 的Grid 表 格 一 般 需 要 半 个 小 时( 而 且 还 可 能 出 错)。 显 然,Grid 表 格 越 大, 本 方 法 的 效 率 就 越 高。
---- 7. 用“ 避 开” 的 手 段 使 对 象 中 的 方 法“ 浮” 起 来
---- 所 谓 让 对 象 的 方 法“ 浮” 起 来, 是 指 让 该 方 法 运 行 时, 能 不 受 工 作 区、 变 量、 已 打 开 的 数 据 表 等 的 限 制( 即 不 受“ 现 场” 的 限 制), 而 且 不 干 扰 其 它 方 法 运 行 的 一 种 手 段。 过 去 在 教 科 书 上 学 到 的 原 则 是: 先 保 存“ 现 场”, 待 处 理 工 作 完 成 后, 再 恢 复“ 现 场” 。 对VFP 等 数 据 库 系 统 来 说, 所 谓“ 现 场” 多 是 指 已 经 被 占 用 的 工 作 区、 当 前 的 磁 盘 目 录、 已 打 开 的 数 据 表 以 及 可 能 使 用 或 正 在 使 用 的 数 据 变 量 或 对 象 的 属 性 等。
---- 因 此, 我 们 完 全 可 以 用“ 避 开” 的 方 式 来 达 到 目 的, 以 下 是“ 避 开” 法 的 基 本 步 骤:
---- ①. 在 本 方 法 的 起 点 先 声 明 变 量 私 有 化, 记 录 好 本 方 法 启 动 前 的 工 作 区 及 磁 盘 目 录;
---- ②. 寻 找 并 返 回 一 个 还 未 被 使 用 的 工 作 区, 在 该 工 作 打 开 一 个 需 要 的 数 据 表;
---- ③. 做 本 方 法 的“ 本 职 工 作”( 包 括 调 用 其 它 方 法);
---- ④. 恢 复 本 方 法 启 动 前 的 工 作 区 及 工 磁 盘 目 录;
---- ⑤. 退 出 本 方 法。
---- 由 以 上 步 骤 可 以 看 出,“ 避 开” 方 式 的 基 本 要 点 是“ 单 进 单 出”, 以 数 据 表 为 例: 同 一 方 法 打 开 的 数 据 表 必 须 在 该 方 法 退 出 时 关 闭。 对 于 工 作 区、 磁 盘 目 录 亦 有 同 样 思 路。 显 然, 这 种 手 段 占 用 的 内 存 要 多 一 些, 在DOS 时 代 是 不 合 适 的, 对 于WINDOWS 就 不 是 什 么 问 题 了。
---- 8. 必 须“ 自 造” 的 几 个 通 用 的 对 象 方 法
---- 以 下 是 几 个 用 得 最 多, 但 在VFP 中 却 没 有 现 成 可 用 的 方 法:
---- ①. 在 盘 上 查 找 指 定 的 数 据 库
LPARAMETERS file_dbc
Private fff
fff=trim(file_dbc)
if len(fff)< 0.8
---- && 如 果 没 指 定 数 据 库, 就 说 明 后 面 要 用 的 那 些 数 据 表 都 是 自 由 表, 所 以 不 用 打 开 数 据 库
return .t.
endif
IF .not.file('&fff')
wait windows '在这个目录下没找到您指定的数据库!'
fff=.F.
ELSE
OPEN DATABASE &fff EXCLUSIVE
fff=.T.
ENDIF
return fff
---- ②. 在 指 定 的( 子) 目 录 中 查 找 指 定 的 文 件
LPARAMETERS file,Text &&即:文件名,提示信息
Private All
****** Like f*
fff=trim(file)
fff1=.t.
IF .not.file('&fff')
IF Len(Trim(Text)) >0.5
&&若提示信息的内容为空则不做暂停显示
wait windows Text
ENDIF
fff1=.f.
ENDIF
return fff1
---- ③. 寻 找 并 返 回 一 个 还 未 被 使 用 的 工 作 区
Private ALL
for i=1 to 10
aaa_m=alias(i)
if len(trim(aaa_m))< 0.5
return i
endif
endfor
return 0
---- ④. 建 立 一 个 指 定 的 目 录
LPARAMETERS dire && 待 建 的 目 录 名
Private All Like f*
fff='set Library to '+trim(This.path_FTS)
+'\FoxTools.FLL Additive'
&fff
*set Library to FoxTools.FLL Additive
fff1=.f.
fff=trim(dire)
if mkdir(fff)=0
fff1=.t. && 建 立 成 功
endif
set Library to
return fff1
---- 9. 快 速 查 询 备 注 字 段
---- 在 对 备 往 字 段 进 行 全 文 查 找 时, 用ATC() 函 数 比 用AT-CLIEN() 函 数 快 数 倍。
---- 10. 最 近 匹 配 检 索
---- 在 使 用 索 引 查 找 命 令 之 前 先 设 置 “SET NEAR ON” 有 时 极 有 用 处, 该 设 置 的 含 义 为: 当 查 找 失 败 时, 记 录 号 定 位 于 最 接 近 匹 配 的 位 置 上, 而 不 是 在 数 据 库 的 末 尾。 比 如 对 一 个 已 打 开 日 期 字 段 索 引 的 库, 想 浏 览3 月5 日 之 后 的 记 录, 但 事 先 只 知 道 库 中 有 许 多 不 连 续 的 日 期 记 录, 并 不 知 道 库 中 是 否 确 有3 月5 日 的 记 录。 如 果 设 置 了 “SETNEAR ON”, 当 库 中 不 存 在3 月5 日 的 记 录 时, 就 会 定 位 在 离3 月5 日 最 接 近 的3 月6 日 或7 日 记 录 处, 从 而 达 到 查 询 浏 览 目 的。
---- 11. 检 测 某 类 文 件
---- 函 数FIEL() 只 能 检 测 某 特 定 文 件 是 否 存 在, 不 能 检 测 某 类 文 件 是 否 存 在, 而 系 统 函 数SYS (2000, < 文 件 名> ) 则 可 搜 寻 某 类 文 件, 只 要 参 数“ 文 件 名” 中 含 有 通 配 符“ *? ” 即 可。 用 这 个 方 法 还 可 以 判 断 某 子 目 录 是 否 为 空, 只 要“ 文 件 名” 用“ 路 径 名” 和“ *. *” 组 成 即 可。
---- 12. 保 护 屏 幕 画 面
---- 当 在 数 据 库 环 境 下 调 用DOS 命 令 时, 命 令 执 行 后 输 出 的 信 息 往 往 会 破 坏 数 据 库 环 境 已 有 的 屏 幕 画 面。 当 然 用 保 存 屏 幕 再 恢 复 的 方 法 可 以 解 决, 但 不 如 使 用Dos 的 输 出 重 定 向 功 能 为 好, 这 样 输 出 的 信 息 就 不 会 向 屏 幕 显 示。 比 如 命 令“RUN COPY ABC.* A:” 可 以 改 为:
RUN COPY ABc.* A: >ttt.txt
---- 此 时 可 将 本 来 要 输 出 到 屏 幕 的 信 息 改 道 输 入 到 临 时 文 件ttt. TXT 中 去, 保 持 屏 幕 不 变。
---- 13. 调 用 大 尺 寸 外 部 程 序
---- 在FoxPro 环 境 下 可 以 用RUN() 命 令 直 接 调 用 外 部Dos 命 令, 但 有 时 剩 下 的 内 存 已 不 多, 而 外 部 程 序 又 很 大 时 就 可 能 调 用 失 败。 在FoxPro 中 有 个 内 存 管 理 程 序FoxSWAP 可 以 解 决 这 个 问 题。 调 用WP5 的 命 令 可 以 写 为:
RUN /120 WPS
---- 14. 用 覆 差 法 更 新 数 据
---- 如 果 一 个 很 大 的 数 据 库 需 要 经 常 进 行 数 据 更 新, 是 好 不 要 用 删 除 旧 记 录 再 增 加 新 记 录 的 方 法, 因 为 大 数 据 库 的 物 理 删 除PACK 命 令 执 行 起 来 需 要 很 长 时 间。 此 时 最 好 用 覆 盖 的 方 法, 即 把 新 记 录 的 内 容 一 一 装 人 旧 记 录 中。 而 这 个 过 程 最 好 用SCATTER 命 令 和GATHER 命 令 配 合 起 来 完 成, 前 者 的 作 用 是 把 一 条 记 录 的 所 有 字 段 内 容 存 人 一 个 数 组 变 量 中, 后 者 的 作 用 则 是 把 数 组 变 量 的 内 容 存 入 一 条 记 录 中。 也 就 是 说 借 用 内 存 变 量 把 新 记 录 的 内 容 传 递 到 旧 记 录 中, 内 存 操 作 显 然 比 磁 盘 操 作 要 快 得 多。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -