【问题标题】:Quick method to determine ClientDataSet has changes快速判断 ClientDataSet 有变化的方法
【发布时间】:2018-11-27 20:23:26
【问题描述】:

使用 Delphi Berlin。

我在数据模块(“dmCore”)中有一个嵌套的 Clientdataset。

任何给定主项目的详细表中大约有 5000 条记录(使用 2 条主记录进行测试)。

我有一个“发布”按钮连接到 ActionManager 中的操作。

它的 OnUpdate 很简单:

actPost.Enabled:=dmCore.HasChanges;// checks master for changes

“HasChanges”很简单:

function TdmCore.HasChanges: boolean;
begin
  result := False;
  if cdsPSet.Active then
     result:=(cdsPSet.ChangeCount>0);
end;

不幸的是,在操作的 onUpdate 中运行 CDS.ChangeCount 会占用大量 CPU 时间 (>50%)。

我没有注意到在非嵌套 CDS 上会发生这种情况...

是否有一种更简单(更快)的机制可以用来查看 CDS 是否已更改?我不需要计数,只需要某处发生变化的事实。

TIA 教育局

【问题讨论】:

  • 目前尚不清楚我是否具备有效地做到这一点的技能——我的目标是“愚蠢的标志技巧”——在数据模块中设置一个布尔值“FastHasChanges”标志,并设置/清除可以更改数据的任何地方-然后只需检查标志。丑陋,丑陋-但很快就可以做到。感谢您的意见,如果我突然有更多空闲时间,我可能会试一试!

标签: delphi delphi-10.1-berlin tclientdataset


【解决方案1】:

动作的 OnUpdate 事件不是切换其启用/禁用状态的最佳位置。它一直被触发。

您可能希望将其移至TDataSource.OnDataChanged 事件。您可以在此处插入与 TAction.OnUpdate 相同的代码,并且仅当您的数据真正更改时才会触发它。您还可以使用 TField 参数来分隔不同的字段。

示例(对不起,我只有 C++ Builder,但在 Delphi 中看起来一样):

void __fastcall TForm1::DataSource1DataChange(TObject *Sender, TField *Field)
{
    Action1->Enabled = ClientDataSet1->ChangeCount > 0;
}

【讨论】:

    【解决方案2】:

    实现您自己的失效机制。这就像一个单一的Boolean 变量一样简单,当它是True 时,它意味着某些东西已经改变,而当它是False 时,它意味着什么都没有改变。然后,您将负责为您对此数据集所做的每项更改和操作进行更新。

    如果是我,我会创建一个继承类,覆盖所有内容,并实现一个失效机制。这将比现有方法轻得多。当然,它在设计时不会那么容易使用,但它会在运行时完成工作。

    【讨论】:

      【解决方案3】:

      试试UpdatesPending 属性。我不能说它会更快,但它是检测数据集中是否有任何变化的方法。因此,在您的情况下,您实际上可以只写:

      function TdmCore.HasChanges: boolean;
      begin
        Result := cdsPSet.UpdatesPending;
      end;
      

      【讨论】:

      • 不幸的是,UpdatesPending 似乎只在东京 - 我仍在使用柏林...
      • 您是对的,它已在东京添加(可能是出于您所描述的性能原因)。我错过了你的版本信息。对不起。我能给你的最好建议是尽快离开 MIDAS。
      • 它比你想象的更糟糕:这个应用程序混合了 CDS 和 FDQuery - 我正在使用需要 CDS 的精美网格,但使用 FDConnection->FDQuery->DataSetProvider->CDS
      • FireDAC 的查询对象可以通过其UpdatesPending 属性回答您(如果您在没有提供程序的情况下直接使用它)。问题(我相信它会发生)是在这种情况下缓存发生在 MIDAS 的客户端数据集中。
      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多