开发经验

在PB 应 用 程 序 中 实 现 对 系 统 注 册 登 记 表 的 访 问

湖 南 广 播 电 视 大 学 教 务 处 计 算 机 室 刘 珊


---- 系 统 注 册 登 记 表 是Windows 9x 中 所 有 配 制 信 息 的 中 央 仓 库。 它 除 了 保 存 操 作 系 统 自 身 的 软 件、 硬 件 及 环 境 信 息 外, 另 一 个 用 途 就 是 保 存 应 用 程 序 中 用 户 定 制 的 配 制 信 息。 把 应 用 程 序 保 存 到 系 统 注 册 登 记 表 中 的 方 法 是 使 应 用 程 序 的 适 用 性 提 高 的 最 佳 方 法 之 一。

---- 在Power Builder 应 用 程 序 中, 通 过 使 用PB 内 嵌 的 注 册 函 数 对 系 统 注 册 登 记 表 的 访 问, 可 以 方 便 地 设 置 和 获 取 应 用 程 序 及 用 户 设 置 的 信 息: 如 进 入 应 用 程 序 时, 通 过 访 问 系 统 注 册 登 记 表 来 获 取 主 窗 口 的 原 有 大 小 及 位 置 信 息, 而 退 出 程 序 时 可 保 存 用 户 改 变 了 的 窗 口 大 小 及 位 置 信 息; 可 以 将 用 户 的 设 置 保 存 到 系 统 注 册 登 记 表 中, 在 必 要 时 从 系 统 注 册 登 记 表 中 取 出; 亦 可 创 建 一 个.REG 文 件( 注 册 登 记) 来 安 装 自 己 的 应 用 程 序, 以 及 实 现 存 取ODBC 驱 动 信 息 等 等。

---- PB 注 册(Registry) 函 数

---- 在Power Builder 6.0 中 内 嵌 的 注 册 函 数 有5 条, 分 别 是RegistrySet、RegistryGet、RegistryDelete、RegistryKeys、 和RegistryValues, 需 要 注 意 的 是, 这 组 函 数 只 能 在Microsoft Windows 系 统 中 使 用, 下 面 是 这 五 个 函 数 的 详 细 用 法:

---- 1. RegistrySet(key, valuename, valuetype, value)

key string 类 型, 指 定 键 名
valuename string 类 型, 指 定 要 访 问 值 或 创 建 新 值 的 名 称
valuetype RegistryValueType 枚 举 类 型, 指 定 值 的 数 据 类 型
value 要 设 置 的 值, 其 数 据 类 型 应 与valuetype 参 数 指 定 的 类 型 相 匹 配
返 回 值 函 数 执 行 成 功 时 返 回1, 发 生 错 误 时 返 回 -1

---- RegistrySet() 的 功 能 是 在 系 统 注 册 登 记 表 中 设 置 或 创 建 指 定 键 和 值, 如 果 要 设 置 的 键 名 或 要 设 置 的 值 不 存 在, 则 先 建 立 再 赋 值。

---- 如 下 面 的 代 码 在 系 统 注 册 登 记 表 中 设 置 或 创 建 了 应 用 程 序MyApp 运 行 时 读 写 文 件 或 访 问 图 形 及 其 他 对 象 时 的 路 径:

RegistrySet("HKEY_LOCAL_MACHINE\SOFTWARE\PB6\MYAPP\Application", &
  "Path", RegString!, "C:\MyApp")

---- 2. RegistryGet (key, valuename, valuetype, valuevariable)

Key string 类 型, 指 定 键 名
Valuename string 类 型, 指 定 要 访 问 值 的 名 称
Valuetype RegistryValueType 枚 举 类 型, 指 定 值 的 数 据 类 型
Valuevariable 用 于 保 存 键 值 的 变 量, 其 数 据 类 型 应 与valuetype 参 数 指 定 的 类 型 相 匹 配
返 回 值 函 数 执 行 成 功 时 返 回1, 发 生 错 误 时 返 回 -1

