張新業(yè) 張振友
摘要:利用Powerbuilder數(shù)據(jù)窗口技術(shù)實(shí)現(xiàn)最終用戶對(duì)應(yīng)用軟件界面的管理,并將用戶對(duì)界面的修改結(jié)果持久存儲(chǔ)到數(shù)據(jù)庫,軟件開發(fā)者無需對(duì)軟件重新編譯和連接,提高了軟件的適應(yīng)性,降低了軟件維護(hù)成本。
關(guān)鍵詞:數(shù)據(jù)窗口;用戶可管理界面軟件;用戶界面;Powerbuilder
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)08-1654-03
用戶可管理界面軟件也稱為用戶可配置界面軟件,是指允許軟件使用者,也就是軟件的最終用戶通過軟件自帶的功能對(duì)用戶界面進(jìn)行管理,如修改界面的外觀,增加或減少界面元素等,并且將這些變化持久存儲(chǔ),而無需軟件開發(fā)商對(duì)已發(fā)布的軟件進(jìn)行重新編譯和發(fā)布,因此用戶可管理界面軟件可以提高軟件的適用性,降低軟件的維護(hù)成本。
用戶可管理界面軟件既是一種技術(shù),也是一種編程思想和方法,可以在任何開發(fā)工具中加以貫徹。該文給出的是基于Powerbuilder數(shù)據(jù)窗口技術(shù)的一種實(shí)現(xiàn)。
1 總體設(shè)計(jì)思路
Powerbuilder應(yīng)用程序中,界面元素包括窗口、菜單、窗口中的各種控件等,數(shù)據(jù)窗口(DataWindow)控件是窗口控件的一種,數(shù)據(jù)窗口控件通過與數(shù)據(jù)窗口對(duì)象相結(jié)合,用多種風(fēng)格向用戶展示數(shù)據(jù)并將用戶對(duì)數(shù)據(jù)操作的結(jié)果保存到數(shù)據(jù)庫中,因此數(shù)據(jù)窗口構(gòu)成了應(yīng)用程序界面的最主要的元素。該文主要介紹數(shù)據(jù)窗口界面用戶可管理的實(shí)現(xiàn),窗口及窗口中其它控件的實(shí)現(xiàn)思想與此類似。
對(duì)用戶界面的管理包括獲取用戶界面的各種界面元素、對(duì)界面元素的屬性進(jìn)行重新設(shè)置、持久存儲(chǔ)修改結(jié)果、界面再次被載入時(shí)通過最后一次的修改結(jié)果重構(gòu)數(shù)據(jù)窗口等主要內(nèi)容。總體結(jié)構(gòu)圖如圖1所示。
2 系統(tǒng)實(shí)現(xiàn)
首先構(gòu)造一個(gè)數(shù)據(jù)窗口類型的用戶可視對(duì)象,所有的編程都是面向該用戶對(duì)象的,應(yīng)用程序中的數(shù)據(jù)窗口控件都繼承自該對(duì)象,因此不會(huì)增加程序員的工作量。
2.1 數(shù)據(jù)窗口語法的讀取及數(shù)據(jù)窗口的重構(gòu)
數(shù)據(jù)窗口的重構(gòu)是指使用已經(jīng)存儲(chǔ)的數(shù)據(jù)窗口語法重新構(gòu)建數(shù)據(jù)窗口,代碼可以放入數(shù)據(jù)窗口控件的constractor事件中。
首先檢查數(shù)據(jù)庫中是否保存有該數(shù)據(jù)窗口的語法,若存在,則取得該數(shù)據(jù)窗口的語法,通過該語法重建該數(shù)據(jù)窗口;若用戶未對(duì)該數(shù)據(jù)窗口進(jìn)行過管理配置,則不存在該數(shù)據(jù)窗口語法的存儲(chǔ)信息,這時(shí)直接使用原始數(shù)據(jù)窗口。數(shù)據(jù)窗口構(gòu)建(constractor)事件代碼如下:
string ls_datawindow_name,ls_datawindow_script,ls_error
blob lb_script
ls_datawindow_name =this.dataobject
long ll_count
//檢查數(shù)據(jù)庫中是否已保存了該數(shù)據(jù)窗口的語法
select count(*) into :ll_count from dw_describe_script
where datawindow_name = :ls_datawindow_name;
if ll_count>0 then
//已存在該數(shù)據(jù)窗口的語法,則取得原有語法
selectblob datawindow_scrip into :lb_script from dw_describe_script
where datawindow_name = :ls_datawindow_name;
ls_datawindow_script = string(lb_script)
//通過所取得的數(shù)據(jù)窗口語法重建數(shù)據(jù)窗口
this.create(ls_datawindow_script,ls_error)
if len(ls_error) >0 then
MessageBox("錯(cuò)誤信息", "創(chuàng)建數(shù)據(jù)窗口錯(cuò)誤: ~r" + ls_error)
end if
end if
其中dw_describe_script表包括數(shù)據(jù)窗口對(duì)象名(datawindow_name)及數(shù)據(jù)窗口語法(datawindow_scrip)等列。
2.2 數(shù)據(jù)窗口語法的獲取及保存
當(dāng)用戶對(duì)數(shù)據(jù)窗口進(jìn)行了修改后,可在數(shù)據(jù)窗口控件的destructor事件中獲取修改后的數(shù)據(jù)窗口語法,并保存到數(shù)據(jù)庫中。保存數(shù)據(jù)窗口語法的代碼如下:
string ls_datawindow_name,ls_datawindow_script
blob lb_script
long ll_rows
ls_datawindow_name=this.dataobject//取得數(shù)據(jù)窗口對(duì)象名字
//取得數(shù)據(jù)窗口語法
ls_datawindow_script=this.Describe ("datawindow.syntax")
lb_script = blob(ls_datawindow_script)
//檢查數(shù)據(jù)庫中是否已保存有該數(shù)據(jù)窗口語法
select count(*) into :ll_rows from dw_describe_script
where datawindow_name = :ls_datawindow_name;
if ll_rows=0 then
//不存在該數(shù)據(jù)窗口語法,則插入一條記錄。
insert into dw_describe_script(datawindow_name)
values(:ls_datawindow_name) ;
if sqlca.sqlcode =-1 then
rollback;
messagebox("信息提示","增加數(shù)據(jù)窗口格式失?。?)
return
end if
end if
//更新數(shù)據(jù)窗口語法
sqlca.autocommit=true
updateblob dw_describe_script set datawindow_scrip = :lb_script
where datawindow_name = :ls_datawindow_name;
sqlca.autocommit=false
if sqlca.SQLNRows<1 then
rollback;
messagebox('錯(cuò)誤','修改數(shù)據(jù)窗口格式失敗')
return
end if
2.3 界面管理工具
界面管理工具是軟件使用者管理用戶界面的工具,用戶通過點(diǎn)擊數(shù)據(jù)窗口,從彈出的菜單中打開該如圖2所示的窗口。
在該窗口的open事件中通過Describe函數(shù)取得原數(shù)據(jù)窗口語法字符串,然后取得由制表符分隔的每個(gè)控件的名字,通過Describe (ls_object_name + ".type")判斷控件類型,對(duì)于不同類型的控件取得相應(yīng)屬性并顯示于圖2所示的窗口中。
用戶通過通過圖2修改各種控件的屬性,也包括新建、隱藏?cái)?shù)據(jù)窗口中的控件等。當(dāng)用戶點(diǎn)擊確定按鈕后,通過modify函數(shù)將修改后的結(jié)果反映到原數(shù)據(jù)窗口中。
由于篇幅所限,本部分代碼從略。
3 結(jié)束語
除了對(duì)數(shù)據(jù)窗口中原有控件的屬性進(jìn)行設(shè)置外,本系統(tǒng)還允許用戶添加如靜態(tài)文本、按鈕、圖片等新控件,大大提高了軟件界面的適用性,收到了良好的效果。