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

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

为Ruby On Rails开发者准备的5款IDE 一位开发人员的生日愿望清单 当“硅”已走到尽头,我们又该用什么去维系摩尔定律? 高端大气上档次 8位iOS顶级女程序媛 谁都可以做开发者:微软推出Windows Phone Web工具 Mozilla正式发布Firefox 23 新增混合内容拦截 网络监控功能 14条建议,使你的IT职业生涯更上一层楼 依托微信的电商产品实践——SDCC 2013讲师潘凡专访 IBM将向Google、英伟达等授权Power架构技术 人脑研究将推动下一代网络革命?从大爆炸到大收缩 H3C携手F5将“空转”数据中心变为“分布式数据中心” W3C小组发布Web存储API推荐标准 开发者必备的6款源码搜索引擎 闪亮登场:开发者制作图形图表所需的11款JS工具包 来自两位技术大牛的博弈:HBase或将制霸NoSQL? 应用改变世界 2013英特尔&#174;创新应用大赛火热开启 看13位CEO、创始人和高管如何提高工作效率 对首次购买智能手机用户而言,苹果吸引力并不大 Amazon Appstore面向Web应用开放 开发者可添加应用内付费功能 CSC收购成功转型的大数据初创公司InfoChimps 嘀嘀打车发展报告:成全球最大出租车调度平台 又摊上事儿了,Android的MasterKey再次出现bug 比特币挖矿必备工具 硬件性能大比拼 RDBMS vs. NoSQL:反派为什么会得以存活并发展壮大 帮助优化移动网站:谷歌发布新指南和PageSpeed Insights工具 增强Web可用性,你需要避免的七大设计错误 Python六大开源框架对比:Web2py略胜一筹 海外看中国:老外开发者间流传着的7件事儿 京东云峰:电商移动云平台背后的技术 初创公司DigitalOcean:55秒搭建一个云服务器 分布式系统事务原子性的非阻塞实现 烦人的问题(该问题在VBA区也没解决),怎样在word中为自定义按钮动态制定自定义的图标? 怎样将用Graphics类画的图保存为jpeg文件格式(在线等候)谢谢 想和大家一起来讨论 VC中的快捷操作! 请奉献!!!!! oracle字符集问题,在线等待,解决后马上结帐! 谁能告诉我CJLibrary是一个什么样的类库?以及他的功能?谢谢!!! 在水晶报表中如何调用存贮过程?在线等!!! Modem之间建立无法建立连接,据说跟电平有关? 寻书城管理软件系统 提示 一个很重要又很常见的问题。 请问有什么调试工具来调试asp程序 一方有难,八方支援,我有疑难,你能否来? 请问使用STL如何将字符串变成大写 OOAD 我对这段代码很困惑!!不知为何出错,请大虾指点一二!!! SQL Server数据库中支持的数据表的最大数是多少? 有会用SDL(Simple DirectMedia Layer)的么? 如何重新启动电脑啊 ooad 有人对xml文档及schema映射为数据库的记录和表作过研究吗? 窗体启动时,Load之后是什么事件 安装好了J2EESDK1。4后怎样运行JAVA程序? 有关DBGrid的问题 IBM的硬盘是不是很菜!惨啊!奉劝大家多多备份,不要买IBM的盘 合格的程序员应该具备哪些知识和技能? 在报表中如何显示出来----共n页/第几页 急寻广州深圳两地图书城管理软件公司 用jdk写出的application里的汉字很难看,有没有解决的办法? 面向对象分析与设计 那位有<<java大学教程>>的光盘,可不可以把光盘上的附录部分发给我!(100分) 关于win2000中的odbc的问题 vfw 软件工程师和程序员有什么不同? 一方有难,八方支援,我有疑难,你能否来? 唉。 发现有人还在吃糠。。。。痛心ing.............. 为什么我连不到mysql? 有什么比做ghost更好的硬盘数据备份方法? 请教:在dataGrid 中如何根据行值的不同,设置不同的颜色 一般菜的问题,不知道你遇到过没有,请大家过来看一下 分析与设计 3D場景鋸齒消除問題 一方有难,八方支援,我有疑难,你能否来? 发布新软件,请帮助测试 一个白痴问题!哪个函数可以去除字符串中的空格? 在两台服务器上的数据库间创建触发器的注意事项? 有一好的想法,但途中这个问题搞不定 各位高手,请问用API怎样获得本机的网卡的IP地址 面向对象ooad 有没有类似deltree功能的函数啊? weblogic初级问题 小问题, 如何把个DBIMAGE里的图片复制到剪贴板里去?? 初一下册科学课时训练第17页到18页 急! 函数f(x)=-x^2+4x+5,x∈[1,4]的最小值和最大值分别是 梯形ABCD中,AD//BC,∠B=65°,∠C=25°,AD=2,BC=8,AB=3,求梯形ABCD的面积 沈阳观光巴士的英文介绍 如何理理等可能概率事件,即事件A 发生的概率 = A所包含的基本事件/S中基本事件的总数如何理理等可能概率事件,即事件A 发生的概率 = A所包含的基本事件/S中基本事件的总数S是样本空间 在梯形ABCD中AD//BC 若∠B=50°∠C=65 说明AB等于BC与AD的差 咏物言志类诗词 怎样确定数学概率中基本事件的总数,为什么有些要乘?有的要加?有的又要乘了再除以2?有什么规律吗?预习高中概率这一章的时候,不知道基本事件总数要怎样求,很沮丧,如题:在夏令营的7名成 如图,梯形ABCD中,AD‖BC,∠B=65°∠c=25°,AD=2,BC=8,AB=3,求梯形ABCD的面积 求广安景区英文介绍邓小平故居,沿口古镇,华蓥山石林,岳池翠湖的英文介绍,速求,摆脱,明早上之前的话就给300分哈 还有广安地理介绍 不是等可能的事件的概率如何计算 有3个有理数x、y、z若x=2/(—1)ⁿ—1 且x与y互为相反数,y与z为倒数.1.当n为奇数时,你能求出x、y、z这三个数吗?当n为偶数时呢?2.根据(1)的结果计算:xy—yⁿ—(y—z)²º¹¹的 咏物言志的诗句关于:石灰,梅花,小草,青松. 7000分之一的概率,算不算小概率事件RT 因式分解有关题目1.x^n+2x^(n+1)+x^(n+2)将它分解因式2.(x+1)(x+2)(x+3)(x+4)+1将它分解因式,注意结果上的处理,我算的结果是(x^2+5x+5)^2,但不对,好像还要根据b^2-4ac这个判别式,对括号内的结果进行运 全英文的风景区介绍!在哪个网站或哪本书上可以弄到全英文的对中国各个省份的自然景区的介绍,要分类的,不要那种一两篇文章就把所有的景区写完了的那种,希望知道的人快告诉我,时间紧 反比例函数的一道选择题在三角形ABC的三个顶点A(2,-3),B(-4,-5),C(-3,2)中,可能在反比例函数Y=k/x(k>0)的图像上的点是( )A.A点B.B点C.C点D.不存在 有关因式分解的题1.(a+b)的平方-4(a+b-1)(因式分解)2.a的平方(b+1)-b的平方(a+1) 因式分解3.4a(b-a)-b的平方 因式分解4.已知(a的平方+b的平方)(a的平方+b的平方-1)=12 求a的平方+b的平方 关于咏物言志的诗句 请根据词语的不同意思分别造句.重担:1.肩上挑的货物多.____________ 2.比喻繁重的责任.____________ 因式分解 已知m,n均为正整数,且有m(m-n)-(n-m)=12求m,n的值 要用方程解,一个数的5倍比它的3倍多20.7,这个数是? 咏物言志的古诗有哪些?RT 六年级上册数学应用题60道和计算题100道, 中国沈阳用英语怎么写 三首咏物言志诗词1.王安石《梅花》,张谓《早梅》,陆游《卜算子 咏梅》赞颂了梅花---------------的品质,王安石写出了梅花------------,张谓再现了梅花------------------,陆游则不无怜惜地写出了梅 一次一次地 继续努力 是什么词语? I've left my schoolbag in the classroom.I'll ___ it for you.bring get take carry我觉得是take 答案是get 为什么? 17.18初一证明题 1道7年级因式分解计算题(x+2)² (x-2)² If you happen( )that interesting story,please tell me .A.to fine B.finding C.found D.finds 16.17.18题,并说明理由, 七年级下册因式分解的应用题【过程】^2表示2次方1.在一个边长为12.75cm的正方形内挖去一个边长为7.25cm的小正方形,那么剩下部分的面积是多少?2.计算(1-1/2^2)(1-1/3^2)…(1-1/9^2)(1-1/10^2)3.已知 函数f(x)=根号(2x+2)-根号(1-x)的最大值and最小值 英语翻译可能工作量很大,对不起 我手抖 地址是gothicregina@foxmail.com 若带来不便,万分抱歉 二道七年级的应用题1.已知A、B两地相距120千米,甲、乙两人都要从A地前往B地,若甲所用的时间比乙少一个小时,且甲的速度是乙的1.5倍,求甲乙各自的速度.(用方程,并计算出答案.)2.小丽与小 求借物言志和借景抒情的诗句个一句 13个小朋友参加乐乐的生日party,乐乐的爸爸说:“你们中间至少有两个同学是同一个月出生的.:你认为他对 关于反比例函数几个选择题 写出一句借景抒情的诗句 Foxmail使用Foxmail如何确保邮件成功发送 Foxmail其它问题 因式分解20道题要答案 表达朋友间深厚感情诗歌 表达诗人强烈的爱国情感诗歌 表达母爱深深的诗歌 咏物言志诗歌 借景抒情的歌三首急 将三个不同的球随机放入三个不同的盒中,则出现两个空盒的概率为?答案是1/6 因式分解20道需要20道因式分解题,急用, 已知:3a^2+2a-3=0,求4-9a^2-6a的值 三个不同的球随机地放入三个不同的盒中,则出现两个空盒的概率是多少?答案是1/6 , x平方-4x在「0,3」最大值最小值 民间有个美丽的“牛郎织女”的传说.据天文测量,牛郎星与织女星相距160万亿千米,牛郎眨眨眼,织女要隔多长时间才能看到?能说明原因吗 木炭不能在氧气中燃烧发光无火焰,但为什么在日常生活中的木炭有时会燃烧得生成火 一道有关反比例函数的数学选择题若自变量y与x成正比例,变量x又于z成反比例,则y与x的关系是 ( )A.成正比例 B.成反比例 C.y与z的平方成正比例D.y与z的平方成反比例是求y与z的关系是什么 21.单项选择21.The name _________ the school is Yuying School.A.at B.in C.of D.for 木炭不能在氧气中燃烧发光无火焰,但为什么在日常生活中的木炭有时会燃烧得生成火原因是木炭不能在氧气中燃烧发光无火焰,但为什么在日常生活中的木炭有时会燃烧得生成火其原因可能 初三数学选择题——反比例函数如图,等腰直角三角形ABC位于第一象限,AB=AC=2,直角顶点A在直线y=x上,其中A点横坐标为1,且两条直角边AB和AC分别平行于x,y轴,若双曲线y=k/x(k不等于0)与△ABC有交点, 英语教育机构哪个比较好? 4a^2=( )^2 16/25X^4Y^2=( )^2 36(X+2Y)^2=[ ]^2 49(X-3Y)^2=[ ]^2 因式分解, 在梯形ABCD中,AD‖BC,DC=BC-AD,角B=75°,求角C的度数 我们可以在电视中看到这样的画面,飓风刮起,屋顶一个个被掀飞,是什么力量使屋顶被掀飞的呢?飓风发生时,屋外的气压急剧降到9×10的4次方Pa,如果可以认为一个门窗紧闭的屋子室内气压是标 1235² 225²····就像这种末尾带5的数 如何速度求平方 在梯形ABCD中,AD‖BC,∠ABC=75°,把梯形沿直线EF翻折,使点B落在线段AD上的点B'处,连结BB’交EF于点O,若∠B’FC=90°,EO=2,求OF的长若∠B’FC=90°,EO=2,求OF的长一定要很好。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