---- RegistryGet() 的 功 能 是 从 系 统 注 册 表 得 到 指 定 键 的 值。 如 下 面 的 代 码 在 系 统 注 册 登 记 表 中 获 取 应 用 程 序MyApp 读 写 文 件 或 访 问 图 形 及 其 他 对 象 时 的 路 径 于 变 量ls_Path 中:

String ls_Path
RegistryGet("HKEY_LOCAL_MACHINE\SOFTWARE\PB6\MYAPP\Application", &
  "Path", RegString!, ls_Path)

---- 3. RegistryDelete(key, valuename)

Key string 类 型, 指 定 键 名, 将 删 除 该 键 或 该 键 的 某 个 值
Valuename string 类 型, 指 定 要 删 除 的 值 的 名 称
返 回 值 函 数 执 行 成 功 时 返 回1, 发 生 错 误 时 返 回 -1

---- RegistryDelete() 的 功 能 是 删 除 系 统 注 册 登 记 表 中 的 一 个 键 或 键 的 某 个 值。 如 想 删 除 键、 键 的 值、 以 及 其 下 的 所 有 子 键, 将valuename 参 数 指 定 为 空 字 符 串。

---- 如 下 面 的 代 码 删 除 系 统 注 册 登 记 表 中 应 用 程 序MyApp 读 写 文 件 或 访 问 图 形 及 其 他 对 象 时 的 路 径:

li_return = RegistryDelete("HKEY_LOCAL_MACHINE\
SOFTWARE\PB6\MYAPP\Application", "Path")

---- 4. RegistryKeys (key, subkeys)

Key string 类 型, 指 定 键 名
Subkeys 字 符 串 数 组 变 量, 用 于 保 存 各 子 键
返 回 值 函 数 执 行 成 功 时 返 回1, 发 生 错 误 时 返 回 -1

---- RegistryKeys() 的 功 能 是 从 系 统 注 册 登 记 表 中 得 到 指 定 键 的 有 效 子 键。

---- 如 下 面 的 代 码 在 系 统 注 册 登 记 表 中 得 到 应 用 程 序MyApp 的 所 有 子 键:

String ls_subkeylist[]
li_return = RegistryKeys("HKEY_LOCAL_MACHINE\
SOFTWARE\PB6\MYAPP", ls_subkeylist)

---- 5. RegistryValues (key, valuename)

Key string 类 型, 指 定 键 名
Valuename 字 符 串 数 组 变 量, 用 于 保 存 各 值 名
返 回 值 函 数 执 行 成 功 时 返 回1, 发 生 错 误 时 返 回 -1

---- RegistryValues() 的 功 能 是 从 系 统 注 册 登 记 表 中 得 与 指 定 键 相 关 的 一 组 值 名。 如 下 面 的 代 码 得 到 为 用 程 序MyApp 定 义 的 子 键Application 的 值 名, 并 将 它 保 存 在 动 态 数 组ls_valuearray 中:

