荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 数据窗口横向滚动时用PB锁定某列
发信站: BBS 荔园晨风站 (Thu Jan 21 23:09:45 1999), 转信


一、问题的提出
    在开发应用系统的过程中,当处理数据查询时,人们通常将查询的
结果以二维表的形式输出到一个窗口中,通过对这个窗口的操作来浏
览数据。这种窗口通常是可以横向滚动和纵向滚动的。因此即使表的
长度和宽度大于窗口的长度和宽度,也可以通过窗口在横向和纵向上
的滚动,来实现对整张表的浏览。
    数据窗口作横向向右滚动时,表右部各列的内容出现在窗口中,而
表左部的列则被滚出窗口之外看不到。在实际情况中,表的左部往往
含有关键字段所在的列(如人事花名册中的姓名、编号等),我们希望
这些列的位置在数据窗口横向滚动时是被锁定的。目前比较流行的几
种开发工具,如Foxpro、PowerBuilder等都没有直接提供数据窗口横
向滚动时锁定列的功能。
    笔者在处理此类问题时,充分利用了PowerBuilder面向对象及事
件驱动的特性,找到了一条解决问题的方法。

    二、基本思想
    实现数据窗口横向滚动时锁定某列,其基本思路为:将数据窗口一
分为二,将要锁定的列放在第一个数据窗口中,该数据窗口不具有横向
和纵向滚动条;其余的列放在第二个数据窗口中,并使该数据窗口具有
横向滚动条。另外生成一个不依赖于任何数据窗口的纵向滚动条对象
,赋予该对象相应各种事件的代码,以实现两窗口在纵向上的同步滚动
。将两个数据窗口、纵向滚动条拼接在一起,通过调整各对象的外部
形状及边框属性,使它们看起来如同一个数据窗口。当需要横向滚动
时,操纵横向滚动条,这时第二个数据窗口横向滚动,第一个数据窗口
不动;操纵纵向滚动条时,两个数据窗口在纵向上同步滚动。这样就达
到了实现数据窗口横向滚动时锁定某列的目的。

    三、实现方法
    假设要浏览的数据来源表tl(c1,c2,…,cn),表tl中c1为要锁定的
列。采用PowerBuildr  4.0为开发工具,具体实现步骤如下:

    1.利用PB的数据窗口画笔生成数据窗口对象dw-1,dw-1中的数据
来源为表t1中的列c1。
    2.生成数据窗口对象dw-2,dw-2的数据来源为表t1中的c2,…,cn

    3.利用PB的窗口画笔生成窗口对象w-browse。将数据窗口对象dw
-1、dw-2放入w-brows e中作为w-browse的控件,使dw-1不具有任何滚
动条,使dw-2仅具有横向滚动条。
    4.在窗口w-browse上生成一个纵向滚动控件vsb-1,为vsb-1相应
各种事件编写代码,以实现数据窗口dw-1和dw-2的纵向同步滚动。vsb
-1的代码如下:
    事件line down(点中向下箭头):
    dw-1.scrollnextrow()
    dw-2.scrollnextrow()
    事件line up(点中向上箭头):
    dw-1.scrollpriorrow()
    dw-2.scrollpriorrow()
    事件page down(点中滚动钮下部的开放空间):
    dw-1.scrollnextpage()
    dw-2.scrollnextpage()
    事件page up(点中滚动钮上部的开放空间):
    dw-1.scrollpriorpage()
    dw-2.scrollpriorpage()
    其它事件的代码这里从略。

    5.将dw-1、dw-2、vsb-1拼接在一起,通过调整各控件的形状及边
框属性,使它们从外观上看起来像一个数据窗口。

    6.为窗口w-browse的open事件加上完成dw-1、dw-2数据检索的代
码。
    7.完成窗口w-browse的制作,将它加入到应用程序中。
    四、结果
    笔者在几个应用系统的开发过程中,采用了上述方法,实现了数据
窗口作横向滚动时锁定某个列,而作纵向滚动时所有列同步滚动,收到
了比较满意的效果。上述方法简单实用,并且具有一定的通用性。

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店