發表文章

a problem Read & ReadEx in Powerbuilder 10

Powerbuilder 10 (含)以後的版本,檔案的讀取分為 Read 與 ReadEx 兩個指令,按照說明文件的用法 ReadEx 支援 StreamMode! 讀取每次可以超過 32767 個位元組,並且支援 TextMode! 的讀取模式,算是很好用的;但是這次的問題卻出在使用 LineMode! 開啟檔案 時 PB10 的 Read 這個指令上: 先看看這段程式碼哪裡出了問題,我有純文字一份文件 A.txt (ANSI編碼)內容為: 數據窗口揭秘:未公開的數據窗口事件 (作者:Mark Brown) 到目前為止,PB的數據窗口控件仍是PB眾多控件中功能最強大,最複雜的控件。 數據窗口固有的行為 然後利用下面這段程式碼讀取內容並顯示在 mle_1(MultiLine Editor)上面 integer li_fn string ls_str mle_1.text = "" li_fn = FileOpen("A.txt",LineMode!,Read!) if li_fn > 0 then //逐行讀取並顯示在mle_1上面 do while FileRead (li_fn , ls_str) >= 0 mle_1.text += ls_str +"~r~n" loop FileClose(li_fn) end if mle_1物件上的顯示內容: 數據窗口揭秘:未公開的數據窗口事件 的數據窗口事件 事件 (作者:Mark Brown) ) 到目前為止,PB的數據窗口控件仍是PB眾多控件中功能最強大,最複雜的控件。 件中功能最強大,最複雜的控件。 複雜的控件。 鞳C 數據窗口固有的行為 的行為 發現了嗎?讀取出的內容怪怪的,幾乎每一行後段文字都重複被讀出,導致整個內容大亂。 但是,這段程式碼如果放在 PB6、PB7、PB8、PB9 執行,卻一點問題就沒有。 整個詭異到不行。 但是如果是英數文內容的檔案,不管哪個版本 PB6 or PB10 就完全不會有問題,測試檔案內容如下: calculate the height of the element and divid

powerbuilder 的邏輯運算函數

powerbuilder 的位元運算能力幾乎同等『沒有』。 但是使用 windows API 又常常遇到許多變數需要邏輯運算過,但是看看目前的 PFC 的邏輯運算效能也不好。 因此突發奇想,把原本 PFC 的邏輯運算改一改,發現也蠻好用的,效能上也有改善。 Function名稱: f_bitoperator 回傳值: unsignedlong 傳遞參數: aul_s1 [unsignedlong][value]、aul_s2 [unsignedlong][value]、as_operator [string][value] /* PFC簡易版兩組數字做邏輯運算 輸入來源:aul_s1 [uLong],aul_s2 [uLong],as_operator [String] as_operator為邏輯運算描述如:"and" , "or" , "xor" , "not"只需要第一組(aul_s1)輸入, aul_s2放0就可以了 返回:運算結果[Long],當參數錯誤返回NULL */ uLong ll_ret boolean lb_s1[32] , lb_s2[32] , lb_u integer li_bit as_operator = lower(trim(as_operator)) //參數檢查 if isnull(aul_s1) or isnull(aul_s2) or isnull(as_operator) then setnull(ll_ret) Return ll_ret end if if as_operator = "" then setnull(ll_ret) Return ll_ret end if //位元轉換 for li_bit = 32 to 1 step -1 if mod(aul_s1 , 2) = 1 then lb_s1[li_bit] = true else lb_s1[li_bit] = false end if aul_s1 = truncate(aul_s1 /

匯入 EDI 檔案到 DataStore

在台灣寫程式常常會需要使用到其他公司的資料交換,而大部份的合作夥伴都很多都會使用EDI檔案傳遞,因此處理EDI檔案就成了家常便飯,但有時候又不想要遇到一個專案就要再寫一次,所以幾乎都將它轉成PFC來使用。 上一次提到了 EDI 轉出 Function ,所以這次來看看轉入EDI檔案的 Function怎麼做吧。 Function 名稱: f_edi2ds 回傳值: Long 傳遞參數: ads_dest[datastore][refrence]、as_file[string][readonly]、as_error[string][refrence] /* 將ED文字檔(as_file)I匯入到 DataStore(ads_dest) EDI切割模式依照 dataObject 的 column.limit 訂定的長度 */ Integer li_ColCount,li_Pos,li_Col,li_file Long ll_collimit[],ll_rc,ll_totl,ll_cc,ll_new String ls_colname[],ls_coltype[],ls_data,ls_val,ls_date,ls_time Datetime ldt_1 boolean lb_fin //檔案存在否? IF not FileExists(as_file) THEN Return -1 //DataStore存在否? IF isnull(ads_dest) OR not isValid(ads_dest) THEN Return -1 END IF //欄位存在否? li_ColCount = integer(ads_dest.Describe("datawindow.column.count")) IF li_ColCount <= 0 THEN Return -1 ll_totl = 0 //取得欄位屬性 FOR li_Col=1 TO li_ColCount ls_colname[li_Col] = ads_dest.Describe("#" + string(li_Col) + ".Name") ll_collimit[li_Col]

