谁能帮我捕获通过DBGrid编辑ADOquery的异常信息!300分 (300分)

  • 主题发起人 主题发起人 电脑农民
  • 开始时间 开始时间

电脑农民

Unregistered / Unconfirmed
GUEST, unregistred user!
在DBGrid中修改数字型字段时,如果输入错误(如输入1.1.1、或粘贴进其它字符),提交修改时
就会引发ADOQuery异常,请问各位大侠如何捕获该异常?
说明:我在与DBGrid相连的ADOquery的OnEditError事件和OnPostError事件中均无法捕获该异常!
 
你的应用程序没有错误处理吗?
在应用程序主窗体添加一个TApplicationEvents控件,在OnException事件中判断
procedure TFrmMain.AppMainException(Sender: TObject; E: Exception);
begin
。。。。。。
if E is EDataBaseError then begin
// 当前编辑数据输入是否正确?;
end;
。。。。。。
end;
 
在字段的OnSetText事件写就可以了
 
二楼的捕获的是全局错误,不能确定到底是哪个窗口上的哪一个错误,比较笼统;
一楼的兄弟所说的事件不存在。
 
你先建ADOQuery的永久字段,这个事件是字段的事件不是ADOQuery的事件
 
问题是我的ADOQuery的字段就是动态的,我是在程序运行过程中自动添加的字段。
 
那你可以在ADOQuery的AfterOpen事件中对字段动态指定OnSetText不就可以了
 
qianwt兄的方法我试了,OnSetText的事件并非捕获错误消息,而是在数据提交之前可以
检验该数据的合法性(应该是这个意思吧)。
而我只是想获得这个异常,而这个异常是什么时候发生,是哪个字段,是哪些类型的字段,
事先并不知道。
希望高手多提建议!
 
Query1SetText(Sender: TField; const Text: String);
begin

end;

怎么会不能控制呢,Sender就是当前的字段,Text就是马上要赋的值

Sender.FieldName 字段名

if Sender is TStringField then
字符字段
else if Sender is TIntegerField then
整型字段
 
To:qianwt
我明白你的意思,但我不是要这种效果,我只是想捕获该异常而已。
最好是能像OnPostError事件一样,我可以通过shomessage(E.message)来显示异常的
详细内容。
 
是你没有理解我的意思,
我下面写一个整型字段给你看一下
procedure Query1po_noSetText(Sender: TField; const Text: String);
var
value: Integer;
begin
try
value := StrToInt(Trim(Text));
Sender.AsInteger := value
except
ShowMessage(Text + '不是正确的整数')
Abort
end
end;
 
procedure TForm1.ADOQuery1WillChangeRecord(DataSet: TCustomADODataSet;
const Reason: TEventReason; const RecordCount: Integer;
var EventStatus: TEventStatus);
begin
if (Reason in [erAddNew, erDelete, erUpdate]) and (EventStatus in [esErrorsOccured]) then
//do your thing...
raise Exception.Create('哇靠!快点检查你正在输入的数据类型!什么?你不知道?
打kyo_2000的手机问问!');

end;

 
TO:qianwt
可能我是没能理解好你的意思,但从你的那段程序上来看,这确实不是我要的效果,我不想
用这种方法来检测数据的有效性,只想在ADOQuery发生“数据提交”异常时,捕获该异常并显示
相关信息。
有点像kyo_2000的方法,但他提供的这个方法也没有捕获到题目中的异常。

现在,其它的异常我已可以在OnEditError事件和OnPostError事件中捕获,但题目中的
异常我还是不能捕获。

到是wangyufan兄的办法能够捕获该异常,但他是一个全局的异常捕获,我也不想用。
 
不知道你想要实现什么样的功能,你能说清楚一点吗
 
是这样的:
我在通过DBGRID编辑ADOQUERY的数据时,如果ADOQUERY里有一个不能为空的字段,而我在
DBGRID里删除了该字段的内容,在提交时就会产生一个异常,该异常可以ADOQUERY的
PostError(DataSet: TDataSet; E: EDatabaseError; Var Action: TDataAction)事件里
捕获,并可以通过E.MESSAGE显示详细异常内容(当然,显示方式可能是自定义的);
而我现在是对ADOQUERY里的一个数字型字段作修改时,如果用户输入了其它字符(如:1.1.1、
0-0-0之类的,也可通过MOUSE右键粘贴进其它字母。),此时如果提交该数据,ADOQUERY就会
弹出自已的异常信息,我就是想捕获该异常并按我自己的信息显示方式提示用出错了。
 
不知这次有没有说明白。
 
你所说的提交是提交整条记录,还是修改当前字段的值呢
 
procedure TForm1.ADOTable1RecordChangeComplete(DataSet: TCustomADODataSet;
const Reason: TEventReason; const RecordCount: Integer;
const Error: Error; var EventStatus: TEventStatus);
begin
if (Reason in [erAddNew, erDelete, erUpdate]) and (EventStatus in [esErrorsOccured]) then
//do your thing...
raise Exception.Create('什么?他说的你听不清楚?打Borland的手机问问!');
end;
 
wangyufan朋友不是已经说了很清楚了,在应用程序上放TapplicationEvent控件,然后在
OnException里捕捉异常就行了,
if E is EDataBaseError then
Showmessage(E.message);
好多数据库都是这么处理的,不知道是不是你要的
 
后退
顶部