如何在PB中同时“继承”多个用户自定义数据窗口对象

转载 2012年03月31日 11:10:56

如何在PB中同时“继承”多个用户自定义数据窗口对象

(加入日期:2001-4-25)

保存文章至硬盘】【打印文章】【字体:

分享到: 0
北京英诺公司技术部 逄新利

---- 问题的提出

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

---- 解决问题的思路

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

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

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

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

---- 实现举例:

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

---- 新建二个数据窗口用户对象, 分别命名为: 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为中间层对象声明二个实例变量:

---- 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 . 默认控件名: Dw_1. 然后在控件Dw_1的Constructor 事件中对需要引用的基本功能对象进行注册, 即可实现引用基本功能对象的目的. 基本功能对象可以是任意个. 在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 自动赋值. 

相关文章推荐

【笨木头Cocos2d-x 042】一个函供应多个菜单回调——UserObject自定义数据

笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/596 正文:   1.Java的菜...

百度地图Api进阶教程-用户自定义数据(标记和搜索)7.html

body, html,#allmap {width: 100%;height: 100%;overflow: hidden;} #l-map{height:100%;width:78%;float:l...
  • sd0902
  • sd0902
  • 2013-01-07 20:11
  • 14678

apache mina : 用户自定义数据存储

从整体的设计与实现,每一次Netty都是在apache mina 之上的提升和优化, 也许会更加的简单方便。可以是因为先入为主的原因,总感觉apache mina实现的更加简单,容易上手学习。

在既有类中使用关联对象存放自定义数据

**在既有类中使用关联对象存放自定义数据** 有时需要在对象中存放相关信息。这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做,有时候类的实例可能...

iOS开发--开发细节(使用关联对象存取自定义数据)

为了方便使用我直接定义成了宏 如果想使用 可以直接粘过去 SF 和 openUrl 是必须要加的 //stringdefine StringFormat(_format,_arg) [NSS...

Head First Python 学习笔记-Chapter6:自定义数据对象:字典与类

本文将涉及到字典和类。字典可以有效地组织数据,可以将数据与名称关联(类似于Map),从而实现快速查找。另外,也可以自定义类来处理一些功能,通过为对象增加一些属性和方法完成所需的功能。

C++自定义数据类型之类和简单对象

类        类的定义:类是一种复杂的数据类型它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。因此,类具有对数据的抽象性,隐藏性和封装性。类是C++程序中最常用的自定义数据类型。 ...

HashSet中存方用户自定义数据类型数据,重写equals方法和hashCode方法

import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(St...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)