国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

PFC的使用與探索(一)

2024-07-21 02:09:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

數(shù)據(jù)庫(kù)快速開(kāi)發(fā)工具 powerbuilder 從5.0版本開(kāi)始提供了一套基礎(chǔ)類(lèi)庫(kù)pfc(powerbuilder foundation class),使得應(yīng)用程序的開(kāi)發(fā)速度又提高了一大步。由于pfc使用的不是很廣泛,許多開(kāi)發(fā)者對(duì)此還不是很了解。下面就我使用的過(guò)程中所得到的心得與遇到的問(wèn)題,整理出來(lái)與大家共享與探討。各位覺(jué)得有不合適的地方,希望批評(píng)指正。
pfc的幫助對(duì)各個(gè)獨(dú)立服務(wù)、事件或者函數(shù)有一些實(shí)例代碼,但是對(duì)于整體的使用幾乎沒(méi)有很全面地介紹。因此,我寫(xiě)這些東西,作為pfc幫助的一個(gè)輔助材料,大部分是在pfc幫助上沒(méi)有的內(nèi)容,是我使用pfc的過(guò)程中的總結(jié)與歸納。 pfc入門(mén)
首先,介紹一下如何創(chuàng)建一個(gè)簡(jiǎn)單的pfc應(yīng)用程序。
構(gòu)造一個(gè)簡(jiǎn)單的pfc程序框架
使用pfc,我們得先學(xué)會(huì)使用pfc構(gòu)造一個(gè)簡(jiǎn)單的應(yīng)用程序。我們可以根據(jù)pfc幫助提供的模式來(lái)構(gòu)造我們的應(yīng)用程序框架(參見(jiàn)pfc幫助的overview 中的 for a quick start項(xiàng)),也可以查看pfc例程(peat、example等)仿造構(gòu)造我們的應(yīng)用程序。下面簡(jiǎn)單的陳述一下我通常使用pfc構(gòu)造應(yīng)用程序的步驟: 首先,創(chuàng)建一個(gè)空的應(yīng)用程序,從對(duì)象n_cst_appmanager繼承一個(gè)新的用戶對(duì)象,命名為n_mdl_app; 其次,根據(jù)pfc幫助快速模型實(shí)例創(chuàng)建簡(jiǎn)單的應(yīng)用程序框架,有所不同的是:應(yīng)用程序服務(wù),我使用剛才創(chuàng)建的用戶對(duì)象n_mdl_app代替了n_cst_appmanager,
設(shè)置n_mdl_app的相關(guān)事件的代碼,可參見(jiàn)pfc例程的程序代碼; 打開(kāi)應(yīng)用(application)對(duì)象,更改部分屬性及代碼: 在additional properties中,更改variable types 頁(yè)中的3個(gè)變量(sqlca->n_tr; error->n_err; message->n_msg)(參考pfc例程peat) 根據(jù)需要更改默認(rèn)字體的類(lèi)型及大小(由于我們開(kāi)發(fā)的都是中文界面的應(yīng)用程序,所有字體更改為“宋體 9pt”),根據(jù)需要更改應(yīng)用程序的圖標(biāo); 根據(jù)需要更改其他的屬性,比如:displayname, microhelpdefault, 等等; 另外,我還需要更改應(yīng)用對(duì)象的systemerror事件的代碼,我使用的是逄新利編寫(xiě)的一個(gè)錯(cuò)誤陷阱模塊。
  根據(jù)需要編寫(xiě).ini文件或者更改注冊(cè)表項(xiàng)值。
好了,到此為止,一個(gè)pfc應(yīng)用程序框架就完成了。試著運(yùn)行一下,可以看到框架窗口的運(yùn)行狀態(tài)。
添加一個(gè)工作區(qū)窗口
應(yīng)用程序框架窗口實(shí)現(xiàn)出來(lái)了,為了能夠工作,我們還得有工作區(qū)窗口(sheet)。
首相,隨便創(chuàng)建一個(gè)grid型的數(shù)據(jù)窗口對(duì)象,保存為d_demo1。然后從w_sheet窗口繼承出來(lái)一個(gè)窗口對(duì)象,然后在這個(gè)窗口中放置一個(gè)用戶對(duì)象u_dw(數(shù)據(jù)窗口的基礎(chǔ)祖先對(duì)象)。該數(shù)據(jù)窗口控件的數(shù)據(jù)對(duì)象為剛才創(chuàng)建的數(shù)據(jù)窗口對(duì)象d_demo1。
在窗口的open事件中編寫(xiě)如下代碼:
// 開(kāi)啟resize服務(wù)this.of_setresize(true)//設(shè)置resize服務(wù)的原始大小this.inv_resize.of_setorigsize( dw_demo.width + dw_demo.x * 2, dw_demo.height + dw_demo.y * 2 )//注冊(cè)要實(shí)施resize服務(wù)的控件及方法this.inv_resize.of_register(dw_demo,this.inv_resize.scalerightbottom)//異步觸發(fā)事件,利用消息路由發(fā)送消息。該消息是要檢索數(shù)據(jù)this.event post pfc_messagerouter('pfc_retrieve')

在數(shù)據(jù)窗口控件的constructor事件中編寫(xiě)如下代碼:

this.of_settransobject(sqlca)// 設(shè)置事物對(duì)象this.of_setbase(true)// 開(kāi)啟數(shù)據(jù)窗口基本服務(wù)this.of_setprintpreview(true)// 打印預(yù)覽服務(wù)this.of_setrowmanager(true)// 行管理服務(wù)this.of_setrowselect(true)// 行選擇服務(wù)this.of_setfind(true)// 查找服務(wù)this.of_setsort(true)// 排序服務(wù)this.of_setfilter(true)// 篩選服務(wù)this.inv_rowselect.of_setstyle(this.inv_rowselect.extended)// 設(shè)置行選擇服務(wù)為高級(jí)選擇模式,支持ctrl & shift鍵this.inv_sort.of_setstyle(this.inv_sort.dropdownlistbox)// 設(shè)置排序服務(wù)的對(duì)話框樣式this.inv_filter.of_setstyle(this.inv_filter.simple)// 設(shè)置篩選服務(wù)的對(duì)話框樣式this.inv_sort.of_setcolumndisplaynamestyle(this.inv_sort.header)// 設(shè)置排序服務(wù)的顯示內(nèi)容this.inv_filter.of_setcolumndisplaynamestyle(this.inv_filter.header)// 設(shè)置篩選服務(wù)的顯示內(nèi)容

在數(shù)據(jù)窗口控件的pfc_retrieve事件中編寫(xiě)如下代碼:

return this.retrieve()

如果該窗口需要保存數(shù)據(jù),在窗口的pfc_endtrans事件中編寫(xiě)如下代碼:

integer li_transrtn
if ai_update_results = 1 then // 如果更新數(shù)據(jù)庫(kù)成功, 則提交事務(wù) li_transrtn = sqlca.of_commit()else // 否則, 回滾事務(wù),并提示信息 li_transrtn = sqlca.of_rollback() of_messagebox('update db failed','提示','數(shù)據(jù)保存失敗。',exclamation!,ok!,1)end if// 返回該事件發(fā)生的情況 success & failure 是w_master的實(shí)例變量if li_transrtn = 0 then return successelse return failureend if

如果該窗口的數(shù)據(jù)不需要保存,則要將數(shù)據(jù)窗口控件的ib_updateable屬性選擇為false,這樣在更改了數(shù)據(jù)以后,關(guān)閉窗口是不會(huì)提示類(lèi)似于“數(shù)據(jù)以更改,是否保存”等的信息了。

將該窗口命名保存為w_demo1。
在應(yīng)用程序的主菜單上添加一個(gè)項(xiàng)目,編寫(xiě)該項(xiàng)目的clicked事件代碼為:

message.stringparm = 'w_demo'of_sendmessage('pfc_open')

