我的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
地址的时候一样,他这种控件能不能从网上下载?谢谢
于是我写了以下的代码: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
地址的时候一样,他这种控件能不能从网上下载?谢谢
....
except
...
end;可以过滤错误,如果发生错误可以被捕获你可以响应OnKeyPress事件,或者OnTextChange事件来检查最新的Text是不是符合格式,比如已经输入过小数点,那么继续输入小数点就不会改变Text的内容,这些方法你可以考虑使用。
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抛出错误就行了
还有就是要学会捕获异常
try
...
except
...
end;
顺便提示搂主,用try在调试期执行效果和直接运行exe得到的执行效果不一样的,楼主自己试验下就知道了,不要以为try无效。
//只能输入整数或小数,且只能输入一个小数点
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;
happyggy,你好!我的这段代码没有异常,就是你列出的,只不过是预期的功能实现不了,按照我的初衷是除了第三个字符,别的字符不能为.但程序实际执行的效果是,只要我一输入数字,他就提示错误,而不是出错才提示。
yinxd6112,你好!我的要求是只有第三位可以输入小数点,别的都不行,因为数据的格式必须保证是12.3654 这种格式,所以我感觉你的程序有些不对头。
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;
//以上代码经过测试可用
OnKeyPress,OnKeyUp,OnKeyDown这三个事件有什么区别呢通常都是什么情况应用,我看了Delphi的帮助,但还是不明白。你的代码写的很好,我已经采用了。