資料視窗橫向滾動時用PB鎖定某列

秋高工作室發表於2016-03-23
1.
再談"資料視窗橫向滾動時用PB鎖定某列" 
--------------------------------------------------------------------------------
重慶大學計算機係資料知識工程研究室 (400044) 張洪偉

一、問題的提出
貴報1997年第39期H23版《資料視窗橫向滾動時用PB鎖定某列》一文講述了實現資料窗
口橫向滾動時鎖定某列的一種方法,具有較好的實用效果,但是這種方法也有一定的缺點。第
一,用該方法鎖定的列是由程式預先決定的,也即是"靜"態的,在程式執行時無法改變。這樣
,當使用者需要在不同時刻鎖定不同的列時,便無法實施。第二,該方法是用程式實現的,包含了
比較複雜的工作。通過仔細實驗,筆者發現了兩種更為簡便的實現方法,可以無需程式設計或只需
簡單程式設計就可實現"動"態地鎖定某些列。
二、實現方法
假設用於顯示資料的資料視窗為dw-1。
方法一:在PowerBuilder整合環境的資料視窗畫筆(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

相關文章