?? visual foxpro 5.txt
字號:
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 + -