如果您用的是query控件则 可在该字段的onvalidate事件可写: var T:Tdatetime; begin try t:=query1.fieldbyname('myfield').asdatetime; except showmessage('err on date input'); raise; end; end;
系统报错是不是类型转换错误,英文信息大致是:ApplicationName.exe raised exception class EConvertError with message ...is not a Valid date and time ... 这是与数据库日期类型字段有关的类型转换错误,一般的异常处理语句无法截获这种异常,但可以 通过自定义Application对象的OnException事件中来截获处理这种异常,因为所有用户没有 处理的异常最终都会到该事件中处理。具体过程如下: 1.自定义一个异常处理过程MyOnException; procedure TMainForm.MyOnException(Sender: TObject; E: Exception); begin if E is EConvertError then begin // 处理特定异常 ShowMEssage('This is a exception'); end; else //处理其他缺省的异常 Application.HandleException(Sender); end; 2. 把自定义异常事件赋给Application对象 procedure TMainForm.FormCreate(Sender: TObject); begin Application.OnException := MyOnException; end;不知我的回答是否满足你的需要?
try
strtodate(DBedtBysj.Text)
except
showmessage('请您按规定格式输入时间值');
dbedit.setfocus;//聚焦在原组件上
end;
你的方法不行
我觉得好象是数据库先校验,然后才执行EXIT事件
应该是
我的经验是使用datetimepicker用用户选择,然后在table或query的beforepost事件中再把datetimepicker的值写到相应的字段里。不知君认同否?
好像在执行Onvalidate事件和onchage事件之前就执行了
sql server的数据类型检查
我也试了
但是datatimepicker有个缺点,就是不能为空
对么
可在该字段的onvalidate事件可写:
var
T:Tdatetime;
begin
try
t:=query1.fieldbyname('myfield').asdatetime;
except
showmessage('err on date input');
raise;
end;
end;
1.写一个函数如下:
procedure DateSetText(Sender :TField; const Text: String);
begin
try
Sender.AsDateTime:=StrToDateTime(Text);
except
ShowMessage('日期格式错误!');
Abort;
Exit;
end;
end;
2.在Table的AfterOpen事件中,写一句代码如下:
Table1.FieldByName('DateField').OnSetText:=DateSetText;万事大吉,其实是重载了Field的OnSetText事件,绝对有效;
如有问题,欢迎发问。
datatimepicker的缺点可以补救。让它配合一个edit控件,不允许用户写的,把datetimepicker的值写到它里面去,你就可以控制了。
class EConvertError with message ...is not a Valid date and time ...
这是与数据库日期类型字段有关的类型转换错误,一般的异常处理语句无法截获这种异常,但可以
通过自定义Application对象的OnException事件中来截获处理这种异常,因为所有用户没有
处理的异常最终都会到该事件中处理。具体过程如下:
1.自定义一个异常处理过程MyOnException;
procedure TMainForm.MyOnException(Sender: TObject; E: Exception);
begin
if E is EConvertError then
begin
// 处理特定异常
ShowMEssage('This is a exception');
end;
else
//处理其他缺省的异常
Application.HandleException(Sender);
end;
2. 把自定义异常事件赋给Application对象
procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnException := MyOnException;
end;不知我的回答是否满足你的需要?
而重载Application.OnException确实可以解决问题,我最早也是这么写的。不过需要判断异常的类型,而这个异常是一个转换实数类型的异常,如果你的程序中有其他地方写有类似于StrToFloat函数的代码,当转换失败的时候,就会产生这个异常,而这时如果你重载掉了OnException,它可不会管你是因为时间输入错误引起的异常还是转换实数的异常,统统给你一个“时间错误”的提示(就是你自定义的提示),一般会让人莫名其妙的。
还有问题吗?
2.此外,他说的这种情况只在与数据库输入有关时才发生,可以采用edit代替dbedit,虽然要多
写点代码,但却是一种值得考虑的方法,一切都在你的控制之中。
确实有个问题
就是用你的方法的时候,
修改dbedit中原有的值的时候,修改了只要一离开就又恢复原来的值了
(在DBEDIT中不按规定输入时间值,是出现规定的中文对话框,这是队的)
我不晓得是怎么回事
你的意思是不是说你即使修改的是一个正确的值,仍然恢复成了原来的值?比如1999-11-1改为1999-11-2,可以一离开,这个值还是变为了1999-11-1。说实话,我没有碰见过这种情况,从代码的角度看,也不应该出现这种情况,如果确实有这种情况,我不知道原因,不过可能的解决办法是:重载OnGetText。
procedure DateGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
Text:=DateTimeToStr(Sender.AsDateTime);
end;
然后在Table.AfterOpen中,再加一句:
Table.FieldByName('DateField').OnGetText:=DateGetText;
估计可以解决问题,不过惭愧的是,我确实不知道原因,你可以研究一下。