?? visual foxpro3.txt
字號:
Visual FoxPro3.0 經 驗14 條
華 北 石 油 設 計 院 計 算 機 室
吳 會 松
---- 1. 怎 樣 解 決 不 可 視 類 庫 操 作 中 庫 容 量 的“ 惡 性 膨 漲”
---- 程 序 員 用 面 向 對 象 編 程 都 會 涉 及 到 類 庫, 但 當 對 象 的 繼 承 關 系 達 到 兩 層 以 上 時( 這 是 很 平 常 的 現 象), 只 要 一 修 改 兩 層 以 上 某 個 對 象 中 的 內 容, 就 會 驚 奇 地 發 現: 盡 管 修 改 量 極 小 ( 有 時 只 是 簡 單 的 刪 除), 但 每 一 次 的 存 盤 操 作 都 會 使 類 庫 的 容 量( 即 用DIR 看 到 的 字 節 數) 增 加 很 多, 有 時 一 次 存 盤 操 作 可 使 其“ 容 量” 增 加 幾 十K ! 筆 者 有 一 個 實 際 內 容 只 有50K 的 類 庫, 當 調 試 完 成 后, 發 現 該 類 庫 的“ 容 量” 是800 多K。 筆 者 曾 在 多 臺 機 器 的 多 個 版 本 上 做 過 試 驗, 問 題 依 舊。 在 排 除 了 病 毒 騷 擾 的 因 素 后, 可 以 肯 定: 這 是Visual FoxPro 自 身 固 有 的 缺 陷。
---- 顯 然, 這 個 問 題 給 程 序 開 發 帶 來 了 不 小 的 麻 煩。 怎 樣 解 決 呢 ? 筆 者 查 過 不 少 資 料, 做 過 多 次 試 驗, 都 不 得 要 領。 后 來 在 一 次 偶 然 的 操 作 中, 卻 發 現 了 一 個 簡 單 而 有 效 的“ 類 庫 消 腫” 方 法:
---- ①. 打 開 這 個 待 處 理 的 類 庫, 進 入 其 中 的 一 個 繼 承 關 系 最 復 雜 且 最 高 層 的 對 象( 即 最 上 層 的 父 類);
---- ②. 修 改 一 下 該 對 象 中 的 任 一 個 方 法 或 屬 性 ( 即 增 加 一 個 字 符, 然 后 再 刪 除 該 字 符);
---- ③. 保 存 并 退 出;
---- ④. 用 Close all 和 Clear all 徹 底 關 閉 類 庫。
---- 此 時 再 觀 察 該 類 庫 的 字 節 數, 可 以 發 現 該 類 庫 的“ 容 量” 已 恢 復 正 常。
---- 2. 怎 樣 為 備 注 型 字 段 建 索 引
---- Visual FpxPro3.0 不 支 持 長 度 變 化 的 關 鍵 字, 但 筆 者 在 實 驗 后 發 現, 如 果 所 建 索 引 的 備 注 型 字 段 的 長 度 在 建 完 索 引 后 不 再 變 化, 那 么 建 立 備 注 型 字 段 的 索 引 還 是 可 行 的。 但 在 建 索 引 時 必 須 注 意: 索 引 的 表 達 式 不 能 直 接 用 備 注 型 的 字 段 名, 還 要 略 加 變 通, 如 用TRIM() 函 數 把 備 注 型 字 段 括 起 來, 就 能 順 利 地 為 備 注 型 字 段 建 索 引。
---- 3. 建 立 索 引 的 字 符 型 字 段 允 許 的 最 大 寬 度
---- 資 料 中 對 此 沒 做 說 明, 經 試 驗 發 現, 此 時 索 引 允 許 的 最 大 寬 度 為240 個 字 符。
---- 4. 當 某 個 對 象( 中 的) 方 法 的 形 參 過 多 時, 最 好 用 屬 性 數 組 來 代 替 形 參
---- 這 種 手 段 可 以 使 主 要 處 理 過 程 的 邏 輯 性 更 加 清 楚 可 讀。
---- 為 了 保 證 實 質 上 的 封 閉 性, 屬 性 數 組 應 該 定 義 在 主 控 方 法 所 在 的 對 象 中; 為 了 保 證“ 視 覺” 上 的 封 閉 性( 即 增 強 程 序 代 碼 的 可 性), 可 以 讓 屬 性 數 組 與 主 控 方 法 同 名。
---- 為 了 進 一 步 加 強 主 控 方 法 的 可 讀 性, 可 為 其 專 門 增 加 一 個 附 加 方 法---- 只 用 于 給 做 形 參 的 屬 性 數 組 賦 值。
---- 5. 怎 樣 在 對 象 中 定 義 屬 性 數 組
---- 在 定 義 屬 性 時, 直 接 用 方 括 號 給 出 行 列 值 即 可。 如:A[5,9], 即 定 義 了 一 個5 行9 列 的 屬 性 數 組。
---- 6. 怎 樣 快 速 地 建 立Grid 表 格
---- 在 程 序 中 使 用 過Grid 表 格 的 程 序 員 都 覺 得 這 種 表 格 的 建 立 方 法 有 些 麻 煩, 特 別 是 當 表 格 的 個 數 及 表 格 項 很 多 的 時 候, 甚 至 會 產 生“ 恐 懼 感”。 其 實, 只 要 能 靈 活 地 利 用VFP 的“ 表 單 生 成 器”, 就 能 大 大 提 高Grid 表 格 的 制 作 效 率。
---- 這 里 假 設 需 要 以TTT. DBF 為 處 理 對 象 建 立 一 個Grid 表 格, 因 為 字 段 很 多,Grid 表 格 的 表 格 項 數 也 相 應 的 多, 所 以 只 能 采 用“ 變 通” 的 方 法, 步 驟 如 下:
---- ①. 建 立 一 個 只 有 兩 個 字 段 的 自 由 表aa.dbf, 并 使 其 中 的 一 個 字 段 能 與TTT.DBF 中 的 某 個 字 段 相 關;
---- ②. 啟 動“ 表 單 生 成 器”, 選 擇“ 向 導 方 式” 中 的“ 一 對 多 表 單 向 導”;
---- ③. 在“ 一 對 多 表 單 向 導” 的 操 作 引 導 下, 以aa.dbf 為 父 表、TTT.DBF 為 子 表 的 基 本 模 式 制 作 表 單。 在 選 擇 子 表 字 段 時, 以 未 來Grid 表 格 的 需 要 來 進 行TTT.DBF 字 段 的 選 取。
---- ④. 打 開 由 第 ③ 步 制 作 的 表 單, 剪 切 表 單 上 的Grid 表 格, 然 后 再 退 出 該 表 單;
---- ⑤. 打 開 您 程 序 中 需 要 使 用Grid 表 格 的 表 單, 把 在 第 ④ 步 上 剪 切 的Grid 表 格 復 制 到 當 前 表 單 上。
---- 至 此, 一 個 符 合 程 序 要 求 的Grid 表 格 即 制 作 完 畢。 無 論Grid 表 格 多 么 大, 用 本 方 法 都 能 在 兩 分 鐘 內 做 出 一 個 符 合 要 求 的Grid 表 格。 而 用“ 手 工” 制 作 一 個 僅50 個 字 段 的Grid 表 格 一 般 需 要 半 個 小 時( 而 且 還 可 能 出 錯)。 顯 然,Grid 表 格 越 大, 本 方 法 的 效 率 就 越 高。
---- 7. 用“ 避 開” 的 手 段 使 對 象 中 的 方 法“ 浮” 起 來
---- 所 謂 讓 對 象 的 方 法“ 浮” 起 來, 是 指 讓 該 方 法 運 行 時, 能 不 受 工 作 區、 變 量、 已 打 開 的 數 據 表 等 的 限 制( 即 不 受“ 現 場” 的 限 制), 而 且 不 干 擾 其 它 方 法 運 行 的 一 種 手 段。 過 去 在 教 科 書 上 學 到 的 原 則 是: 先 保 存“ 現 場”, 待 處 理 工 作 完 成 后, 再 恢 復“ 現 場” 。 對VFP 等 數 據 庫 系 統 來 說, 所 謂“ 現 場” 多 是 指 已 經 被 占 用 的 工 作 區、 當 前 的 磁 盤 目 錄、 已 打 開 的 數 據 表 以 及 可 能 使 用 或 正 在 使 用 的 數 據 變 量 或 對 象 的 屬 性 等。
---- 因 此, 我 們 完 全 可 以 用“ 避 開” 的 方 式 來 達 到 目 的, 以 下 是“ 避 開” 法 的 基 本 步 驟:
---- ①. 在 本 方 法 的 起 點 先 聲 明 變 量 私 有 化, 記 錄 好 本 方 法 啟 動 前 的 工 作 區 及 磁 盤 目 錄;
---- ②. 尋 找 并 返 回 一 個 還 未 被 使 用 的 工 作 區, 在 該 工 作 打 開 一 個 需 要 的 數 據 表;
---- ③. 做 本 方 法 的“ 本 職 工 作”( 包 括 調 用 其 它 方 法);
---- ④. 恢 復 本 方 法 啟 動 前 的 工 作 區 及 工 磁 盤 目 錄;
---- ⑤. 退 出 本 方 法。
---- 由 以 上 步 驟 可 以 看 出,“ 避 開” 方 式 的 基 本 要 點 是“ 單 進 單 出”, 以 數 據 表 為 例: 同 一 方 法 打 開 的 數 據 表 必 須 在 該 方 法 退 出 時 關 閉。 對 于 工 作 區、 磁 盤 目 錄 亦 有 同 樣 思 路。 顯 然, 這 種 手 段 占 用 的 內 存 要 多 一 些, 在DOS 時 代 是 不 合 適 的, 對 于WINDOWS 就 不 是 什 么 問 題 了。
---- 8. 必 須“ 自 造” 的 幾 個 通 用 的 對 象 方 法
---- 以 下 是 幾 個 用 得 最 多, 但 在VFP 中 卻 沒 有 現 成 可 用 的 方 法:
---- ①. 在 盤 上 查 找 指 定 的 數 據 庫
LPARAMETERS file_dbc
Private fff
fff=trim(file_dbc)
if len(fff)< 0.8
---- && 如 果 沒 指 定 數 據 庫, 就 說 明 后 面 要 用 的 那 些 數 據 表 都 是 自 由 表, 所 以 不 用 打 開 數 據 庫
return .t.
endif
IF .not.file('&fff')
wait windows '在這個目錄下沒找到您指定的數據庫!'
fff=.F.
ELSE
OPEN DATABASE &fff EXCLUSIVE
fff=.T.
ENDIF
return fff
---- ②. 在 指 定 的( 子) 目 錄 中 查 找 指 定 的 文 件
LPARAMETERS file,Text &&即:文件名,提示信息
Private All
****** Like f*
fff=trim(file)
fff1=.t.
IF .not.file('&fff')
IF Len(Trim(Text)) >0.5
&&若提示信息的內容為空則不做暫停顯示
wait windows Text
ENDIF
fff1=.f.
ENDIF
return fff1
---- ③. 尋 找 并 返 回 一 個 還 未 被 使 用 的 工 作 區
Private ALL
for i=1 to 10
aaa_m=alias(i)
if len(trim(aaa_m))< 0.5
return i
endif
endfor
return 0
---- ④. 建 立 一 個 指 定 的 目 錄
LPARAMETERS dire && 待 建 的 目 錄 名
Private All Like f*
fff='set Library to '+trim(This.path_FTS)
+'\FoxTools.FLL Additive'
&fff
*set Library to FoxTools.FLL Additive
fff1=.f.
fff=trim(dire)
if mkdir(fff)=0
fff1=.t. && 建 立 成 功
endif
set Library to
return fff1
---- 9. 快 速 查 詢 備 注 字 段
---- 在 對 備 往 字 段 進 行 全 文 查 找 時, 用ATC() 函 數 比 用AT-CLIEN() 函 數 快 數 倍。
---- 10. 最 近 匹 配 檢 索
---- 在 使 用 索 引 查 找 命 令 之 前 先 設 置 “SET NEAR ON” 有 時 極 有 用 處, 該 設 置 的 含 義 為: 當 查 找 失 敗 時, 記 錄 號 定 位 于 最 接 近 匹 配 的 位 置 上, 而 不 是 在 數 據 庫 的 末 尾。 比 如 對 一 個 已 打 開 日 期 字 段 索 引 的 庫, 想 瀏 覽3 月5 日 之 后 的 記 錄, 但 事 先 只 知 道 庫 中 有 許 多 不 連 續 的 日 期 記 錄, 并 不 知 道 庫 中 是 否 確 有3 月5 日 的 記 錄。 如 果 設 置 了 “SETNEAR ON”, 當 庫 中 不 存 在3 月5 日 的 記 錄 時, 就 會 定 位 在 離3 月5 日 最 接 近 的3 月6 日 或7 日 記 錄 處, 從 而 達 到 查 詢 瀏 覽 目 的。
---- 11. 檢 測 某 類 文 件
---- 函 數FIEL() 只 能 檢 測 某 特 定 文 件 是 否 存 在, 不 能 檢 測 某 類 文 件 是 否 存 在, 而 系 統 函 數SYS (2000, < 文 件 名> ) 則 可 搜 尋 某 類 文 件, 只 要 參 數“ 文 件 名” 中 含 有 通 配 符“ *? ” 即 可。 用 這 個 方 法 還 可 以 判 斷 某 子 目 錄 是 否 為 空, 只 要“ 文 件 名” 用“ 路 徑 名” 和“ *. *” 組 成 即 可。
---- 12. 保 護 屏 幕 畫 面
---- 當 在 數 據 庫 環 境 下 調 用DOS 命 令 時, 命 令 執 行 后 輸 出 的 信 息 往 往 會 破 壞 數 據 庫 環 境 已 有 的 屏 幕 畫 面。 當 然 用 保 存 屏 幕 再 恢 復 的 方 法 可 以 解 決, 但 不 如 使 用Dos 的 輸 出 重 定 向 功 能 為 好, 這 樣 輸 出 的 信 息 就 不 會 向 屏 幕 顯 示。 比 如 命 令“RUN COPY ABC.* A:” 可 以 改 為:
RUN COPY ABc.* A: >ttt.txt
---- 此 時 可 將 本 來 要 輸 出 到 屏 幕 的 信 息 改 道 輸 入 到 臨 時 文 件ttt. TXT 中 去, 保 持 屏 幕 不 變。
---- 13. 調 用 大 尺 寸 外 部 程 序
---- 在FoxPro 環 境 下 可 以 用RUN() 命 令 直 接 調 用 外 部Dos 命 令, 但 有 時 剩 下 的 內 存 已 不 多, 而 外 部 程 序 又 很 大 時 就 可 能 調 用 失 敗。 在FoxPro 中 有 個 內 存 管 理 程 序FoxSWAP 可 以 解 決 這 個 問 題。 調 用WP5 的 命 令 可 以 寫 為:
RUN /120 WPS
---- 14. 用 覆 差 法 更 新 數 據
---- 如 果 一 個 很 大 的 數 據 庫 需 要 經 常 進 行 數 據 更 新, 是 好 不 要 用 刪 除 舊 記 錄 再 增 加 新 記 錄 的 方 法, 因 為 大 數 據 庫 的 物 理 刪 除PACK 命 令 執 行 起 來 需 要 很 長 時 間。 此 時 最 好 用 覆 蓋 的 方 法, 即 把 新 記 錄 的 內 容 一 一 裝 人 舊 記 錄 中。 而 這 個 過 程 最 好 用SCATTER 命 令 和GATHER 命 令 配 合 起 來 完 成, 前 者 的 作 用 是 把 一 條 記 錄 的 所 有 字 段 內 容 存 人 一 個 數 組 變 量 中, 后 者 的 作 用 則 是 把 數 組 變 量 的 內 容 存 入 一 條 記 錄 中。 也 就 是 說 借 用 內 存 變 量 把 新 記 錄 的 內 容 傳 遞 到 舊 記 錄 中, 內 存 操 作 顯 然 比 磁 盤 操 作 要 快 得 多。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -