delphi语言受众多程序员追捧,主要原因之一就是它有很多第三方的控件可供使用。很多资深的delphi程序员都把自己积累的函数、过程等设计成控件,以方便使用,提高开发效率。

本文通过一个只允许输入数字、并且可以设置输入值范围和小数点位数的编辑框控件的设计,详细介绍了控件的实现方法。该控件继承自edit控件,控件单元名称为numedit,控件类名称为tnumedit。控件的实现主要分为4个阶段:

1、 建立控件原型。

2、 设计控件功能代码。

3、 设计控件图标。

4、 安装发布控件。

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

1、 建立控件原型

我们可以通过delphi向导建立控件原型。通过delphi菜单file-new-other

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

图1.1

ancestor type:选择你的控件要继承的类,我们选择tedit(stdctrls)。

class name:要创建的控件的类名称,我们设置为tnumedit。

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

unit file name:该控件代码存放路径。

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

unit numedit; //单元名称

interface

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

sysutils, classes, controls, stdctrls;

type

tnumedit = class(tedit) //控件类,继承自tedit

private//私有成员

{ private declarations }

protected//保护成员

{ protected declarations }

public//公有成员

{ public declarations }

published//发布成员

{ published declarations }

end;

procedure register;//过程声明

implementation

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

procedure register;

begin

register components('samples', [tnumedit]);

end;

end.

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

2、 设计控件功能代码

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

1)只允许输入数字。

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

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

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

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

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

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

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

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

unit NumEdit; //单元名称
interface
uses //该控件需要调用的单元
 SysUtils, Classes, Controls, StdCtrls;
type
 TNumEdit = class(TEdit) //控件类,继承自TEdit
 private //私有变量声明
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);
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 SetMax ; //;
property dotnum:Cardinal read Fdotnum write setdotnum ; //;
end;
procedure Register; //注册过程声明
implementation
{函数描述:规整字符串,使其小数位数为:fdotnum。
参数s:要处理的数值的字符串形式。
返回值:字符串形式的数值,小数位数为fdotnum。}
function TNumEdit.formatstr(s:string):string;
var
i,j:integer;
len:cardinal;
begin
i:=pos('.',s); //在s中定位小数点
if i<> then //如果存在小数点
begin
if i= then //如果小数点在第一位,则在前面加0
s:=''+s;
len:=length(s)-pos('.',s); //获取小数点后的位数
if Fdotnum= then //如果小数点个数设置为0,则取小数点前的部分
s:=copy(s,,length(s)-len-)
else if len<Fdotnum then //追加0使s满足小数点后有fdotnum位数
begin
for j:= to Fdotnum-len- do
s:=s+'';
end
else //小数点后位数过多,舍去多余部分,不考虑四舍五入
begin
s:=copy(s,,length(s)-(len-Fdotnum));
end;
end
else// //不存在小数点,加上小数点,再加n个0
begin
s:=s+'.';
if Fdotnum= then
else
for j:= to Fdotnum- do
s:=s+'';
end;
result:=s;
end;
{过程描述:在自定义控件光标离开或者按回车键的时候处理,使控件里面的内容(text)符合数值范围和小数点位数设置的要求}
procedure TNumEdit.delaexit();
var
curvalue: Extended;
stemp,stemp1:string;//存放符号和值的字符串形式
begin
if trim(text)='' then text:='';//如果为空,默认填写0
if copy(text,,)='-' then //如果为负数
begin
stemp1:='-';
stemp:=copy(text,,length(text)-);
end
else //如果不是负数
begin
stemp1:='';
stemp:=text;
end;
try
curvalue:=StrToFloat(stemp); //转换为数字
except //转换失败,默认填写0并格式或为设定的小数位数。
showmessage('不是有效的数字!请确认');
text:=formatstr('');
self.SetFocus;
end;
//下面对最大值处理,分为大于0,等于0和小于0三种情况
if FMax> then //设置的最大值大于0的处理
begin
if (stemp1='') and (curvalue>FMax) then //为正且大于最大
curvalue:=FMax
end
else if FMax= then //等于0的处理
begin
if (stemp1='') then
curvalue:=FMax;
end
else if FMax< then //小于0多处理
begin
if (stemp1='') then
curvalue:=FMax
else if curvalue>abs(FMax) then
curvalue:=abs(FMax);
end;
//下面对最小值处理,分为大于0,等于0和小于0三种情况
if FMin> then //最小值大于0
begin
if ((stemp1='') and (curvalue<FMin)) then //支持负数
curvalue:=FMin
else if stemp1='-' then
curvalue:=FMin;
end
else if FMin= then //最小值等于0
begin
if stemp1='-' then
curvalue:=FMin;
end
else if FMin< then //最小值小于0
begin
if ((stemp1='-') and (curvalue>abs(FMin))) then
curvalue:=abs(FMin);
end;
//下面对小数位数进行处理
if curvalue= then
text:=formatstr(floattostr(curvalue))
else
text:=stemp1+formatstr(floattostr(curvalue));
end;
{函数描述:重载构造函数,设置自定义控件三个新增属性的默认值}
constructor TNumEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FMin := ; //最小值默认为0
FMax := ; //最大值默认为255
Fdotnum:=; //小数点个数默认为2个
Text := formatstr(''); //text继承自Tedit,设置默认显示为0.00
end;

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

3、 设计控件图标

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

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

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

3)图标名称要与控件类名称一致。如本控件的图标名称应该为tnumedit。

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

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

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

