FUNCky 的使用張健姿 |
01-6-26 下午 04:31:30 |
FUNCky 是 一 個PowerBuilder 應 用 程 序 庫, 它 提 供 了16 位 和32 位 兩 種 應用 庫, 其 中 包 含 了 大 量 的 底 層 函 數, 免 去 了 開 發 人 員親 自 動 手 使 用C 語 言 編 寫 動 態 鏈 接 庫 來 處 理 很 多 常 用的 諸 如 文 件 操 作、 字 符 串 操 作、 位 操 作 等 功 能。 使 用Funcky 能 大 大 提 高 開 發 效 率。 本 篇 簡 單 講 述 一 下 如 何 在PowerBuilder 中 使 用Funcky。 |
將FUNCky 加 到 您 的 應 用 中 |
FUNCky 提 供 了16 位 和32 位 的 運 行 庫Funcky.dll、Funcky16.pbl 和 Funcky32.dll、Funcky32.pbl,應 用 程 序 調 用 的 函 數 或 過 程 都 在 該 動 態 鏈 接 庫 和PBL 文件 中。 安 裝 完FUNCky 後, 兩 個 動 態 鏈 接 庫 被 拷 貝 到Windows 的System 目 錄 下, 兩 個PBL 則 在 安 裝 的 目 錄 下。 使 用 時 將 用 到 的函 數 在 應 用 的Global External Function 或Local External Function 中 作 相 應的 聲 明 即 可, 如 需 使 用 全 部 函 數 則 可 以 將 整 個PBL 文 件加 到 您 應 用 的 搜 索 庫 中。 函 數 原 型 定 義 可 以 從 相 應 函數 幫 助 中 獲 得。 |
除 幫助 文 件 中 提 供 的 函 數 以 外, 在funcky.dll 中 還 有 其 它 的 一些 未 公 開 的 函 數 在Funcky.pbl 中 被 調 用, 這 些 函 數 用 戶 也可 以 使 用。 |
使 用Funcky 要 注 意 的 幾 點 |
· 在 應 用 中, 只 將 使 到 的 函 數 加 到 函數 原 型 聲 明 中 去, 不 要 聲 明 過 多 的 函 數 原 形, 否 則 運行 時 系 統 可 能 會 報 函 數 原 型 不 匹 配 錯 誤; |
· 如 只 需 使 用 少 量 函 數, 用 戶 盡 量 不要 將FUNCky.pbl 加 到 應 用 中 使 用, 因 爲 那 將 需 要 大 量 的 函數 原 型 聲 明 才 能 編 譯 通 過; |
· 某 些 函 數 原 型 是 以"_" 開 頭 的定 義, 這 些 函 數 都 在Funcky.pbl 中 有 定 義, 使 用 者 可 以 直接 使 用 該 函 數, 將Funcky.pbl 中 的 代 碼 直 接 拷 貝 到 自 己 的pbl 中, 或 自 己 編 寫 相 關 的PowerBuilder 函 數。 |
Funcky 函 數 分 類 |
Funcky 一 共 提 供 了12 類 的 函 數: |
· 位 操 作 函 數 |
· 塊 和 內 存 操 作 函 數 |
· 數 據 轉 換 函 數 |
· DBF 文 件 訪 問 函 數 |
· 磁 盤 訪 問 函 數 |
· DOS 環 境 函 數 |
· 日 期 函 數 |
· 低 級 文 件 操 作 函 數 |
· 轉 換 函 數 |
· 字 符 串 操 作 函 數 |
· 系 統 資 源 函 數 |
· 時 間 操 作 函 數 |
舉 例 說 明 |
下 面我 們 舉 幾 個 例 子, 說 明 一 下 這 些 函 數 的 使 用。 我 們 着重 介 紹 的 是DBF 文 件 訪 問, 塊 操 作 和 內 存 操 作、 低 級 文件 操 作 等 這 幾 類 函 數, 這 是 大 家 在 應 用 中 經 常 要 用 到的, 而PowerBuilder 本 身 卻 不 提 供 的 操 作。 |
1. 我 們 經 常 在PowerBuilder 應 用 中 遇 到 有 關圖 象 存 儲 和 顯 示 的 問 題, 而 在 這 方 面,PowerBuilder 本 身 的處 理 功 能 較 弱, 在 實 際 應 用 中 經 常 無 法 達 到 用 戶 的 要求。 我 們 可 以 借 助Funcky 的 函 數 來 處 理 圖 象 文 件。 |
例 如 在 應用 中 需 要 存 儲、 查 詢、 顯 示 和 打 印 照 片, 一 般 開 發 人員 使 用OLE 嵌 入 的 方 法 來 做, 但 是 如 果 獲 得 的 每 一 幅 照片 的 規 格 不 完 全 一 樣, 這 樣 顯 示 和 打 印 的 效 果 就 很差, 採 用 這 種 方 法 制 作 通 行 證 或 身 份 證 上 的 照 片 幾 乎是 不 可 用 的。 解 決 這 一 問 題, 所 使 用 的 較 簡 單 的 方 法是, 以bitmap 格 式 在 數 據 庫 中 存 放 圖 象 數 據, 顯 示/ 打 印時, 將 數 據 取 出 在 本 地 保 存 成 爲 臨 時 文 件, 根 據 圖 象的 尺 寸 進 行 等 比 例 縮 放 顯 示 在 圖 象 控 件 上, 這 樣 既 能達 到 界 面 的 要 求, 又 能 獲 得 高 質 量 的 圖 象。 我 們 可 以借 助Funcky 函 數 來 解 決 這 樣 幾 個 問 題: |
o bitmap 圖 象 文 件 存 儲 效 率 不 高, 在 數據 庫 中 佔 據 的 空 間 過 大, 可 在 存 入 前 使 用fcompress 函 數對 圖 象 文 件 進 行 壓 縮: |
函數 聲 明: |
FUNCTION long fcompress(string s,string d) |
LIBRARY "FUNCky32.DLL" |
//定義壓縮函數原型 |
SCRIPT: |
retcode = fcompress(ls_path, "_tmp.tmp") |
//壓縮文件 |
choose case retcode |
...//檢查返回值 |
End choose |
...//將壓縮後的文件保存到數據庫中 |
fdcompress 的 壓 縮 效 率 不 高, 但 速 度 很 快, 還 是 值 得 使 用的。 |
o bitmap 圖 象 的 寬 和 高 保 存 在 該 文 件 的第18 和 第22 個 字 節 中, 不 用Funcky 函 數 很 難 讀 出 這 兩 個 字節 的 信 息。 下 面 一 段 程 序 是 解 壓 縮 和 計 算BMP 圖 象 的 寬和 高 |
函數 聲 明: |
//定義從二進制數據中讀取一個長整形函數原型 |
FUNCTION long _blob2long(ref blob b, uint o) |
LIBRARY "FUNCky32.DLL" |
//定義解壓縮函數原型 |
FUNCTION long fdcompress(string s,string d) |
LIBRARY "FUNCky32.DLL" |
SCRIPT: |
... //從數據庫中將數據取出保存在文件$fgd.bmp中 |
status = fdcompress("$fgd.bmp","_fgd.bmp") |
//解壓縮 |
choose case status |
...//檢查返回值 |
End choose |
...//將_fgd.bmp讀入blob變量pic |
ll_width = _blob2long(pic,18) //讀圖象寬度 |
ll_height = _blob2long(pic,22) //讀圖象高度 |
//根據指定的寬和高計算縮放比例 |
bili_width = integer(sle_width.text) / ll_width |
bili_height = integer(sle_height.text) / ll_height |
//得到顯示寬度和高度 |
p_width = ll_width * min(bili_width, bili_height) |
p_height = ll_height * min(bili_width, bili_height) |
我 們可 以 看 到Funcky 函 數 的 使 用 非 常 簡 單, 能 夠 輕 鬆 做 到 在PowerBuilder 中 很 難 實 現 的 操 作。 |
2. 在 應 用 中 您 可 能 會 遇 到 直 接 讀 取DBF 文 件 的 情 況, 處 理 這 類 問 題 的 方 法 一 般 有 兩 種 經 典 的方 法: 一 是 使 用 數 據 窗 口 讀DBF 文 件, 二 是 指 定 一 個 磁盤 目 錄 作 爲 數 據 區, 用ODBC 連 接 這 個 目 錄, 使 用 時 規 定用 戶 必 須 將DBF 文 件 拷 貝 到 這 個 目 錄 下。 但 是 這 兩 種 方法 都 缺 乏 靈 活 性, 而 在Funcky 中 卻 提 供 了 直 接 讀DBF 文 件的 函 數。 在Funcky32.pbl 中 有 一 個dbffieldget() 函 數 可 以 獲 取 該DBF 文 件 的 字 段 名 稱。 不 過 根 據 我 們“ 盡 量 不 使 用Funcky32.pbl” 的 原 則, 自 己 手 工 編 寫 一 個 實 現 該 功 能 的 代 碼。 |
定 義 外 部函 數: |
FUNCTION long dbfOpen(string f, int o) |
LIBRARY "FUNCky32.DLL" |
FUNCTION boolean dbfEof(long d) |
LIBRARY "FUNCky32.DLL" |
FUNCTION int dbfClose(long d) |
LIBRARY "FUNCky32.DLL" |
FUNCTION long dbfSkip(long d, long c) |
LIBRARY "FUNCky32.DLL" |
FUNCTION uint dbfFieldSize(long d, int p) |
LIBRARY "FUNCky32.DLL" |
SUBROUTINE _dbfFieldGet(long d,int p,ref string b) |
LIBRARY "FUNCky32.DLL" |
FUNCTION int dbfFieldPos(long d,string n) |
LIBRARY "FUNCky32.DLL" |
SCRIPT: |
//以讀寫和拒絕其他用戶寫的方式打開dbf數據庫 |
do while 1 = 1 |
dbf = dbfopen(ls_file, 2 + 32) |
if dbf <> 0 then |
exit |
end if |
loop |
//讀dbf數據 |
//ii_xx_count是需要讀的dbf字段的總數 |
//is_dbf[]是字段名稱數組 |
do while not dbfeof(dbf) |
for i = 1 to ii_xx_count |
p = dbffieldpos(dbf, upper(is_dbf[i])) |
//獲取字段的位置 |
ls_tmp = space(dbffieldsize(dbf, p) + 1) |
//根據字段的大小初始化存放數據的變量 |
_dbffieldget(dbf, p, ls_tmp) |
//將數據讀入到ls_tmp中 |
next |
dbfskip(dbf, 1) |
//使dbf操作指向下一條記錄 |
loop |
dbfclose(dbf) |
//關閉打開的dbf文件 |
這 樣直 接 讀 取DBF 信 息, 給 應 用 帶 來 的 好 處 是 顯 而 易 見 的。 |
3. 對 於 數 據 庫 的 用 戶 管 理, 我 們 一 般會 採 用 在 數 據 庫 中 建 立 一 個 表, 記 錄 用 戶 名 稱、 口 令等 信 息, 在 用 戶 登 錄 時, 應 用 檢 索 這 個 表 的 信 息, 同用 戶 輸 入 的 內 容 核 對。 按 照 一 般 系 統 管 理 的 規 定, 每一 個 用 戶 的 口 令, 其 他 人 是 無 法 在 系 統 中 查 到 的。 即使 是 系 統 管 理 員 也 只 有 刪 除 登 錄 用 戶 的 權 利, 而 無 法獲 取 用 戶 的 口 令。 可 是 由 於 系 統 管 理 員 可 以 讀 取 數 據庫 中 的 每 一 張 表, 因 此 他 是 就 有 機 會 看 到 用 戶 的 登 錄口 令 的, 因 此 我 們 應 當 在 口 令 字 段 存 入 數 據 庫 前 對 其進 行 加 密。Funcky 提 供 了encrypt() 函 數 和decrypt() 函 數 就 可 以 用來 完 成 這 一 工 作, 這 就 避 免 了 程 序 員 手 工 編 寫 加 密 算法 的 麻 煩 了。 |
此 外,Funcky 在16 位Windows 下 還 有 許 多 底 層 的 操 作, 包 括 中斷 的 調 用 和 直 接 操 作 磁 盤 的 函 數, 可 以 用 以 軟 件 加 密的 工 作, 這 裏 就 無 法 詳 述 了。 總 之,Funcky 提 供 了 較 多 的函 數 功 能, 有 條 件 的 讀 者 可 以 在 以 後 的 應 用 中 嘗 試 使用, 相 信 會 給PowerBuilder 的 開 發 帶 來 一 定 的 方 便。 |