⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 visual foxpro 5.txt

📁 Vfp 文档 一些经典编程文章 可供初学者学习编程时使用
💻 TXT
📖 第 1 页 / 共 3 页
字号:

Visual FoxPro 5.0 应 用 开 发 技 巧 

湖 南 省 计 生 委 信 息 中 心 
罗 辉 
---- ( 所 有 图 均 略)Visual FoxPro 5.0 作 为 一 个 新 型 的 前 端 数 据 库 应 用 开 发 工 具, 其 功 能 之 强 大 足 以 让 FoxPro 用 户 和 其 它 数 据 库 应 用 开 发 人 员 莫 名 惊 喜 ! 

---- 本 文 特 将 作 者 在 Visual FoxPro 5.0 平 台 从 事 应 用 开 发 过 程 中 之 经 验 和 技 巧 总 结 出 来, 希 望 能 助 你 一 臂 之 力。 本 文 是 基 于 中 文 版 Visual FoxPro 5.0 平 台 展 开 讨 论 的。 

---- 1、 充 分 利 用 数 据 词 典 功 能 简 化 表 单 设 计 

---- Visual FoxPro 5.0 新 增 了 一 个 数 据 辞 典 的 特 性。 数 据 库 的 数 据 辞 典 特 性 便 于 用 来 设 计 与 字 段 层 次 相 关 联 的 对 象 所 属 的 对 象 类( 可 以 是 自 定 义 类), 并 且 可 以 让 用 户 通 过 快 速 拖 曳 的 方 式 来 直 接 设 计 所 需 的 用 户 表 单 中 的 编 辑 对 象。 当 从 数 据 环 境 设 计 器、 数 据 库 设 计 器 或 者 项 目 管 理 器 中 把 表 或 字 段 拖 到 表 单 上 时, 将 直 接 创 建 默 认 的 控 件 类 型。 例 如, 当 把 一 个 字 符 型 字 段 拖 到 表 单 上 时,Visual FoxPro 将 创 建 一 个 文 本 框。 

---- 在 表 设 计 器 中, 我 们 可 以 在 数 据 词 典 中 为 数 据 表 字 段 设 置 如 下 特 性: 

---- * 指 定 输 入 和 显 示 字 段 的 格 式 属 性、 注 释 信 息, 它 们 将 在 表 单 设 计 器 中 使 用 拖 曳 技 术 来 设 计 编 辑 字 段 的 对 象 时, 控 制 该 对 象 的 显 示 属 性 如Format、InputMask、Caption、Comment 等 属 性 的 值。 

---- 格 式(Format): 指 定 表 达 式, 使 得 在“ 浏 览” 窗 口、 表 单 或 报 表 中, 确 定 字 段 显 示 时 的 大 小 写、 字 体 大 小 和 样 式。 

---- 输 入 掩 码(InputMask): 指 定 字 段 中 输 入 数 值 的 格 式。 例 如, 电 话 号 码 的 格 式 为 (999) 999-9999。 

---- 标 题(Caption): 指 定 在“ 浏 览” 窗 口、 表 单 或 报 表 中 代 表 字 段 的 标 签。 表 单 或 报 表 中 的 属 性 设 置 可 覆 盖 此 设 置。 

---- 字 段 注 释(Comment): 提 供 输 入 字 段 注 释 的 位 置。 

---- * 指 定 字 段 类 型 匹 配 的 表 单 控 件 对 象 类, 当 在 将 字 段 拖 到 表 单 时, 自 动 用 指 定 的 控 件 类 为 字 段 创 建 相 应 的 控 件 对 象 类。 

---- 显 示 库(Display Vcx): 指 定 类 库 的 路 径 和 文 件 名。 如 果 要 浏 览 文 件, 可 使 用 对 话 按 钮。 

---- 显 示 类(Display Class): 指 定 字 段 的 默 认 控 件 类。 

---- 例 如, 在 我 们 的 一 个 稿 件 系 统 中, 在 表 设 计 器 中 为 稿 件 表Contrib.dbf 中 的Contr_date( 投 稿 日 期) 字 段 

