delphi自定义控件设计.docx

上传人:b****1 文档编号:3159763 上传时间:2023-05-05 格式:DOCX 页数:15 大小:298.90KB
下载 相关 举报
delphi自定义控件设计.docx_第1页
第1页 / 共15页
delphi自定义控件设计.docx_第2页
第2页 / 共15页
delphi自定义控件设计.docx_第3页
第3页 / 共15页
delphi自定义控件设计.docx_第4页
第4页 / 共15页
delphi自定义控件设计.docx_第5页
第5页 / 共15页
delphi自定义控件设计.docx_第6页
第6页 / 共15页
delphi自定义控件设计.docx_第7页
第7页 / 共15页
delphi自定义控件设计.docx_第8页
第8页 / 共15页
delphi自定义控件设计.docx_第9页
第9页 / 共15页
delphi自定义控件设计.docx_第10页
第10页 / 共15页
delphi自定义控件设计.docx_第11页
第11页 / 共15页
delphi自定义控件设计.docx_第12页
第12页 / 共15页
delphi自定义控件设计.docx_第13页
第13页 / 共15页
delphi自定义控件设计.docx_第14页
第14页 / 共15页
delphi自定义控件设计.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

delphi自定义控件设计.docx

《delphi自定义控件设计.docx》由会员分享,可在线阅读,更多相关《delphi自定义控件设计.docx(15页珍藏版)》请在冰点文库上搜索。

delphi自定义控件设计.docx

delphi自定义控件设计

Delphi自定义控件设计

邓清闯张丹姬希娜李国杰

(许继电气中试部河南许昌461000)

摘要:

本文通过一个例子程序,系统、详细地介绍了如何设计Delphi的自定义控件,该控件代码技术难度不高,旨在说明Delphi控件的设计方法,包括自定义控件创建向导、代码设计、图标设计及控件发布。

关键词:

控件、自定义控件、Delphi控件

DesigncustomcontrolinDelphi

Dengqingchuangzhangdanjixinaliguojie

(IntermediateTestDPT.XJElectricCo.,Ltd.XuChangCity,HenanProvince461000)

【Abstract】thispapergivesasystematicanddetailedintroductionofhowtodesigncustomcontrolinDelphithoughanexampleprogram。

Thecodeofthiscustomcontrolisnottechnicallydifficult。

it’sintendedtoillustratehowtodesignusercontrolinDelphi,includinghowit’screatedbyappwizard、codedesign、icondesignandtheissueofthecontrol。

【Keywords】control、customcontrol、Delphicontrol

Delphi语言受众多程序员追捧,主要原因之一就是它有很多第三方的控件可供使用。

很多资深的Delphi程序员都把自己积累的函数、过程等设计成控件,以方便使用,提高开发效率。

本文通过一个只允许输入数字、并且可以设置输入值范围和小数点位数的编辑框控件的设计,详细介绍了控件的实现方法。

该控件继承自edit控件,控件单元名称为NumEdit,控件类名称为TNumEdit。

控件的实现主要分为4个阶段:

1、建立控件原型。

2、设计控件功能代码。

3、设计控件图标。

4、安装发布控件。

下面对这四个阶段进行介绍。

1、建立控件原型

我们可以通过Delphi向导建立控件原型。

通过Delphi菜单File-New-Other

打开NewItems对话框,然后在New属性页中选择Component,点击OK,弹出NewComponent对话框,在该对话框中设置控件的基本信息,如下图(图1.1):

图1.1

Ancestortype:

选择你的控件要继承的类,我们选择TEdit(StdCtrls)。

ClassName:

要创建的控件的类名称,我们设置为TNumEdit。

PalettePage:

该自定义控件发布后将要停靠的控件面板。

Unitfilename:

该控件代码存放路径。

设置好上面信息后,点ok按钮,向导自动生成最原始的控件代码,如下:

unitNumEdit;//单元名称

Interface

uses//该控件需要调用的单元

SysUtils,Classes,Controls,StdCtrls;

type

TNumEdit=class(TEdit)//控件类,继承自TEdit

private//私有成员

{Privatedeclarations}

protected//保护成员

{Protecteddeclarations}

public//公有成员

{Publicdeclarations}

published//发布成员

{Publisheddeclarations}

end;

procedureRegister;//过程声明

implementation

//下面函数功能是将控件TNumEdit的图标显示在Samples面板上。

procedureRegister;

begin

RegisterComponents('Samples',[TNumEdit]);

end;

end.

到目前为止,控件TNumEdit已经具备了Tedit编辑框的所有功能,下面我们就可以在这个基础上设计我们需求的功能了。

2、设计控件功能代码

首先我们知道,该控件功能需求有三个:

1)只允许输入数字。

2)可以设置输入范围,即可以设置输入数字的最小、最大值。

3)可以设置输入数字的小数点位数。

基于上面需求,我们的控件需要做如下几个方面处理:

1)继承控件接收的按键事件,如果按的不是数字键直接返回。

2)增加控件可以接收的最大值Max、最小值属性Min。

3)增加控件小数点设置的属性dotnum。

4)响应控件焦点离开消息(cm_exit),在这里处理控件中录入的内容,使其大于Min、小于Max且小数点位数等于dotnum。

下面结合该控件代码,通过代码的注释介绍我们详细的处理过程。

unitNumEdit;//单元名称

interface

uses//该控件需要调用的单元

 SysUtils,Classes,Controls,StdCtrls;

type

 TNumEdit=class(TEdit)//控件类,继承自TEdit

 private//私有变量声明

FMin,FMax:

Extended;//编辑框允许输入的最大最小值。

Fdotnum:

Cardinal;//小数点后位数个数

procedureCMExit(varMessage:

TCMExit);messagecm_exit;//响应焦点离开控件的消息

 protected//保护

procedureKeyPress(varKey:

Char);override;//重载按键事件

procedureSetMin(value:

Extended);

procedureSetMax(value:

Extended);

proceduresetdotnum(value:

Cardinal);

 public//公有

constructorCreate(AOwner:

TComponent);override;//重载构造函数

functionformatstr(s:

string):

String;//规整字符串

proceduredelaexit;//处理使控件中的内容

published//发布三个属性,分别表示最小值,最大值和小数点数

propertyMin:

ExtendedreadFMinwriteSetMin;//;

propertyMax:

ExtendedreadFMaxwriteSetMax;//;

propertydotnum:

CardinalreadFdotnumwritesetdotnum;//;

end;

procedureRegister;//注册过程声明

implementation

{函数描述:

规整字符串,使其小数位数为:

fdotnum。

参数s:

要处理的数值的字符串形式。

返回值:

字符串形式的数值,小数位数为fdotnum。

}

functionTNumEdit.formatstr(s:

string):

string;

var

i,j:

integer;

len:

cardinal;

begin

i:

=pos('.',s);//在s中定位小数点

ifi<>0then//如果存在小数点

begin

ifi=1then//如果小数点在第一位,则在前面加0

s:

='0'+s;

len:

=length(s)-pos('.',s);//获取小数点后的位数

ifFdotnum=0then//如果小数点个数设置为0,则取小数点前的部分

s:

=copy(s,1,length(s)-len-1)

elseiflen

begin

forj:

=0toFdotnum-len-1do

s:

=s+'0';

end

else//小数点后位数过多,舍去多余部分,不考虑四舍五入

begin

s:

=copy(s,1,length(s)-(len-Fdotnum));

end;

end

else////不存在小数点,加上小数点,再加n个0

begin

s:

=s+'.';

ifFdotnum=0then

else

forj:

=0toFdotnum-1do

s:

=s+'0';

end;

result:

=s;

end;

{过程描述:

在自定义控件光标离开或者按回车键的时候处理,使控件里面的内容(text)符合数值范围和小数点位数设置的要求}

procedureTNumEdit.delaexit();

var

curvalue:

Extended;

stemp,stemp1:

string;//存放符号和值的字符串形式

begin

iftrim(text)=''thentext:

='0';//如果为空,默认填写0

ifcopy(text,1,1)='-'then//如果为负数

begin

stemp1:

='-';

stemp:

=copy(text,2,length(text)-1);

end

else//如果不是负数

begin

stemp1:

='';

stemp:

=text;

end;

try

curvalue:

=StrToFloat(stemp);//转换为数字

except//转换失败,默认填写0并格式或为设定的小数位数。

showmessage('不是有效的数字!

请确认');

text:

=formatstr('0');

self.SetFocus;

end;

//下面对最大值处理,分为大于0,等于0和小于0三种情况

ifFMax>0then//设置的最大值大于0的处理

begin

if(stemp1='')and(curvalue>FMax)then//为正且大于最大

curvalue:

=FMax

end

elseifFMax=0then//等于0的处理

begin

if(stemp1='')then

curvalue:

=FMax;

end

elseifFMax<0then//小于0多处理

begin

if(stemp1='')then

curvalue:

=FMax

elseifcurvalue>abs(FMax)then

curvalue:

=abs(FMax);

end;

//下面对最小值处理,分为大于0,等于0和小于0三种情况

ifFMin>0then//最小值大于0

begin

if((stemp1='')and(curvalue

curvalue:

=FMin

elseifstemp1='-'then

curvalue:

=FMin;

end

elseifFMin=0then//最小值等于0

begin

ifstemp1='-'then

curvalue:

=FMin;

end

elseifFMin<0then//最小值小于0

begin

if((stemp1='-')and(curvalue>abs(FMin)))then

curvalue:

=abs(FMin);

end;

//下面对小数位数进行处理

ifcurvalue=0then

text:

=formatstr(floattostr(curvalue))

else

text:

=stemp1+formatstr(floattostr(curvalue));

end;

{函数描述:

重载构造函数,设置自定义控件三个新增属性的默认值}

constructorTNumEdit.Create(AOwner:

TComponent);

begin

inheritedCreate(AOwner);

FMin:

=0;//最小值默认为0

FMax:

=255;//最大值默认为255

Fdotnum:

=2;//小数点个数默认为2个

Text:

=formatstr('0');//text继承自Tedit,设置默认显示为0.00

end;

{过程描述:

响应焦点离开控件的消息:

cm_exit。

在焦点离开时调用过程delaexit()处理控件内容}

procedureTNumEdit.CMExit(varMessage:

TCMExit);

begin

inherited;//继承父类Tedit的响应

delaexit();//处理控件内容

end;

//设置最小值

procedureTNumEdit.SetMin(value:

Extended);

begin

FMin:

=value;

ifFMax

FMax:

=FMin;

end;

//设置最大值

procedureTNumEdit.SetMax(value:

Extended);

begin

FMax:

=value;

ifFMin>FMaxthen

FMin:

=FMax;

end;

//设置小数点位数

procedureTNumEdit.setdotnum(value:

Cardinal);

begin

Fdotnum:

=value;

Text:

=formatstr('0');

end;

{函数描述:

重载按键响应,只响应输入数字和回车}

procedureTNumEdit.KeyPress(varKey:

Char);//override;

begin

inheritedKeyPress(Key);//继承父类

ifkeyin[#13]then//如果按回车键,处理控件内容

delaexit;

Ifnot(keyin[#45,#46,#48..#57,#8])then//如果非数字键,不响应

begin

key:

=#0;//该语句使你按键时候,控件不予处理、不显示

end;

end;

{注册控件使TNumEdit显示在delphi控件面板的Samples面板}

procedureRegister;

begin

RegisterComponents('Samples',[TNumEdit]);

end;

end.

上面的编码设计使该控件已经满足了需求中提出的功能要求。

 

3、设计控件图标

Delphi控件要使用一个图标显示在Delphi的控件面板上供开发者使用(由上面设计可知,该控件要显示在Delphi控件面板的samples面板上),控件的图标有如下要求(注意图标文件名和图标名称的区别,下面有讲述):

1)图标文件名称为dcr(后缀名为dcr)格式,该类文件可认为是图标的容器,其中可以包含多个图标。

2)图标文件名要与控件单元的文件名一致,如该控件的图标文件名应该为NumEdit.dcr。

3)图标名称要与控件类名称一致。

如本控件的图标名称应该为TNumEdit。

4)图标文件要与控件单元文件位于同一目录下,这样发布控件时候才能关联到一块。

下面通过用Delphi自带的工具imageeditor设计本控件的图标来介绍控件图标的设计,步骤如下:

1)通过Delphi的菜单“tools-imageeditor”打开图标编辑工具。

2)通过file-new-componentresourcefile(.dcr)建立一个图标文件。

把它保存在NumEdit.pas相同目录下,名称为:

NumEdit.dcr。

此时image-editor如下图示(图3.1):

图3.1

3)在上图中,鼠标右键点Contents,然后在弹出的菜单中选择“new-Bitmap”打开“BitmapProperties”框,设置属性后点“OK”即可创建一个默认名称为“bitmap1”的位图,把其名称修改为“TNumEdit”,并双击它打开,然后通过画笔等工具设计该位图,示意如下(图3.2):

图3.2

设计位图根据自己的喜好,这里做简单的设计,设计好后保存即可。

至此,该控件对应的图标已经设计好。

4、安装发布控件

目前我们已经完成了控件的设计,该控件包含两个文件,代码文件NumEdit.pas和图标文件NumEdit.dcr。

这一节介绍如何把该控件安装到Delphi的控件面板上供开发者使用,步骤如下:

1、把这两个文件拷贝到一指定目录下,对于自定义控件,作为一种好的开发习惯,我们一般在Delphi安装目录下建立custom目录并把自定义控件拷贝过去。

这里我们也建立custom\numedit目录,然后把该控件的文件拷贝到该目录下,如下:

C:

\ProgramFiles\Borland\Delphi7\custom\numedit\

2、在Delphi库中增加该控件的路径。

通过菜单:

“tools-environment-options打开environment-options对话框,选择library属性页,然后单击librarypath后的选项按钮打开Directories对话框,在该对话框中手工录入或者通过选项按钮把控件路径填写进去,如图(图4.1)所示:

图4.1

点击“Add”按钮,点击OK,回到“environment-options”对话框,再点击“OK”完成库文件路径添加。

3、控件安装。

通过前两步的处理,我们就可以安装控件了,通过菜单“Component-InstallComponent”打开控件安装对话框,点intoexistingpackage属性页中的unitfilename后的Browse按钮,选中要安装的控件文件NumEdit.pas,然后点“OK”按钮即可。

系统提示是否编译,选择编译后便可以把该控件安装到Delphi的控件面板,如下图:

图4.2

到目前我们已经完成了一个控件从最开始的需求分析到最终发布使用的全部过程。

  好了,设计程序的时候,把上面的控件(红色的,在控件图标设计中设计的那个图标)拖到Delphi的窗体上、通过设置控件的属性就可以使用该控件了。

简单吧,快动手设计一个自己的控件吧。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2