pb自定义报表:如何在PB中同时 继承 多个用户自定义数据窗口对象

北京英诺公司技术部 逄新利

---- 问题提出

---- 我公司在开发医院信息管理系统过程中,由于系统庞大,遇到这样个棘手问题: 我们制作了若干个用户自定义数据窗口对象, 每个对象中封装了个独立功能, 如: 数据窗口排序功能,用户自定义列校验功能,下拉数据窗口快速录入功能,大文本录入功能,回车到下列功能等等, 共12个功能对象, 由区别人制作. 我们需要任意选取其中某几个功能对象做为祖先继承, 由于PB不允许个对象同时继承区别祖先,且祖先旦确定, 就不允许改变. 如果将这12个用户自定义数据窗口对象功能全部封装到个用户自定义数据窗口对象中, 虽然能解决继承问题, 但是该对象会很庞大,对象内部逻辑变得更复杂, 更难以维护,些在时用不上功能, 势必会在运行时消耗更多系统资源. 既然继承路走不通, 笔者就想出了个对象变量引用思路方法.

---- 解决问题思路

---- 首先笔者引入了 2个概念(指用户定义数据窗口对象):

---- 1. 基本功能对象: 具有单功能,独立,用户自定义对象.

---- 2. 中间层对象: 把自己捕获到事件以某种方式传递给基本功能对象例子变量, 以完成对基本功能对象相应事件脚本. 被继承, 但不继承任何其它对象.

---- 另做个用户自定义数据窗口对象,它不继承任何对象, 称的为中间层对象, 在中间层对象中为每个需要用到基本功能对象声明个例子对象变量, 在中间层对象事件中去例子对象相应事件. 使用时继承中间层对象, 以完成对基本对象选择和.(见图)

---- 实现举例:

---- 1. 基本功能对象制作:

---- 新建 2个数据窗口用户对象, 分别命名为: Uo_DwA, Uo_DwB . 在Uo_DwA Clicked 事件中写行脚本:

---- MessageBox ( ' Uo_DwA ' , ' Uo_DwA 单击事件')

---- 在Uo_DwB Clicked 事件中写行脚本:

---- MessageBox ( ' Uo_DwB ' , ' Uo_DwB 单击事件')

---- 2. 中间层对象制作:

---- 2.1新建个数据窗口用户对象, 命名为 Uo_DwInterlayer .

---- 2.2为中间层对象声明 2个例子变量:

---- GraphicObject Igo_BaseDwObject //每个元素是个基本对象例子引用 Integer Ii_BaseDwObjectNumber //保存元素个数.

---- 2.3. 加个用来注册对象, 用来注册基本功能对象. Uf_Register (GraphicObject a_obj , DataWindow adw_object)

---- 内容:

Long Ll_Circulater
Ii_BaseDwObjectNumber = UpperBound (A_Obj)
FOR Ll_Circulater = 1 TO ii_basedwobjectnumber
Igo_BaseDwObject[Ll_Circulater] =
A_Obj[Ll_Circulater]
// 下行脚本用来注册基本功能对象中例子变量
Idw_THIS (介绍说明见下文)
//Igo_BaseDwObject[Ll_Circulater].Function
Dynamic Uf_RegisterDwo ( Adw_Object)
END FOR
Return


---- 2.4为中间层对象中加入每个基本功能对象拥有用户自定义事件, 在中间层对象每个事件中加入如下脚本(事件Clicked):
Long Ll_Circulater
//被注册过每个基本功能对象相同事件脚本
FOR Ll_Circulater = 1 TO Ii_BaseDwObjectNumber
//如果当前事件为EditChanged , 则把下行脚本中
Clicked(xpos , ypos , row , dwo) 部分替换为
EditChanged(row,dwo,data)
Igo_BaseDwObject [Ll_Circulater].Event
Dynamic Trigger Clicked (xpos , ypos , row , dwo)
END FOR
Return

---- 3. 新建个窗口, 命名为W_TestInterlayer . 在窗口中放置中间层对象: Uo_DwInterlayer . 默认Control控件名: Dw_1. 然后在Control控件Dw_1Constructor 事件中对需要引用基本功能对象进行注册, 即可实现引用基本功能对象. 基本功能对象可以是任意个. 在Dw_1 Constructor 事件中加入如下脚本:
//注册基础数据窗口对象
GraphicObject Lgo_BaseDwObject   
  //声明个可变长度维对象

//建立对象元素例子,  以便对Uo_DwA进行引用
Lgo_BaseDwObject[1] = Create Uo_DwA

//建立对象元素例子,  以便对Uo_DwB进行引用
Lgo_BaseDwObject[2] = Create Uo_DwB   //

//用中间层注册对象和本数据窗口对象.
Uf_Register ( Lgo_BaseDwObject ,THIS)
Return

---- 4. 运行窗口W_TestInterlayer , 单击 DW_1 , 会依次弹出2个消息框.
---- 在实际应用中, 由于基本功能对象是被引用而非继承, 所以基本功能对象脚本中代词THIS为空, 为此:

---- 需要在基本功能对象中声明个例子变量: DataWindow Idw_THIS .

---- 加个注册用来为例子变量Idw_THIS 赋值. 名称 Uf_RegisterDwo (DataWindow , Adw_THIS) . 内容:

Idw_THIS = Adw_THIS
Return

---- 对象中所有对数据窗口操作前都必须加上 “Idw_THIS.”, 进行完全路径引用.
---- 这些基本功能对象被继承过,为了向前兼容, 所以要在它们Constructor 事件中写入如下脚本:

IF Not IsValid (Idw_This) THEN
Idw_This = THIS
END IF
Retrun

---- 以便对例子变量Idw_THIS 自动赋值. 
Tags:  阻止对象继承权限 pb继承 oracle自定义对象 pb自定义报表

延伸阅读

最新评论

发表评论