Database 版 (精华区)
发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标 题: Visual FoxPro 通用组合框的实现
发信站: 哈工大紫丁香 (2000年12月13日09:14:59 星期三), 站内信件
Visual FoxPro 通用组合框的实现
湖 北 武 汉 中 国 地 质 大 学 矿 产 资 源
定 量 预 测 及 勘 查 评 价 开 放 实 验 室
韩 志 军 汪 新 庆 吴 冲 龙
确 保 数 据 库 数 据 准 确 性 的 最 直 接 方 法 之 一 就 是 为 用 户
提 供 一 组 预 先 设 定 的 选 项。 这 样 既 可 保 证 在 数 据 库 中 不
存 储 无 效 数 据, 又 可 提 高 用 户 数 据 输 入 效 率。 在 运 用
Visual FoxPro 进 行 项 目 开 发 时, 可 以 通 过 选 项 按 钮 组、 复 选
框、 列 表 框 或 下 拉 组 合 框 等 控 制 实 现 此 种 功 能。 而 对 于
数 据 输 入 来 说, 下 拉 组 合 框 是 必 不 可 少 的。 它 即 为 用 户 提
供 了 包 含 一 些 选 项 和 信 息 的 可 滚 动 列 表, 又 可 允 许 用 户
输 入 一 个 值。 其 方 便 的 操 作 被 用 户 所 青 睐, 因 此 常 被 程
序 员 采 用。
下 拉 组 合 框 看 上 去 象 一 个 文 本 框, 只 是 右 边 有 个 下 拉
按 钮, 单 击 这 个 按 钮, 可 以 翻 滚 组 合 框, 从 而 选 择 输 入 其
中 的 选 项。 一 般 的 程 序 员 常 按 下 面 步 骤 在 表 单 中 建 立 组
合 框:
1) 在 表 单 设 计 器 中, 单 击 选 定" 表 单 控 件" 工 具 栏 中 的
控 件 按 钮。
2) 在 表 单 上 组 合 框 要 出 现 的 位 置 画 一 个 方 框。
3) 打 开 组 合 框 构 建 器(Builder), 并 选 择 设 定 其 各 项 属 性
。
4) 单 击OK 按 钮 返 回 表 单 设 计 器。
组 合 框 成 功 应 用 的 重 要 基 础 是 正 确 设 置 其 各 项 属 性,
包 括 数 据、 方 法 程 序 及 布 局 等 多 种 类 型。 在 设 计 时 经 常
设 置 的 组 合 框 属 性 有:
ColumnCount : 组 合 框 的 列 数。
ControlSource : 设 置 用 户 从 组 合 框 中 选 择 值 的 保 存 位 置
。
Multiselect: 决 定 用 户 能 否 从 组 合 框 中 一 次 选 择 一 个 以
上 的 项。
RowSource: 列 表 中 显 示 值 的 来 源。
RowSourceType: 列 表 中 数 据 源 的 类 型, 有 以 下 几 种:0 - 无
, 由 程 序 添 加;
1 - 值;2 - 别 名;3 - SQL 语 句;4 - 查 询;5 - 数 组;6 - 字 段;7
- 文 件;8 - 结 构;9 - 弹 出 式 菜 单。
在 项 目 开 发 时, 程 序 员 常 把 组 合 框 选 项 数 据 源 保 存 于
特 定 表 中, 由 该 选 项 表 来 提 供 对 特 定 字 段 的 输 入 控 制。
由 于 组 合 框 选 项 来 源 由RowSource 和 RowSourceType 两 个 属 性 设
定, 如 果 从 特 定 表 中 选 择 组 合 框 的 数 据 源, 通 常 通 过 将
RowSourceType 属 性 设 置 为3-SQL 语 句, 而 在RowSource 属 性 中 设 置
一 个SELECT-SQL 语 句 来 实 现。 如:
SELECT 课 程 名 称 FROM 课 程 ;
INTO CURSOR kclist
该 语 句 可 选 择< 课 程 > 表 中 的< 课 程 名 称 > 字 段 建 立 临 时
表kclist 来 提 供 组 合 框 的 选 项。
组 合 框 的 运 用 为 数 据 输 入 提 供 了 准 确 与 方 便。 但 运 用
上 述 方 法 建 立 组 合 框 却 非 常 麻 烦-- 每 个 表 单 中 建 立 的 所
有 组 合 框, 都 要 运 用 构 建 器 一 一 设 置 其 各 项 属 性。 不 但
效 率 低, 而 且 容 易 发 生 遗 漏 与 错 误。 另 一 方 面, 还 需 为 对
应 不 同 存 储 字 段 的 组 合 框 建 立 各 自 的 数 据 源 表, 从 而 引
起 表 文 件 数 量 不 断 增 加。 对 上 述 问 题, 作 者 发 现 可 通 过
创 建 下 述 的 通 用 组 合 框 类 来 解 决。
创 建 通 用 组 合 框
1. 创 建 通 用 组 合 框 类
运 用Visual FoxPro 创 建 一 个 新 类 的 方 式 有 以 下 三 种:
在 项 目 管 理 器 中, 选 择" 类" 选 项 卡 并 选 择" 新 建" 按 钮。
从" 文 件" 菜 单 中 选 择" 新 建" 命 令, 再 选 择" 类", 再 选 择" 新
文 件" 按 钮。
使 用 CREATE CLASS 命 令。
使 用 上 述 三 种 方 法 中 的 任 一 种 方 式, 均 可 打 开" 新 类"
对 话 框。 在 该 对 话 框 的< 类 名 > 栏 中 指 定 新 类 的 名 称
ty_ComboBox,< 派 生 于 > 栏 中 指 定 新 类 基 于 的 类( 父 类)ComboBox
, 在< 存 储 于 > 栏 中 指 定 保 存 新 类 的 类 库 名 main.vcx( 如 果
设 置 的 类 库 名 不 存 在,Visual FoxPro 会 自 动 在 相 应 的 路 径 中
创 建 相 应 的 类 库 文 件)。 设 置 好 后 选 择" 确 定" 按 钮, 即 可
进 入 类 设 计 器 中 对 该 新 类ty_ComboBox 进 行 属 性 设 置 与 修 改
。
为 了 使 类ty_ComboBox 具 有 通 用 性, 需 要 使 其RowSource 和
RowSourceType 两 个 属 性 能 够 自 动 设 置。 为 此 可 在 其Init 事 件
中 加 入 如 下 代 码:
*****************************************
*通用组合框ty_ComboBox类Init事件代码,
*可根据其ControlSource属性及数据源表
*自动设置其RowSource属性
*****************************************
FOR nTEMP = 1 TO 50
cZXTEMP='ZXTEMP'+LTRIM(STR(nTEMP,2))
IF NOT USED(cZXTEMP)
EXIT
ENDIF
ENDFOR
cFieldName=TRIM(SUBS(This.ControlSource,;
AT('.',This.ControlSource)+1))
cRowSource = 'SELECT name , field_name ;
FROM zxdict WHERE zxdc="' + ;
cFieldName +'"TO CURSOR '+ cZXTEMP
WITH THIS
.ColumnCount = 2
.ColumnWidths = '120, 80'
.RowSourceType = 3
.RowSource = cRowSource
.BoundColumn = 1
ENDWITH
*****代码结尾 *****
上 述Init 事 件 代 码 可 在 组 合 框 初 始 化 时, 把 其
RowSourceType 属 性 设 置 为3-SQL 语 句, 而 在RowSource 属 性 中 则 设
置 相 应 的SELECT-SQL 语 句。 该 语 句 以 组 合 框 ControlSource 属 性
对 应 存 储 位 置 的 字 段 名 为 筛 选 条 件, 从 数 据 源 表ZXDICT 中
选 择name 和 field_name 两 个 字 段 建 立 具 有 两 列 选 项 的 新 临 时
表。 该 临 时 表 名 以ZXTEMP 开 头, 其 中 的 记 录 即 为 组 合 框 中
显 示 的 选 项。
此 通 用 组 合 框 类 需 要 有 具 有 如 下 字 段 的 数 据 源 表
ZXDICT.DBF 配 合 使 用:
字 段 名 类 型 宽 度
zxdc 字 符 型 10
name 字 符 型 30
field_name 字 符 型 10
其 中 的zxdc 字 段 存 放 组 合 框ControlSource 属 性 设 置 的 保 存
位 置 的 数 据 库 表 字 段 名 称, 它 决 定 了SELECT-SQL 语 句 中 的 筛
选 条 件。 而name 和field_name 两 个 字 段 则 分 别 存 储 符 合 筛 选
条 件 的 数 据 源 实 际 值 与 代 码 值。 组 合 框BoundColumn 属 性 值 为
1 表 示ControlSource 对 应 字 段 中 存 储 实 际 值; 如 果 想 在 该 字
段 中 存 储 代 码 值, 把 上 述Init 事 件 代 码 中 的 BoundColumn 属 性
值 由1 改 为2 即 可。
2. 设 置 临 时 表 释 放 事 件
ty_ComboBox 类 每 次 在 表 单 中 建 立 一 个 实 例, 其SELECT-SQL 语
句 即 产 生 一 个 以ZXTEMP 开 头 的 临 时 表 文 件。 若 通 用 组 合 框
执 行 多 次, 也 就 建 立 相 应 数 量 的 临 时 表 文 件。 该 临 时 表
文 件 不 会 自 动 释 放, 不 断 累 计 结 果 将 消 耗 大 量 内 存 资 源。
因 此, 需 在 表 单 关 闭 同 时 关 闭 所 建 临 时 表 文 件。 这 可 通
过 在 选 用 的 表 单 类 的Destroy 事 件 中 加 入 如 下 代 码 来 实 现:
***************************************
* 表 单 的 Destroy 事 件 代 码,
* 自 动 释 放 组 合 框 建 立 的 临 时 库 ZXTEMP*
***************************************
nOldArea=SELE()
FOR nTEMP = 1 TO 50
cZXTEMP='ZXTEMP'+LTRIM(STR(nTEMP,2))
IF USED(cZXTEMP)
SELECT &cZXTEMP
USE
ELSE
EXIT
ENDIF
ENDFOR
RELEASE ALL LIKE ZXTEMP*
SELECT (nOldArea)
***** 代 码 结 尾 *****
该 段 代 码 在 关 闭 表 单 时, 按 顺 序 检 查 内 存 中 以ZXTEMP 开
头 的 所 有 临 时 表: 如 果 存 在 即 使 用USE 命 令 关 闭。 临 时 表
文 件 关 闭 后 会 立 即 从 存 储 器 中 移 出, 释 放 出 内 存 资 源。
通 用 组 合 框 的 应 用
在Visual FoxPro 中 有 几 种 方 法 可 激 活 使 用 用 户 自 己 的 类
库。 一 种 方 法 是 把 其 指 定 为 缺 省 类 库: 执 行" 工 具" 菜 单 的<
选 项 > 操 作 后 选 择 其 中 的< 控 件 > 页, 把 创 建 的 类 库MAIN.VCX
加 到 对 话 框 中 指 定 其 为 要 加 载 的 库, 进 而 单 击 屏 幕 底 部
的< 保 存 为 缺 省 值 > 按 钮 即 可 永 久 保 存 该 项 设 置。 另 外 可
在" 表 单 控 件" 工 具 栏 中, 右 击< 查 看 类 > 控 件, 从 弹 出 式 菜
单 中 选 定< 添 加 > 选 项, 进 而 在" 打 开 文 件" 对 话 框 中 指 定
想 要 打 开 的 类 库。 通 过 上 述 两 种 方 法 激 活 用 户 自 己 的 类
库 后," 表 单 控 件" 工 具 栏 的 条 目 将 由 该 库 中 的 部 件 所 代 替
, 进 而 可 在 设 计 表 单 时 使 用。
而 在Visual FoxPro 5.0 版 本 中, 可 通 过" 拖 曳" 功 能 使 用 用
户 自 己 的 类 库。 首 先 在 " 表 设 计 器" 中, 把 需 建 立 通 用 组 合
框 的 数 据 库 表 字 段 的< 显 示 库 > 栏 设 置 为MAIN.VCX ,< 显 示 类
> 栏 相 应 设 为ty_ComboBox。 保 存 数 据 库 表 结 构 设 置 后, 在 表
单 设 计 时, 把 此 类 字 段 由" 数 据 环 境" 中 拖 曳 至 表 单 上 后,
将 直 接 在 表 单 上 建 立 该 通 用 组 合 框。 另 外 也 可 由" 项 目 管
理 器" 的< 数 据 > 页 中 直 接 拖 曳 此 类 字 段 至 表 单 上, 也 将 在
表 上 相 应 建 立 该 通 用 组 合 框。 通 过" 拖 曳" 功 能 使 用 用 户
类 库 的 方 法 更 加 方 便 快 捷, 但 只 能 用 于Visual FoxPro 5.0 以 上
版 本 中。
返回
--
大海无边天做岸
山登绝顶我为风
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:206.643毫秒