




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘 要:本文通过一个例子程序,系统、详细地介绍了如何设计Delphi的自定义控件,该控件代码技术难度不高,旨在说明Delphi控件的设计方法,包括自定义控件创建向导、代码设计、图标设计及控件发布。Delphi语言受众多程序员追捧,主要原因之一就是它有很多第三方的控件可供使用。很多资深的Delphi程序员都把自己积累的函数、过程等设计成控件,以方便使用,提高开发效率。本文通过一个只允许输入数字、并且可以设置输入值范围和小数点位数的编辑框控件的设计,详细介绍了控件的实现方法。该控件继承自edit控件,控件单元名称为NumEdit,控件类名称为TNumEdit。控件的实现主要分为4个阶段:1、 建立
2、控件原型。2、 设计控件功能代码。3、 设计控件图标。4、 安装发布控件。下面对这四个阶段进行介绍。 1、 建立控件原型。我们可以通过Delphi向导建立控件原型。通过Delphi菜单File-New-Other打开New Items对话框,然后在New属性页中选择Component,点击OK,弹出New Component对话框,在该对话框中设置控件的基本信息,如下图(图1.1):图1.1Ancestor type:选择你的控件要继承的类,我们选择TEdit(StdCtrls)。Class Name:要创建的控件的类名称,我们设置为TNumEdit。Palette Page:该自定义控件发布
3、后将要停靠的控件面板。Unit file name:该控件代码存放路径。设置好上面信息后,点ok按钮,向导自动生成最原始的控件代码,如下:unit NumEdit; /单元名称Interfaceuses /该控件需要调用的单元SysUtils, Classes, Controls, StdCtrls;typeTNumEdit = class(TEdit) /控件类,继承自TEditprivate /私有成员 Private declarations protected /保护成员 Protected declarations public /公有成员 Public declarations p
4、ublished /发布成员 Published declarations end;procedure Register; /过程声明implementation/下面函数功能是将控件TNumEdit的图标显示在Samples面板上。procedure Register;begin Register Components('Samples', TNumEdit); end;end.到目前为止,控件TNumEdit 已经具备了Tedit编辑框的所有功能,下面我们就可以在这个基础上设计我们需求的功能了2、 设计控件功能代码。首先我们知道,该控件功能需求有三个:1)
5、60; 只允许输入数字。2) 可以设置输入范围,即可以设置输入数字的最小、最大值。3) 可以设置输入数字的小数点位数。基于上面需求,我们的控件需要做如下几个方面处理:1) 继承控件接收的按键事件,如果按的不是数字键直接返回。2) 增加控件可以接收的最大值Max、最
6、小值属性Min。3) 增加控件小数点设置的属性dotnum。4) 响应控件焦点离开消息(cm_exit),在这里处理控件中录入的内容,使其大于Min、小于Max且小数点位数等于dotnum。下面结合该控件代码,通过代码的注释介绍我们详细的处理过程。unit NumEdit; /单元名称interfaceuses /该控件需要调用的单元SysUtils, Classes, Controls, StdCtrls;typeTNumEdit = class(T
7、Edit) /控件类,继承自TEditprivate /私有变量声明FMin, FMax: Extended; /编辑框允许输入的最大最小值。Fdotnum:Cardinal; /小数点后位数个数procedure CMExit(var Message: TCMExit); message cm_exit;/响应焦点离开控件的消息protected /保护procedure KeyPress(var Key: Char); override; /重载按键事件procedure SetMin(value: Extended);procedure SetMax(value: Extended);
8、procedure setdotnum(value: Cardinal);public /公有constructor Create(AOwner: TComponent); override;/重载构造函数function formatstr(s:string):String; /规整字符串procedure delaexit; /处理使控件中的内容published /发布三个属性,分别表示最小值,最大值和小数点数 property Min: Extended read FMin write SetMin ; /;property Max: Extended read FMax write
9、SetMax ; /;property dotnum:Cardinal read Fdotnum write setdotnum ; /;end;procedure Register; /注册过程声明implementation函数描述:规整字符串,使其小数位数为:fdotnum。参数s:要处理的数值的字符串形式。返回值:字符串形式的数值,小数位数为fdotnum。function TNumEdit.formatstr(s:string):string;vari,j:integer;len:cardinal;begini:=pos('.',s); /在s中定位小数点if i&l
10、t;>0 then /如果存在小数点beginif i=1 then /如果小数点在第一位,则在前面加0 s:='0'+s;len:=length(s)-pos('.',s); /获取小数点后的位数if Fdotnum=0 then /如果小数点个数设置为0,则取小数点前的部分 s:=copy(s,1,length(s)-len-1)else if len<Fdotnum then /追加0使s满足小数点后有fdotnum位数begin for j:=0 to Fdotnum-len-1 do s:=s+'0'endelse /小数点
11、后位数过多,舍去多余部分,不考虑四舍五入begin s:=copy(s,1,length(s)-(len-Fdotnum);end;endelse/ /不存在小数点,加上小数点,再加n个0begins:=s+'.'if Fdotnum=0 thenelse for j:=0 to Fdotnum-1 do s:=s+'0'end;result:=s;end;过程描述:在自定义控件光标离开或者按回车键的时候处理,使控件里面的内容(text)符合数值范围和小数点位数设置的要求procedure TNumEdit.delaexit();varcurvalue: Ext
12、ended;stemp,stemp1:string;/存放符号和值的字符串形式beginif trim(text)='' then text:='0'/如果为空,默认填写0if copy(text,1,1)='-' then /如果为负数begin stemp1:='-' stemp:=copy(text,2,length(text)-1);endelse /如果不是负数begin stemp1:='' stemp:=text;end;try curvalue:=StrToFloat(stemp); /转换为数字e
13、xcept /转换失败,默认填写0并格式或为设定的小数位数。 showmessage('不是有效的数字!请确认'); text:=formatstr('0'); self.SetFocus;end;/下面对最大值处理,分为大于0,等于0和小于0三种情况if FMax>0 then /设置的最大值大于0的处理begin if (stemp1='') and (curvalue>FMax) then /为正且大于最大 curvalue:=FMaxendelse if FMax=0 then /等于0的处理begin if (stemp1=
14、'') then curvalue:=FMax;endelse if FMax<0 then /小于0多处理begin if (stemp1='') then curvalue:=FMax else if curvalue>abs(FMax) then curvalue:=abs(FMax);end;/下面对最小值处理,分为大于0,等于0和小于0三种情况if FMin>0 then /最小值大于0begin if (stemp1='') and (curvalue<FMin) then /支持负数 curvalue:=FM
15、in else if stemp1='-' then curvalue:=FMin;endelse if FMin=0 then /最小值等于0begin if stemp1='-' then curvalue:=FMin;endelse if FMin<0 then /最小值小于0begin if (stemp1='-') and (curvalue>abs(FMin) then curvalue:=abs(FMin);end;/下面对小数位数进行处理if curvalue=0 then text:=formatstr(floatt
16、ostr(curvalue)else text:=stemp1+formatstr(floattostr(curvalue);end;函数描述:重载构造函数,设置自定义控件三个新增属性的默认值 constructor TNumEdit.Create(AOwner: TComponent);begininherited Create(AOwner);FMin := 0; /最小值默认为0FMax := 255; /最大值默认为255Fdotnum:=2; /小数点个数默认为2个Text := formatstr('0'); /text继承自Tedit,设置默认显示为0.00end
17、;3、 设计控件图标。Delphi控件要使用一个图标显示在Delphi的控件面板上供开发者使用(由上面设计可知,该控件要显示在Delphi控件面板的samples面板上),控件的图标有如下要求(注意图标文件名和图标名称的区别,下面有讲述):1) 图标文件名称为dcr(后缀名为dcr)格式,该类文件可认为是图标的容器,其中可以包含多个图标。2) 图标文件名要与控件单元的文件名一致,如该控件的图标文件名应该为NumEdit.dcr。3)
18、0; 图标名称要与控件类名称一致。如本控件的图标名称应该为TNumEdit。4) 图标文件要与控件单元文件位于同一目录下,这样发布控件时候才能关联到一块。下面通过用Delphi自带的工具image editor设计本控件的图标来介绍控件图标的设计,步骤如下:1) 通过Delphi的菜单“tools-image editor”打开图标编辑工具。2)
19、 通过file-new-component resource file(.dcr)建立一个图标文件。把它保存在NumEdit.pas相同目录下,名称为:NumEdit.dcr。此时image-editor如下图示(图3.1):图3.13) 在上图中,鼠标右键点Contents,然后在弹出的菜单中选择 “new-Bitmap”打开“Bitmap Properties”框,设置属性后点“OK”即可创建一个默认名称为 “bitmap1”的位图,把其名称修改为“TNumEdit”,并双击它打开,然后通过画笔等工具设计该位图,示意如下(图3.2):图3.2设计位图根据自己的喜好,这里做简单的设计,设计好后保存即可。至此,该控件对应的图标已经设计好。4、 安装发布控件。目前我们已经完成了控件的设计,该控件包含两个文件,代码文件NumEdit.pas和图标文件NumEdit.dcr。这一节介绍如何把该控件安装到Delphi的控件面板上供开发者使用,步骤如下:1、 把这两个文件拷贝到一指定目录下,对于自定义控件,作为一种好的开发习惯,我们一般在Delphi安装目录下建立custom目录并把自定义控件拷贝过去。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度教育培训机构教育行业数据服务协议
- 二零二五年度农业科技文职人员聘用协议
- 2025年度茶楼合作经营协议书:茶楼与茶艺茶具研发中心的合作合同
- 二零二五年度知识产权质押合同解除与资金返还协议
- 2025年度船舶租赁与船舶技术咨询服务协议
- 2025年度超市转让与智能化升级改造合作协议
- 2025年度智能化社区物业委托经营管理合同
- 专业资格教育培训合作协议
- 新型储能技术应用开发合作协议
- 行路难:古典诗词中的壮志情怀教案
- 《中国溃疡性结肠炎诊治指南(2023年)》解读
- 中国故事英文版哪吒英文二篇
- 铁路桥梁工程各工序工效分析
- 2022《文创产品的设计》PPT演示文稿
- 介入科制度汇编
- 镀锌管理论重量表常用
- 铁总计统【2017】177号关于进一步加强铁路建设项目征地拆迁工作和费用管理的指导意见
- 电子技术基础与技能-(3)
- 部编版四年级下册语文第二单元课文教材分析及全部教案
- 美术开学第一课(课堂PPT)
- 出生证明委托书(共2页)
评论
0/150
提交评论