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

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

黑客挟持160万用户密码 抗议联合国监管互联网 Twitter面对危机火速上线照片滤镜产品 Nike推创业孵化器:每个参与团队获2万美金 傲游发布云浏览器 支持跨终端数据同步 12个git实战建议和技巧 用友UAP产品线总设计师史周军访谈录 IE10新功能解析 支持Media Query(图) 单页Web应用或引领下一代Web新趋势? [CTO俱乐部第89期]新时代的前端开发 [多图]160台Mac mini打造的数据中心机架 是谁动了我的CPU! 欧朋CEO:GPU加速是手机浏览器的新趋势 TOP30专访:Splashtop研发中心总经理Alex Xu 2012Q3国内App开发者半数以上入不敷出 细微之处见真章 为什么要在try-catch-finally里加大括号 独立开发者:面对攻击就要“脸皮厚+更自豪” IBM纳米光子芯片对付大数据 单个通道25Gbps AWS数据仓库服务Redshift是最好的选择吗? 又赚了一笔:微软向两公司收取Android专利费 深度解析:Android4.2系统“应用验证服务” 欧洲移动游戏大会:五大行业趋势 大揭秘:Windows Phone 8 键盘输入的8个设计精髓 朝鲜:探寻最神秘的移动互联网王国 如何让IE 10玩转响应式网站 Windows Server 2012:令CIO激动的三个新特性 高德和新浪微博战略合作 打通账号互调数据 乐观锁和悲观锁 你更钟情于哪一个? Apple索30%分成 iOS版微软SkyDrive更新搁浅 [简讯] Linux 3.7发布 开源图形卡驱动程序 高效敏捷的十大经验法则 佛瑞斯特资讯公司预测2013年云计算的十个变化 是读软件工程硕士还是去当程序员? 在VB里用ADO对像来更新ACCESS数据库时出现"所有记录中均未找到搜索关键字。"错误!如何解决啊.. 怎么看懂别人的程序? 如何修改软件默认的安装路径。 是读软件工程硕士还是去当程序员? WinCE支持I2C总线吗?谁有资料 有没有深层次的c语言书啊?(50分) 请问dbgrid对应的数据表的某个字段为0/1,可以把其cell显示为checkbox? 什么是3D加速卡? 请教NotesFactory问题,那里有资料 developer2000的疑惑 一个小问题,请给我看看! 是读软件工程硕士还是去当程序员? 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 紧急求助:关于打印的问题 如何用C#在ASP.net中对数据库进行查询? 网络打印问题 【求助】一个小问题,在线待回 DBGrid1如何获得2个表里的数据 帮帮菜鸟呀`/! 如何用C#在ASP.net中对数据库进行查询? 求获取FTP服务器上文件的创建日期的代码 系统已经从一个严重错误中恢复。 怎样使一个页面访问过后立即过期? and 和 or 有什么不同??? 关于oracle 配置的问题 Oracle数据库实例和数据文件的问题求助 调查:各位用Lotus开发的时候,对源码如何做版本控制的?效果如何? 请问各位高手现在业界对工作流与电子工单有没有统一的标准? 动态生成STATIC 文本框,把里面的文字都加上下划线,怎么做? 有什么好的类似于QQ的局域网通讯程序???可支持WIN98及WINXP间的通讯!!! 我快晕了,急救! 低手勿入,高手请进,剧难??? 一个程序调试中产生的问题 -------数据接收和发送模式的问题!(非资深程序员勿入)100分只给答的最好的 求救!关于坐标系转换问题 现在很多邮件服务器要身份验证,ASP.NET(C#)的SMTPMAIL类有设置身份验证和密码的属性吗? 怎么在基于对话框的程序中加入一幅bmp作为底图? 刚学java,碰到一问题,请 有空进来看看 showMessageDialog的使用问题 disable mainmenu控件的某个subitem怎样实现 哈哈,需要短信网关IP地址及其源代码的快来顶一下。 sybase12.0安装时的问题??? 怎么样能用asp编写使得IE打开pdf文件?在查询后怎样还能在查询的输入框里面保留查询的输入? 如何使用TreeView进行分级管理 触发器的效率问题! 寻求解决方案 组件刷新问题,UP有分 请问 虚拟目录 和 WEB站点 有什么区别? DBEXPRESS的问题!很简单 怎么证明鬼是种磁场? 请问,Zn-MnO2电池在ZnCl2-NH4Cl溶液中的两极反应方程式是什么?...请问,Zn-MnO2电池在ZnCl2-NH4Cl溶液中的两极反应方程式是什么?另,电解酸化MnSO4溶液得MnO2的原理是什么? 农民常用盐水来选种,当把种子放入盐水中时,所有种子都未浮起,为使不饱满的种子浮起,应当加盐还是加水?为什么? 鬼真的是一种磁场吗?这种说法有科学依据吗?是谁说的?人死后有鬼魂的存在,鬼魂是一种什么东西呢?其实,鬼魂和身体的关系就象电磁波和对讲机的关系.鬼魂也就是一种磁场,有记忆的磁场.鬼 ZnCl2和NH4Cl混合溶液中含杂质CuCl2,欲出去Cu离子,最好选用A.NaoH B.ZnC Fe D.Na2Co3为什么答案选B ,NH4Cl和Zn难道不能发生置换反应么 常温常压下8g氧气含有的电子数 有人说其实鬼魂就是一种特殊的磁场,从物理方面说有的话,我感觉是有,因为一本书看到说的鬼其实是一种电磁场,因为某些人的电磁场在死后的一段时间内不会消失,而可能与另一个人的电磁 hbv-dna结果:1.662E+07拷贝/毫升 检测下限:500 拷贝/毫升 司南为什么要做成勺型? I was in front of the library的翻译求求大哥大姐们了 我学会了什么,500字抄袭的也可以,急 当司南的磁勺在指盘上停止转动指向南的是? 英语翻译那家超市突然倒塌,许多人没有跑出来the supermarket suddenly __ __ and many people dien't run out of it. 什么是混沌数学? 怎样可以更好的学化学?更容易书写化学? 某车站行李寄存处的收费标准如下12小时以内收5元(包括12小时),12小时以后每增加1小时,加收0.5(不足1小时的按1小时计费)设寄存时间为t(t>12,则t是整数)小时,试写出表示寄存费的代数式 臭氧和水反应吗?如果反应,那是怎么反应呢? 亚硫酸铵与二氧化硫反应生成亚硫酸氢铵化学方程式 各羧酸酸性大小顺序 a.CH3COOH b.BrCH2COOH c.FcH2COOH d.CLCH2COOH 突触后膜受体与相应神经递质结合后,引起Na+通过被动运输方式内流到突触后膜以内 为什么这话是对的.神经递质不是有两种的嘛?一种是抑制的啊.更何况不是应该要达到一定的阈值才能引起 丁达尔效应是什么变化? 为什么酸性FCH2COOH>CLCH2COOH>CH3COOH 材料物理与化学和无机非金属材料工程分别是几级学科,两者是什么关系 防毒面具有几种防有机农药的防毒面具有什么 已知酸性:HCOOH>CH3COOH>H2CO3>C6H5OH>HCO3-,下列方程式中不正确的是()已知酸性:HCOOH>CH3COOH>H2CO3>C6H5OH>HCO3-,下列方程式中不正确的是()A:2C6H5O- +CO2+H2O→2C6H5OH+(CO3)2-B;CH3COO-+C6H5OH→C 我公司75吨锅炉现在试运行,给水为脱盐水,炉水处理准备采用加磷酸三钠.请问磷酸三钠的加量按什么工式计 纳投入到硫酸铜的现象及化学方程式 为什么酸性是FCH2COOH>ClCH2COOH>CH3COOH? **磷酸二氢钾缓冲液作用**急!就最近在做液相,是初学者,一般流动相中有机相的成分会比较大,但最近发现很多文献中如:磷酸二氢钾缓冲液 - 乙腈( 71: 29 ),请问这个磷酸二氢钾是干什么的,为 在磁体内部放一个指南针,指南针的南北极指向哪里? 求助,二氧化碳和水会生成什么东西? 正相色谱溶剂的极性增大保留时间如何变化 当指南针指南针指向南的一端是磁体的——极,指向北的一段是磁体的——级 从元素角度分苏打不属于 氧化物 含钠氧化物 含氧化合物 含碳化合物 有什么东西结合能产生大量的二氧化碳? 什么样的笔适合在农村墙上写字?我是在农村修理家电的,以前用毛笔蘸油漆在农村的墙上 电线杆上写广告,但是非常不方便,而且非常慢.我想问问有没有一种不用经常补充油料,写出的字还圆滑 心电监护仪怎么表示病人失去生命特征? 生产天然桶装水时,经过臭氧塔后出来的水体发黄应如何如何处理?有几种方法?之前已经过了除铁,锰的离子交换塔.水体还是发黄> 听说有一种电子笔可以在墙上写字,有人知道吗? 30%的硫酸铜溶液和10%的硫酸铜溶液等质量混合后,所得溶液的质量分数是多少还有一个 丶 为增加水的导电性 在做电解水的实验室 永昌向水中加入一定量的氢氧化钠或稀硫酸 若有200g溶质质量 在1000千克的15%的盐水中,含盐多少千克?水有多少千克?要过程! 就算紫外线再怎么亮都无法看见吗? 用什么化学剂可以消除紫外线荧光墨水液态的 松香改性酚醛树脂的正庚烷容纳度怎么测定? PH试纸上滴加盐水会怎么样RT laied to copy busybox求翻译 平面波的叠加是怎样得到波包公式的,能给个具体的推倒公式吗考虑一维的情况也行啊,波包公式跟傅立叶积分公式好像,请高手帮帮忙 司南的勺柄的磁极方向是N还是S|?勺柄指的是地理位置的南极还是北极\? Copy to Gallery 该怎么翻译 国内做固相萃取和色谱做好的有哪些?如上 DNA的羟基末端称为图中所示的羟基端为在遗传病及刑侦破案中常需要对样品DNA进行分析,PCR技术能快速扩增DNA片段,在几个小时内复制出上百万份的DNA拷贝,有效地解决了因为样品中DNA含量太低 下列化合物中酸性最强的是RCOOH R-OH H2Otell me why~ zncl2 nh4cl 溶液中除cu2+用naoh nh3h2o zn fe请选择,为什么 在5%氢氟酸和15%硝酸混合液中、常温常压下选用哪种钢材最耐蚀? 什么是鬼磁场?鬼磁场到底是什么?世上有没有鬼啊?鬼最怕什么啊?人死后到底去哪里了? 沙眼衣原体(CT-DNA)大于500拷贝是什么意思 磁场强度的简称为什么是H?磁通密度的简称为什么是B? 鬼和磁场有联系吗? 欲除去ZnCl2-NH4Cl混合溶液中的杂质Cu2+,最好选用下列试剂中的 A.NaOH B.Zn C.Fe D.NH3.H2O为什么不能选D,只能选B 调质钢在常温状态下的组织形态是回火索氏体还是珠光体?就拿45调质钢来说. 外媒称俄罗斯在G20峰会监控各国元首各国如何处理打医生?日本“老爸地位指数”预测经济走势美最新型隐身驱逐舰下水奥巴马考虑终止 监听盟国领导人英国窃听丑闻案开庭 默多克昔日爱将出无人机击毙索马里“青年党”高官美国十年逾百起医院枪击事件 FBI探美国驻也门大使馆虚惊一场 婚礼烟花被男子给6岁儿子买411万豪宅:怕他长利比亚枪手狂劫五千万美元白宫曾叫停监听默克尔?捐肾牵良缘 悲剧变喜剧美媒:光有“屌丝”与“土豪”社会无法四条眼镜蛇盘绕 “守护”婴儿午睡中国与东盟关系迎来“钻石十年”新发展纽约华裔灭门案震惊社区 凶犯偷渡来美有研究称所有哺乳动物遵循21秒排尿定世上真有“摇钱树”:桉树能测地下黄金出租屋现633万巨款续:租客妻子称钱铁路部门新规:火车票只能改签一次 开河北医院一患者被砍伤 8名嫌疑人归案西藏归国藏胞谈民主改革:现在生活更好哈尔滨两名男子“解闷”毒打流浪汉 已海旅会:两岸双向旅游突破一千万人次“攀枝花考古发现商周“冶炼场”遗址 当福建检察机关依法决定对陈盛仪立案侦查边城虎林:坚守绿色发展走上小康路山东:今年大病保险每人最高可获30万今年内蒙古所有旗县公立医院将取消药品广西:北仑河缉私查扣走私疫区牛肉15晚清五大名人:飘摇清室的续命者国家自然科学基金委:2020年实现基福建检察机关依法决定对陈盛仪立案侦查国际社会为中国保护非洲象点赞荷兰藏家方面声明未提肉身坐佛所有权争兰州军区组织团以上军事主官集训 司令朝鲜再次重申与韩国“天安”号沉没事件原标题:安倍赴新加坡使馆悼念李光耀 外媒:安吉丽娜·朱莉切除卵巢和输卵管印度总理莫迪会见杨洁篪姐妹花首现女子中巡赛 石昱婷坦言夺冠
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