string ls_value -- 這能存一個值
string ls_array[] -- array,列陣、數組,這能存多個單一類型的值
Structure 是一個能存放多種類型的變量(variable) ,主要用於需要同時「傳遞」多個值時使用。如果只是在同一段代碼裏面需要用到多個值的話,直接用 select... into... 就可以了,Structure 主要用於「傳遞」,或者作為 instant 或 global variable 使用。
string ls_value -- 這能存一個值
string ls_array[] -- array,列陣、數組,這能存多個單一類型的值
Structure 是一個能存放多種類型的變量(variable) ,主要用於需要同時「傳遞」多個值時使用。如果只是在同一段代碼裏面需要用到多個值的話,直接用 select... into... 就可以了,Structure 主要用於「傳遞」,或者作為 instant 或 global variable 使用。
Function 的 output 只能選一個,沒什麼好說的,但 input 有 Pass by value 和 Pass by reference 兩種,我們就來說一下它們有什麼差異。
Pass by value 最簡單,你 'Hello' 傳給 Function ,Function 就會接收到 'Hello' ,並把它放進下圖的 as_string 中,是個「值」的傳遞,跟外部不關連。
Pass by reference 傳的是「指標」,是個指着某個變量的指標,與調用該 function() 的外部關連,外面必須有個相同類型的變量,用以保存它在 function() 內的變化。意思就是說,不管 as_array[] 在裏面變成怎麼樣,外面的 array 也會變成怎麼樣,因為它們根本是同一個東西,這就剛好解決了前面說只能有一個 output 的問題了。
PowerBuilder 裏面比較常接觸到的有兩種 Function ,讓你可以把代碼打包起來不斷重複調用,不必每次重寫差不多的代碼。Functions 又叫 User-defined function 就是通用的,在整個程式裏都可以調用,Window function 就是限於在當前 Window 裏可用。
Function 就是整個系統都可以調用的通用代碼,由於是希望儘量通用,所以在寫的時候就要考慮到未來的各種可能性,比方說 input 什麼,output 又是什麼之類的,例子有:
PowerBuilder 提供了最基本的信息盒,但如果都在代碼裏面直接使用的話,那就難以支持多語言、沒彈性、用字也不易統一,因為不同程式員會有不同的習慣,可能 A 程式員用「請問需要儲存嗎?」,B 程式員卻問「是否要保存?」,這讓用戶體驗不好,後續也難以維護。
為了改良以上的問題,我們可以在調用 MessageBox() 前多加點功夫。過程中需要:
既然在前面提過「繼承」,我還是先說一下繼承好了。「繼承」就是所有子孫都能繼承祖先的所有代碼,不需另外再寫,可以擴展,也可以停用。
以下圖為例,一個 Window,內含三個 datawindow control 加一堆按鈕,每個控件裏面都寫好一堆相應的代碼,以後從它繼承出來的新 Window 就可以直接使用所有的控件和代碼了。不止 Window ,其他如 datawindow、按鈕之類的控件也可以有同樣的做法,在開發前期先寫好「祖先」,而同一套「袓先」也可以套用到往後開發的其他系統,這可以為未來的開發省下很多的時間。
近來所開發的系統都需要面對來自五湖四海的用戶,所以系統都需要提供多語言的界面,讓用戶選擇他想要的。這裏我就簡單說個思路,讓大家考一下。
思路如下:
大家都在開箱機身,那我就來開一下配件好了,矽膠護套+繫繩。
矽膠套如以前的一樣,按機子量身訂製,一切都剛剛好,無可挑剔。
繫繩有點小改,加入扣子設計,方便隨時拆下來,在冬天衣服厚厚,或戴着帽子的時候挺方便的。
在 PowerBuilder 裏,所有控件都有個叫「Tag」的屬性,Tag 可以理解為這控件的標籤,是不是獨有的,就看你的用法了。
我會把它作為 id 去使用,例如在 menu 裏,每個 menu item 都為它定義一個 id ,每個 id 都在數據庫裏面定義它的屬性,比方在 menu 點中這個 id 會打開哪個窗體、這個窗體裏面有哪些新增、刪除等功能,這窗體內的datawindow object 有哪幾個之類,讓一切設定都存在數據庫中,在不需重新部署的情況下都隨時可改。
當然,在打開窗體之前,你也可以以此 id 去檢查對應的用戶權限,確定用戶對這功能有權之後才去打開窗體。
數據一萬行,highlight 第一跟最後一行,欲取 highlight 行號,最直接就是用 IsSelected() 去逐行檢查,但這就要檢查一萬遍了。
用 GetSelectRow() 的話,循環兩遍就能做好了。
Rowcount()
方法一,rowcount() 只執行一遍,結果放在 ll_total 裏,往後重復使用。
方法二,rowcount() 按行數執行,如果 Datawindow 有十萬行的話,rowcount() 就要計算十萬遍了。