PowerBuilder 应用开发系列讲座(40)
我 们 经 常 使 用 的 图 形 用 户 界 面, 如Windows、Mac、Xwindow 等, 都 提 供 了 一 套 标 准 的 控 件, 经 常 使 用 计 算 机 的 用 户 可 能 已 十 分 了 解 这 些 标 准 控 件 的 用 途, 例 如 一 个 多 选 框 在 用 户 用 鼠 标 点 击 后 会 改 变 其 状 态, 当 按 动 滚 动 条 上 的 箭 头 时, 屏 幕 将 发 生 滚 动; 当 点 击 单 选 框 时 一 般 系 统 不 会 弹 出 一 个 对 话 框, 如 果 不 做 诸 如 点 击 按 钮 或 选 择 菜 单 等 类 似 的 操 作, 系 统 也 不 会 进 入 到 一 个 什 么 新 的 操 作 进 程 等 等。 在 用 户 用 过 了 大 量 应 用 软 件 后, 用 户 就 会 对 常 见 窗 口 的 操 作 建 立 起 一 些 基 本 概 念, 当 他 进 入 一 个 从 未 用 过 的 软 件 时, 不 会 束 手 无 策, 而 是 会 因 该 新 软 件 与 已 用 过 的 某 些 应 用 相 似, 从 而 对 它 的 使 用 有 一 定 认 识。 这 种 认 识 程 度 越 高, 说 明 这 一 软 件 越 直 观, 也 就 是 软 件 的 用 户 界 面 设 计 得 越 成 功。
因 此 每 一 个 程 序 员 都 应 当 意 识 到 他 自 己 所 开 发 的 应 用 与 其 他 程 序 员 开 发 的 应 用 都 是 在 同 一 平 台 上, 使 用 的 也 是 相 同 的 窗 口 控 件, 用 户 在 其 他 应 用 上 学 到 的 对 软 件 的 操 作 方 法 越 多, 可 运 用 在 新 开 发 的 应 用 上 的 也 就 越 多。 如 果 使 用 标 准 的 方 法, 用 户 会 感 到 越 方 便, 尽 管 他 们 并 不 一 定 能 意 识 到 方 便 的 原 因 所 在。
作 为 一 个 程 序 员 首 先 应 当 了 解 窗 口 中 不 同 控 件 的 作 用, 不 少PowerBuilder 的 程 序 员 都 在DOS 或Mainframe 的 字 符 终 端 上 开 发 过 应 用 软 件, 而 对Windows 的 图 形 界 面 却 比 较 陌 生。 因 此 作 为 程 序 员 熟 悉 使 用 怎 样 的 控 件 来 完 成 怎 样 的 功 能 是 至 关 重 要 的。 当 一 个 程 序 员 用 错 了 所 应 使 用 的 控 件 时, 应 用 也 不 可 能 是 很 直 观 的。
保 持 一 致 是 使 应 用 直 观 的 重 要 环 关。 一 致 性 既 包 括 使 用 标 准 的 控 件, 也 是 指 使 用 相 同 的 信 息 表 现 方 法, 如 在 字 体、 标 签 风 格、 颜 色、 术 语、 显 示 错 误 信 息 等 方 面 确 保 一 致。 下 面 是 显 示 信 息 时 应 当 遵 循 的 一 致 性 标 准:
对 于 这 些 信 息 的 排 列 大 部 分 都 是 由 程 序 员 来 控 制 的, 上 述 显 示 风 格 也 仅 供 参 考, 更 为 重 要 的 是 程 序 员 应 当 注 意 在 同 一 软 件 中 表 现 形 式 的 一 致 性。 如 果 在 同 一 个 应 用 中, 这 些 信 息 的 表 现 方 式 不 一 致, 会 使 得 用 户 分 散 注 意 力, 因 而 影 响 这 一 软 件 的 使 用。
遵 循 了 上 述 一 致 性 原 则 后, 还 应 注 意 在 一 个 窗 口 内 部 所 有 控 件 的 布 局 和 信 息 组 织 的 艺 术 性, 使 得 用 户 界 面 美 观。 在 一 个 窗 口 中 按tab 键, 移 动 聚 焦 的 顺 序 不 能 杂 乱 无 章, 在 字 符 界 面 下, 如DOS 中,tab order 的 顺 序 是 先 从 左 至 右, 后 从 上 至 下, 而 在Windows 中 的 顺 序 则 一 般 应 先 从 上 至 下 再 从 左 至 右。 一 屏 中 首 先 应 输 入 的 和 重 要 信 息 的 控 件 在tab 顺 序 中 应 当 靠 前, 位 置 也 应 放 在 窗 口 上 部 较 醒 目 的 位 置。
MS Windows 应 用 中 应 当 遵 循 的 规 则 还 有 一 条 是 可 不 用 鼠 标 的 原 则: 应 用 中 的 每 一 个 功 能 只 用 键 盘 也 应 当 可 以 完 成, 也 就 是 说 在 设 计 的 应 用 中 还 应 加 入 一 些 必 要 的 按 钮 和 菜 单 项。 但 是, 许 多 鼠 标 的 操 作, 如 双 击、 拖 动 对 象 等, 并 不 能 简 单 地 用 键 盘 来 模 拟 即 可 实 现, 例 如 在 一 个 列 表 框 中 用 鼠 标 双 击 其 中 一 项 可 以 表 示 选 中 该 项 内 容; 为 了 用 键 盘 也 能 实 现 这 一 功 能, 必 须 在 窗 口 中 定 义 一 个 表 示 选 中 的 按 钮, 以 作 为 实 现 双 击 功 能 的 替 代。 又 如 在 一 个 窗 口 中 有 两 个 数 据 窗 口, 可 以 用 鼠 标 从 一 个 数 据 窗 口 中 将 一 项 拖 出 然 后 放 到 另 一 个 中; 如 果 只 用 键 盘, 就 应 当 在 菜 单 中 设 置 拷 贝 或 移 动 的 菜 单 项。
在 菜 单 项 中 使 用 快 捷 键 可 以 让 使 用 键 盘 的 用 户 操 作 更 快 一 些, 在 西 文Windows 及 其 应 用 软 件 中 快 捷 键 的 使 用 大 多 是 一 致 的。
面 向 事 务 的:
查 询/ 列 表:
其 它:
MS Windows 保 留 键:
在 应 用 软 件 的 开 发 中, 重 要 的 一 个 因 素 是 要 给 用 户 提 供 一 个 安 全 的 工 作 环 境, 在 软 件 中 不 应 藏 有 任 何 地 雷, 在 用 户 将 要 作 破 坏 性 的 且 难 以 恢 复 的 操 作 时, 系 统 应 当 给 以 应 有 的 提 示。 用 户 只 有 充 分 相 信 软 件 是 安 全 的, 才 会 乐 于 使 用 它, 才 会 放 心 地 去 探 索 这 一 软 件 所 提 供 的 新 功 能, 才 能 更 高 效 地 使 用 它。
什 么 是 安 全 的 应 用
首 先 最 重 要 的, 但 也 是 最 不 容 易 实 现 的 是 排 除 可
能 会 使 应 用 非 正 常 中 止 的 错 误。 在 任 何 情 况 下, 最 终 用 户
都 不 应 看 到 应 用 出 现 保 护 性 错 误 而 退 出 系 统, 这 种 错 误
最 容 易 使 用 户 对 软 件 失 去 信 心。 因 为 这 意 味 着 用 户 要 中
断 思 路, 并 费 时 费 力 地 重 新 登 录, 而 且 已 进 行 的 操 作 也 会
因 没 有 存 盘 而 全 部 丢 失。 当 然 造 成 系 统 中 止 的 原 因 很 多,
可 能 是 网 络、 硬 件、 系 统 软 件 或 是PowerBuilder 本 身 的 问 题,
但 是 开 发 者 应 当 尽 量 周 全 地 考 虑 到 各 种 可 能 发 生 的 问 题,
使 出 错 的 可 能 降 至 最 小。 特 别 是 使 用PowerBuilder 开 发 的 软
件 的 确 经 常 会 出 现 保 护 性 错 误, 但 是 开 发 人 员 却 不 能 因
此 怨 天 尤 人, 而 是 要 多 做 测 试, 选 择 最 为 保 险 的 方 法 实 现
相 同 的 功 能。
此 外, 在 使 用PowerBuilder 编 程 时, 还 有 一 种 常 见 的 导 致 非 正 常 中 止 的 情 况 是 由 于 程 序 员 自 己 的 原 因 造 成 的, 这 就 是 变 量 联 接 滞 后 问 题, 即 在 编 译 时 定 义 一 个 有 效 的 对 象 类, 但 是 在 运 行 时 却 没 有 创 建 它 的 实 例 或 这 个 实 例 已 释 放(destroy); 这 时 如 有 一 段 代 码 引 用 到 这 一 对 象, 系 统 却 无 法 在 内 存 中 找 到 它 的 实 例, 而 导 致 中 止。 因 此, 在 引 用 变 量 时, 应 当 首 先 检 查 它 是 否 存 在 实 例, 例 如 在 一 个 窗 口 中 引 用 了 另 外 一 个 窗 口 的 对 象, 就 应 首 先 检 测 它 在 执 行 代 码 之 前 是 否 已 经 创 建 了 一 个 实 例。
在 下 面 的 例 子 中,win_A 这 一 窗 口 对 象 可 能 在 代 码 执 行 时 并 没 有 创 建, 因 此 我 们 就 应 当 在 执 行 前 用IsValid 函 数 来 检 查 其 是 否 有 效:
IF IsValid(win_A) THEN Close(win_A) END IF
使 用 数 据 窗 口 中 应 注 意 的 问 题
PowerBuilder 的 代 码 将 引 用 很 多 数 据 窗 口 中 的 列, 指
代 这 一 列 的 方 法 可 以 是 列 名 也 可 以 是 列 号。 列 号 是 指 这
一 个 数 据 窗 口 在 执 行Select 语 句 中 排 列 的 顺 序 号, 如 果 习
惯 于 使 用 列 号 引 用 某 列, 要 注 意 可 能 在 后 来 会 在 数 据 窗
口 的select 语 句 中 移 动 或 删 除 某 些 列, 如 果 不 能 想 起 所 有
引 用 过 这 个 数 据 窗 口 的 代 码, 这 时 就 有 可 能 出 现 数 据 类
型 不 匹 配 的 错 误。 使 用 列 名 来 引 用 则 可 以 避 免 这 类 错 误,
但 是 这 里 使 用 的 字 符 串, 在 编 译 时PowerBuilder 并 不 验 证 引
用 得 是 否 正 确, 只 有 在 运 行 时, 系 统 才 可 能 发 现 使 用 的 字
符 串 在 数 据 窗 口 中 不 存 在, 并 提 示 错 误, 退 出 应 用。 这 种
错 误 一 般 比 较 难 以 发 现, 减 小 这 种 出 错 的 方 法 是 尽 可 能
使 用Object Browses 来 剪 贴, 以 减 小 录 入 错 误。
安 全 的 环 境 还 应 当 注 意 尽 可 能 避 免 用 户 无 意 录 入 无 效 的 数 据。 在GUI 下, 有 许 多 控 件 可 以 以 十 分 友 好 的 方 式 限 制 用 户 输 入 值 的 种 类。 例 如 一 个 多 选 框 只 有 两 种 值 的 选 择, 所 以 当 用 户 作 出 选 择 的 可 能 性 只 有 两 个 时, 可 以 采 用 这 一 控 件, 免 去 了 另 外 编 程 进 行 输 入 有 效 性 验 证 的 麻 烦。 当 选 择 的 可 能 再 多 一 些 时, 可 以 采 用 单 选 钮, 每 一 种 选 择 都 是 有 效 的, 用 户 不 可 能 输 入 任 何 一 种 无 效 的 选 择。 同 理 采 用ListBox、DropDownDataWindow、DropDownListBox 等 标 准 控 件 都 可 以 有 效 地 避 免 用 户 无 效 输 入, 而 不 必 另 外 编 程 来 进 行 有 效 性 验 证, 同 时 可 避 免 用 户 在 某 一 个 输 入 点 反 复 作 输 入 尝 试 而 耽 误 很 多 时 间。
在 一 个 应 用 系 统 中, 开 发 者 应 当 避 免 用 户 作 出 未 经 授 权 或 没 有 意 义 的 操 作, 在PowerBuilder 中 菜 单 和 按 钮 等 对 象 有Enabled 和Visible 的 属 性, 因 此 对 用 户 未 授 权 或 无 法 进 行 的 操 作 应 将 相 应 对 象 的 属 性 改 为Disabled 和Invisible。 例 如 在 一 个 窗 口 中 有 一 个 数 据 输 入 窗 口 和 一 个 删 除 按 钮。 在 编 辑 一 条 新 记 录 时, 删 除 按 钮 是 无 效 的, 因 此, 这 个 按 钮 的 属 性 应 为Disable。 当 窗 口 的 状 态 发 生 变 化 时, 应 当 随 时 改 变 控 件 或 菜 单 项 的 这 两 个 属 性。
当 对 象 无 效 时, 使 用 该 控 件 的Disable 属 性 还 是Invisible 属 性 是 个 人 习 惯 问 题。 一 般 地, 在 一 个 菜 单 项 或 控 件 永 远 是 无 效 时 应 当 使 用Invisible 属 性, 例 如 一 个 用 户 打 开 一 个 有 删 除 键 的 窗 口, 但 是 这 个 用 户 没 有 删 除 权 限, 那 么 这 个 按 钮 就 应 当 是 不 可 见 的; 而 如 果 用 户 有 权 删 除, 只 是 在 当 前 状 态 下, 无 法 执 行 删 除 功 能, 如 编 辑 新 记 录, 这 时 该 按 钮 应 当 设 置 成Disable。
数 据 窗 口 是 一 个 单 一 的 封 装 的 对 象, 当 不 希 望 用 户 输 入 某 一 列 时, 不 能 将 整 个 数 据 窗 口 的 属 性 设 成Disable, 而 是 应 当 采 用 其 它 的 方 法, 一 般 来 讲, 有 以 下 三 种 方 式:
将 系 统 出 现 的 错 误 提 示 信 息 尽 可 能 淡 化 处 理 是 使 得 用 户 有 安 全 感 的 重 要 因 素。 开 发 者 应 当 预 见 到 某 些 可 能 出 现 的 错 误, 尽 可 能 避 免 系 统 缺 省 的 错 误 信 息 出 现, 一 方 面 由 于 这 些 信 息 本 身 没 有 汉 化, 而 且 过 于 专 业 化, 用 户 不 易 理 解, 另 一 方 面 也 容 易 使 用 户 以 为 自 己 操 作 错 误, 造 成 不 安 全 感。 例 如 用 户 可 能 会 在 输 入 数 据 时 违 反 了 数 据 库 的 约 束 条 件, 开 发 者 应 当 在PowerBuilder 发 出SQL 语 句 向 数 据 库 提 交 前 对 此 进 行 必 要 的 有 效 性 检 验。 当 然 使 用 下 拉 列 表 框 等 方 法 可 以 实 现 外 键 约 束。 如 果 用 户 直 接 从 键 盘 输 入, 须 在 对 数 据 作update 之 前 先 验 证 其 有 效 性。 数 据 库 中 有 些 列 有 非 空 的 约 束, 如 果 用 户 对 某 些 列 还 没 有 填 入 值 时 就 提 交 数 据 库 会 也 返 回 错 误, 因 此 在 开 发 者 设 计 窗 口 时, 应 对 数 据 库 的 非 空 约 束 等 条 件 先 作 一 预 览, 不 要 让 从DBMS 发 出 的 错 误 信 息 直 接 显 示 给 用 户。 另 外 在 使 用 数 据 窗 口 前, 应 确 保 每 一 列 都 在update 选 项 中 被 选 中( 在 数 据 窗 口 画 笔 菜 单 的Rows|Update 中), 否 则 系 统 在DataWindow 做Update 和Insert 操 作 时, 将 不 包 括 该 列。
PowerBuilder 中, 数 据 窗 口 画 笔 里 列 的Required Field 属 性 是 一 个 界 面 很 不 友 好 的 属 性。 一 旦 聚 焦 在 该 列 上, 没 有 输 入 任 何 东 西 就 离 开 或 者 提 交 数 据 窗 口 时 该 列 没 有 值, 系 统 都 不 允 许。 即 使 不 知 该 输 入 什 么, 想 查 询 一 下 其 他 窗 口 时, 也 要 先 在 该 列 中 写 入 一 些 东 西, 才 能 关 团 这 个 窗 口, 因 此 建 议 一 般 不 采 用 这 一 属 性, 而 是 要 通 过 编 程 来 做 检 查, 可 以 把 这 段 代 码 放 在UpdateStart 事 件 中, 这 一 事 件 在 执 行update() 函 数 时 触 发。
在 用 户 要 作 出 不 易 恢 复 的 操 作 前, 应 对 用 户 作 适 当 的 提 示, 这 样 在 用 户 打 算 探 索 系 统 新 功 能 时 没 有 后 顾 之 忧。 例 如 用 户 不 经 意 下 删 除 一 些 记 录 要 恢 复 它 们 是 困 难 的, 因 此 在 用 户 删 除 前, 出 一 个 提 示 窗 口“ 您 将 删 除 下 列 记 录, 继 续 ?” 等。 在 系 统 修 改 了 记 录 却 没 有 存 盘 就 退 出 之 前, 应 在CloseQuery 事 件 提 示“ 是 否 要 保 存” 等 信 息。
在 应 用 程 序 设 计 的 全 过 程 中, 必 须 记 住 要 编 写 安 全 的 应 用 这 一 重 要 因 素, 这 样 才 能 在 该 应 用 使 用 时 少 产 生 错 误, 减 小 维 护 的 压 力, 这 些 注 意 事 项 有:
《 宋 史》 载, 岳 飞 曾 言:“ 兵 法 之 常, 运 用 之 妙, 存 乎 一 心”。 我 们 在 这 两 期 讨 论 的 界 面 设 计 的 一 些 注 意 事 项, 以 及 以 前 各 期 谈 到 的 其 他 一 些PowerBuilder 的 开 发 技 巧, 并 不 是 万 能 的 和 一 成 不 变 的, 也 并 没 有 涵 盖 开 发 的 全 部 内 容。 只 是 希 望 能 够 为 读 者 提 供 解 决 问 题 的 思 路, 使 读 者 能 够 建 立 感 觉, 演 绎 出 同 适 合 于 应 用 的、 实 用 的 技 巧 来。
本 讲 座 到 此 就 暂 告 一 段 落。 笔 者 在 历 时 一 年 的 撰 文 过 程 中, 曾 收 到 了 读 者 大 量 的 热 情 的 来 信(Email) 和 电 话, 给 予 我 鼓 励 与 支 持, 对 文 章 中 的 错 误 给 予 批 评 与 指 正, 这 些 都 成 为 了 我 坚 持 完 成 这 一 讲 座 的 最 根 本 的 动 力。 遗 憾 的 是, 限 于 时 间 和 精 力, 对 于 这 些 来 信, 我 未 能 一 一 回 复, 特 此 至 歉。 更 为 遗 憾 的 是, 限 于 版 面, 我 不 得 不 在 讲 座 中 放 弃 了 一 些 虽 然 重 要、 却 需 要 较 大 篇 幅 才 能 说 清 楚 的 专 题, 如 应 用 分 析 设 计、 团 队 开 发、 图 形 数 据 窗 口 设 计、Debug 技 巧 等 等, 今 后 将 陆 续 为 大 家 补 上。
最 后, 感 谢 原Sybase 公 司 市 场 部 总 监 檀 林 先 生 促 成 了 这 一 讲 座 的 开 办, 感 谢《 计 算 机 世 界》 李 福 顺 主 任 和 林 江 艳 小 姐 悉 心 地 安 排 和 对 文 章 精 益 求 精 地 修 改 和 校 正, 感 谢 读 者 对 本 讲 座 的 关 注 和 支 持 !