CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

关于输入合法性检查?

楼主DataBind(大肩)2000-08-21 13:57:00 在 Delphi / VCL组件开发及应用 提问

我怎样才能保证一个edit控件中只能输入real类型的值? 问题点数:50、回复次数:10Top

1 楼jumphigh(迈克阿狼)回复于 2000-08-21 15:35:00 得分 0

TextToFloat                                   函数                   将字符串(以NULL结束的格式)转换为浮点数   Top

2 楼govy(石头)回复于 2000-08-21 15:43:00 得分 0

进行一次转换即可知道:  
  Edit1.text   :=   CurrToStr(StrToCurr(Edit1.text));  
  如果出错了,说明输入的不是Currency类型了,如果必须要real类型,  
  再进行一次强制类型转化Real(StrToCurr(Edit1.text))Top

3 楼Fenian()回复于 2000-08-21 16:28:00 得分 0

可以用sscanf()从string中读float.Top

4 楼alin()回复于 2000-08-21 17:12:00 得分 10

//在EDIT1的OnKeyPress事件中  
  procedure   frmMain.Edit1OnKeyPress(Sender:TObject;Char:Word);  
  Begin  
      Try  
          StrToFloat(Edit1.Text);  
      except  
      Begin  
          ShowMessage('输入的不是浮点数');  
          Char   :=#0;  
      end;  
  end;Top

5 楼lotto(乐透)回复于 2000-08-21 17:58:00 得分 10

还是不让用户输入的好,在keypress事件中判断接收参数key的值,如下:  
  if   not   (key   in   ['0'..'9','+','-','.'])   then   key:=chr(0);Top

6 楼shylsz(星际第一颠)回复于 2000-08-21 22:26:00 得分 10

procedure     Proc_check(v_edit1:TEDIT;KEY:WORD);  
  var  
    i,v_len,v_flag:integer;  
  begin  
  //   键值说明  
  //   48-57表示大键盘的数字键   '0-9'  
  //   8   表示删除键  
  //   12   表示小键盘上的   '5'  
  //   45   表示小建盘上的   '0'  
  //   33-40   表示小键盘上的数字96-105  
  //   190   表示大键盘上的小数点   '.'  
  //   46   表示小建盘上的小数点   '.'  
  if   key=13   then   exit;  
  if   ((key>=48)and(key<=57))   or   (key=8)   or   (key=12)   or   (key=45)   or   ((key>=33)and(key<=40))   or   (key=190)   or   (key=46)   or   ((key>=96)and(key<=105))or   (key=110)then  
              v_edit1.ReadOnly:=false  
  else  
              begin  
                v_edit1.readonly:=true;  
                exit;  
              end;  
    v_len:=length(v_edit1.text);  
    for   i:=1   to   v_len   do  
          if   v_edit1.text[i]='.'   then  
                begin  
                  v_flag:=1;  
                  break;  
                end;  
   
  if   ((v_edit1.text='')or(v_flag=1))and   ((key=190)or(key=110))   then  
    begin  
        v_edit1.readonly:=true;  
        exit;  
    end;  
   
  end;  
   
  在edit1的keydown事件了加入  
  proc_check(edit1,key);Top

7 楼IAmKylix(kylix)回复于 2000-08-21 23:34:00 得分 10