---- 其 中, 我 们 设 置 了 输 入 掩 码 为“9999-99-99", 标 题 为“ 投 稿 日 期”, 并 设 置 了 字 段 注 释“ 投 递 稿 件 的 邮 戳 时 间。”, 其 它 沿 用 默 认 值。 

---- 在 表 单 设 计 器 窗 口 上, 将 稿 件 库 添 加 到 数 据 环 境 中, 然 后 拖 曳 数 据 环 境 中 稿 件 库 的Contr_date 字 段 到 表 单 中, 即 出 现 如 图1-2 所 示 的 状 态: 表 单 中 自 动 产 生 一 个 文 本 框 控 件 TxtContr_date, 其 对 应 的Format、Inputmask、Comment 属 性 对 应 为 表 设 计 器 中 Contr_date 字 段 的 格 式、 输 入 掩 码 和 注 释; 并 为 该 文 本 框 配 套 创 建 了 一 个 标 题 为“ 投 稿 日 期” 的 标 签。 

---- 当 然, 你 可 以 在 数 据 环 境 中 一 次 选 择 多 个 字 段( 通 过Shift 键 + 点 按 连 续 选 择, 或 通 过Ctrl 键 + 点 按 间 断 选 择), 然 后 拖 曳 到 表 单 上, 即 可 一 次 性 地 为 多 个 被 选 字 段 产 生 对 应 的 表 单 控 件。 而 且, 针 对 不 同 字 段 类 型, 将 自 动 映 象 套 用 产 生 不 同 的 控 件 类 型。 如 对 备 注 型 字 段, 自 动 套 用 编 辑 框 控 件; 对 逻 辑 型 字 段, 自 动 套 用 检 查 框 控 件; 对 通 用 型 字 段, 自 动 套 用 图 像 控 件, 等 等。 

---- 利 用 数 据 词 典, 应 用 表 单 设 计 就 是 如 此 简 单 ! 

---- 2、 控 制 字 段 类 型 与 控 件 类 型 的 映 象 关 系 

---- 上 面 已 经 提 到: 通 过 拖 曳 设 计 应 用 表 单 时, 针 对 不 同 字 段 类 型 可 以 创 建 不 同 的 控 件 类 型。 但 是, 有 时 我 们 可 能 需 要 改 变 字 段 类 型 与 控 件 类 型 的 这 种 默 认 的 映 象 关 系, 以 达 到 定 制 的 目 的, 譬 如 说 对 字 符 型 字 段, 希 望 拖 曳 产 生 编 辑 框 控 件 而 不 是 默 认 的 文 本 框 控 件; 或 者 对 字 符 型 字 段, 希 望 拖 曳 产 生 我 们 特 制 的 文 本 框 控 件 而 不 是 默 认 的 文 本 框 控 件。 对 这 种 定 制 需 求, 分 两 种 情 况, 一 是 希 望 个 别 字 段 映 象 到 特 定 的 控 件 类 型; 二 是 希 望 某 一 种 字 段 类 型 都 映 象 产 生 特 定 的 控 件 类 型。 

---- 如 果 只 是 希 望 个 别 字 段 需 要 映 象 产 生 特 定 的 控 件 类 型, 则 应 在 如 图1-1 的 表 设 计 器“ 匹 配 字 段 类 型 到 类” 框 中 选 择“ 显 示 类” 列 表 框 里 需 要 的 控 件 类 型, 而 不 是 沿 用“ 默 认”。 如 果 要 设 置 的 控 件 类 型 不 是 系 统 提 供 的 基 类( 标 准 控 件), 则 你 首 先 需 要 在“ 显 示 库” 框 中 指 定 相 应 的 类 库 文 件, 然 后 再 选 择 其 中 的 类。 

---- 如 果 你 希 望 在 所 有 的 表 单 设 计 中 某 一 种 字 段 类 型 都 映 象 为 特 定 的 控 件 类 型, 譬 如 希 望 所 有 的 字 符 型 字 段 都 映 象 产 生 编 辑 框 控 件 而 不 是 默 认 的 文 本 框 控 件, 此 时 则 应 该 改 变 该 字 段 类 型 映 象 到 控 件 类 型 的 默 认 值。 具 体 方 法 是: 

