DBGrid编辑的例外情况

时间:2012-10-11 09:15:55

标签: delphi delphi-5

我实现了一个可编辑的DBGrid。如果未正确填充字段,则抛出异常并显示消息,例如:

'08:00::00' is not a valid time

如何捕获这些异常,以便显示由我编写的消息而不是自动生成的消息?我会感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

正如@teran在他的评论中指出的那样,异常是由绑定到TDataSet的{​​{1}}(或其中一个组件)或数据库引擎本身引发的。

您可以尝试处理TDBGrid(另请参阅TDataSet.OnPostErrorOnUpdateError):

  

TDataSet.OnPostError:在应用程序尝试修改或插入记录时发生   提出了一个例外。编写一个OnPostError事件处理程序来处理   尝试发布记录失败时发生的异常。

请注意,您始终可以使用OnEditError全局事件处理程序来捕获应用程序中的任何EDBxxx异常。


编辑: Application.OnException例外是之前任何实际数据修改,或EConvertError字段的任何Post操作,即:

TDateTimeField

0045af91 +085 Project1.exe SysUtils StrToDateTime <- EConvertError 004ab76a +042 Project1.exe Db TDateTimeField.SetAsString 004a9827 +007 Project1.exe Db TField.SetText 004a95d9 +029 Project1.exe Db TField.SetEditText 004d6448 +014 Project1.exe DBGrids TCustomDBGrid.UpdateData 004d087f +02b Project1.exe DBGrids TGridDataLink.UpdateData 004d599a +01a Project1.exe DBGrids TCustomDBGrid.MoveCol StrToDateTime内抛出异常,而不是触及数据,而且 根本不会解雇TDateTimeField.SetAsString事件处理程序。

所以你的选择是(在发布模式下测试应用程序):

1.通过TDataSet.OnxxxError接受并处理EConvertError 2.使用Application.OnException将用户输入限制为有效的时间格式,例如TField.EditMask或使用就地DateTimePicker editor inside your Grid。 (并避免捕获此例外) 3.Override !90:00;1;_:使用TDateTimeField的持久字段并创建一个inter-poser类:

TDataSet

答案 1 :(得分:1)

如果引发异常,则在调试器中运行时应显示两条错误消息。其中一个将由调试器捕获,第二个由UI处理(当以用户身份运行程序时,您将只看到第二个)。

异常错误消息应包含类似

的字符串
  

Appname.exe引发了带有消息XXX的异常EExceptionName

您需要注意EExceptionName。

围绕创建异常的代码块,您需要编写

...
try
   code that can cause the exception here  
except 
  on e: EExceptionName do
  begin
    ShowMessage('Your apps nicer error message here');
  end;
end;

注意 - 如果你没有打电话退出;在处理异常之后,您的代码将在try..except块之后继续执行所有操作。此外,如果有许多事情可能导致相同的代码块中出现相同的错误消息,那么您可能无法编写任何过于具体的内容。 e.Message是一个字符串,用于保存未处理的异常中显示的消息,并且可能对向用户显示也很有用。

还试图摆脱BDE - 现代系统支持ADO。