在 Delphi Embarcadero 10.2或11上,禁用控件不会影响带有查找字段的FDTable或FDQuery的查看速度

arknldoa  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(155)

我有一个FDTable,其中一些查找字段包含数千条记录。当我使用以下代码查看FDTable时:

FDTable1.AutoCalcFields:=false;
FDTable1.DisableControls;
FDTable1.First;
while FDTable1.Eof<>true do
begin
  // some code....
  FDTable1.Next;
end;
FDTable1.EnableControls;
FDTable1.AutoCalcFields:=true;

它消耗了大量的时间。当我从表中删除查找字段时,这个代码运行得非常快。
有必要提到是,对于包含查找字段的表,这段代码使用ADOTable运行得非常快。2我该如何解决这个问题呢?

z8dt9xmd

z8dt9xmd1#

请尝试将数据集的AutoCalcFields属性设定为False
确定何时触发OnCalcFields事件以及何时计算查找字段值。
设置AutoCalcFields以控制何时触发OnCalcFields事件以更新计算字段,以及何时计算查找字段。
计算字段是从活动记录中的一个或多个字段的值派生其值的字段,有时还需要进行其他处理。查阅字段是其值来自辅助数据集或查阅缓存的字段。

**注意:**单向数据集支持计算字段,但不支持单向字段。对于单向数据集,OnCalcFields仅控制计算字段的更新时间。

AutoCalcFieldsTrue(默认值)时,在以下情况下将重新计算Lookup字段并触发OnCalcFields:

  • 数据集打开。
  • 数据集将进入dsEdit状态。
  • 焦点从一个可视控件移动到另一个可视控件,或从数据感知网格中的一列移动到另一列,并且对记录进行了修改。

AutoCalcFieldsFalse时,Lookup字段将被重新计算,并且OnCalcFields事件仅在以下情况下发生:

  • 数据集打开。
  • 数据集将进入dsEdit状态。
  • 从数据库中检索记录。

如果应用程序允许用户更改数据,则会频繁触发OnCalcFields。在这些情况下,应用程序可以将AutoCalcFields设置为False,以降低OnCalcFields事件发生的频率以及获取查找值的频率。
此外,字段的LookupCache属性可能会对您有所帮助。

相关问题