在 调 用 自 定 义 的 对 话 框 表 单 时, 我 们 往 往 需 要 获 得 该 表 单 执 行 后 的 选 择 结 果 或 是 某 些 控 件 的 值 等 等。 许 多 人 采 用 的 方 法 是 设 置 一 个 全 程 变 量, 然 后 在 对 话 框 表 单 内 部 修 改 该 标 志 变 量, 进 而 获 得 需 要 的 结 果。 其 实VFP 提 供 了 一 种 更 为 安 全 的 方 法, 使 得 表 单 不 光 能 够 接 收 参 数, 而 且 能 够 返 回 值。 由 于 不 使 用 全 程 变 量, 表 单 的 通 用 性 和 独 立 性 得 以 增 强。 要 使 得 一 个 表 单 能 够 返 回 值, 必 须 满 足 以 下 条 件:




  1. 1. 该 表 单 的 窗 体 类 型 必 须 是 模 式 窗 体; 
  2. 2. 调 用 该 表 单 的 命 令 为 
  3. DO  FORM  frmName  [WITH参数列表]  TO  VarName 
  4. 其 中frmName 是 被 调 用 表 单 的 名 称( 若 表 单 有 参 数 应 正 确 指 定 实 参),
  5. VarName:用来接收表单返回值的变量名.如果该变量原先没有定义,则会被自动创建.
  6. 3. 被 调 用 表 单 必 须 在unload 方 法 的 代 码 中 使 用 返 回 语 句 
  7. return  表 达 式 

并 且 应 保 证 该 语 句 一 定 能 够 被 执 行 到, 以 将 表 达 式 的 值 送 入 指 定 的 变 量 中。return 命 令 后 的 表 达 式 可 以 是 任 意 类 型 的 合 法 表 达 式, 如 果 省 略 了return 语 句 后 的 表 达 式, 则 表 单 将 返 回 值 逻 辑 值.T.。 下 例 简 要 说 明 了 获 取 表 单 返 回 值 的 方 法: 

一、 创 建 循 环 调 用 程 序test.prg




  1. do while .T. 
  2. ''
  3. to
  4.     *:\\调用表单,返回值送入变量tempvar 
  5.     if empty(tempvar) 
  6.     &&若直接关闭了表单则 
  7.         exit 
  8. else
  9. '表单返回值是'
  10.     endif 
  11. enddo

二、 创 建 示 例 表 单test

1. 添 加 新 属 性uRetuVal;

2. 在unload 方 法 中 添 加 代 码: ----




  1. retu this.uRetuVal 

注 意: 由 于 表 单 的unload 事 件 发 生 在destroy 事 件 之 后, 而 此 时 依 附 于 表 单 的 其 他 控 件 都 已 经 释 放, 只 能 引 用 表 单 的 属 性, 而 不 能 引 用 这 些 控 件 的 任 何 属 性 值, 如command1.caption 等 等。 因 此 一 定 要 先 将 需 要 返 回 的 值 送 入 表 单 的 公 共 属 性uRetuVal 中, 这 样 才 能 够 获 得 表 单 的 返 回 值。

3. 设 置 表 单 属 性windowtype 的 值 为1, 即 表 单 为 模 式 表 单。

4. 添 加 三 个 按 钮command1,command2,command3。 设 置 其 属 性 如 下:




  1. command1.caption = "OK"
  2. command1.caption = "CANCEL"
  3. command1.caption = "HELP"
  4. 在这三个按钮的click方法里填写相同的代码 
  5. thisform. uRetuVal = this.caption 
  6. rele thisform 

三、 保 存 退 出, 执 行test.prg。

可 以 观 察 到, 按 下 不 同 的 按 钮 时, 变 量tempvar 将 返 回 不 同 的 值, 这 证 明 表 单 的 确 可 以 返 回 值 到 调 用 过 程。 利 用 这 种 方 法, 我 们 可 以 从 表 单 中 返 回 任 何 类 型 的 值。