---- 1、 选 择“ 工 具/ 选 项” 菜 单 项, 并 选 择 选 项 对 话 框 中 的 字 段 映 象 页, 其 中 的“ 将 字 段 类 型 映 象 到 类 中” 框 中, 显 示 了 系 统 支 持 的 所 有 字 段 类 型 与 控 件 类 之 间 当 前 的 映 象 关 系。 列 表 包 括: 

---- 类 型: 数 据 库 支 持 的 所 有 数 据 类 型。 注 意: 其 中 还 额 外 提 供 了 两 个 数 据 库 不 支 持 的 类 型:“ 多 用 途 型” 和“ 标 签 型”。 它 们 的 作 用 是: 当 您 一 次 把 整 个 表 或 多 个 字 段 拖 到 表 单 上 时,“ 多 用 途 型” 用 来 指 定 将 要 创 建 的 类, 系 统 默 认 是 创 建 一 个 网 格 控 件; 而“ 标 签 型”, 则 用 来 指 定 为 字 段 标 题 创 建 的 类。 

---- 类 库: 一 个 类 库, 该 类 库 包 含 映 象 到 一 个 字 段 类 型 的 类 定 义。 如 果 该 列 为 空, 表 示 该 字 段 类 型 将 映 象 到 一 个 Visual FoxPro 提 供 的 基 类 上。 

---- 类 名: 一 个 字 段 类 型 将 要 映 象 的 类, 它 指 定 了 将 要 创 建 的 控 件 类 型。 

---- 修 改: 选 择 该 按 钮 可 以 显 示 字 段 类 型 映 象 对 话 框, 从 中 可 为 选 中 的 字 段 类 型 指 定 一 个 不 同 的 映 象。 

---- 2、 点 按 修 改 按 钮, 激 活 字 段 类 型 映 象 对 话 框。 

---- 3、 在 字 段 类 型 映 象 对 话 框 内, 在 字 段 类 型 列 表 中 选 择 一 个 字 段 类 型。 若 要 设 置 在 拖 动 一 个 表 或 多 个 记 录 时 将 创 建 的 控 件 类, 则 选 择“ 多 用 途 型”。 

---- 4、 在 类 信 息 框 中, 从 类 名 列 表 中 选 择 需 要 的 控 件 类 名 称。 如 果 不 是 基 类, 则 还 需 要 设 定 类 库 文 件 名(.VCX 文 件), 该 类 库 包 含 您 希 望 与 选 中 字 段 类 型 联 系 在 一 起 的 控 件 类 型。 

---- 5、 点 按 确 定 或 应 用 按 钮 来 接 受 这 种 映 象 关 系。 

---- 在 这 里 有 必 要 强 调 的 是, 在 字 段 映 象 页 下 部 还 提 供 了 一 组 数 据 库 选 项, 这 些 选 项 也 将 影 响 我 们 结 合 数 据 词 典 通 过 拖 曳 设 计 表 单 的 效 果, 这 组 选 项 是: 

---- 拖 放 字 段 标 题: 如 果 希 望 Visual FoxPro 使 用 字 段 的 标 题 为 即 将 创 建 的 控 件 额 外 创 建 一 个 标 签 型 标 题, 则 应 选 中 该 选 项。 如 果 您 清 除 该 选 项,Visual FoxPro 将 不 会 如 图1-2 所 示 一 样 创 建 字 段 标 题。 

---- 复 制 字 段 备 注: 选 中 该 选 项 可 以 使 Visual FoxPro 在 创 建 类 时, 把 字 段 的 注 释( 如 果 有 的 话) 复 制 到 控 件 类 的 Comment 属 性 中。 

---- 复 制 字 段 输 入 掩 码: 选 中 该 选 项 可 以 使 Visual FoxPro 在 创 建 类 时, 把 字 段 的 输 入 掩 码( 如 果 有 的 话) 复 制 到 控 件 类 的 InputMask 属 性 中。 

---- 复 制 字 段 格 式: 选 中 该 选 项 可 以 使 Visual FoxPro 在 创 建 类 时, 把 字 段 的 格 式 设 置( 如 果 有 的 话) 复 制 到 控 件 类 的 Format 属 性 中。 

