是这样的,我用的是TTable控件,DBEdit所对应的表中的字段类型是Short类型,范围在-32768到32767之间。我在DBEdit的exit事件中写了代码把它限制在1到9999之间。测试时,我在DBEdit中输入大于32767的值(当然还有小于-32768和为空的情况),系统就先发生异常,指示无效的字段值,而exit事件根本就没有发生。所以我想控制此异常。但是,好象在TTable的OnPostError,OnUpdateError,OnEditError中写代码捕获异常也没用。如我在TTable的OnEditError中: const eMaxValErr=9731; ... procedure TmyDm.buTableEditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin if (E is EDBEngineError) then if (E as EDBEngineError).Errors[0].Errorcode=eMaxValErr then begin Showmessage('MaxValErr');//testing Abort; end; end; 同上测试后,异常依旧。 agui讲的满有道理,我想回去试试。
前辈agui的建议我已经试过了。还是系统的异常先发生。 异常如下: Project **.exe raised exception class EDatabaseError with messaage '1222222222' is not a valid value for field 'Id'.The allowed range is -32768 to 32767. 按确定后,才出现自己的异常代码。
你可以在DataSource的OnUpdateData事件试一下,如果可以的话,请给我加分。
short型只能存储 -32768 to 32767,这个范围呀,你往里面放1222222222有啥意义呢?.
在Form中加一个处理异常的方法:
procedure HandleException(Sender: TObject; E: Exception);
加一个变量:
FOldExceptHandler: TExceptionEvent;
在FormActivate事件中这样写:
FOldExceptHandler := Application.OnException;
Application.OnException := HandleException;
在FormDeactivate事件中这样写:
Application.OnException := FOldExceptHandler;在HandleException方法的实现中判断是DBEdit的异常,简单地,Exception is EDataBaseError,然后处理它,否则如果FOldExceptHandler不为nil,传给它。
const eMaxValErr=9731;
...
procedure TmyDm.buTableEditError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if (E is EDBEngineError) then
if (E as EDBEngineError).Errors[0].Errorcode=eMaxValErr then
begin
Showmessage('MaxValErr');//testing
Abort;
end;
end;
同上测试后,异常依旧。
agui讲的满有道理,我想回去试试。
异常如下:
Project **.exe raised exception class EDatabaseError with messaage '1222222222' is not a valid value for field 'Id'.The allowed range is -32768 to 32767.
按确定后,才出现自己的异常代码。
你直接运行EXE文件就可以的了.OK!