FUNCky 的使用

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 的 開 發 帶 來 一 定 的 方 便。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章