Delphi TField.OnValidate是否可以在不引发异常的情况下还原原始值?

汤姆

我通常将验证逻辑实现为:

procedure TMyDM.IBQueryAMOUNTValidate(
  Sender: TField);
begin
  inherited;
  if Sender.AsFloat>100
    then raise Exception.Create('Amount is too large!');
end;

现在的问题是-有机会不提高ExceptionOnValidate(其停止进一步的处理),但在恢复默默原值OnValidate和入手OnChangeCheckBrowseMode并通过调用所有的GUI更新CheckBrowseMode/ Post

当然,我知道,我可以随时更换OnValidate与逻辑OnChange的逻辑来处理OldValueNewValue,但在我看来,这些代码将是清洁它,我坚持OnValidate

马丁·A

不要使用OnValidate从加薪除了做任何异常拒绝Sender的价值。

若要了解原因,请设置一个简单的测试应用程序,该应用程序由TClientDataSet组成,其中的ID字段为ID(整数)和Name(字符串(20)),TDataSource,TDBNavigator,TDBGrid和TDBEdit作为Name字段。添加以下代码:

procedure TForm1.ClientDataSet1NameValidate(Sender: TField);
begin
  if Sender.AsString = 'x' then
    Sender.DataSet.Cancel;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.InsertRecord([1, 'a']);
  ClientDataSet1.InsertRecord([2, 'b']);
  ClientDataSet1.InsertRecord([3, 'c']);
end;

编译,运行并将“ x”(不带引号)输入DBEdit。然后在DBNavigator上单击“保存”。

请注意,编辑已取消,但“ x”保留在DBEdit中。这是在Delphi 10.2.3中,顺便说一句。早在D7天,情况就更糟了-数据库网格中的错误行将显示'x'!

另一件事是,OnValidate在TDataSet的方法中从未真正调用过它,只有后代,例如TClientDataSet。因此,不能保证通常OnValidate会在所有时间或在正确的时间调用它-取决于数据集类型的作者是否正确。

因此,我认为您的q的答案是“否”,请离开OnValidate引发异常,但不再例外。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Delphi-在ClientDataSets之间发送TField属性以及数据

TField.OnGetText 中“Text”参数的默认值是多少

在不引起提示音的情况下无法关闭Delphi表单

Delphi失败的情况下陈述

我可以尝试一下-在不引发异常的情况下捕获JS吗?

Delphi引用程序异常

Delphi DLL 类异常

Delphi Trunc 行为异常

Delphi在构造函数中引发异常

如何指定由Delphi方法引发的异常?

如何在不使用Delphi约束的情况下确定泛型类型是否为nil?

在没有 OnPaint 事件的情况下绘制 delphi 表单

使用Rails的活动记录,是否有另一种方法可以在不引发异常的情况下进行回滚?

如何将TField分配给TcxGridtableViewColumn

将TQuery中的当前字段获取到TField

Delphi线程返回值

Delphi 記錄賦值

如何在不引发异常的情况下执行此操作?

如何在不引发python异常的情况下获取堆栈跟踪字符串?

如何在不引发异常的情况下退出 python 2.7 中的 for 循环

如何在不引发异常的情况下将字符串转换为URI

“新”语句在不引发异常的情况下会失败吗?

如何在不引发异常的情况下使VSTS构建任务失败

为什么我的webjob在不引发异常的情况下终止?

是否可以在不添加throws声明的情况下引发异常?

有没有一种方法可以在不引发Java异常的情况下转储堆栈跟踪?

Java默认情况下是否声明“引发异常”?

如何在不生成EXE的情况下构建Delphi项目

如何在不更改库文件的情况下修改Delphi库文件中的常量?