我的Form上有若干个Edit控件,要求每个Edit中输入的数据的范围在1.6到29.9999,如果不在这个范围就提示错误,
于是我写了以下的代码:procedure TMainForm.Edit1Exit(Sender: TObject);
beginif TEdit(sender).text <> '' then
  begin
    if ((StrToFloat(TEdit(sender).Text)>29.9999) or (StrToFloat(TEdit(sender).Text)<1.6)) then
      begin
        TEdit(sender).Font.Color :=clRed;
        Showmessage('Error! Your input out of range!');
        TEdit(sender).SetFocus;
      end
    else
      begin
        if length(TEdit(sender).Text)<>7 then
          begin
            TEdit(sender).Font.Color :=clRed;
            Showmessage('Error! The length of data is unequal to 7!');
            TEdit(sender).SetFocus;
          end
        else
          TEdit(sender).Font.Color :=clBlack;
      end;
   end;end;而且我要求小数点的位置必须在第三位,例如:要输入1.6,就必须输入01.6000。一般情况下,我的代码没问题。
但是,如果在除了第三个字符外误输入小数点,程序就会弹出异常对话框,说是非法的浮点数,例如我不小心
输入12.3.36,程序马上就终止,弹出异常,于是我又加了以下的代码:
procedure TAutoFitDlg.Edit1Change(Sender: TObject);
Var
 s : String;
begin
 if TEdit(Sender).Text <>'' then
   begin
     s :=TEdit(Sender).Text;
     if ((s[1]='.') or (s[2]='.') or ((s[3]<>'.') or (s[3]<>'')) or (s[4]='.') or
         (s[5]='.') or (s[6]='.') or (s[7]='.')) then
       begin
         TEdit(Sender).Font.Color :=clRed;
         Showmessage('Error! Only the third char can be "."');
       end;
   end;
end
但还是不行,只要我一输入他就提示错误。和我的初衷不一样。
所以,我想问的是遇到这种情况怎么处理才能够让他只提示出错,而不是出现异常
就像我上面的那样:
if ...... then
 begin
   TEdit(sender).Font.Color :=clRed;
   Showmessage('Error!);
   TEdit(sender).SetFocus;
 end
else谢谢!
还有,我以前见过一个类似于Edit的控件,他当中输入的数据格式是固定,就和Windows系统中输入IP
地址的时候一样,他这种控件能不能从网上下载?谢谢

解决方案 »

  1.   

    try
    ....
    except
    ...
    end;可以过滤错误,如果发生错误可以被捕获你可以响应OnKeyPress事件,或者OnTextChange事件来检查最新的Text是不是符合格式,比如已经输入过小数点,那么继续输入小数点就不会改变Text的内容,这些方法你可以考虑使用。
      

  2.   

    procedure TAutoFitDlg.Edit1Change(Sender: TObject);
    Var
    s : String;
    begin
    if TEdit(Sender).Text <>'' then
    begin
    s :=TEdit(Sender).Text;
    if ((s[1]='.') or (s[2]='.') or ((s[3]<>'.') or (s[3]<>'')) or (s[4]='.') or
    (s[5]='.') or (s[6]='.') or (s[7]='.')) then
    begin
    try
      //
    except
       TEdit(Sender).Font.Color :=clRed;
       Showmessage('Error! Only the third char can be "."');
    end;
    end;
    end;
    end
    //用try..except抛出错误就行了
      

  3.   

    Delphi有MaskEdit,你学习一下吧
    还有就是要学会捕获异常
    try
     ...
    except
     ...
    end;
      

  4.   

    不要判断,用异常的try绝对可行。
    顺便提示搂主,用try在调试期执行效果和直接运行exe得到的执行效果不一样的,楼主自己试验下就知道了,不要以为try无效。
      

  5.   

    真的是小问题啊,确保只能输入一个小数点就行了。 20分我都要了
    //只能输入整数或小数,且只能输入一个小数点
    procedure TFrmMain.EdtValueKKeyPress(Sender: TObject; var Key: Char);
    var
      j: byte;
      S: string;
    begin
      i := 0;
      S := (sender as TEdit).Text;
      for j := 1 to length(S) do
        if S[j] = '.' then
          Inc(i);
      if (key = '.')and(i>0) then
          key := #0;  if not (key in ['0'..'9',#8,'.']) then
        key := #0;
    end;
      

  6.   

    非常感谢大家的帮助!但我还是不太明白,
    happyggy,你好!我的这段代码没有异常,就是你列出的,只不过是预期的功能实现不了,按照我的初衷是除了第三个字符,别的字符不能为.但程序实际执行的效果是,只要我一输入数字,他就提示错误,而不是出错才提示。
    yinxd6112,你好!我的要求是只有第三位可以输入小数点,别的都不行,因为数据的格式必须保证是12.3654 这种格式,所以我感觉你的程序有些不对头。
      

  7.   

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    //只能输入数字跟小数点
    if not (Key in ['0'..'9','.',#8]) then
    key:= #0;
    //end;procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
    Shift: TShiftState);
    var
    s,gstr: String;
    i,len: integer;
    gcount: integer;
    begin
    gcount:=0;
    s:= trim(Edit1.Text);
    len:= length(s);
    gstr:= s;
    i:= pos('.',s);
    while i<>0 do
    begin
     Inc(gcount);
     Delete(gstr,1,i);
     i:= pos('.',gstr);
    end;
    if gcount>1 then
    begin
    i:= pos('.',s);
    gstr:= copy(s,1,i);
    Delete(s,1,i);
    i:=Pos('.',s);
    gstr:= gstr+copy(s,1,i-1);
    Edit1.Text:= gstr;
    Edit1.SelStart:= length(gstr);
    end;
    s:= trim(Edit1.Text);
    len:= length(s);
    i:= pos('.',s);
    if (len>=3) then
    begin
     if (i=3) then
     begin
     gstr:= copy(s,1,3);//正确的格式内容  delete(s,1,3);
     i:= pos('.',s);
     if i<>0 then
     begin
     Edit1.Text:= gstr;
     Edit1.SelStart:= length(gstr);
     end;
     end else //小数点位置大于第三位
     begin
    gstr:= copy(s,1,2);
    gstr:= gstr +'.';
    Edit1.Text:= gstr;
    Edit1.SelStart:= length(gstr);
     end;
    end else
    begin
     if (i<>0) and (i<3) then //有小数点
     begin
     case i of
     1: s:= '00'+s;
     2: s:= '0'+s;
     end;
     Edit1.Text:=s;
     Edit1.SelStart:=length(s);
     end;
    end;
    end;
    //以上代码经过测试可用
      

  8.   

    非常感谢happpyggy。但我有个疑问,为什么你不把所有的代码都写到OnKeyPress事件中呢?
    OnKeyPress,OnKeyUp,OnKeyDown这三个事件有什么区别呢通常都是什么情况应用,我看了Delphi的帮助,但还是不明白。你的代码写的很好,我已经采用了。