---- 设 定 好 字 段 类 型 与 控 件 类 型 的 映 象 关 系 后, 一 定 要 记 住 点 按 选 项 对 话 框 下 部 的 设 置 为 默 认 值 按 钮, 将 你 的 设 定 保 存 为 默 认 值。 

---- 如 此 设 置 后, 结 合 数 据 词 典 通 过 拖 曳 设 计 数 据 库 应 用 表 单 时, 即 可 改 变 字 段 与 控 件 的 映 象 关 系。 

---- 3、 如 何 给 表 单 添 加 一 个 数 组 属 性 

---- 要 给 表 单 添 加 属 性, 可 选 择“ 表 单/ 新 建 属 性” 菜 单 项, 在 新 建 属 性 对 话 框 直 接 输 入 属 性 名 和 相 应 注 释, 再 点 按 添 加 按 钮 即 可。 然 而, 又 如 何 该 表 单 添 加 一 个 数 组 属 性 呢 ? 

---- 给 表 单 添 加 数 组 属 性, 同 样 选 择“ 表 单/ 新 建 属 性” 菜 单 项, 在 新 建 属 性 对 话 框 直 接 输 入 数 组 属 性 名 和 相 应 注 释 即 可。 但 是, 数 组 属 性 名 中 必 须 用 圆 括 号() 或 方 括 号[] 带 数 组 下 标。 如 图3-1 所 示, 可 给 当 前 表 单 添 加 一 个3 ×2 的itemarray 数 组。 

---- 添 加 的 数 组 属 性 可 以 在 该 表 单 的 任 何 方 法 程 序 中 改 变 它 的 维 数。 譬 如 对 上 述 数 组 属 性, 我 们 可 以 在 该 表 单 的 Click 事 件 中 添 加 如 下 代 码 进 行 该 数 组 属 性 大 小 的 测 试: 

wait windows ' 原 数 组 属 性 维 数:
'+str(alen(thisform.itemarray,1))+;
	' ×'+str(alen(thisform.itemarray,2))
dime thisform.itemarray[2,1]
wait windows ' 改 变 后 数 组 维 数:
'+str(alen(thisform.itemarray,1))+;
	' ×'+str(alen(thisform.itemarray,2))
---- 运 行 该 表 单 后, 单 击 表 单, 首 先 显 示 原 属 性 itemarray 数 组 维 数 为3 ×2, 击 任 意 键 后 接 着 显 示 改 变 后 属 性 itemarray 数 组 的 维 数 为2 ×1。 由 此 可 见, 数 组 属 性 的 大 小 进 行 了 调 整。 

---- 4、“::" 与 DODEFAULT() 函 数 的 使 用 及 区 别 

---- 在 Visual FoxPro 3.0 中 提 供 了 一 个 作 用 域 操 作 符“::", 它 用 于 在 一 个 子 对 象 类 事 件 或 方 法 程 序 中 执 行 父 对 象 类 的 事 件 或 方 法 程 序。 举 例 说, 我 们 首 先 定 义 了 一 个 父 对 象 类 PClass, 并 为 它 设 置 了Init 事 件 代 码, 以 完 成 某 些 初 始 化 操 作。 然 后, 我 们 又 基 于 该 父 类 派 生 出 一 个 子 对 象 类CClass, 也 需 要 为 它 设 置 一 段 Init 事 件 代 码。 默 认 时, 当 父 类 设 置 了 某 一 个 事 件( 如Init 事 件) 的 事 件 处 理 代 码 而 子 类 在 同 一 个 事 件 中 没 有 设 置 处 理 代 码 时, 表 单 运 行 时 将 执 行 父 类 的 该 事 件 处 理 代 码。 但 是, 当 父 类 和 子 类 的 同 一 个 事 件( 如Init 事 件) 都 设 置 了 事 件 处 理 代 码 时, 表 单 运 行 后, 将 只 运 行 子 类 的 事 件 处 理 代 码, 而 父 类 的 事 件 处 理 代 码 将 被 屏 蔽 不 予 执 行。 然 而, 可 能 我 们 需 要 父 类 和 子 类 的 同 一 个 事 件 处 理 代 码 都 需 运 行, 此 时,Visual FoxPro 3.0 的 处 理 方 法 是 在 子 类 的 事 件 处 理 代 码 前 面, 首 先 用 作 用 域 操 作 符“::" 执 行 父 类 的 事 件 处 理 代 码, 然 后 再 执 行 子 类 附 加 的 其 它 事 件 处 理 代 码。 作 用 域 操 作 符 的 使 用 格 式 是: 父 类 名:: 事 件 名。 