好了,運(yùn)行應(yīng)用程序,看一下運(yùn)行的效果吧。你可以查看以下的效果:
使用鼠標(biāo)右鍵單擊數(shù)據(jù)窗口,查看數(shù)據(jù)窗口的右鍵菜單; 刪除一條數(shù)據(jù),然后右鍵單擊數(shù)據(jù)窗口,選擇“restore”項(xiàng),看一看恢復(fù)刪除的功能; 點(diǎn)擊窗口菜單上的“sort”、“filter”、“print preview”,“find”,“replace”等菜單項(xiàng),查看數(shù)據(jù)窗口的“排序”、“篩選”、“打印預(yù)覽”,“查找”,“替換”等的功能; 點(diǎn)擊菜單[view]的[first/prior/next/last]等菜單項(xiàng),查看數(shù)據(jù)窗口的翻頁(yè)功能; 修改部分?jǐn)?shù)據(jù),關(guān)閉窗口,查看提示保存的對(duì)話框
以上的這些功能,使用pfc的時(shí)候,簡(jiǎn)單到只需設(shè)置某項(xiàng)屬性或者編寫(xiě)一句開(kāi)啟某項(xiàng)服務(wù)的語(yǔ)句即可實(shí)現(xiàn)。如果你想對(duì)某項(xiàng)服務(wù)提出更高的要求,比如排序服務(wù),你想更改服務(wù)的模式由默認(rèn)的pb拖放排序方式改為下拉列表框方式,還需要一行命令來(lái)更改服務(wù)的方式。
完善并增加更多的功能
如果您想增加更多的更強(qiáng)大的功能,比如閃屏,登錄窗口等等。下面就簡(jiǎn)單的介紹一下增加這些功能的簡(jiǎn)單的方法。順便介紹一下我們可也在這些事件中添加的代碼和開(kāi)啟的服務(wù)。涉及到的有關(guān)的具體問(wèn)題會(huì)在以后慢慢的了解到。

通過(guò)查看pfc例程peat的代碼,我們知道可以在“應(yīng)用程序管理器”對(duì)象(gnv_app的對(duì)象)的contructor事件中初始化版本、公司、ini文件等的信息(實(shí)例變量值,這些值大多可以在屬性窗口中設(shè)置),可以在“應(yīng)用程序管理器”對(duì)象的pfc_open事件中開(kāi)啟需要的應(yīng)用程序服務(wù),這些服務(wù)包括:應(yīng)用程序選項(xiàng)服務(wù)、數(shù)據(jù)窗口緩存服務(wù)、錯(cuò)誤信息服務(wù)、調(diào)試服務(wù)、安全服務(wù)、事務(wù)注冊(cè)服務(wù)、最近使用對(duì)象服務(wù)等等。

其次,我們可以在該對(duì)象的pfc_preabout,pfc_presplash,pfc_prelogondlg事件中添加代碼來(lái)定制“關(guān)于”、“登錄”以及閃屏對(duì)話框的顯示。在這三個(gè)事件中各有一個(gè)參考型的參數(shù),這些參數(shù)是相應(yīng)的屬性對(duì)象實(shí)例,開(kāi)發(fā)人員可以改變這些對(duì)象的屬性,來(lái)達(dá)到控制對(duì)話框顯示信息目的。如果不更改,將按照默認(rèn)的樣式現(xiàn)實(shí)。

如果需要,“應(yīng)用程序管理器”對(duì)象的pfc_idle,pfc_connectionbegin、pfc_connectionend事件中編寫(xiě)代碼,并在應(yīng)用的相應(yīng)事件中觸發(fā)這些事件。

如果需要顯示登錄窗口,需要完成以下步驟:
在框架窗口的open事件中調(diào)用of_logondlg()函數(shù):
integerli_rtn//調(diào)用函數(shù)打開(kāi)登錄對(duì)話框li_rtn= gnv_app.of_logondlg()if li_rtn = 1 then this.setmicrohelp('logon successful')else if li_rtn = -1 then messagebox('logon','logon failure' + string(li_rtn)) end if //close(this) halt closeend if
在“應(yīng)用程序管理器”對(duì)象的pfc_logon事件中添加代碼來(lái)處理用戶的登錄。例如可以是如下的代碼:
integerli_rtnstringls_inifilels_inifile= this.of_getappinifile()if sqlca.of_init(ls_inifile,"database") = -1 then li_rtn= failureend if//as_userid & as_password為傳遞給事件的參數(shù)sqlca.of_setuser(as_userid,as_password)if sqlca.of_connect() = -1 then li_rtn= failureelse gnv_app.of_setuserid(as_userid) li_rtn= successend ifreturnli_rtn

其實(shí),在我們大多開(kāi)發(fā)的應(yīng)用程序中,登錄窗口檢驗(yàn)的是我們存放在數(shù)據(jù)庫(kù)中的用戶列表,而不是登錄數(shù)據(jù)庫(kù)的用戶身份驗(yàn)證。開(kāi)發(fā)人員可根據(jù)需要自行更改。

