1.再談"資料視窗橫向滾動時用PB鎖定某列"
--------------------------------------------------------------------------------
重慶大學電腦係數據知識工程研究室 (400044) 張洪偉一、問題的提出
貴報1997年第39期H23版《資料視窗橫向滾動時用PB鎖定某列》一文講述了實現資料窗
口橫向滾動時鎖定某列的一種方法,具有較好的實用效果,但是這種方法也有一定的缺點。第
一,用該方法鎖定的列是由程式預先決定的,也即是"靜"態的,在程式運行時無法改變。這樣
,當使用者需要在不同時刻鎖定不同的列時,便無法實施。第二,該方法是用程式實現的,包含了
比較複雜的工作。通過仔細實驗,筆者發現了兩種更為簡便的實現方法,可以無需編程或只需
簡單編程就可實現"動"態地鎖定某些列。
二、實現方法
假設用於顯示資料的資料視窗為dw-1。
方法一:在PowerBuilderIntegration Environment的資料視窗畫筆(Datawindow Painter)中建立一資料
視窗控制項dw-1,將滑鼠移到該控制項上,單擊滑鼠右鍵,螢幕上將出現一彈出菜 單,選擇功能表項目
Style,再從串聯功能表中選中Hscroll Bar、Vscroll Bar、Hsplit Scrolling三項,這樣即可
完成所要求的功能。
運行應用時,資料視窗dw-1的橫向捲軸最左邊有一小空隙,將滑鼠移到該處,按住左鍵
不放,資料視窗中將有一"豎線"將資料視窗水平地一分為二,然後拖動滑鼠移動該"豎線"至所
需位置,資料視窗就被劃分為兩個貌似獨立的並列的資料顯示地區,從外觀上看,一個資料窗
口變成了與原資料視窗一樣的兩個資料顯示地區。當點按一個地區的橫向捲軸時,另一區
域的資料顯示保持不動;當點按任一地區的豎向捲軸時,兩個地區的顯示同步滾動。這樣用
戶便可將需鎖定的列(一列或多列)置於一個地區,而另一地區作橫向滾動,並且在程式運行過
程中使用者可隨意調節所需鎖定的列。
方法二:通過簡單編程也可實現上述效果,而且可以動態地禁止或允許這種效果。在Poe
rbuilder中,資料視窗有一屬性HsplitScroll,用於決定是否將一個資料視窗一分為二來顯示
資料。當它為TURE時,允許此功能;當它為FALSE時,禁止此功能。所以,當要允許此項鎖定功
能時,只需書寫一句dw-1.HsplitScroll=TRUE即可;當要禁止此項功能時,只需書寫一句d-1.
HsplitScroll=FALSE即可,實現起來非常簡便。
三、小結
上述兩種方法,克服了原文的兩個缺點,可動態按需鎖定相應列,實現起來非常靈活、簡
單,使用者操作起來也更方便。 2.鎖定某一列實現同Excel中的樣式
在Excel中,當列很多時,我們移動當前行到最後一項時,第一列就看不到了,那麼我們可以將第一列或者第一行的值鎖定,這樣,不管有多少行或者多少列我們都可以看到,以確保資料的準確性.這樣我們在pb中也很容易做到.具體代碼如下:
//鎖定的列為ID,資料視窗為dw_master
dw_master.HSplitScroll = True
dw_master.Object.DataWindow.HorizontalScrollSplit = dw_master.object.id.Width
dw_master.Object.DataWindow.HorizontalScrollPosition2 = dw_master.object.id.Width 3.在資料視窗的constructor事件裡寫:
dw_1.Object.DataWindow.HorizontalScrollSplit=integer(dw_1.describe("#1.width"))
在資料視窗的scrollhorizontal事件裡寫:
int i
if pane = 1 then
i = integer(this.OBJECT.datawindow.horizontalscrollposition2)
if i < 1 or isnull(i) then return
if scrollpos > 0 then
this.OBJECT.datawindow.horizontalScrollPosition = 0
end if
else
i = integer(this.Object.DataWindow.HorizontalScrollSplit)
if i < 1 or isnull(i) then return
if i > scrollpos then
this.OBJECT.datawindow.horizontalScrollPosition2 = i
end if
end if