说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

DELPHI构件制作方法

HTML文档下载 WORD文档下载 PDF文档下载
DELPHI构件制作方法

Delphi作为RAD工具,以其快速编译和友好的可视化界面受到广泛欢迎。Delphi提供了很多现成构件,而且随着版本更新不断增加新构件。另外还可以买到第三方开发的特色构件,或从因特网下载免费构件。这些构件足以支持一般应用系统开发。但应用开发人员仍有必要自己制作构件。

采用构件形式可以把对象严密封装,并加上一层直观外壳,有利于软件调试和代码重用。开发群体以构件为功能单位分工协作,比较容易实现工程化管理,从软件规划设计到测试修改都可以减少意外差错,大大提高工作效率。成熟的构件还可以作为商品软件出售,带来附加效益,且有利于软件开发的社会化分工协作。Delphi的构件使用和构件制作采用同样的工作环境和相似的编程方法,只要弄清基本原理,制作构件无需学习多少新东西。

基本概念

制作构件的基本过程可以概括为:

1.编写构件单元(unit)。其中包含构件声明和构件实现代码。

2.按照与普通Delphi单元同样的方法编译和调试构件单元。

3.创建构件注册单元。其中用uses语句连接构件单元,并用Register过程完成构件的注册。

4.编写构件联机帮助信息,并编译成标准Windows帮助文件。

全部工作完成后,生成构件单元二进制文件(.DCU)、构件注册源文件(.PAS)和帮助信息文件(.HLP)及附加的关键词文件(.KWF)。用户拿到这些文件后,就可以安装使用了。在Delphi环境下调用菜单命令,启动安装过程(安装过程中需指定注册文件名),可以把构件注册到Delphi的VCL库中,并在构件工具条上生成一个新按钮。借助HelpInst安装工具可以把关键词文件并入Dephi帮助索引系统,用F1键实现联机帮助。

这样制作出的.DCU文件与一般Delphi单元没有根本区别,即使不安装到VCL库中也可以由其他单元直接调用。最大的区别在于:构件单元中某些属性和事件声明为published,从而在程序设计期对用户是可见的,用户可以通过对象编辑窗口(ObjectInspector)访问这些属性和事件。这是可视化程序设计的关键所在。

对象的继承与修改

制作构件第一件事就是选择适当的Delphi对象类型作为父对象,以派生新的对象。子对象可以继承父对象的全部非private部件,但不能摆脱不需要的部件。因此,所选父对象应尽可能多地包含子对象所需的属性、事件和方法,但不应包含子对象不需要的东西。

TComponent是所有Delphi构件的基点,但若直接从TComponent派生新构件,很多东西就需要自己从头做起。一般只有非可视构件才直接从TComponent派生。Delphi提供了若干专门用于制作控件(可视构件)的对象类型,都是从TControl和TWinControl派生而来。其派生关系如下:

TControl---TGraphicControl---TCustomLabel

TWinControl--TCustomControl---TCustomGrid---TButtonControl--

TCustomGroupBox---TScrollingWinControl--TCustomPanel---

TCustomComboBox---TCustomEdit---TCustomListBox

TControl的子类型用于非窗口式控件,TWinControl的子类型则用于窗口式控件。除非特殊需要,一般不直接从TControl和TWinControl派生新控件,而是从其子类型派生。这样可以充分利用原有的属性、事件和方法,减少很多工作量。

在这些构件类型中,非通用的属性、事件和方法都声明为protected。这样可以禁止构件用户访问,又能被子类型继承和修改。在新构件中,可以简单地把继承来的属性和事件重新声明为published,使构件用户能在设计期通过对象编辑窗口访问,也可以进而修改属性的默认值和读写方式,或是重载(override)事件处理子过程和其他构件方法,以修改其中的程序代码。重声明可以放宽访问权限,但不能相反,例如,不可能把published属性重声明为private或protected。

为了增加新功能,常常需要定义全新的属性、事件和方法。定义时,一般总是把对用户开放的属性和事件声明为published,把方法声明为public或protected。

构件属性

在构件中,属性和方法往往可以相互替代。对构件用户来说,属性比方法更直观简便。因此,只要可能,应尽量以属性取代方法。

属性类型包括简单类型(numeric,character,string)、枚举类型、集合类型、对象类型(例如font)和数组类型(例如TStrings类型中的Strings)。其定义方法如下:

type

private

FLayers:Integer;{内部存储用的变量}

