gpt4 book ai didi

delphi - Delphi TField.OnValidate 可以恢复原始值而不引发异常吗?

转载 作者:行者123 更新时间:2023-12-03 15:46:05 25 4
gpt4 key购买 nike

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

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

问题是 - 是否有机会不在 OnValidate 中引发 Exception (这将停止进一步处理),而是在 OnValidate 中静默恢复原始值 并继续执行 OnChangeCheckBrowseMode 以及 CheckBrowseMode/Post 调用的所有 GUI 更新>?

当然,我知道我总是可以用处理 OldValueNewValueOnChange 逻辑替换 OnValidate 逻辑> 但在我看来,如果我坚持使用 OnValidate,代码会更干净。

最佳答案

除了引发异常以拒绝验证之外,不要使用 OnValidate 执行任何操作发件人的值。

要了解原因,请设置一个简单的测试应用程序,其中包含一个 TClientDataSet,其中包含字段 ID(整数)和名称(字符串(20))、TDataSource、用于名称字段的 TDBNavigator、TDBGrid 和 TDBEdit。添加以下代码:

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;

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

请注意,编辑已取消,但“x”仍保留在 DBEdit 中。这是顺便说一句,在 Delphi 10.2.3 中。回到 D7 时代,情况更糟 - 错误的行DB 网格将显示“x”!

另一件事是,OnValidate 从未在 TDataSet 的方法中实际调用,只有后代,例如TClientDataSet。所以不能保证一般情况下OnValidate 将在任何时候或在正确的时间被调用 - 这取决于数据集类型的作者是否正确。

所以我认为你的问题的答案是“否”,让 OnValidate 引发异常,但仅此而已。

关于delphi - Delphi TField.OnValidate 可以恢复原始值而不引发异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52869890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com