另外,我們可以開(kāi)啟框架窗口的狀態(tài)條服務(wù)和工作區(qū)窗口(sheet)管理服務(wù)。要開(kāi)啟這兩個(gè)服務(wù),我們只需在框架窗口的open事件中編寫(xiě)相應(yīng)的代碼。不過(guò),pfc的狀態(tài)條實(shí)在是差強(qiáng)人意。
消息路由器
csdn上曾有網(wǎng)友提問(wèn)要知道pfc消息路由器的機(jī)制問(wèn)題,下面我從《powerbuilder 基礎(chǔ)類(lèi)庫(kù)技術(shù)詳解》一書(shū)摘抄一節(jié)介紹消息路由器的部分。


pfc使用消息路由器來(lái)處理菜單和窗口之間的通信。這種定制的消息傳送機(jī)制內(nèi)至于所有pfc菜單和窗口中。
雖然消息路由器可以用于任何對(duì)象與一個(gè)窗口的通信,但是他通常用來(lái)將消息從菜單傳遞給窗口。消息路由器根據(jù)一種定制的搜索算法來(lái)決定接受該消息的對(duì)象。
使用消息路由器有以下優(yōu)點(diǎn): 菜單的腳本只需要知道要調(diào)用的用戶事件,而不必知道當(dāng)前窗口或相關(guān)控件的名稱; 窗口不必保留那些只是簡(jiǎn)單地調(diào)用數(shù)據(jù)窗口的用戶事件。這樣,窗口所保留的用戶事件的數(shù)目就減少了。
消息路由器函數(shù)傳遞的消息實(shí)際上就是一個(gè)字符串,該字符串包含窗口或窗口的控件要激活的用戶事件的名稱。消息路由器包括內(nèi)置的調(diào)試信息,從而可以提供錯(cuò)誤信息。
當(dāng)用戶選中一個(gè)菜單項(xiàng)時(shí),該菜單項(xiàng)的clicked事件調(diào)用該菜單的of_sendmessage函數(shù),并傳遞要調(diào)用的用戶事件的名稱。 of_sendmessage函數(shù)調(diào)用n_cst_menu的of_sendmessage函數(shù),該函數(shù)調(diào)用窗口的pfc_messagerouter事件,該事件再調(diào)用制定的用戶事件。
根據(jù)應(yīng)用程序是mdi程序還是sdi程序,of_sendmessage調(diào)用的pfc_messagerouter用戶事件的方式有所不同,如圖:




 
pfc_messagerouter用戶事件調(diào)用窗口、當(dāng)前控件以及最近即獲得數(shù)據(jù)窗口中傳遞的用戶事件,如圖:

 
消息路由器提供一種菜單和窗口之間的通信機(jī)制。除了數(shù)據(jù)窗口中的命令按鈕之外,沒(méi)有按鈕能夠調(diào)用pfc_mwssagerouter事件。這是因?yàn)樵敿?xì)函數(shù)調(diào)用getfocus事件來(lái)的到當(dāng)前的控件,而實(shí)際上點(diǎn)中一個(gè)命令按鈕之后,當(dāng)前的控件就是該命令按鈕本身。
以上內(nèi)容摘自《powerbuilder 基礎(chǔ)類(lèi)庫(kù)技術(shù)詳解》,電子工業(yè)出版社出版,王梅君 等編著。
該書(shū)是 劉紅巖 主編的《powerbuilder 7.0 與 sybase internet 技術(shù)叢書(shū)》系列中的一員。  
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东港市| 崇信县| 侯马市| 抚松县| 苗栗县| 汨罗市| 梓潼县| 丰县| 武冈市| 呼玛县| 内黄县| 晋州市| 绥中县| 五峰| 会同县| 湘潭县| 闸北区| 崇信县| 景德镇市| 无锡市| 丘北县| 芜湖市| 德保县| 久治县| 翁牛特旗| 麻阳| 苗栗县| 芦山县| 永新县| 吕梁市| 尖扎县| 乡城县| 阿拉善右旗| 武穴市| 忻城县| 弥勒县| 通山县| 太仓市| 沐川县| 丽江市| 聂拉木县|