Database 版 (精华区)
发信人: pine.bbs@sun20.nuaa.edu.cn (杆杆), 信区: cndatabase
标 题: [转载] 生成可重用的数据窗口
发信站: nuaabbs (Fri Apr 17 19:18:00 1998)
转信站: Lilac!ustcnews!nuaabbs
【 以下文字转载自 Program 讨论区 】
【 原文由 pipishi.bbs@bbs.nju.edu.cn 所发表 】
许多人在学习了窗口的继承以后,就认为掌握了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这
个对象覆盖
--
※ 来源:.南大小百合信息交换站 bbs.nju.edu.cn.[FROM: hsia.nju.edu.cn]
--
※ 转载:.Top Gun sun20.nuaa.edu.cn.[FROM: 202.119.71.141]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.875毫秒