其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!  
   
  unit   NumEdit;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      StdCtrls,Clipbrd;  
   
  type  
      TNumEdit   =   class(TEdit)  
      private  
          {   Private   declarations   }  
          FIsReal:boolean;  
          function   GetInteger:integer;  
          procedure   SetInteger(Value:integer);  
          function   GetReal:real;  
          procedure   SetReal(Value:real);  
          procedure   WMPaste(var   Message:   TMessage);   message   WM_PASTE;  
      protected  
          {   Protected   declarations   }  
          procedure   KeyPress(var   Key:   Char);   override;  
      public  
          {   Public   declarations   }  
          property   AsInteger:integer   read   GetInteger   Write   SetInteger   default   0;  
          property   AsReal:real   read   GetReal   Write   SetReal;  
          constructor   Create(AOwner:TComponent);override;  
      published  
          {   Published   declarations   }  
          property   IsReal:boolean   read   FIsReal   write   FIsReal;  
      end;  
   
  procedure   Register;  
   
  implementation  
   
   
   
  procedure   Register;  
  begin  
      RegisterComponents('Edit',   [TNumEdit]);  
  end;  
   
   
   
  {   TNumEdit   }  
   
   
  function   TNumEdit.GetInteger:   integer;  
  var   V,Code:integer;  
  begin  
        if   not   FIsReal   then  
        begin  
              val(text,V,Code);  
              if   Code=0   then  
                    Result:=V  
              else  
                    Result:=0;  
        end  
        else  
              Result:=Round(GetReal);  
  end;  
   
   
  procedure   TNumEdit.KeyPress(var   Key:   Char);  
  var   CharSet:set   of   char;  
  begin  
      if   FIsReal   then  
            CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)]+['.']  
      else  
            CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)];  
   
      if   not   (char(key)   in   [^X   ,^C])   then  
            if   (not   (Key   in   CharSet))   then  
            begin  
                  beep;  
                  Key   :=   #0;  
            end  
            else  
            begin  
                  if   FIsReal   then  
                        if   (Key='.')and(pos('.',text)<>0)then  
                        begin  
                              beep;  
                              Key   :=   #0;  
                        end;  
            end;  
   
      inherited   KeyPress(Key);  
  end;  
   
  procedure   TNumEdit.SetInteger(Value:integer);  
  begin  
        text:=inttostr(Value);  
  end;  
   
  function   TNumEdit.GetReal:   real;  
  var   Code:integer;  
          R:real;  
  begin  
        if   not   FIsReal   then  
              Result:=GetInteger  
        else  
        begin  
              val(text,R,Code);  
              if   Code=0   then  
                    Result:=R  
              else  
                    Result:=0;  
        end;  
  end;  
   
  procedure   TNumEdit.SetReal(Value:real);  
  begin  
        text:=floattostr(Value);  
  end;  
   
  constructor   TNumEdit.Create(AOwner:   TComponent);  
  begin  
      inherited   Create(AOwner);  
      Text:='0';  
  end;  
   
  procedure   TNumEdit.WMPaste(var   Message:   TMessage);  
  var   Value:string;  
          R:real;  
          V,Code:integer;  
  begin  
          Clipboard.Open;  
          Value   :=   Clipboard.AsText;  
          Clipboard.Close;  
   
          if   Value=''   then   exit;  
   
          if   IsReal   then  
          begin  
              val(Value,R,Code);  
              if   Code=0   then  
              begin  
                  if   (Pos('.',SelText)<>0)  
                        or   (Pos('.',Text)=0)  
                        or   (Pos('.',Value)=0)  
                  then  
                      SelText:=floattostr(R);  
              end;  
          end  
          else  
          begin  
              val(Value,V,Code);  
              if   Code=0   then   SelText:=inttostr(V);  
          end;  
  end;  
   
  end.  
   
   
  Top

8 楼IAmKylix(kylix)回复于 2000-08-21 23:36:00 得分 10