2)通过file-new-component resource file(.dcr)建立一个图标文件。把它保存在numedit.pas相同目录下,名称为:numedit.dcr。此时image-editor如下图示(图3.1):

图3.1

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

图3.2

设计位图根据自己的喜好,这里做简单的设计,设计好后保存即可。至此,该控件对应的图标已经设计好。

4、 安装发布控件

目前我们已经完成了控件的设计,该控件包含两个文件,代码文件numedit.pas和图标文件numedit.dcr。这一节介绍如何把该控件安装到delphi的控件面板上供开发者使用,步骤如下:

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

c:\program files\borland\delphi7\custom\numedit\

2、 在delphi库中增加该控件的路径。通过菜单:

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

图4.1

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

3、控件安装。通过前两步的处理,我们就可以安装控件了,通过菜单“component-install component”打开控件安装对话框,点into existing package属性页中的unit file name后的browse按钮,选中要安装的控件文件numedit.pas,然后点“ok”按钮即可。系统提示是否编译,选择编译后便可以把该控件安装到delphi的控件面板,如下图:

图4.2

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

好了,设计程序的时候,把上面的控件(红色的,在控件图标设计中设计的那个图标)拖到delphi的窗体上、通过设置控件的属性就可以使用该控件了。简单吧,快动手设计一个自己的控件吧。

delphi Edit 控制最大值,只能输入数字型 控制小数位数的更多相关文章

  1. 控制input只能输入数字和两位小数

    <input type="text" name="je" onkeyup="clearNoNum(this)" /> funct ...

  2. javascript正则表达式控制input只能输入数字

    不能输入中文 <input type="text" name="textfield"  onkeyup="this.value=this.val ...

  3. jquery控制input只能输入数字和两位小数

    jquery代码 function num(obj){ obj.value = obj.value.replace(/[^\d.]/g,""); //清除"数字" ...

  4. js控制input只能输入数字和小数点后两位,输入其他自动清除方法。

    工作中input='text'总会遇到要控制输入数字,或者是输入中文,输入电话,输入身份证号,邮箱等.今天我遇到的是要输入数字并且只能小数点后面两位的数字,还不能为负数.废话不多说上代码: <i ...

  5. 【aardio】如何让edit控件只能输入数字、小数点及 - 号

    import win.ui; /*DSG{{*/ var winform = win.form(parent=...; text="aardio Form";right=349;b ...

  6. WPF第三方控件,只能输入数字型数据

    话不多说,根据最近项目需求,为了减少输入验证等相关代码量,需要此控件 先上效果图 默认样式是这样,自己可以根据需求修改外形,但我更喜欢它自带的简洁版 有人可能会问怎么实现的呢?其实很简单,我们设置它的 ...

  7. js控制只能输入数字和控制小数的位数

    <input class="form130" style="width: 80px;" maxlength="10" id=" ...

  8. js 控制文本只能输入数字

    代码如下: <input onkeypress="setNumber()"><script> function setNumber(){ var keyCo ...

  9. js控制输入框只能输入数字不能输入其他字符

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 如何用hexo搭建个人博客. 亲测有效

    搭建博客: 安装node.js和git 以管理员身份进入cmd. 输入:  npm install -g cnpm --registry=https://registry.npm.taobao.org ...

  2. Plugin was not installed: Cannot download 'https://plugins.jetbrains.com/pluginManager''

    在Android studio中安装插件的时候,提示了类似这种的错误,解决这个问题有以下几步 1.打开Configure->Settings 2.System Settings->Upda ...

  3. Hadoop(21)-数据清洗(ELT)简单版

    有一个诸如这样的log日志 去除长度不合法,并且状态码不正确的记录 LogBean package com.nty.elt; /** * author nty * date time 2018-12- ...

  4. Hadoop(8)-HDFS的读写数据流程以及机架感知

    1. HDFS的写数据流程 1.客户端通过fs模块向NameNode申请文件上传,NameNode检查请求是否合法,如用户权限,目标文件是否已存在,父目录是否存在等等 2.NameNode返回是否可以 ...

  5. CentOS 同步时间的方法

    与时间服务器上的时间同步的方法 1.  安装ntpdate工具 # yum -y install ntp ntpdate 2.  设置系统时间与网络时间同步 # ntpdate cn.pool.ntp ...

  6. css常用样式属性详细介绍

    对于初学css的来说,肯定会觉得这么多样式不好记,而且记住了也容易忘,其实刚开始我们不用去记这么多的样式,确实是记了也会忘,刚开始只需记住一些常用的就可以了,然后在慢慢的使用过程当中接触并学习一些高级 ...

  7. 使用java多线程分批处理数据工具类

    最近由于业务需要,数据量比较大,需要使用多线程来分批处理,提高处理效率和能力,于是就写了一个通用的多线程处理工具,只需要实现自己的业务逻辑就可以正常使用,现在记录一下 主要是针对大数据量list,将l ...

  8. [转载]Java类打包成JAR文件

    原文传送门:http://www.2cto.com/kf/201204/129495.html 使用的工具及环境: MyEclipse 7.5 Java Enterprise.JDK1.6.0 打包J ...

  9. OpenCV代码提取:flip函数的实现

    OpenCV中实现图像翻转的函数flip,公式为: 目前fbc_cv库中也实现了flip函数,支持多通道,uchar和float两种数据类型,经测试,与OpenCV3.1结果完全一致. 实现代码fli ...

  10. LeetCode:12. Roman to Integer (Easy)

    1. 原题链接 https://leetcode.com/problems/roman-to-integer/description/ 2. 题目要求 (1)将罗马数字转换成整数:(2)范围1-399 ...