數(shù)據(jù)窗口控件-datawindow PB9.0提供了28個(gè)屬性、35個(gè)默認(rèn)事件,、162個(gè)函數(shù)。注意與數(shù)據(jù)窗口對(duì)象的區(qū)分,。 【其他】 ■腳本的執(zhí)行效率 *盡量不要在RetrieveRow事件下編寫(xiě)腳本(包括注釋?zhuān)?/p> *如果數(shù)據(jù)窗口的DoubleClicked事件中編寫(xiě)了腳本,,那么在數(shù)據(jù)窗口的C1icked事件中的腳本應(yīng)該盡量短,否則雙擊事件中的腳本永遠(yuǎn)不可能得到執(zhí)行,。一般來(lái)說(shuō),,Cliked中腳本的執(zhí)行時(shí)間和兩次擊鼠標(biāo)之間的間隔時(shí)間之和,不應(yīng)該大于操作系統(tǒng)中所設(shè)定的鼠標(biāo)雙擊時(shí)間間隔,,否則雙擊事件永遠(yuǎn)不可能觸發(fā),,雙擊時(shí)僅僅是接連兩次觸發(fā)c1icked事件。 *在數(shù)據(jù)窗口中錄入數(shù)據(jù)時(shí),,事件EditChanged是觸發(fā)頻率最高的,,每一個(gè)按鈕都觸發(fā)該事件;觸發(fā)頻率僅次于該事件的是ItemChanged事件和ItemFocusChanged,,只要修改了單元中的內(nèi)容,,每次觸發(fā)ItemFocusChanged事件都會(huì)觸發(fā)ItemChanged事件。在這些事件下編寫(xiě)過(guò)長(zhǎng)的腳本會(huì)非常影響錄入工作的效率,。同樣,,事件RowFocusChanged的觸發(fā)頻率也是相當(dāng)高的。一般來(lái)說(shuō)是可以避免在這四個(gè)事件中編寫(xiě)腳本的,。 ■dwo參數(shù)使用 數(shù)據(jù)窗口的某些事件中可以使用一個(gè)稱為dwo的變量,,該變量保存數(shù)據(jù)窗口中的部分信息,用數(shù)據(jù)窗口的屬性可以讀取這些信息dwo.type:讀取在dwo中保存的對(duì)象類(lèi)型,。對(duì)象類(lèi)型可能有bitmap,、button,、column、compute,、graph,、groupbox、line,、ole,、ellipse、rectangle,、roundrectangle,、report、tableblob,、text,、datawindow(當(dāng)用戶沒(méi)有單擊特定對(duì)象時(shí)) dwo.Name:column的列名 dwo.Primary[row]:column的數(shù)據(jù) dwo.Selected:選中column的數(shù)據(jù) ■數(shù)據(jù)緩沖區(qū) 數(shù)據(jù)窗口在運(yùn)行時(shí)要?jiǎng)?chuàng)建四個(gè)緩沖區(qū),分別是主緩沖區(qū),、刪除緩沖區(qū),、過(guò)濾緩沖區(qū)和原始緩沖區(qū),這四個(gè)緩沖區(qū)各司其職,、共同配合,,來(lái)保證數(shù)據(jù)窗口對(duì)數(shù)據(jù)的正確處理。下面分別加以介紹,。 1,、主緩沖區(qū)-Primary 這是最重要的一個(gè)緩沖區(qū),保存的是當(dāng)前顯示在數(shù)據(jù)窗口中的所有數(shù)據(jù)以及它們的修改狀態(tài),。在保存數(shù)據(jù)時(shí)使用這些狀態(tài)生成SQL語(yǔ)句,。平常的大多數(shù)操作都是針對(duì)該緩沖區(qū),函數(shù)中的緩沖區(qū)參數(shù)缺省也是該緩沖區(qū),。 2,、刪除緩沖區(qū)-Delete 該緩沖區(qū)保存所有刪除了的數(shù)據(jù)。保存數(shù)據(jù)時(shí),,該緩沖區(qū)中的數(shù)據(jù)用來(lái)產(chǎn)生delete語(yǔ)句,。在數(shù)據(jù)沒(méi)有提交到數(shù)據(jù)庫(kù)之前,可以從該緩沖區(qū)中將數(shù)據(jù)恢復(fù)出來(lái),。數(shù)據(jù)提交后,,該緩沖區(qū)中的數(shù)據(jù)清空。 3,、過(guò)濾緩沖區(qū)-Filter 該緩沖區(qū)中保存的是沒(méi)有通過(guò)過(guò)濾規(guī)則的所有數(shù)據(jù),,這些數(shù)據(jù)在存儲(chǔ)時(shí)同主緩存區(qū)的數(shù)據(jù)一起生成相應(yīng)的insert或update語(yǔ)句。 4,、原始緩沖區(qū)-original 用來(lái)保存從數(shù)據(jù)庫(kù)中檢索到的初始值,,在保存數(shù)據(jù)時(shí)用來(lái)生成where語(yǔ)句,。 上面這四個(gè)緩沖區(qū)中,original緩沖區(qū)在腳本中很少使用,,其他三個(gè)經(jīng)常涉及到,,很多數(shù)據(jù)窗口函數(shù)都需要指定對(duì)這三個(gè)緩沖區(qū)中的哪個(gè)進(jìn)行操作,大多數(shù)情況下都使用缺省的緩沖區(qū)Primary!,。這三個(gè)緩沖區(qū),,除了保存相應(yīng)的數(shù)據(jù)外,都自動(dòng)維護(hù)這些數(shù)據(jù)的修改標(biāo)志,,它們之間的協(xié)作也是自動(dòng)維護(hù)的,。例如,當(dāng)使用過(guò)濾函數(shù)時(shí),,沒(méi)有通過(guò)過(guò)濾規(guī)則的數(shù)據(jù)自動(dòng)從Primary緩存區(qū)移送到Filter緩存區(qū),;執(zhí)行刪除操作時(shí),數(shù)據(jù)自動(dòng)從Primary緩存區(qū)移送到Delete緩存區(qū),。所有這些數(shù)據(jù)的移送無(wú)需腳本的干預(yù),,只管使用相應(yīng)的函數(shù)即可。 ■DWBuffer Primary! 0 Delete! 1 Filter! 2 ■DWItemStatus NotModified! 0 DataModified! 1 New! 2 NewModified! 3 ■編輯控件 和數(shù)據(jù)窗口控件打交道都是通過(guò)編輯控件進(jìn)行的,。在數(shù)據(jù)窗口中錄入數(shù)據(jù),、修改數(shù)據(jù),實(shí)際上是在修改單元上的編輯控件中的內(nèi)容,。當(dāng)編輯控件移動(dòng)到另外單元上之前,要對(duì)編輯控件中的數(shù)據(jù)進(jìn)行校驗(yàn),,如果能通過(guò)字段的校驗(yàn)規(guī)則,,就保存到字段中。編輯控件是可以移動(dòng)的,,需要編輯哪個(gè)單元,,編輯控件就移動(dòng)到哪個(gè)單元上,接受輸入或者修改,。 編輯控件在沒(méi)有離開(kāi)當(dāng)前字段時(shí),,用戶錄入或者修改的數(shù)據(jù)就不會(huì)被保存到字段中,如何確保在數(shù)據(jù)窗口失去焦點(diǎn)時(shí),,最后位置上編輯框中的內(nèi)容不被遺漏呢,?前面介紹了在數(shù)據(jù)窗口的LoseFocus事件中編寫(xiě)如下腳本: this.AcceptText() 這個(gè)方法在很多情況下能解決該問(wèn)題。美中不足的是,,如果編輯框中的內(nèi)容不能通過(guò)字段的校驗(yàn)規(guī)則,,有時(shí)會(huì)顯示兩次錯(cuò)誤信息窗口。造成兩個(gè)錯(cuò)誤信息窗口,,往往是在選擇其他單元時(shí)發(fā)生,,在數(shù)據(jù)窗口失去焦點(diǎn)之前(如單擊“保存”按鈕等)只會(huì)顯示一個(gè)錯(cuò)誤信息窗口,。用戶選擇其他單元時(shí),編輯框中的數(shù)據(jù)開(kāi)始進(jìn)行校驗(yàn),,不能通過(guò)校驗(yàn)規(guī)則,,顯示校驗(yàn)錯(cuò)誤信息,在顯示校驗(yàn)錯(cuò)誤信息時(shí)數(shù)據(jù)窗口失去焦點(diǎn),,觸發(fā)數(shù)據(jù)窗口的LoseFocus事件執(zhí)行AcceptText函數(shù),,又一次顯示校驗(yàn)錯(cuò)誤窗口。 所以,,顯示兩次校驗(yàn)錯(cuò)誤窗口的原因是LoseFocus事件中的AcceptText函數(shù)造成的,。可以想法讓該函數(shù)在這種情況下不執(zhí)行,。為此定義一個(gè)實(shí)例變量: Boolean ib_accept = True 該變量用來(lái)表示是否正確通過(guò)了校驗(yàn),,然后將LoseFocus中的腳本改成下面的腳本: If ib_accept Then This.AcceptText() Else ib_accept = true End If 在數(shù)據(jù)窗口的ItemError事件中編寫(xiě)腳本: ib_accept = False 這樣就可以解決顯示兩個(gè)校驗(yàn)錯(cuò)誤信息窗口了,并且不會(huì)遺漏最后一個(gè)編輯框中的內(nèi)容,。 *當(dāng)在某個(gè)單元中修改或者錄入數(shù)據(jù)后,,編輯框要離開(kāi)時(shí),要進(jìn)行4個(gè)校驗(yàn)步驟,,前面兩個(gè)步驟由PowerBuilder完成,,后面兩個(gè)由開(kāi)發(fā)者編寫(xiě)。 (1)看數(shù)據(jù)和編輯前相比是否發(fā)生了改變,,沒(méi)有改變則不做任何處理,。 (2)檢查測(cè)試此值是否違反了任何一個(gè)在字段上定義的有效性校驗(yàn)規(guī)則,違反則拒絕接受此值,,并觸發(fā)ItemError事件,。 (3)檢查此值是否與編輯前真的不同,沒(méi)有改變則終止有效性校驗(yàn),。 (4)檢查開(kāi)發(fā)人員在ItemChanged事件中編寫(xiě)的腳本,。具體的發(fā)生情況取決于分配給被稱為動(dòng)作代碼的值。 ■讀取和設(shè)置數(shù)據(jù) 讀?。?br>1,、使用函數(shù) dw_1.getitemX() 2、直接使用數(shù)據(jù)窗口對(duì)象屬性來(lái)讀取數(shù)據(jù) dw_1.object.data.primary.current[row,column] 該語(yǔ)句的格式是: dwcontrol.object.data[buffer[.whichvalue]][row,column] dwcontrol是數(shù)據(jù)窗口控件名稱,。 whichvalue既可以是current(缺省值),,也可以是original。這樣就允許用戶訪問(wèn)一個(gè)列的初始值或當(dāng)前值,。 row和column是要訪問(wèn)的單元所在的行號(hào)及列號(hào),。 object、data是保留字,,buffer是緩存區(qū)的名稱,,有Delete,、Primary、Filter,。 這種引用方法速度比較快,,尤其讀取大量數(shù)據(jù)時(shí)。 設(shè)置: 使用函數(shù) SetItem() SetText()
|