我通常将验证逻辑实现为:
procedure TMyDM.IBQueryAMOUNTValidate(
Sender: TField);
begin
inherited;
if Sender.AsFloat>100
then raise Exception.Create('Amount is too large!');
end;
现在的问题是-有机会不提高Exception
的OnValidate
(其停止进一步的处理),但在恢复默默原值OnValidate
和入手OnChange
,CheckBrowseMode
并通过调用所有的GUI更新CheckBrowseMode
/ Post
?
当然,我知道,我可以随时更换OnValidate
与逻辑OnChange
的逻辑来处理OldValue
和NewValue
,但在我看来,这些代码将是清洁它,我坚持OnValidate
。
不要使用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] 删除。
我来说两句