跨平台可重用组件开发

翻译|其它|编辑:郝浩|2004-02-19 12:21:00.000|阅读 2990 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

摘 要 以Delphi 3.0C/S开发工具为例,介绍了可重用组件的开发过程,及转化开发好的组件为ActiveX控件的相关技术,使其能运行于网页上和其他开发工具上,从而创建跨平台可重用软件建筑模块,实现代码重用性。

关键词 组件;ActiveX控件;面向对象编程

0 前 言

利用可重用组件软件,是软件产业中的一个新的开发方向。在软件产业中,代码重用性日益受到重视。统计资料表明,软件维护阶段的花费占整个软件生存期花费的67%, 而且维护费用开支相当高。代码的重用性不仅可以降低维护的费用和难度,而且可以加快应用软件的开发速度。作为代码重用性的一个实现方式,可重用组件的开发成为目前各个可视化支撑系统开发公司的不懈追求,也是应用软件开发人员的共同目标。

开发组件的其他优点是可修改当前可视化组件的行为,使应用者在开发自己的应用软件时就能看到行为的变化。

开发跨平台组件,不仅可以运行于开发工具本身环境内,而且可以运行于支持ActiveX的开发工具环境内和网络上。比面向单一开发工具开发的组件更有优势。

由于软件变得更加复杂,特别是微软推出的ActiveX在软件界刮起的组件对象模型(COM)旋风,使用组件开发应用程序将成为深受人们喜爱的方法。

1 ActiveX在开发跨平台组件上的作用

组件的前身是动态链接库(DLL),DLL使我们能够用一种语言开发一个可以用于任何其他语言的过程库。DLL的另一个强大的功能是在运行期间被加载的,这使得我们能够将开发任务划分为一个个组件而不必开发并静态链接一个大型应用程序。

为了提供使对象能够与主应用程序通信的一种标准,微软原来引入了对象链接和嵌入(OLE)。原来规范的目标是提供一种途径,使应用程序,如Excel能够将电子表格嵌入到其他支持OLE标准的应用程序中。那时,人们认识到,OLE支持一种技术的基础,这种技术使得能够共享类属的对象,即组件对象模型(COM)。这种概念用于为OCX组件创建一种组件规范。这将我们带到了当前的标准ActiveX和ActiveX控件,OLE和OCX的发展最终形成了COM的顶尖产物。

可以将COM看作是在两块代码之间共享组件的二进制标准。COM根据对象可以完成的功能使得对象实现抽象化。对象可以完成的功能在其接口部分描述。接口就是对象可以实现的一组在逻辑上相关功能的访问方法。每个对象都拥有一个唯一的类ID(CLSID),它使用任意的一组接口。所有类必须具有IUNKNOWN接口,这个接口又可以被用于访问这个类支持的任何接口。这是一种功能强大的对象模型,因为它使应用程序能够在运行过程中确定任意一个对象是否可以完成某一项任务。

COM对象是通过几个方法来实现的。可以将COM对象编译成DLL或OCX,它们可以与调用应用程序在相同的进程空间中运行。COM对象还可以象编译过的可执行文件一样在它自己的进程空间中运行。利用分布式COM(DCOM),对象可以运行在不同的机器上,即可以运行在世界的任何位置。尽管COM对象的实现代码可能处于不同的进程中或不同的机器上,但COM对象系统服务去除了调用COM对象的复杂性。ActiveX组件是COM对象,这些对象实现了一套基本的接口,使组件能够被嵌入到可以主控ActiveX组件的应用程序中去。

2 开发组件对组件开发人员的要求

成功地开发和综合专用组件的关键是,它能够服从界面的各种需要和习惯,以及开发环境所期望的行为。专用组件是一个对象类,这个对象类是专用组件或其他组件的后代,这使它本身就服从基本需要的大部分,但除了这些基本功能外,组件还可以定义任意复杂的行为和可以显示任意丰富的属性集合提供给组件用户或者应用程序员。这些对组件的标准及基本行为的扩充是组件开发人员的责任。

组件开发难度大,对组件开发人员的要求相对较高,不仅要充分了解组件用户的需求,透彻了解有关的已有组件的限制或缺点,而且还要对面向对象编程(OOP)课题有相当深入的理解。

3 有关OOP概念

在对象Pascal类元素上的四层保护(Private,Protected,Public,Published)中,组件用户可以存取公共的和已发表的元素,而组件开发人员可以存取所有的元素。

将类元素声明为私有的,使类的界面与类的实现分开,这样在后来再对新组件修改时不影响客户代码。但这样也隐藏了类元素的细节,这与存取类实现的细节以及修改或增强其父类的提供的行为带来了不利。

为了摆脱这一困境,对象Pascal提供了保护界面。当组件开发人员创造了一个新组件时,他就存取了一个对象的保护界面,这个界面对组件用户是不可见的。存取控制的保护层恰恰给后继组件开发人员足够的存取权,以便通过可能的继承方法扩展或修改组件;类对外部世界或对组件保护的封装仍然保持没有析构,因此类封装的好处没有丢失。