functionGetLayers:Integer;{用来读属性值的方法}

procedureSetLayers(ALayers:Integer);{用来写属性值的方法}

published

propertyLayers:IntegerreadGetLayerswriteSetLayersdefault1;

end;

每个属性都需要相应的private变量用于内部存储。按照约定,变量名以F打头,后跟属性名(此处为Layers),读写方法名称分别为Get加属性名和Set加属性名。写方法总是带一个与属性类型相同的参数,用以传送属性值。此参数可以传值,也可以传递变量。如果不定义写方法(省略write部分),此属性便成为只读属性。读写方法应该在private部分声明,以使其对构件用户和构件的派生对象保持隐蔽。

读写方法除了取值和赋值之外,还可以附加其他操作代码,使属性读写产生附加效应。这正是属性可以取代方法的原因。如果不需要附加效应,可以不定义读写方法,采用直接访问格式来声明属性:

propertyLayers:IntegerreadFLayerswriteFLayersdefault1;

default命令符用来指定属性的默认值,同时需要在构件的构造函数中为属性设置初值。default命令的作用是在窗体文件存盘时提供参照:若属性当前值与default命令指定的值不同,则把当前值保存在文件中,否则便无需保存。如果省略default命令,属性当前值总是保存在窗体文件中。

事件与事件处理过程

创建构件时,事件也被当做属性来处理,区别仅在于事件必须定义为过程类型,使其成为一个隐蔽指针,指向某个潜在的过程。当构件用户为事件指定处理子程序后,事件便成为指向该子程序的指针。事件的定义方式如下:

type

private

FOnClick:TNotifyEvent;{声明事件变量以保存过程指针}

published

propertyOnClick:TNotifyEventreadFOnClickwriteFOnClick;

end;

此例正是Delphi标准控件中Click事件的定义方式。可以看出,除了OnClick被定义为过程类型外,其定义格式与一般属性的直接访问格式几乎完全相同。Delphi预定义了所有标准事件的过程类型及标准事件所引发的虚方法。其中,Click事件将引发如下虚方法:

procedureTControl.Click;

begin

ifAssigned(OnClick)thenOnClick(Self);

{以下是默认处理部分}

end;

其中,Assigned函数检验OnClick是否已分配了事件处理过程。如果返回值为True,则调用用户指定的事件处理过程。通过重载此虚方法,可以修改Click事件的处理方式。在重载的方法中,一般应先调用用户处理程序,然后再安排后续处理。在本例中,首行代码应当是inheritedClick。

需要注意的是,构件用户不一定会给事件指定处理程序,因此事件不能定义为函数类型,否则可能会指向返回值类型不定的空函数。如果需要事件处理过程返回某个值,可以借助var参数。调用用户程序之前应确保此参数包含有效返回值,以免用户未指定事件处理过程时出错。

如果Delphi标准事件不能满足需要,也可以自己定义事件。其核心思想是选择适当的Windows消息来引发构件中的事件过程。篇幅所限,不拟详述,请读者参阅有关资料。

方法处理要点

方法处理在创建构件时和使用构件时没有多大区别,但有些问题仍需要注意。

首先要注意的是,构件通常是在事件处理过程中调用,而构件作者又无法预测用户将在什么环境下如何调用构件。因此,构件中的方法应尽量避免占用系统资源,避免使Windows停止对用户操作的反应。

创建构件时应随时意识到,此构件不仅可以直接调用,而且可用来创建别的构件。即使是对用户隐蔽的方法也应具有完整的功能和清晰的接口。除了属性读写方法之外,内部方法一般应声明为protected虚方法,以便被派生对象继承和重载。属性读写方法则应采用private声明严密保护。派生对象如果需要读写父对象的属性值,应该访问属性本身,没有必要直接访问其读写方法。

构件测试

制作构件的核心工作是编写构件单元,包括根据构件功能要求设定对用户开放的属性、事件和方法,设定用以实现这些部件的变量、过程和函数等等。除了属性和事件有特殊格式之外,构件单元的设计方式与一般Delphi单元没有什么不同,只是单元中不能包含窗体。

在编写构件单元的过程中,可以借助一个测试窗体直接对其测试。以可视化方法在窗体上安排构件,本质上不过是自动生成调用构件的代码。即使构件未并入VCL库,无法使用可视化操作,也可以手工编写这些调用代码。这样测试,可以免去反复修改而导致的反复安装。

测试时,需先建立一个窗体单元,然后进行以下操作:

1.把被测构件单元名称加入窗体单元的uses语句中,并在public部分声明被测构件的对象实例。

2.在窗体单元的FormCreate子程序中调用被测构件的Create方法,以构造构件实例,其Owner参数设置为Self,即窗体本身。然后给Parent属性赋值,并适当设置其他属性值。Parent是容纳构件的父对象,如果是窗体本身,应设置为Self。

3.运行包含测试窗体的工程,找出构件程序中的错误。

注册构件

注册构件用的程序代码可以放在构件单元中,但在Delphi下注册构件时要求提供包含注册代码的源程序文件(.PAS文件),因此,比较好的方式是把构件核心代码编译成.DCU文件或.DLL动态链接库,在注册源文件中只放注册代码和外围程序。下面是注册代码实例:

type

TMyPanelΚclass(TCustomPanel)

TMyLabelΚclass(TCustomLabel)

procedureRegister;

implementation

procedureRegister;

begin

RegisterComponents(′Samples′,[TMyPanel,TMyLabel]);

end;

注册过程名必须是Register。过程体中调用Register Compnents,其中的两个参数分别指定Delphi构件工具条页名和要注册的构件类型。如果指定页不存在,Delphi将创建一个新页。

Delphi环境提供了一个构件生成器(componentexpert),可用来自动生成注册单元。

构件工具条上每个构件需要一个24×24点阵bitmap图标。图标可以借助Delphi的ImageEditor编辑生成,以.DCR资源文件的形式提供给构件用户,文件与注册单元文件相同。如果不提供此文件,Delphi将采用默认图标。

提供联机帮助

一个成熟的构件,无论是用于开发群体还是用做商品软件,都要有联机帮助信息才能正常使用。Delphi的帮助信息与Windows一般帮助信息结构基本上相同,其编写方法可参见有关资料。但Delphi包含一个特殊的帮助搜索引擎,能跨越多个帮助文件搜索关键词。因此,在构件帮助文件中不仅要有普通K型关键词脚注,还要包含Delphi所用的B型关键词脚注。脚注内容有如下约定:

在Delphi的对象编辑窗口和代码编辑窗口中,用F1键可以引发帮助搜索引擎,通过B型关键词调出有关帮助主题。为了实现这种帮助机制,需借助KeywordGenerate程序来生成关键词文件(.KWF),与帮助信息文件(.HLP)一起交给构件用户。用户借助HelpInst程序把关键词文件内容并入Delphi主帮助索引文件(.HDX)中。

构件联机帮助信息应当与Delphi标准构件帮助信息格式相同。编写帮助文件时最好遵循如下约定:

1.每个构件有一个单独的帮助主题(Topic),内容包含构件简介及用户可见的属性、事件和方法列表。

2.新增的及修改较大的属性、事件和方法均应有单独的帮助主题,其中应包含所属构件、用途、声明格式等内容。

3.每个帮助主题都应包含K型脚注,以便用F1键引发。

用Delphi实现禁止用户关闭Window9X 用Delphi制作能够干净地删除自己的程序 用DELPHI 做一个简单的屏幕保护程序 用Enter键代替Tab键-Delphi资料 用修改文件时间的方法来加密文件-Delphi资料 用最原始的方法编制程序-Delphi资料 运用Delphi编写Windows NT中服务程序 在DELPHI编程中确定系统运行模式 在Delphi程序中调用控制面板设置功能 在DELPHI下读取与设置系统时钟 在Delphi中避免2000年问题的捷径 在Delphi中调用API函数 在Delphi中获取和修改文件的时间 在Delphi中控制扫描仪 在Delphi中实现对WIN9X应用程序使用权限的设置 在Delphi中实现对目录拷贝、删除和搬移的操作 在Delphi中使用自定义光标 在Delphi中用拼音首字符序列来实现检索功能。 在DELPHI中用线程排序 在Delphi中制作背景音乐 在Dephi中使用TStream读写数据的技巧-Delphi资料 在应用程序中跟踪MOUSE的坐标-Delphi资料 怎样建立回调函数-Delphi资料 怎样显示自定义鼠标光标(Cursor)-Delphi资料 找出消失的 Delphi 窗口 执行外部程序-Delphi资料 执行一程序并等待其结束-Delphi资料 制作一个不在任务栏及任务列表中显示的幽灵程序-Delphi资料 抓获全屏-Delphi资料 子目录级的文件查询的实现-Delphi资料 Delphi中ChartFX构件使用详解 文件的有关操作,请各位指教! 如何在程序运行时,对TABLE增加永久字段和计算字段 1个小问题,关于like与*(在线等待) 如何得到TIMAGE的BITMAP,PALLETE? 请问谁能为COM的CComXXX的原理和使用方法写篇文章啊。。 男人不如猫的十三条理由[转] 如何让浏览器(ie)弹出来就是最大化的? 如何用BCB进行TIMAGE的底层操作? 如何增加三层分布式系统的用户数? 请帮帮我~ 关于网络打印的问题?????????急急急 有windows1内有datawindow1有command1如何单击选择没有打开的datawindows2 VB,DELPHI 哪个对网络图形编程支持更好 有上海的公司需要人吗? VB,DELPHI 哪个对网络图形编程支持更好 调查:大家喜欢第三方控件吗? session 问题 如何在lotus中利用JAVA进行写代理,或哪里有较好的相关资料!如有好的帮助,定当另外再给分 虚拟现实,网络哪一个更有前途? 关于注册表 关于网络打印的问题?????????急急急 奇怪的现象。。 初学者问的基本的问题请大家指教 那里有编写ActiveX DLL网页的教程~ Unix或者Dos下怎么知道键盘有键被按下? 大家好 一个有意思的小任务,诚征实现程序 关于网络打印的问题?????????急急急 请问深圳IT行业人员薪资水平 请问谁知道那有关于售票系统方面的软件可以DOWN! windows2kserver 里的“本地策略”不能用? 我的2000因为WMI不能用了,谁能帮我,快!我在这等 灌水灌得差点忘了问问题~进来的有分。 一个有意思的小任务,诚征实现程序 我的2000因为WMI不能用了,谁能帮我,快!我在这等: 一个有意思的小任务,诚征实现程序 那位仁兄用过 installation system 请告诉我怎样设置才能使我的应用程序出现在“开始”菜单里 小弟急用 韩国队崛起大揭密:铁血作风 军人模式 地狱训练 vb中怎么动态生成按钮??? 请问:考中程怎样去复习,尤其是下午的题? java 的环境配置,请高手指教! 如何判断一个1024的int数组的所有元素的值全部小于50。寻求高速算法。 有谁看过Charles Petzold的《Programming Microsoft Windows with C# 》和Jeffrey Richter的《Applied Microsoft.NET Framework Programm 如何把图标加到 dll 文件中! 求助!!!哪儿能下载到VB高级编程的详细参考资料? 如何得到光标在编辑框中的位置?一个笨笨的问题 请教select函数用法!!!!! 关于日期计算的的错误!请关注!! 韩国人踢进八强 和 中国人相互掐架(转帖) vb中怎么动态生成按钮 如何修改Internet option/home page中的address 萌芽网的新概念作文大赛的投稿地址以及邮政编码我听说萌芽要举行新概念作文大赛,谁有大赛的投稿地址与邮政编码, 帮忙写几个字的形近字,然后组词1.然 2.泣 3.砚 4.锤 5.焚 6.乾 7.碎 8.痕 9.纵 10.祭 11.磨就这几个字的形近字,记住要给形近字组词哦!谢谢啦 这个字的形近字并组词要2个 衣服上弄上了中性笔油怎么样能洗掉?如 题 . ! 形近字组词(20组),有多少写多少 下列词语中每组各有俩个错别字,找出来并改正(1)负盖 徘徊 柳恕 一蹴而就 ——改为—— ——改为——(2 )伶仃 可鄙 琵缩 换然一新 ——改为—— ——改为——(3) 对奕 繁杂 奇攴斜 经史子集具体指什么 写形近字,再组词 英语作文..五句话 假设你叫李华,你的美国笔友Peter知道你准备参加“快乐海南四日游”后发电子邮件打算和你同行.请根据以下海报信息给Peter回一封电子邮件,介绍有关旅游所的情况.中国祥 经史子集的区别在哪里 三年级作文父母对我的爱2010年5月6日做完 英语作文假定你是李华,你准备给已回国的澳大利亚籍教师peter写封邮件 什么是“经史子集”﹖ 小丽买了一本九折出售的故事书,比原价便宜4元,这本故事书原价是( )元. 小强第一天读了一本书的8/1,第二天读了剩下的7/2,还剩下35页,这本书共多少页? 经史子集包括哪些 塑怎么组词 小强第一天看了一本书的3分之1,第二天看了剩下的2分之1.你会比较小强这两天看书的多少吗? 可爱的小白兔作文 经史子集是指?希望再详细一点! 塑可以组什么词 介绍小白兔的作文400字以上 小白兔的作文400字左右 塑组词3个 参加新概念作文大赛时表格上的字数究竟如何计算?必须用打格的稿纸吗? 观察小白兔的作文. 一本故事书原价20元 现在每本按原价打九折出售 现价多少元? 写小白兔的优秀作文 咧字的形近字及组词有哪些呢? 假设你叫李华,下面一篇海报是你校英语角的一次活动安排.请根据海报内容用英语写一封电子邮件,邀请你的海报内容:欢迎到英语角来看电影 汤姆叔叔的小屋 时间 6月30日下午3点30至5点30 地 萌芽新概念作文参赛投稿的稿纸用哪种?用什么颜色的看起来笔好些吖,投稿的稿纸用哪种内?方格的还是横格哒、 我喜欢横格因为它看起来比较干净吧、但是又有人说看起来潦草介意用方格的 形近字,组词 . 假设你是李华,你校与美国一所友好学校决定通过网络开展跨文化交流活动,请你用英语写一封邮件与美方联系,谈谈自己的设想,征求对方意见,交流内容要点如下:自我介绍;饮食文化差异; 萌芽新概念作文要用什么样的稿纸投稿好些, 令我感动的一件事500字 关于同学之间的 John即将外出旅行,请你根据提示用英语给他写封电子邮件向他介绍你对旅行的看法并提醒他旅行注意事项一、旅游是一种非常好的活动,当你累了或有空的时候到外地走走,欣赏美景呼吸新鲜空 怎样参加新概念作文大赛?越具体越好 最好有报名时间等等...这个是不是每年都有?..报名时间是? 令我感动的一件事 500字(最好能用上纸巾) 甲乙二人共同加工一批零件,9小时完成任务.完成任务时乙正好加工了零件总数的5分之2,乙每小时加工16个.那么这批零件一共多少个? 假如你将代表你校2014届毕业典礼上发言,请你用英语写一篇发言稿,内容如下:回顾 每丽的校园假如你将代表你校2014届毕业典礼上发言,请你用英语写一篇发言稿,内容如下:回顾 每丽的校园 令人难忘什么作文600乐于助人 令我感动的一件事500字(平常发生的) 假设你在学校举行的英语演讲塞中获得了好成绩,将在颁奖仪式上发言.请用英语写一篇发言稿.急.要英语.80字左右. 作文600字《这就是我一个乐于助人的女孩》 甲,乙两人合作完成350个零件,甲单独做8小时后,甲,乙再合作2小时可完成任务.甲每小时比乙多做2个,求甲,乙每小时各做多少个? 假如你将代表你校2008届毕业生在学校毕业典礼上发言,请你用英语写一篇发言稿,发言稿的内容要点如下.回假如你将代表你校2011届毕业生在学校毕业典礼上发言,请你用英语写一篇发言稿,发言 熬字的形近字组词,4个 一项工程,甲单独做要20天,乙要24天,丙要30天.甲先做5天后剩下的三队一起做,全工程劳动报酬是6000元,求甲队应得多少元 给下面的字找个形近字,再分别组词,相信你最棒!秧()_() 假设你是李华,请你以email的形式向你的笔友john讲述你和你朋友的一次周末到凤凰古城旅行的经.具体内容如下表 一项任务,甲队要20天完,乙队要24天完成,丙队要30天,剩下的合做完成.报酬是6000元,甲队得报酬多少元 小白兔作文 英语作文题目假如你是刘梅你的美国朋友John要来天津学习一年请给他写一封电子邮件介绍天津天气情况急明早 有关中秋节的作文10000字 萌芽新概念作文参赛可以多投稿么?当然,所有的稿都是我的名字,我也会用好几个表格的, 但是多投稿了会不会被评委排斥吖, 会不会印象分大打折扣, 他想:诶这个人好烦呐,会不会^_^嘿嘿、对 用一个诗句来形容朋友之间不舍的感情 中秋节作文10000字 《萌芽》下半期(新概念作文)如何投稿不是参赛,是纯粹的投稿 写朋友间真挚感情的诗句 中秋节作文,10000字开头:守护者一行人到中国的时候,正好是中秋佳节.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