String ls_valuearray[]
li_return = RegistrySet("HKEY_LOCAL_MACHINE
\SOFTWARE\PB6\MYAPP\Application", ls_valuearray)

---- 程 序 实 例

---- 下 面 以 一 个 简 单 的 实 例 来 说 明PB 注 册 函 数 在 应 用 程 序 中 使 用。

  1. 使 用Application 画 板, 创 建 一 个 新 库Myapp.pbl 和 应 用 程 序 对 象Myapp;
  2. 使 用Window 画 板, 按 图1 在 窗 口w_login 上 放 置 一 个 静 态 文 本st_1, 在 静 态 文 本 的 属 性 页 中 将 其Text 属 性 置 为" 学 年 度 设 定:"; 放 置 一 个 编 辑 掩 码 控 件em_1, 在 其Mask 属 性 页 中, 置Mask 属 性 为"####", 选 中Spin Control 属 性, 置Min 属 性 为"1999"; 放 置 一 个 组 框gb_1, 在 组 框 的 属 性 页 中 将 其Text 属 性 置 为" 考 试 种 类 选 择:"; 在 组 框 内 放 置 两 个 单 选 钮rb_1 和rb_2, 在 单 选 钮rb_1 的 属 性 页 中 将 其Text 属 性 置 为" 正 考", 选 中Checked 属 性, 在 单 选 钮rb_2 的 属 性 页 中 将 其Text 属 性 置 为" 补 考"; 放 置 三 个 命 令 按 钮cb_save、cb_show 和cb_delete, 在 命 令 按 钮cb_save 的 属 性 页 中 将 其Text 属 性 置 为" 保 存", 在 命 令 按 钮cb_show 的 属 性 页 中 将 其Text 属 性 置 为" 显 示", 在 命 令 按 钮cb_delete 的 属 性 页 中 将 其Text 属 性 置 为" 删 除"。
  3. 给cb_save 命 令 按 钮 的Clicked 事 件 输 入 如 下 脚 本 代 码:
    String ls_Login_key
    Integer li_return1,li_return2
    ls_Login_key = "HKEY_CURRENT_USER\Software\PB6\MYAPP\Login"
    li_return1 = RegistrySet(ls_Login_key,
     "Year", RegString!, em_1.text)
    IF rb_1.checked THEN
    li_return2 = RegistrySet(ls_Login_key,
     "Examin", RegString!, rb_1.text)
    END IF
    IF rb_2.checked THEN
     li_return2 = RegistrySet(ls_Login_key,
    "Examin", RegString!, rb_2.text)
    END IF
    IF li_return1 = 1 AND li_return2 = 1 THEN
     MessageBox("保存信息显示", "Login子键的值已保存!")
    ELSE
     MessageBox("保存信息显示", "Login子键的值未能保存!")
    END IF
    RETURN
    

  4. 给cb_show 命 令 按 钮 的Clicked 事 件 输 入 如 下 脚 本 代 码:
    String ls_Login_key,ls_Year,ls_Examin
    ls_Login_key = "HKEY_CURRENT_USER\Software\PB6\MYAPP\Login"
    IF RegistryGet(ls_Login_key, 
    "Year", RegString!, ls_Year) = 1 & 
    AND RegistryGet(ls_Login_key, 
    "Examin", RegString!, ls_Examin) = 1 THEN
    MessageBox("Login子键信息显示", 
    "  年度:"+ls_Year+char(13) &
        +"考试种类:"+ls_Examin)
    ELSE
     MessageBox("Login子键信息显示", "获取Login子键信息失败!")
    END IF
    RETURN
    

  5. 给cb_delete 命 令 按 钮 的Clicked 事 件 输 入 如 下 脚 本 代 码:
    String ls_Login_key
    ls_Login_key = "HKEY_CURRENT_USER
    \Software\PB6\MYAPP\Login"
    IF RegistryDelete(ls_Login_key, "") = 1 THEN
     MessageBox("删除信息显示", "Login子键已删除!")
    ELSE
     MessageBox("删除信息显示", "未能删除Login子键!")
    END IF
    RETURN
    

  6. 使 用Application 画 板, 为Myapp 应 用 对 象 的Open 事 件 输 入 如 下 脚 本 代 码:
    Open(w_login)
    

  7. 运 行 程 序, 在 图1 窗 口 中 输 入 年 度1999 和 选 择 补 考, 之 后 按" 保 存" 按 钮, 然 后 在 按" 显 示" 按 钮, 可 以 看 到 显 示 出 了 正 确 结 果( 图2), 如 果 在 保 存 之 前 或 删 除 之 后 按" 显 示" 按 钮, 则 出 现( 图3) 结 果, 说 明 要 找 的 子 键 的 值 不 存 在。


  8. 当 按 下" 保 存" 按 钮 后, 点 击 按 钮【 开 始】 →【 运 行】 → 键 入regedit →【 确 认】, 进 入 系 统 注 册 登 记 表 编 辑 程 序, 可 以 查 看 到HKEY_CURRENT_USER\Software\PB6\MYAPP\Login 子 键 下 的 信 息 如( 图4) 所 示。 从 上 实 例 可 以 看 出, 用PB 注 册 函 数 访 问 系 统 注 册 表 是 十 分 简 单 容 易 的。

-