很多時候,DataWindow 的設計目的在於監視列表的資料,尤其是會自動定期更新的列表。
譬如說,我有一個紀錄狀態的 Table ,裡面紀錄的狀態一直在改變,
因此,我會需要一個 DataWindow 定時的去 Retrieve 這些紀錄資料,並將它顯示到畫面上,
讓管理人員可以一目了然。
當然,你會說這有什麼困難?用一個 DataWindow 加上 Timer 就可以解決啦!
但如果,這些資料多到螢幕容納不下時會發生什麼事?
如果你設定必需2秒更新一次又會怎麼樣?
事實是,當管理人員下拉(Scroll)該 DataWindow 以便檢視下方被遮住的資料時,
由於 Retrieve 的關係,所以畫面又跳回第一筆 Row 啦!!!
管理人員會落入不勝其擾的拉下又跳回、拉下又跳回的無間地獄了。
也許加大 Timer 間隔是個方法,不過對於資料的即時性就大打折扣了,
尤其是特別重要的資料更是如此,例如即時股票的變化.....
所以需要一點小技巧來達成這樣的運作模式,利用下面的程式碼技巧可以避開 DataWindow 的顯示畫面 reflash 動作:
DataStore lds_src
Long ll_row , ll_rcount
Integer li_col , li_ccount
//建立一個資料倉儲並使之與資料視窗的來源物件相同
lds_src = Create DataStore
lds_src.DataObject = dw_1.DataStore
lds_src.SetTransObject(SQLCA)
//由資料倉儲來讀取資料
lds_src.Retrieve()
ll_rcount = lds_src.RowCount()
li_ccount = integer(dw_1.Object.DataWindow.Column.Count)
for ll_row = 1 to ll_rcount
for li_col = 1 to li_ccount
//複製資料蓋掉畫面上的資料
dw_1.Object.Data[ll_row , li_col] = lds_src.Object.Data[ll_row , li_col]
next
next
//移除畫面上多餘的資料(如果有的話)
if ll_row <= dw_1.RowCount() then
do while dw_1.RowCount() > lds_src.RowCount()
dw_1.DeleteRow(dw_1.RowCount())
loop
end if
Destroy lds_src
這段程式碼放在讀取的 function 裡面執行,
當然為了提高效率,你可以把淡藍色的部份放在該 window 的 open 事件裡面,
只是 lds_src 就必須定義在 Instance 變數區內以方便呼叫使用,
而粉色的部份就放到 window 的 close 事件去處理就好了。