数据窗口横向滚动时用PB锁定某列

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
 

你可能感兴趣的:(PB)