其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!  
   
  unit   NumEdit;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      StdCtrls,Clipbrd;  
   
  type  
      TNumEdit   =   class(TEdit)  
      private  
          {   Private   declarations   }  
          FIsReal:boolean;  
          function   GetInteger:integer;  
          procedure   SetInteger(Value:integer);  
          function   GetReal:real;  
          procedure   SetReal(Value:real);  
          procedure   WMPaste(var   Message:   TMessage);   message   WM_PASTE;  
      protected  
          {   Protected   declarations   }  
          procedure   KeyPress(var   Key:   Char);   override;  
      public  
          {   Public   declarations   }  
          property   AsInteger:integer   read   GetInteger   Write   SetInteger   default   0;  
          property   AsReal:real   read   GetReal   Write   SetReal;  
          constructor   Create(AOwner:TComponent);override;  
      published  
          {   Published   declarations   }  
          property   IsReal:boolean   read   FIsReal   write   FIsReal;  
      end;  
   
  procedure   Register;  
   
  implementation  
   
   
   
  procedure   Register;  
  begin  
      RegisterComponents('Edit',   [TNumEdit]);  
  end;  
   
   
   
  {   TNumEdit   }  
   
   
  function   TNumEdit.GetInteger:   integer;  
  var   V,Code:integer;  
  begin  
        if   not   FIsReal   then  
        begin  
              val(text,V,Code);  
              if   Code=0   then  
                    Result:=V  
              else  
                    Result:=0;  
        end  
        else  
              Result:=Round(GetReal);  
  end;  
   
   
  procedure   TNumEdit.KeyPress(var   Key:   Char);  
  var   CharSet:set   of   char;  
  begin  
      if   FIsReal   then  
            CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)]+['.']  
      else  
            CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)];  
   
      if   not   (char(key)   in   [^X   ,^C])   then  
            if   (not   (Key   in   CharSet))   then  
            begin  
                  beep;  
                  Key   :=   #0;  
            end  
            else  
            begin  
                  if   FIsReal   then  
                        if   (Key='.')and(pos('.',text)<>0)then  
                        begin  
                              beep;  
                              Key   :=   #0;  
                        end;  
            end;  
   
      inherited   KeyPress(Key);  
  end;  
   
  procedure   TNumEdit.SetInteger(Value:integer);  
  begin  
        text:=inttostr(Value);  
  end;  
   
  function   TNumEdit.GetReal:   real;  
  var   Code:integer;  
          R:real;  
  begin  
        if   not   FIsReal   then  
              Result:=GetInteger  
        else  
        begin  
              val(text,R,Code);  
              if   Code=0   then  
                    Result:=R  
              else  
                    Result:=0;  
        end;  
  end;  
   
  procedure   TNumEdit.SetReal(Value:real);  
  begin  
        text:=floattostr(Value);  
  end;  
   
  constructor   TNumEdit.Create(AOwner:   TComponent);  
  begin  
      inherited   Create(AOwner);  
      Text:='0';  
  end;  
   
  procedure   TNumEdit.WMPaste(var   Message:   TMessage);  
  var   Value:string;  
          R:real;  
          V,Code:integer;  
  begin  
          Clipboard.Open;  
          Value   :=   Clipboard.AsText;  
          Clipboard.Close;  
   
          if   Value=''   then   exit;  
   
          if   IsReal   then  
          begin  
              val(Value,R,Code);  
              if   Code=0   then  
              begin  
                  if   (Pos('.',SelText)<>0)  
                        or   (Pos('.',Text)=0)  
                        or   (Pos('.',Value)=0)  
                  then  
                      SelText:=floattostr(R);  
              end;  
          end  
          else  
          begin  
              val(Value,V,Code);  
              if   Code=0   then   SelText:=inttostr(V);  
          end;  
  end;  
   
  end.  
   
   
  Top

相关问题

  • 如何检查输入的合法性!
  • 怎样合法性检查用户的输入是ip地址
  • 在用户表单输入日期检查合法性函数?
  • 菜鸟问题:关于输入项合法性检查
  • 用JAVASCRIPT如何实现检查输入钱数的合法性?
  • 如何检查用户输入IP的合法性
  • 如何检查Text中输入的是正确的日期,即数据的合法性检查?
  • 日期合法性检查
  • 如何检查时间的合法性?
  • 一个网页上有多个表单,可否在客户端脚本中分别对输入合法性进行检查?

关键词

  • real
  • code
  • tnumedit
  • fisreal
  • seltext
  • getinteger
  • 输入
  • isreal
  • begin
  • getreal

得分解答快速导航

  • 帖主:DataBind
  • alin
  • lotto
  • shylsz
  • IAmKylix
  • IAmKylix

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo