- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通常将验证逻辑实现为:
procedure TMyDM.IBQueryAMOUNTValidate(
Sender: TField);
begin
inherited;
if Sender.AsFloat>100
then raise Exception.Create('Amount is too large!');
end;
问题是 - 是否有机会不在 OnValidate
中引发 Exception
(这将停止进一步处理),而是在 OnValidate 中静默恢复原始值
并继续执行 OnChange
、CheckBrowseMode
以及 CheckBrowseMode
/Post
调用的所有 GUI 更新>?
当然,我知道我总是可以用处理 OldValue
和 NewValue
的 OnChange
逻辑替换 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/
所以我正在开发一个使用数据库网格的表单,我遇到了一个问题,我需要根据金额和 GST 字段自动默认字段。这将始终为用户自动默认我的字段,直到他们手动更改我的字段,此时它显然不会再为该记录默认。 关于如何
我正在使用 TDataSet,其中 CommandText 属性设置为 SQL 查询。我还创建了以下函数,它根据 TDataSet 的字段创建了 SQL 查询的一部分。然而它是不完整的。如您所见,我仍
我有一个 TClientDataSet 与一个查询耦合,其中所有字段都在字段编辑器中定义。 在运行时我添加三个 fkInternalCalc 字段: class procedure TTaskInde
我在客户端数据集中有一个计算字段,名为备忘录类型的完整地址。 我想连接地址字段,像这样: TField* f = customersCDS->FieldByName("full_address
我有一个查询,使用像这样的 TSQLQuery TSQLQuery* tq = new TSQLQuery(NULL); tq->SQLConnection = atdbDM->SQLConnecti
我通常将验证逻辑实现为: procedure TMyDM.IBQueryAMOUNTValidate( Sender: TField); begin inherited; if Sende
连接到网格的数据集具有: TField.DisplayFormat := '$######.00' 我想构建网格特定列中的字符串列表: while NOT DataSet.EOF do Stri
我使用 TField.origin 属性动态构建 SQL 查询的 where 子句。 因此,如果我有一个查询,例如; select p.firstname, p.lastname, g.d
我有一个附加到字段Score 的TField.OnGetText 事件的过程,如下所示: procedure TMyForm.GetScoreText(Sender: TField; var Text
当我们将数据库组件从 ODBC Express 交换到 ADO 时,我们遇到的最大问题之一是 ODBC Express“右修剪”了 CHAR 字段的结果,而 ADO 没有。 CHAR 字段填满了它们的
我有一个包含多个字段的 TClientDataSet,但我收到此异常,我确信我忘记设置一个字段值,但问题是,哪个字段? 是否有某种方法可以快速找出哪个字段引发了此异常? 编辑 我解决了这个问题,我将
我正在尝试创建一个通用的“更新表达式构建器”——一个可以传递的对象,用于指示需要为哪些字段分配什么值。我所做的是: public class UpdateExpression : Dictionary
我的表 Customers 有一个已索引的字段 UserID。 现在,当我从 delphi 中删除此字段时,我将 EOleExecption 作为其索引字段。我尝试使用以下代码: ObjCustome
我是一名优秀的程序员,十分优秀!