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. leetcode笔记(七)529. Minesweeper

    题目描述 Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix repres ...

  2. mysql 中的存储过程

    创建一个简单的存储过程 存储过程proc_adder功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum: 几点说明: DELIMITER ...

  3. js根据年份获取某月份有几天

    function getNum(year, month) { var temp; month = parseInt(month, 10); temp = new Date(year, month, 0 ...

  4. BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 解题心得: 第一次接触莫队算法,很神奇,很巧妙.莫队算法主要就是用来解决多次询问时 ...

  5. 编译net core时nuget里全部报错,\obj\project.assets.json找不到

    除了Nuget管理设置允许下载缺少的程序包 如果你自己设置的程序包源里有一个源访问不到,则可能出现下面错误,导致所有nuget无法还原. 而且在VS2017里不会出现这个 SDK,特别是你网上下载的其 ...

  6. Lambda表达式详解【转】

    前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...

  7. 初步学习pg_control文件之十五

    接前文  初步学习pg_control文件之十四 再看如下这个: int MaxConnections; 应该说,它是一个参考值,在global.c中有如下定义 /* * Primary determ ...

  8. SQL Server 2005 导出包含(insert into)数据的SQL脚本 (使用存储过程) 分类: 数据库

    CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS ) ) ) declare @xtype tinyint declare @name ...

  9. EF更新时出错,An error occurred while updating the entries. See the inner exception for details

           在使用EF进行更新数据时出错,报出的异常是 "An error occurred while updating the entries. See the inner excep ...

  10. spring+apache dbcp +oracle 连接池配置以及优化

    特此记录 <!-- 数据源配置, 使用应用中的DBCP数据库连接池 --> <bean id="dataSource" class="org.apach ...