在edit的OnKeyPress事件中控制edit只接受数字和小数点输入
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in ['0'..'9','.']) then
  key:=#0;
end;
但这样连退格键都不能用了,如何使退格键可用?

解决方案 »

  1.   

    If ((key < '0') Or ( key > '9')) and (key <> chr(8)) and (key <> '.') then
        key := #0;
       if key = '.' then
          if AnsiContainsStr((Sender as tedit).Text , '.') then
            key := #0;
      

  2.   

    procedure TProjectForm.edtxmjeKeyPress(Sender: TObject; var Key: Char);
    begin
      inherited;
      if ((Key <'0') or (Key>'9')) and (Key<>'.') and (Key<>'-') and
        (Key<>Char(VK_BACK)) and  (Key<>Char(VK_Delete)) and (Key<>Char(VK_Left)) and
        (key <> Char(VK_Right)) then
          key:=#0
      else if key='.' then begin
        if (Sender as TCustomEdit).SelStart=0 then
          key:=#0
        else if pos('.',(Sender as TCustomEdit).Text)>0  then
          key:=#0;
      end
      else if key='-' then begin
        if (Sender as TCustomEdit).SelStart <>0 then
          key:=#0
        else if pos('-',(Sender as TCustomEdit).Text)>0 then
          key:=#0;
      end;
    end;
      

  3.   

    if not (key in ['0'..'9', #8, '.']) then
        key := #0
      else
      begin
        if key = '.' then
        begin
          if pos('.', TEdit(Sender).Text) > 0 then key := #0; //只能输入一个小数点
          if (length(TEdit(Sender).Text) = 0) then   //如果第一次输入'.'则自动加'0';
          begin
            Tedit(Sender).SelText:='0.';
            key:=#0;
          end;
        end
        else
          if key = '0' then
          begin
            if (length(TEdit(Sender).Text) = 1) and (TEdit(Sender).Text = '0') then
              key := #0;
          end
          else
          begin
            if (length(TEdit(Sender).Text) = 1) and (TEdit(Sender).Text = '0') then
              TEdit(Sender).Text := '';
          end;  end;
      

  4.   

    在你的程序前面加
      if key := #8 then ....
    这样应该就可以处理退格了
      

  5.   

    if not (key in ['0'..'9', #8, '.']) then
      

  6.   

    阿凯(为双星努力):最后这个else处理的是什么情况?
    else
          begin
            if (length(TEdit(Sender).Text) = 1) and (TEdit(Sender).Text = '0') then
              TEdit(Sender).Text := '';
          end;
      

  7.   

    在EDIT的onkeypress事件中写:
    if not (key in ['0'..'9'],#8,#46]
     then
      showmessage('输入格式错误');
    就可以了
    #8 是退格的ASC码,#46是小数点的ASC码
      

  8.   

    procedure TFrmTimeStepDataEdit.DBEdit1KeyPress(Sender: TObject;
      var Key: Char);
    begin
      if not(Key in ['0'..'9','.', #8]) then
      begin
        Key := #0;
        Beep;
      end;
    end;
      

  9.   

    这个简单:
    if not (Key in ['0','1','2','3','4','5','6','7','8','9', #13, '.', Chr(VK_Back)]) then
    Key:=#0;
      

  10.   

    用maskedit不就结了,这这么多东东,影响效率
      

  11.   

    //判断输入的是不是一个非负实数
    function TParaAddFrm.IsReal(AStr: String; AKey: Char): Char;
    begin
      //只能输入数字和小数点,回车键和退格键
      if (AKey in ['0'..'9','.']) or (AKey=#8) or (AKey=#13) then
      begin
        if AKey='.' then
          if Pos('.',AStr)>0 then
            AKey:=#0;
      end
      else
        AKey:=#0;
      Result:=AKey;
    end;
    procedure TParaAddFrm.StringGrid1KeyPress(Sender: TObject; var Key: Char);
    begin
      //时间值必须为实数
      with StringGrid1 do
        if Col=1 then
          Key:=ParaAddFrm.IsReal(Cells[Col,Row],Key);
    end;