4 开发定制组件过程

创建组件的方法有三种:1、通过创建组件模板创建一个新组件;2、从一已存在的专用类派生一个新类,创建一个新的组件;3、从非专用组件中派生一个新组件。通过创建组件模板创建一个新组件是最简单的一种方法,组件开发人员开发的代码将随用户对此组件的使用嵌入用户程序内,它只能改变或增强组件的很少的功能和属性值,而不能修改组件的参数或增加改变组件的属性,也不能够用于创建ActiveX组件,从而不能跨平台应用。后两种方法可以创建专用的较复杂的组件,且ActiveX支持通过OCX实现跨平台运行这些组件。

现以第三种方法为例开发一个根据公式显示图形的组件。

1)声明一个新组件类、创建一个新单元

打开Component菜单下new component对话框,选择类祖先TCustomControl,键入新类单元名称TMathPlot,选择好存储单元的路径和注册页面(本实例以缺省sample页面为例),单击Create Unit按钮。

2)安装并注册新组件

打开component下的install component对话框,选择单元PlotChart,选择Ok按钮,弹出Package对话框,接受编译,打开DELPHI IDE上的sample页面会发现新组件已被注册和安装。

3)扩展组件功能

添加新的事件类型:

TmathFunc=procedure(X:single;var Y:single)

添加私有成员:

FRangeMinX:integer;

FRangeMaxX:integer;

FRangeMinY:integer;

FRangeMaxY:integer;

FuserMathFunc:Tmath;

添加保护成员:

procedure Paint:override;

添加共有成员:

constructor Create (AOwner:TComponent);override;

添加发表属性(可视化属性):

property RangeMinX:integer Read FrangeMin X Write FrangeMinX;

property RangeMaxX:integer Read FrangeMax X Write FrangeMaxX;

property RangeMinY:integer Read FrangeMin Y Write FrangeMinY;

property RangeMaxY:integer Read FrangeMax Y Write FrangeMaxY;

property OnMathFunc:TMathPlot Read FuserMathFunc Write FuserMathFune;

property With default 50;

property Height default 50;

添加实现过程:

constructor TMathPlot.Create (AOwner:TComponent);

begin

inherited Create (AOwner:TComponent);

Height:=50;

Width:=50;

FRangeMaxX:=1;

FRangeMaxY:=1;

end;

Procedure TMathPlot.Paint;

Var

X,Y:integer;

RX,RY:single;

Begin

Inherited Paint;

Canvas.Rectangle(0,0,Width,Height);

For X:=1 to Width do

Begin

RX:=FrangeMinX+(((FrangeMaxX-FrangeMinX)/Width)*X);

IF assigned (FuserMathFunc) then //调用事件

FuserMathFunc (RX,RY);

Else

Ry:=0

Y:=round ((1((RYFrangeMinX)/(FrangeMaxY-FrangeMinY)))*Height);

If X=1 then

Canvas.MoveTo(X,Y)

Else

Canvas.LineTo(X,Y)

End;

End;

在使用该组件时,只需在对象观察器中单击方法OnMathFunc,键入含有X,Y变量的参数的函数,就可画出图形,例如

Y:=X*X、Y:=sin(X)等。

5 转化为ActiveX控件

选择File菜单下的New菜单项,单击ActiveX页,选中ActiveX库。Delphi就建立了DLL框架。重新进入ActiveX页,选择ActiveX控件。在弹出的对话框中选择TmathPlot类,键入新的控件名TmathActiveX,单击OK转化完毕。

转化完毕后,可以对ActiveX控件直接编程,利用Edit菜单下的Add to Interface添加属性,方法等;在用Delphi开发的组件转化ActiveX组件时,需要注意两点:

1、数据必须遵守OLE类型。如本文中的Single类型不能用real类型;

2、祖先类必须有被ActiveX支持的能力。在我们开发本文组件时,没有用TgraphicControl,而是用了TcustomControl类,原因是后者有窗口句柄,可以为ActiveX支持。

6 把ActiveX组件导入到其他语言中

选择Delphi中Run菜单下的Register ActiveX Server,注册ActiveX控件。本文以Visual Basic 5.0为例说明。启动Visual Basic 5.0,从Project菜单选择References。Visual Basic显示References对话框,选中TmthActiveX,单击Ok,TmathActiveX控件出现在Visual Basic工具箱中,就可以像用其它控件一样使用。

7 结论

可重用组件的发现是通过建立大量应用程序,并抽取这些应用程序所共有的或大部分应用程序所共有的模式的处理过程获得的。可重用组件的开发是渐进的、逐步优化的过程,直到使结果建筑模块变得逐渐自治和逐渐可重用。开发的过程是辛苦的,由于转向了代码行的开发环境,没有了许多可视化界面。但这种付出是值得的,因为其潜在的回报是巨大的。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP