Database 版 (精华区)
发信人: lizhenguo (夸父·追日), 信区: Database
标 题: 16
发信站: 哈工大紫丁香 (2001年09月26日18:43:33 星期三), 站内信件
bbs.hit.edu.cn
PowerBuilder专栏
[回到开始][上一层][下一篇]
----------------------------------------------------------------------------
----
发信人: carsam (独自偷...), 信区: Database
标 题: PowerBuilder应用开发系列讲座(16)
发信站: 逸仙时空 Yat-sen Channel (Wed Jan 5 11:38:44 2000), 站内信件
PowerBuilder应用开发系列讲座(16)
----------------------------------------------------------------------------
----
生成可重用的数据窗口
许多人在学习了窗口的继承以后,就认为掌握了PowerBuilder的继承技术了。实际上,Po
werBuilder中继承的作用远不止这些。这里我们介绍利用继承的方法,设计一个可重用的
数据窗口祖先。通过本节的介绍您将看到继承技术在数据窗口上的运用,体会它在这一方
面发挥出灵活性和强大功能。
数据窗口的继承通过自定义用户对象的方式扩展数据窗口控件,使该控件功能更为强大。
在本节后面的部分中,我们把数据窗口控件的用户对象祖先叫作dwa_main。也可以命名为
任何别的想要的名字。
我们曾在以前的文章中介绍过,数据窗口对象是不具有继承性的,但是我们可以利用具有
可继承特性的数据窗口用户对象来拓展PowerBuilder所提供的数据窗口的基本属性。这
里要注意的是所继承的是数据窗口控件,而不是数据窗口对象。
为什么应该使用用户对象数据窗口,而不用PowerBuilder提供的呢?当您将一个数据窗口
控件放到窗口上时,您所做的是继承一个基于系统事先定义好的数据窗口类以此来创建一
个新的数据窗口。这意味着,给您的数据窗口增加功能方法只有一个,就是在这个数据窗
口控件的事件语句中增加代码。您不能为这个数据窗口定义您自己的函数,您也不能给这
个数据窗口增加另外的属性。如果您认为有一些常用的操作需要封装,您只能将这些加入
数据窗口所在的窗口。如果您希望两个不同的数据窗口上有相同的行为,唯一的方法就是
重写代码。这显然不是好的面向对象的编程风格。解决上述问题的方法就是定义一个数
据窗口用户对象,这非常容易做到。您只要打开用户对象绘制器,选择"新建"和"标准可视
化用户对象";然后选择数据窗口作为类型。您就可以看见一个小白框。这就是您的数据
窗口控制,您可将它以dwa_main的名字存盘。dwa_main将是您的最底层的数据窗口祖先。
现在,当您在窗口上需使用数据窗口时,您不要将PowerBuilder内部的数据窗口放到窗口
上了,而是放上您新创建的数据窗口用户对象。将这个数据窗口的名字取为dw_1。使用用
户对象来替代系统本身的数据窗口以后,您仍可以像以前那样使用数据窗口的所有函数、
属性和事件。不同的是,您现在可以在您的数据窗口祖先dwa_main中加入实例或共享的变
量、事件和函数。因为您在窗口中用到的数据窗口都继承了祖先数据窗口dwa_main,所以
所增加的一切都可以在每一个数据窗口控件中存在。
如果您认为这种方法可行,决定以后的设计都采用用户对象来替代PowerBuilder本身的数
据窗口,那么您可能还会遇到这样一个问题:如何在已编完的代码中用上这个对象。这里
我们介绍一种办法:将您的数据窗体控件的祖先对象由Datawindow改变成为dwa_main。在
library画笔中输出含有数据窗口的窗口或用户对象,修改几个引用,然后将它再输入到您
的库中。注意在做这些操作之前,先做一下备份,以备操作失误时恢复。
在您输出的窗口或自定义的可视化用户对象中,您可以看到类似下面的代码:
type dw_1 from Datawindow within w_anc我们曾在以前的文章中介绍过,这行代码的作
用是告诉PowerBuilder编译器您定义了一个从数据窗口继承下来的名为dw_1的数据窗口
,因此只要将Datawindow改为dwa_main,就可以使dw_1继承的对象由系统内部的数据窗口
控件改为dwa_main。
如果您打算让所有在您的机器上进行开发的其他人也使用dwa_main对象,您还可以自定义
窗口工具条,在工具条中加入一个新图标来代表数据窗口用户对象的控件。在定义工具条
的对话框中,要求填入dwa_main这一用户对象,并设置要得到的工具条文本和帮助信息。
数据窗口的构造事件
一般情况下,如果某些代码在首次运行时执行初始化操作,应该将它们放在应用的open事
件中;如果在窗口被打开时执行初始化操作,则应将它们放在窗口的open事件中。同样,如
果想让代码在数据窗口被"打开"时执行初始化操作,应该使用数据窗口的构造事件,因为
当数据窗口创建时构造事件被激发。事实上,在窗口打开之前其上的每一个控件都会激发
自身的构造事件。假设窗口上有三个控件,它们的顺序为cb_ok、sle_1和dw_1。如果用O
penSheet()函数将该窗口作为表单打开,将得到以下的事件序列:
cb_ok::constructor
sle_1::constructor
dw_1::constructor
window::open
window::show
window::resize
window::activate
cb_ok::getfocus
如果您打开一个SDI窗口,您将得到以下的事件序列:
cb_ok::constructor
sle_1::constructor
dw_1::constructor
window::open
window::activate
cb_ok::getfocus
window::show
window::resize
需要说明的是,窗体本身open事件中的初始化操作是在所有控件的构造事件被激发后才执
行的。如果用OpenSheetWithParm()或OpenWithParm()函数向窗口传递数据,那么在构造
事件中使用消息对象时就要特别小心。如果其中的任何一个构造事件修改了消息对象的
StringParm、DoubleParm或PowerObjectParm属性,open事件中使用的消息对象就不能得
到正确的信息。
我们对每一个数据窗口的构造事件编程时,总是要反复地键入:
dw_1.SetTransObject(SQLCA)
事实上,我们的应用中有90%以上是使用SQLCA这个事务对象,如果我们采用用户对象的设
计方法,我们就可以把这一行代码写在用户对象之中,而不必在每次用数据窗口时都要键
入该行代码。
Event:Constructor
Object:dwa_main
SetTransObject(SQLCA)
每一次调用这个用户对象,我们缺省的就是使用SQLCA这个事务。我们完全不必担心这样
做会出现什么问题。因为如果使用外部数据窗口,PowerBuilder是根本不会理会曾经执行
过的任何事务对象;如果使用的事务不是SQLCA,那么只需在继承后的数据窗口中,再次调
用SetTransObject()这个函数,将用到的事务对象引入,系统就会将SQLCA这个对象覆盖。
--
我想自由自在地飞......
飞过大海...
飞过沙漠...
飞翔在星的夜空......
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 202.116.90.29]
----------------------------------------------------------------------------
----
[回到开始][上一层][下一篇]
欢迎访问Cterm主页
--
《列子·汤问》:“夸父不量力,欲追日影,逐之于隅谷之际。渴欲 得饮,赴饮河渭
。河渭不足,将走北饮大泽。未至,道渴而死。”
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.637毫秒