限制并方便用户输入[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 sanjin 的 blog

限制并方便用户输入(2002/12/03 三金 版权所有)


    防止用户误输入是软件开发的一项必不可少的工作,除才之外,还要为用户
的使用提供最大方便。当然,我们可以利用或开发新的组件,以完成这些功能。
但是,在团队开发中,每个成员都用自己认为不错的组件开发自己所承担的模
块,会给软件的后期维护带来麻烦。交工的时候,项目负责人可不买你的帐。如
果你用函数调用来完成这些功能,老盖也管不着。下面就是针对常用delphi组件
的限制用户输入函数,但愿网友们能用的上。
(一)tedit、tdbedit、tcombobox、tdbcombobox的输入
分三种类型限制:
(1)任意输入
(2)整数输入
(3)浮点数输入
限制的项目如下:
(1)整数输入只能输入数字0-9、+、-
(2)浮点输入只能输入数字0-9、+、-、.
(3)+和-只能有其一,并且只能出现在最前面
(4).只能有一个
(5)限制小数位数
函数如下:
procedure mxformatkeypress(text:string;selstart,sellength:integer;
        var key:char;edittype:integer;digits:integer);
begin
  if (key=#27) or (key=#8) or (edittype=1) then exit;
  if edittype=2 then
    if not (key in ['0'..'9','+','-'] ) then key:=#0;
  if edittype=3 then
    if not (key in ['0'..'9','+','-','.'] ) then key:=#0;
  //控制+-
  if (key ='-') or (key='+' ) then begin
    if ((pos('-',text) > 0) or (pos('+',text) > 0 )) and
            (sellength=0 ) then key:=#0;
    if selstart > 0 then key:=#0;
  end;
  //控制.
  if (key = '.') and (edittype=3 ) then begin
    if (pos('.',text) > 0) and (not((selstart=pos('.',text) ))) then key:=#0;
    if selstart=0 then key:=#0;
    if (digits>0) and (selstart+sellength0) and (edittype=3) then
    if (pos('.',text )>0 ) and (selstart>=pos('.',text)) then
      if length(text)-pos('.',text )>=digits then key:=#0;
end;

此函数在所限制组件的onkeypress事件中调用。key即为onkeypress携带的
key:char参数;edittype为限制的类型:1-任意输入;2-整数输入;3-浮点输入;
digits为浮点数输入时小数的位数,如果是零,则可输入任意位数。另外,此
函数只适用于有text、selstart、sellength等属性的twincontrol类的派生类。
具体限制各组件的二级函数如下:

限制tedit、tdbedit:
procedure mxformateditkeypress(edit:tcustomedit;var key:char;edittype:integer;
        digits:integer);
begin
  mxformatkeypress(edit.text,edit.selstart,edit.sellength,key,edittype,digits);
end;

限制tcombobox:
procedure mxformatcombokeypress(combo:tcombobox;var key:char;edittype:integer;
        digits:integer);
begin
  mxformatkeypress(combo.text,combo.selstart,combo.sellength,key,edittype,digits);
end;

限制tdbcombobox:
procedure mxformatdbcombokeypress(combo:tdbcombobox;var key:char;
        edittype:integer;digits:integer);
begin
  mxformatkeypress(combo.text,combo.selstart,combo.sellength,key,edittype,digits);
end;

调用示例:
假如form1上有一combobox1,让用户只输入浮点数,并且小数位数为两位。则
可以在combobox1的onkeypress事件中调用上面的函数,代码如下:
procedure tform1.combobox1keypress(sender: tobject; var key: char);
begin
  mxformatcombokeypress(combobox1,key,3,0);
end;

如果你的窗体上有多各tcombobox,并且限制类型一致,则不必每个tcombobox都
书写代码,只需为其中一个编写事件处理代码,其它作连接即可。
procedure tform1.combobox1keypress(sender: tobject; var key: char);
begin
  mxformatcombokeypress(sender as tcombobox,key,3,0);
end;
其它组件调用方法同上。

(二)时间的输入
限制类型:
(1)时分
(2)时分秒
组件采用tmaskedit,数据敏感采用tdbedit。
限制项目如下:
(1)小时只能输入0-23
(2)分钟不超过59
(3)秒不超过59
(4)用户只能全删,而不能只删某一位数据
(5)箭头键可以更改时间
需要在组件的onkeypress和onkeydown事件中分别书写代码。

procedure mxformattimekeypress(ctl:tcustommaskedit;timeformat:integer;
        var key:char;dts:tdatasource);
var
  textsave:string;
  editingpos:integer;//1-h 2-m 3-s
  i:integer;
  numchars:set of char;
  selstartsave,sellengthsave:integer;
  charvalid:boolean;
begin
  numchars:=['0'..'9'];
  if key=^v then key:=#0;
  if not (key in numchars ) then exit;
  textsave:=ctl.text;
  selstartsave:=ctl.selstart;
  sellengthsave:=ctl.sellength;
  case ctl.selstart of
    0,1: editingpos:=1;
    3,4: editingpos:=2;
    6,7: editingpos:=3;
    else editingpos:=0;
  end;
  ///////////////////////////////////////
  charvalid:=true;
  case editingpos of
    1: begin
      if selstartsave=0 then begin
        if not (key in ['0'..'2']) then charvalid := false;
        if (key ='2' )  and (textsave[2] in ['4'..'9']) then
          charvalid:=false;
      end;

本文关键:输入,input
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top