|
登录注册 |
☦ 上海交通大学论坛 > 数据库 > 浏览当前帖子 | 手机版 关闭左侧栏 |
生成可重用的数据窗口 |
【返回本版】 【发表帖子】 【回复帖子】 | 浏览量 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 |
论坛帮助 会员认证删帖申请 联系我们 |