---- 譬 如, 在 子 类 CClass 的 Init 事 件 处 理 代 码 中, 添 加 如 下 语 句 行: 

PClass::Init
---- 即 可 执 行 父 类 Pclass 的 Init 事 件 代 码。 

---- 注 意: 作 用 域 操 作 符 的 使 用 格 式 中 的 父 类 名 是 指 父 类 的 对 象 类 名, 而 不 是 该 对 象 在 表 单 创 建 一 个 具 体 控 件 时 的 控 件 名。 

---- 为 便 于 理 解, 特 举 例 加 以 说 明。 下 面 的 程 序 创 建 一 个 表 单, 在 表 单 上 具 有 两 个 按 钮, 其 中 的“ 退 出” 按 钮( 控 件 名 是:cmdQuit) 是 基 于 CommandButton 基 类 创 建 的 cmdQuitButton 对 象 类 的 一 个 具 体 实 例; 而“ 点 按 以 退 出” 按 钮( 控 件 名 是:cmdAnother) 是 基 于 cmdQuitButton 父 类 创 建 的 cmdAnotherButton 子 类 的 一 个 具 体 实 例。 在 子 类 的 Click 事 件 中 是 通 过 cmdQuitButton::Click 语 句 执 行 父 类 的 Click 事 件 处 理 代 码 的。 

frmMyForm = CREATEOBJECT("Form")
frmMyForm.Width      = 450
frmMyForm.Height     = 100
frmMyForm.Caption    = " 作 用 域 操 作 符 使 用 举 例"
frmMyForm.AutoCenter =.T.
---- *** 下 面 两 行 语 句 用 于 在 表 单 上 创 建 对 象 类 的 实 例( 具 体 对 象) 

frmMyForm.AddObject("cmdQuit","cmdQuitButton")
frmMyForm.AddObject("cmdAnother","cmdAnotherButton")
frmMyForm.SHOW                   && 显 示 表 单
READ EVENTS                      && 开 始 事 件 处 理
---- *** 下 面 定 义 对 象 类 

DEFINE CLASS cmdQuitButton AS CommandButton  &&定义父类
    Caption    = "退出\< Q"  &&命令按钮的标题
    Left       = 175   &&按钮左边界
    Top        = 60   &&按钮上边界
    Height     = 25    &&按钮高度
    Visible    = .T.     &&在表单上显示按钮
    FontItalic = .T.       &&按钮上文本斜体显示
    ForeColor  = RGB(0,0,255)  &&改变按钮上文本颜色

    PROCEDURE Click
      WAIT WINDOW "现在正在执行退出按钮(控件名:"+;
		" cmdQuit)的 CLICK事件." TIMEOUT 2
      CLEAR EVENTS  &&停止事件处理程序,关闭表单
ENDDEFINE

DEFINE CLASS cmdAnotherButton AS cmdQuitButton &&定义子类
    Caption = "点按以退出"
    Left    = 175
    Top     = 30
    Height  = 25

    PROCEDURE Click
      WAIT WINDOW "现在正在执行点按以退出按钮"+;
		"(控件名:cmdAnotherButton)
        的 Click事件." TIMEOUT 2
      cmdQuitButton::Click
ENDDEFINE
---- 在Visual FoxPro 5.0 中 仍 支 持 作 用 域 操 作 符 的 用 法, 但 是 它 同 时 提 供 了 一 个 DODEFAULT() 函 数 的 用 法。DODEFAULT() 函 数 用 于 在 子 类 的 事 件 处 理 代 码 中 执 行 父 类 中 同 名 事 件 的 事 件 处 理 代 码。 譬 如, 在 子 类 的 Click 事 件 中 使 用 了 DODEFAULT() 函 数, 它 表 示 执 行 父 类 的 同 名 事 件 Click 的 事 件 处 理 代 码。 其 使 用 格 式 是: 

