登录注册
上海交通大学论坛 > 数据库 > 浏览当前帖子 手机版 关闭左侧栏
生成可重用的数据窗口
返回本版】  【发表帖子】  【回复帖子 浏览量  8928      回帖数 0
liuming000    等级  

楼主 发表于  2012/5/21 18:39:19    编 辑   


 
  许多人在学习了窗口的继承以后,就认为掌握了PowerBuilder的继 
承技术了。实际上,P owerBuilder中继承的作用远不止这些。这里我 
们介绍利用继承的方法,设计一个可重用的数据窗口祖先。通过本节 
的介绍您将看到继承技术在数据窗口上的运用,体会它在这一方面发 
挥出灵活性和强大功能。 
    数据窗口的继承通过自定义用户对象的方式扩展数据窗口控件, 
使该控件功能更为强大。在本节后面的部分中,我们把数据窗口控件 
的用户对象祖先叫作dwa_main。也可以命名为任何别的想要的名字。 
    我们曾在以前的文章中介绍过,数据窗口对象是不具有继承性的, 
但是我们可以利用具有可继承特性的数据窗口用户对象来拓展PowerB 
uilder所提供的数据窗口的基本属性。这里要注意的是所继承的是数 
据窗口控件,而不是数据窗口对象。 
    为什么应该使用用户对象数据窗口,而不用PowerBuilder提供的 
呢?当您将一个数据窗口控件放到窗口上时,您所做的是继承一个基于 
系统事先定义好的数据窗口类以此来创建一个新的数据窗口。这意味 
着,给您的数据窗口增加功能方法只有一个,就是在这个数据窗口控件 
的事件语句中增加代码。您不能为这个数据窗口定义您自己的函数, 
您也不能给这个数据窗口增加另外的属性。如果您认为有一些常用的 
操作需要封装,您只能将这些加入数据窗口所在的窗口。如果您希望 
两个不同的数据窗口上有相同的行为,唯一的方法就是重写代码。这 
显然不是好的面向对象的编程风格。解决上述问题的方法就是定义一 
个数据窗口用户对象, 这非常容易做到。您只要打开用户对象绘制器 
,选择"新建"和"标准可视化用户对象";然后选择数据窗口作为类型。 
您就可以看见一个小白框。这就是您的数据窗口控制,您可将它以dw  
a_main的名字存盘。dwa_main将是您的最底层的数据窗口祖先。 
    现在,当您在窗口上需使用数据窗口时,您不要将PowerBuilder内 
部的数据窗口放到窗口上了,而是放上您新创建的数据窗口用户对象 
。将这个数据窗口的名字取为dw_1。使用用户对象来替代系统本身的 
数据窗口以后,您仍可以像以前那样使用数据窗口的所有函数、属性 
和事件。不同的是,您现在可以在您的数据窗口祖先dwa_main中加入 
实例或共享的变量、事件和函数。因为您在窗口中用到的数据窗口都 
继承了祖先数据窗口dwa_main,所以所增加的一切都可以在每一个数 
据窗口控件中存在。 
    如果您认为这种方法可行,决定以后的设计都采用用户对象来替 
代PowerBuilder本身的数据窗口,那么您可能还会遇到这样一个问题
如何在已编完的代码中用上这个对象。这里我们介绍一种办法:将您 
的数据窗体控件的祖先对象由Datawindow改变成为dwa_main。在libr 
 ary画笔中输出含有数据窗口的窗口或用户对象,修改几个引用,然后 
将它再输入到您的库中。注意在做这些操作之前,先做一下备份,以备 
操作失误时恢复。 
    在您输出的窗口或自定义的可视化用户对象中,您可以看到类似 
下面的代码
    type dw_1 from Datawindow within w_anc我们曾在以前的文章 
中介绍过,这行代码的作用是告诉PowerBuilder编译器您定义了一个 
从数据窗口继承下来的名为dw_1的数据窗口, 因此只要将Datawindow 
改为dwa_main,就可以使dw_1继承的对象由系统内部的数据窗口控件 

改为dwa_main。 
    如果您打算让所有在您的机器上进行开发的□□人也使用dwa_ma 
in对象,您还可以自定义窗口工具条,在工具条中加入一个新图标来代 
表数据窗口用户对象的控件。在定义工具条的对话框中,要求填入dwa 
_main这一用户对象,并设置要得到的工具条文本和帮助信息。图1 

    数据窗口的构造事件 
    一般情况下,如果某些代码在首次运行时执行初始化操作,应该将 
它们放在应用的open事件中;如果在窗口被打开时执行初始化操作,则 
应将它们放在窗口的open事件中。同样,如果想让代码在数据窗口被" 
打开"时执行初始化操作,应该使用数据窗口的构造事件,因为当数据 
窗口创建时构造事件被激发。事实上,在窗口打开之前其上的每一个 
控件都会激发自身的构造事件。假设窗口上有三个控件,它们的顺序 
为cb_ok、sle_1和dw_1。如果用OpenSheet()函数将该窗口作为表单 
打开,将得到以下的事件序列:cb_ok::constructorsle_1::construct 
o rdw_1::constructorwindow::openwindow::showwindow::resizewi 
ndow::activatecb_ok:getfocus 
    如果您打开一个SDI窗口,您将得到以下的事件序列:cb_ok::cons 
tructorsle_1::const ructordw_1::constructorwindow::openwindo 
w::activatecb_ok::getfocuswindow::showw indow::resize 
    需要说明的是,窗体本身open事件中的初始化操作是在所有控件 
的构造事件被激发后才执行的。如果用OpenSheetWithParm()或OpenW 
ithParm()函数向窗口传递数据,那么在构造事件中使用消息对象时就 
要特别小心。如果其中的任何一个构造事件修改了消息对象的Strin  
gParm、DoubleParm或PowerObjectParm属性,open事件中使用的消息 
对象就不能得到正确的信息。 
    我们对每一个数据窗口的构造事件编程时,总是要反复地键入 
    dw_1.SetTransObject(SQLCA) 
    事实上,我们的应用中有90%以上是使用SQLCA这个事务对象,如果 
我们采用用户对象的设计方法,我们就可以把这一行代码写在用户对 
象之中,而不必在每次用数据窗口时都要键入该行代码。 
    Event:Constructor 
    Object:dwa_main 
    SetTransObject(SQLCA) 
    每一次调用这个用户对象,我们缺省的就是使用SQLCA这个事务。 
我们完全不必担心这样做会出现什么问题。因为如果使用外部数据窗 
口,PowerBuilder是根本不会理会曾经执行过的任何事务对象;如果使 
用的事务不是SQLCA,那么只需在继承后的数据窗口中,再次调用Set T 
ransObject()这个函数,将用到的事务对象引入,系统就会将SQLCA这 
个对象覆盖 
1
表情
所有内容均为会员自愿发表,并不代表本站立场.
论坛帮助 会员认证删帖申请 联系我们