PB6.5中有关OLE控件功能的三个缺点在线教程
---- 由 于PB6.0 在 汉 字方 面 有 问 题, 因 此 利 用Sybase 公 司 免 费 提 供 的PB6.5 补 丁 程序 进 行 升 级 是PB6.0 用 户 较 现 实 的 选 择。 但 笔 者 在 用 升级 后 的PB6.5 开 发 一 个 需 串 口 操 作 微 机 数 据 库 项 目 的 过程 中, 发 现PB6.5 中 的OLE(Microsoft 喜 欢 叫 她ActiveX) 在 汉 字 方 面仍 存 在 一 些 问 题。 这 里 不 提PB5.0 和6.0 中 存 在 的 有 关OLE 控件 的 缺 点。 首 先 在PB 中 创 建 一 个 窗 口w_1。
---- 问 题 一 嵌 入PB 中 的 微 软OLE 控 件MSCOMM32.OCX 的output 属 性 为char 变 量 或char() 函 数时, 程 序 执 行 时 为 非 法。
---- 把MSCOMM32.OCX 嵌 入到w_1 中, 命 名 为ole_1。 执 行 以 下 语 句 时 程 序 将 提 示“ 在进 入output 属 性 时 非 法, 并 中 断 程 序”:
---- 如 果 从 以 下 两点 来 看, 这 个 错 误 就 不 应 该 存 在:(1) 从MSCOMM32.OCX 本 身 来看,output 属 性( 见MSDN 中 有 关MSCOMM32 的 内 容) 完 全 可 以 等 于 与PB 中char 变 量 和char() 函 数 相 对 应 的 变 量 和 函 数。(2) MSCOMM32 嵌入 到PB 中 后,PB 把 其output 属 性 变 量 当 作any 型 变 量 来 处 理。Any 型 变 量 就 包 括char( 或character) 型 变 量。
---- 处 理 这 个 问 题的 简 单 方 法 是: 把char 变 量 或 函 数 的 值 赋 予 一 个string 变量, 然 后 再 使output 属 性 值 为 该string 变 量 值。 如:
---- 这 样PB 将 正 常运 行。
---- 问 题 二 OLE 控 件 接 收 到 的 汉 字 数 据 无 中 生 有。
---- 利 用VC++5.0 的MFC ActiveX Controlwizard 的 所 有 默 认 选 项 创 建 一 个ActiveX 控 件TempControl,并 增 加 一 个CString 属 性SetWord(m_setWord 为 该 属 性 的CString 实 例);在OnDraw() 函 数 中 用TextOut 函 数 在 屏 幕 上 显 示m_setWord; 在 处 理给SetWord 付 值 的 函 数OnSetWordChanged() 中 加 上InvalidateControl() 以 便显 示 更 新。
---- 把TempControl 控 件嵌 入w_1 中, 命 名 为ole_2。 执 行 如 下 代 码:
---- 结 果 在 屏 幕 上TempControl 控 件 内 不 但 显 示 了“ 开 始 通 讯 试 验”, 而 且 后 面 还 增加 了 多 余 的 字 符。 多 余 字 符 且 具 有 一 定 的 规 律 性, 即总 是 在 汉 字 末 尾 首 先 出 现0 号ASCII 字 符, 随 后 有 几 个 莫名 其 妙 的 汉 字 或ASCII 字 符。 如 果 用 户 还 停 留 在 用PB6.0 的时 代, 那 您 的 运 气 将 更 糟( 在PB6.0 调 试 状 态 执 行 就 见 不到 需 要 的 汉 字, 更 不 用 说 编 译 成exe 文 件 后 将 汇 合 上 其他 众 所 周 知 的 汉 字 问 题 了)。 但 当SetWord 为 普 通 可 打 印ASCII 字 符 时 不 出 现 该 现 象。
---- 在 这 个 简 单 的控 件 里 我 们 没 有 其 他 复 杂 的 功 能, 只 是 简 单 地 由w_1 把汉 字 数 据 付 予TempControl 控 件 唯 一 的 属 性SetWord, 然 后 由TempControl 控 件 显 示 在 屏 幕 上。 使 用 如 此 简 单 的 控 件 竟 有 问 题,因 此PB6.5 中 给OLE 控 件 进 行 汉 字 付 值 是 有 一 点 问 题。
---- 在 这 个 问 题里,Microsoft 的 产 品 也 不 是 完 美 无 缺 的。 一 般 地,CString 实例 是 不 包 括0 号ASCII 字 符 的。 即 把 一 组 中 间 包 括NULL(0 号ASCII 字 符) 字 符 的 字 符 串 付 予CString 的 实 例 时, 该 实 例 自 动 取NULL 以 前 的 字 符 们, 即m_setWord 就 不 该 包 括NULL 及 其 后 面 的 字符。 当 然 了, 在Microsoft 产 品 内 部 不 存 在 这 个 问 题。
---- 这 个 问 题 的 解决 方 法 是 很 简 单 的, 只 需 在TempControl 中OnSetWordChanged() 函 数的 开 头 把NULL 以 后 的 内 容 去 掉 就 可 以 了。 但 现 成 的 商 业控 件 就 没 这 么 轻 而 易 举 了。
---- 问 题 三 在PB 中 读 取 到 的OLE 控 件 内 部 汉 字 数 据 将 可 能 残 缺 不 全。
---- 在TempControl 控 件的OnSetWordChanged() 中InvalidateControl() 之 前 加 上: m_setWord=" 字 符已 变"; 即 在 控 件 内 部 改 变m_setWord 值。 在 问 题 二 所 示 那行PB 程 序 后 增 加 如 下 语 句:
---- 运 行 时, 对word 值 与“ 字 符 已 变” 进 行 对 比 来 看,“ 字 符” 尚 存,“ 已变” 二 字 真 的 已 经 被 变 成 其 他 莫 名 其 妙 的 字 符 了。 该问 题 难 以 补 救。
---- 综 合 以 上 看来,PB6.5 的OLE 在 汉 字 数 据 处 理 方 面 有 一 定 的 缺 点。
---- 奉 献 如 上 内 容以 便 众 同 仁 在 项 目 设 计 时, 请 谨 慎 处 理PB6.5 的OLE 控 件 功能。