---- DODEFAULT([ 参 数1 [, 参 数2] ...) 

---- 其 中 的 参 数1、 参 数2 等 等, 用 于 向 父 类 的 事 件 或 方 法 传 递 参 数。 而 作 用 域 操 作 符“::" 与 DODEFAULT() 函 数 的 使 用 有 点 区 别, 就 是 使 用 作 用 域 操 作 符, 可 以 在 子 类 某 一 事 件 中 执 行 父 类 的 另 一 个 不 同 名 事 件 的 事 件 处 理 代 码, 而 DODEFAULT() 函 数 则 不 行 ! 

---- 5、 重 新 设 置 网 格 的 记 录 属 性 值 时 的 属 性 复 位 问 题 

---- 在 表 单 中 使 用 网 格(Grid) 控 件 对 数 据 表 记 录 作 全 屏 幕 编 辑 操 作 时, 网 格 控 件 与 要 编 辑 的 数 据 表 或 视 图 记 录 的 联 系 是 通 过 设 置 网 格 的 记 录 源 属 性 RecordSource 为 打 开 的 数 据 表 或 视 图 所 在 工 作 区 别 名 来 建 立 的。 

---- 在 实 际 操 作 中 发 现, 当 反 复 设 置 网 格 的 RecordSource 属 性 值 时, 网 格 的 其 它 属 性 总 是 复 位 到 它 的 默 认 设 置。 譬 如, 在 某 一 个 按 输 入 某 一 字 段 值 过 滤 进 行 浏 览 的 表 单 中, 表 单 可 以 反 复 请 求 用 户 输 入 不 同 的 字 段 值, 然 后 通 过SELECT -SQL 语 句 得 到 满 足 条 件 的 记 录 过 滤 到 一 个 临 时 游 标 中, 网 格 的 RecordSource 属 性 设 置 为 该 游 标 名。 因 为 每 执 行 一 次 SELECT -SQL 语 句, 该 游 标 实 质 上 是 重 新 产 生 一 次, 相 当 于 重 新 设 置 了 一 次 RecordSource 属 性 值。 这 样, 如 果 在 表 单 设 计 状 态 时 为 网 格 控 件 设 置 某 些 属 性, 譬 如 设 置 了FontName、FontSize、GridLineColor、GridLineWidth、 记 录 的 动 态 显 示 属 性( 如 不 同 记 录 的 分 色 显 示) 如DynamicBackColor、DynamicForeColor 等 等 属 性, 那 么, 在 第 一 次 查 询 时, 这 些 属 性 可 以 正 常 表 现 出 来, 但 是 在 第 二 次 以 后 的 查 询 中, 这 些 属 性 都 复 原 为 默 认 的 状 态, 好 象 没 有 进 行 设 置 一 样 ! 

---- 对 于 这 种 需 要 多 次 设 置 网 格 的 RecordSource 属 性 值 的 情 况, 为 避 免 网 格 控 件 的 其 它 属 性 的 复 位, 我 们 可 以 类 似 如 下 处 理: 

ThisForm.Grid1.RecordSource=''
&&首先将记录源属性置空
DO dynaqry.qpr
&&执行查询得到新的记录集(Tmpcursor)
ThisForm.LockScreen=.T.
&&锁定屏幕
ThisForm.Grid1.RecordSource='tmpcursor'
&&重新设置记录源属性
ThisForm.LockScreen=.F.
&&解除屏幕锁定
---- 这 样, 通 过 在 更 新 网 格 记 录 源 数 据 之 前, 先 将 记 录 源 属 性 置 空, 再 执 行 查 询 重 新 得 到 记 录 集, 然 后 重 新 设 置 网 格 记 录 源 属 性 到 新 的 记 录 集, 即 可 解 决 网 格 属 性 复 位 的 问 题。 

---- 6、SELECT-SQL 中 的 WHERE 和 HAVING 的 区 别 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -