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

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键引发。

Java框架研发思考 那些年,Java程序员用过的开发工具 Java内存模型的历史变迁 Java 8与Apache Ignite Java开发与技术挑战——关于技术的技术思考 专访唯品会架构师肖桦:做编码的架构师 越来越“简单”的Java 我的Java!越过山丘 专访沙梓社:做个“Think Different”的技术牛人 基于ES6,使用React、Webpack、Babel构建模块化JavaScript应用 财税街创始人石克清:创业须空杯心态+有效社交 自我知识管理:连贯性就是生产率 玩转Google I/O 2015:Android M、IoT、Glass 2.0、VR、ATAP ARC中Retain Cycle揭秘 失控与逆转!企业移动化2.0时代下如何求变? 玩转物联网之MQTT 专访都灵创客教育奚炎:被忽视的Maker教育 13岁iOS开发者:Swift开发Sprite Kit游戏实践 专访豌豆荚「自动装」开发团队:无需Root即可批量点击「下一步」 iOS项目的持续集成与管理 《近匠》谛听科技,探索智慧家庭的智能网关 【简讯】Python 3.5.0b1发布 《算法的乐趣》作者王晓华访谈:多看、多做、多想是秘诀 专访李祎:Java在Testin的技术应用 React首部经典图书推荐:全程经典实例,360度剖析React.js 再做一个Android!Google发布第二代VR眼镜Cardboard Go语言开发常见陷阱,你遇到过几个? 奏响年度最强音 第七届中国云计算大会日程全公布(表) 【CTO讲堂】请在还年轻的时候,尽量多踩些坑 以细分使用场景为突破点 探究墨迹天气的体验创新 熟练成就创造——MathWorks全球副总裁Richard Rovner、产品市场经理赵志宏专访 实例化算不算继承? 急!!!!关于SQL数据堵塞 请大家推荐一下哪个汇编集成环境比较好用?DOS下用什么?WIN下用什么? 向各位请教两个tomcat的问题:(谢谢) 高手请问 拉格朗日算法VB=>BCB 求ASP的字符串比较函数. 找C++BUILDER高手!! 我在做演示光盘,用camtasia录制的屏幕图象,可是在客户的机器上播放不出来,在线等待,解决问题马上揭贴! fastreport如何不进行预览而直接打印! 不使用下拉数据窗口,如何实现输入产品代码即可显示产品名称 大哥救命啊 一个简单问题,在一个Win32 applicaion 中如何使用CString变量! 在线等待! 倒霉!!!平白无故被副总扣了100点! 我高中的班主任 JBuilder的爱好者,请留下您的联系方式!谢谢,让我们共同进步! 未指定默认数据库驱动…… VC中如何添加数据库支持? 栽ejb-jar.xml中部署的Ejb QL怎么和Home接口中声明的查询连接起来,必须以ejbSelect开头吗? 如何通过程序调用荧光笔操作?急,在线等!高分相送啊! 表格宽度 发现我的作文水平如果参加今年高考能得满分(仅限作文) 送100分,JB7+JBoss下,用CMP方式建两个EntityBean,比如DIfsZxx(主键所在实体),DIfsZxxRw(外建所在实体),当两者之间关系设为。。。。 谁能够告诉我所有ACCESS数据类型的英文名字?偶在VB中有用到! 请问如何才能使用asp连接foxpro数据库,使用oledb 启动出现找不到windows\system\service.vbs怎么回事??但进入系统正常,如何去掉??? Datagrid!!! 大家能不能推荐一个免费个人主页啊。 大家来帮我看看PHP连接ACCESS数据库的问题! 大家讨论一下这种软件的开发机制和速度优化机制,有没有可能进入代理内部? 放分拉,关于struts的问题,如何在action类中调用ApplicationResources.properties中的信息!!进者有分!! 如何基于对话框打印表格(比如个人简历)在线给分! 今天刚装了新的内核,所以写出过程供大家参考! 一个急需要解决的问题??? VC下如何接收COM+事件 妈妈,女儿对不起你 jbuilder乱码,在线求解 请教一个有难度的代码,江湖救急啊! 在线等!!! 编写一个短信中心,必须要向服务商拿哪些参数? 简单问题:关于ModifyStyle 大家有遇到这种情况吗:"使用jsp无法实现功能,而要被迫使用servlet"? 自己设计VCL组件时,怎样定义对象类型的属性 ? 关联算法的一个问题,大家共同讨论啊 奇怪的问题:高手来看看! 急,关于有状态会话bean的概念问题 关于mediaplayer控件的一个问题 如何让一个表格底下呈现阴影的样式 关于OBJECT哪位大虾知道,赶快进呀!帮小弟解决问题呀!:) 关于UNC ? 请问如何进行这样的操作:察看数据库中的数据,如果数据与edit1.text相同,则showmessage,如果不同,则添加。 拜托大侠们,帮我找个WIN98二版的序列号,急!急!在线等待! 语文复习题,下册的 练习题也行 后天就是入学考试了 7月20考试,conversation怎么提高?conversation总是错很多,感觉比lecture快,来不及记笔记,有些细节题总错,还把握不好出题点,怎么办?请大家指教, 帮我把“快开学了,收拾一下心情,迎接新学期咯”改成可爱版本的,可以改字,但是有符号的尽量用符号!弄卡哇伊一点啦.能卡哇伊就再卡哇伊一点.. 跪求 行容舒适的进入梦乡是什么词语 急,快来帮我,本人数学不好 我是一名学习还不错的学生,我每天都非常努力的学习,非常勤奋,我认为学习是快乐的,只是最近的情绪不好,每天晚上都没有看书,导致现在的我都不知道我自己为什么要那么勤奋的读书,每天也 没什么说的吧,有的请说一下,分析的也行,我主要是用来参考. 在直四棱锥ABCD-A1B1C1D1中,AA1=2,底面是边长为1的正方形,分别是棱B1B、DA的中点.(1)求证:BF//平面AD1E (2)求证:DE垂直平面AEC 用不寒而栗和不翼而飞和草菅人命和不绝如缕和立竿见影造句. 六年级题目(会一题是一题)(1)有一批学生,按规定人数分组,若分成10组,则多13人,若分成12组,则少3人,求总数(2)同学们爬山,上山平均每分钟走60米,下山从原路返回,平均每分钟走80米,往 商女不知亡国恨,隔江独唱后庭花写的是哪一处名胜? 有首歌 我只说得出几句 ‘行驶在城市的边缘 努力把情绪抛很远. 求助大家如何在电脑桌面主题上写字有点着急了啊,不好意思,麻烦给位朋友了7k 人们在下雨天很容易打瞌睡 下列原因中错误的是人们在下雨天很容易打瞌睡,下列原因中错误的是:A.下雨时发出雨声属于白噪音,是天然的 安眠曲B.雨天气压低,交感神经不给力C,雨天时,褪黑 有没有人喜欢寒冷?我喜欢 里关于女人善变的名言 打瞌睡是由什么原因组成的 最上面那题,下列各式是否有意义?为什么? 名字“玥辰”该怎么解释? (英语)看图,用正确的反身代词完成对话. 全国卷的数学 难不难啊 玥瑶可以怎样解释? 由于数学考砸了,数学课代表被撤职了,我该怎么办? 不翼而飞的造句我在看书时看到全身的疲倦不翼而飞 说是错误的 不翼而飞比喻东西突然不见了.也比喻事情传播得很迅速百科里面还有造句是 我的铅笔不翼而飞为什么疲倦不翼而飞不行铅笔 葡萄糖经饮用进入右前臂肌肉的途径 玥辰什么意思 我第一次数学考得不好.班主任同时是数学老师,于是辞职,老师说我还行叫我不要胡思乱想没答应,这是怎么回事 通讯员负责行进中队伍的通讯,从队尾向前追,全速前进是部队速度的3倍,从队首返回队尾,每分钟减少100米,前进中,连续三次往返执行任务,共用1小时,三次返回队尾的时间比追赶前面共少用12分 4题2小题圈2 求教 上课老打瞌睡怎么办?我上生物课和数学课的时候总是打瞌睡,掐自己也没有用,怎么办? 高数题求解答.刚学求教1求级数【n=1】5x/(n+2)3^n的收敛半径和收敛区间. 2将函数f(x)=2/x-4展开为麦克劳林展式.请稍微详细点,初学者. 计算∫∫max{x²,y}dxdy,其中D是直线x=0,x=1,y=0,y=1所围成的闭区间其中max{x², 平行四边形有几条高? 一件工作,甲乙合作6天完成全部工作的5/6,甲完成1/2的时间与乙完成1/3的时间相同,则甲,乙单独工作各需要几天完成?解方程 计算二重积分∫∫3x/y² dxdy ,其中D由x=2,y=1/x和y=x围成. 在三角形ABC ∠C=90° 且AC=BC=3点M满足向量BM=2向量MA 则向量CM于向量CB的乘机是? 初一数学求解!一元一次方程 求不定积分∫du/(u-(1+u^2)^0.5/2).对不起,表述不太清楚,是∫du/(u-((1+u^2)^0.5)/2)。 考数学心态非常不好我考数学时心态非常不好,非常紧张,手也在发抖,非常害怕考不好,本来也考的不怎么样,每次也就是六七十分,一紧张,会的也忘了,有一阵子该紧张到胃痉挛,怎么办?我真的非 报纸的批发价是1035元,零售价是1.5元,小明赚了30元,卖了多少份报纸 育肥猪吃了就吐是什么病? “佛”里的单人旁,能不能换成其他的偏旁? 英语翻译 “辰巳午未”这个成语是什么意思?不要单独解释这几个字,我看过了.我指的是这几个字组成的的成语. 平行四边形有几条底?几条高? 碟中谍4 英文简介300词左右500词左右 语法一定要通 老师会check的 红颜色“辰”字定义图片、跪求希望可以能能的跟 这个搭配的洪字、在线等、希望各位高手帮帮小妹忙、50就给你了 若(2a^mb^m+n)^3=8a^9b^15成立,则m= n=(急)帮帮小弟吧.不不,是小妹.呜呜 碟中谍4英语台词加中文翻译? 小孩爱捡地上的脏东西吃怎么办? 若(2a^m*b^m+n)^3=8a^9b^15 则m= ,n= .求回答, 求碟中谍1英文剧情介绍 求第20题的答案! 已知(1/2a^m+1b^n-1)^3=1/8a^9b^12,求m和n的值 求电影碟中谍2英文简介 请帮我数一下[天安门]有多少笔画?请帮我数一下[天安门]有多少笔画. (-10a^m+3b^n-8a^m+1b^n+2-2a^mb^n+3)除以(-2a^mb^n-1)的结果是不是5a^3b+4ab^3+b^4 江苏的! 2012年5月20日人力二级 实操技能 请问同样考这个的同学,简答题的三道题分别是什么题目啊?如题简答题的题目分别是什么啊? 将一张长60公分.宽40公分的止,简成大小相同且边长都是整数公分的正方形,正方形的边长可能是多少/最长是多少公分? 奶粉进药店多问题待解 本周开始安装售宁波海曙区已有五个社区无主车“清零”美耶鲁大学19岁大二学生欲徒步闯南极墨西哥一家美国公司糖果厂爆炸20人失美国海军基地再发枪击案 2人受伤枪手美国义诊团感受中国医疗现状 吁加强健环球小姐决赛即将举行 佳丽泳装展示傲世界最高大的狗在美国去世 存活年龄为手机疑遭美监听 默克尔怒了哈士奇模仿婴儿爬行萌翻网友【组图】墨西哥一美国公司糖果厂锅炉爆炸 40中韩超人气“包子脸”女星(组图)美媒:美逐渐蜕变成为“监视国家”新加坡女子穿比基尼街头秀一字马(组图外媒:日大规模夺岛军演剑指中国世界最高大的狗在美国去世 站立达22美国财长呼吁朝野同意以合理减支取代自世界最高大的狗在美国去世 存活年龄为英国BBC知名主播再添性侵罪名 下月美军方:因财政扣押明年将裁减最少6架美国海军基地再发枪击案 2人受伤枪手营业执照15合1,下周一起可领新版本剖腹产伤经络,打通任督二脉再无可能?A股下周或是震荡行情 且战且退轻仓为丈夫爱工作妻子更健康传达学习习近平总书记在省部级主要领导重庆市规划局城乡规划公告体坛简讯认同单独两孩政策,期待政策早落地解救被拐婴儿冲超最后一块拼图完成!我市启动大气污染立法调研国电南瑞本周涨近16%招商证券杨大荣近7成酒驾 都是年轻人干的全国政协十二届二次会议定于3月3日召新版营业执照重庆晚报主办银信科技“他替我买了一家卖苹果的公司股票,有秀能耐金科股份抛压较大我市“单独二孩”政策月底开始审议
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