datawindow使用陣列參數傳遞

圖片
如果你的 DataWindow 需要 in 的條件,要注意的是 Datawindow 裡面 SQL 的 in 參數是需要一個陣列型態的參數,所以你必須在指定 DataWindow 參數的時候宣告它為陣列型態: 1、選擇 Design > Retrieval Arguments

jQuery ajax.responseText注意事項

jQuery操作ajax技巧是相當方便的, 但是操作ajax.responseText,不得不注意到同步問題,如下面的例子: var rtxt = $.ajax ({ type: "GET" ,                    url: "empl.cfm" ,                    data: { eno:"A001",                    dept: "A" } ,                    async: true}) .responseText; var msg = eval (rtext).message; alert (msag); 這個是以 jQuery 利用ajax非同步呼叫 empl.cfm 頁面取得人事資料,而該頁面會以 JSON 格式回傳,該格式結構裡面會包含 message 的變數。 這個看似正常的程式碼其實隱含著很大的問題, 測試過程中,當伺服器回應在200ms以內時這個畫面會顯示 msag 內容, 當大於 200ms 就容易出現無反應 ( alert沒有執行 )。 後來反覆檢查的結果,發現原來是 async 參數會作祟,當 async為 true 時,ajax 為非同步運作:請求頁面同時,script 繼續執行並不等待請求回應,由於 responseText 指令在執行時會需要瀏覽器即時編譯,當編譯完成執行時,若請求的頁面已經返回回應資料,則此時會正常的繼續執行,若請求頁面來不及在編譯執行前返回回應資料,則會造成 rtxt 變成 undefined 狀態,使得接下來的 eval(rtext) 也變成 undefined ,如此直接取得結構 .message 時就會導致 javascript 執行錯誤停止。 當然正常的情況可以不要加入 async 屬性,因為其預設值就是 false 狀態。

programming DLL using C/C++ for Powerbuilder external function

圖片
真的,用PowerBuuilder的人實在太少了,再加上又會寫C語言作為輔助的更是寥寥可數,只好自己用功一點『自學』了。 C語言有很強大的功能,但每種版本的C語言又有許多的不一樣(C、C++、C#、Object C...),真的學起來相當辛苦,如果電腦原理基礎觀念不好,操作C語言可能真的會成為夢饜,雖然C++與C#有許多強大的功能與函式,但是作為可以被『異種』程式語言呼叫的 獨立 函式庫,可能就非常不理想,因此需要以標準的C語言編譯,讓其他程式可以使用就是一個原則(這是我的想法,如果你有不同的意見歡迎提出)。 雖然C語言的原始碼可以跨平台,不過會由於編譯器的不同而有不太一樣的指令方式。 例如, 我的開發環境在Visual Studio 2005 底下,使用到某些C指令就會有所警告,像是: strcpy => strcpy_s strdup => _scrdup 諸如此類,雖然編譯會發生警告,但是還是可以使用。但是以 Visual Studio 的觀點來說,這些都是被列為 不安全 的指令。所以我撰寫的程式碼都是在符合 Visual Studio 環境底下設計的,若你需要使用到原本C語言原始指令,就可能要自行改寫或是參考一下MSDN的說明了。 好了,來說說如何製作一個標準的DLL供 PowerBuilder 使用吧(不一定限定PB,也可以是VB、Delphi之類): 首先,你必須建立一個新的專案(部分C開發環境沒有專案概念,例如:Dev-C,每個檔案都必須自行建立與整理)

利用 coldfusion 實作 CAPTCHA 驗證功能

圖片
 我當然知道這樣輸入很沒效率,但是這是目前比較好的防廣告文手段。 CAPTCHA,中文常被稱為『驗證碼』,其全名為 Completely Automated Public Turing test to tell Computers and Humans Apart (全自動區分計算機和人類的圖靈測試)。媽呀,好長的名字!!! 需要詳細瞭解者可以看 中文版維基的解釋 或是 英文版本 的。 如果需要輕鬆一點的可以看看 直角兄-淺談各式各樣的網路圖形驗證碼(Captcha) 因為網路上我真的找不太到中文關於使用原生 CFML 來設計 CAPTCHA 驗證碼的文章, 真的有點感嘆,所以就自己動手寫起來以備日後的紀錄與查找。 原始碼出處: http://www.bennadel.com/blog/873-Using-CAPTCHA-In-ColdFusion-8.htm 當然英文看不輪轉的就看我這裡的吧,我已經把註解都中文化,並且稍微修改了一些。