各位好:
  本人最近遇到一棘手的问题,请各位帮忙。
  请在Delphi中基于TEdit实现以下功能,TEdit中只可输入Float型的数值(可为整形,可为负数),输入其他的可见字符(如字母)则屏蔽,但控制字符(如左右键和del键)不被屏蔽,如有能力可试试把数值的整数位限制在一个范围(即大于时则整数部分不接受数字,但小数部分不受影响),同样对限制小数部分为两位.
  其实本人认为关键是能否在TEdit的OnKeyPress事件中知道光标的所在位置.
如可解决此问题的请不吝指教.我的信箱[email protected]
                                                     16:03 02-11-10
                                                     3CL

解决方案 »

  1.   

    光标位置:Edit1.SelStart俺的想法:根本没必要实时检查,用户确认输入时用try...except检查,不能转换为实数就令其重新输入或修改输入呗。楼主,你认为3e4和.1是不是实数(浮点数)?当用户试图输入-0.1中的负号“-”时又该怎么办?
      

  2.   

    用 TMaskEdit 不行吗?
    或者是在用户焦点转移的时候检查。
      

  3.   

    同意cnsuyong(小可) 
    一般做法是在用户提交的时候将edit1.text转换你想要的类型,同时用try ...except来捕获可能的异常
      

  4.   

    在keypress事件中,把不需要的健屏蔽,即key=#0。
      

  5.   

    为什么不用formatfloat呢?
      

  6.   

    1.use MaskEdit.
    2.try
      
      except
      
      end;
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Menus;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        PopupMenu1: TPopupMenu;
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure InputFormat(var Key:char;InputType:integer=0;OStr:string='');
    begin  
      case inputtype of
      0:// Integer
      begin
        if not (((key<='9') and (key>='0')) or  (key=#8)) then
        begin
          key:=#0 ;
          beep;
        end;
      end;
      1 :// Float
      begin
        if ((key<='9') and (key>='0'))
          or (key=#8)
          or (key='.') then
        begin
          if (key='.')and(pos('.',ostr)>0) then
          begin
            key:=#0;
            beep;
          
          end;  
        end
        else
        begin
          key:=#0 ;
          beep;
        end;
      end;
      end;
    end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      inputformat(key,1,edit1.Text);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      edit1.PopupMenu:= tpopupmenu.Create(self);
    end;end.
      

  8.   

    不会出现异常,保证del,backspace好使。
    能输入float和integer,
    配合设置edit.maxlength可以控制输入的位数。当想通过其他方式写入edit的时候,不要直接改变edit.text,
    用:sendmessage(edit1.handle,wm_char,ord('2'),0);
    这样就能让inputformat起到过滤所有改变edit.text的作用。
      

  9.   

    我有能力帮助你,请看我站http://www.to-happy.com《电子评委》里的相关部分。
      

  10.   

    有那么复杂吗?瞧我的!
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      //编辑框只允许输入数字
      //#46表示小数点 #8表示退格键 #0表示没有按键
      if not (Key in ['0'..'9', #46, #8]) then
        Key := #0;
    end;
    procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
    begin
      //编辑框只允许输入字母
      if not (Key in ['a'..'z', 'A'..'Z']) then
        Key := #0;
    end;
    procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
    begin
      //显示按键值
      Caption := InttoStr(Ord(Key));
    end;
      

  11.   

    楼上的判断不完全!!
    一般不需实时检查,如果的确需要实施检查的话只要在KeyPress事件中加入:
    var temp:single;//定义一个临时变量
    try 
    temp:=strtofloat(edit1.text);
    except
    key:=#0;
    end;
      

  12.   

    有个很好的函数:
    TryStrToFloat
      

  13.   

    十分感谢各位!但有个不可忽视的问题是文本框中为.1234时,在.和1之间输入-,有bug
      

  14.   

    我的用类似这样的如何?
    Function PLstrtoFloat(ss:string):Extended;
    var
    plst,pls,plss,plsss:string;
    NOdian,NOjianhao,NOjiahao:boolean;
    plf:double;
    i:integer;
    begin
      plss:='';
      NOdian:=true;
      NOjianhao:=true;
      NOjiahao:=true;  pls:=trim(ss);
      for i:=1 to length(pls) do
        begin
          plst:=copy(pls,i,1);
             if (plst='0') or (plst='1') or (plst='2') or
                (plst='3') or (plst='4') or (plst='5') or
                (plst='6') or (plst='7') or (plst='8') or
                (plst='9') or
                ((plst='.') and Nodian) or
                ((plst='+')  and  Nojiahao) or
                ((plst='-')   and  Nojianhao)
                 then plss:=plss+plst;
                 if (plst='.') then Nodian    :=false;
                 if (plst='+') then Nojiahao  :=false;
                 if (plst='-') then Nojianhao :=false;
        end;
      Plsss:=copy(plss,1,1);
      plst:='';
      if (length(plss)>=2) then
        begin
          for i:=2 to length(plss) do
            Begin
              plst:=copy(plss,i,1);
              if (plst<>'+') and (plst<>'-') then plsss:=plsss+plst;
            End;
          plf:=strtofloat(plsss);
        end
      else
         begin
          if (plss='-') Or (plss='+') Or (plss='') then plf:=0
          else plf:=strtofloat(plss);
         end;
    result:=plf;
    end;
      

  15.   

    自己写个控件吧!
    利用
    Edit1.SelStart和  combobox1.SelLength
    就可以搞定了,然后再DoExit中做好错误捕捉
    我前段时间写了一个负数,小数,整数,都可以输入
    整数部分为追加,小数部分为插入(初始化小数部分为0)
    不过代码很臭。不敢拿出来。
    我就利用了Copy函数和Pos
    重载了Onkeyperss,Onkeydow,Doexit,OnMousedown