确定ClientDataSet的快速方法有变化

时间:2018-06-18 23:35:49

标签: delphi delphi-10.1-berlin tclientdataset

使用Delphi Berlin。

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

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

我有一个“Post”按钮连接到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 EDB

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

实施您自己的失效机制。这就像单个Boolean变量一样简单,当它是True时,它意味着某些东西发生了变化,当它变为False时,它意味着没有任何变化。然后,您将负责为此数据集上的每个更改和操作更新此内容。

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

答案 2 :(得分:0)

操作的OnUpdate事件不是切换其启用/禁用状态的最佳位置。它一直开着。

您可能希望将其移至<div class="side-bar"> <div class="content"> <div class="button"> <div> <form action="http://google.com"> <a href="http://google.com"> <i class="fas fa-tachometer-alt"></i></a> <input type="submit" value="Dashboard"> </form> </div> </div> <div class="sub-title"> <p>TOOLS</p> </div> <div class="button"> <div> <form action="http://google.com"> <a href="http://google.com"> <i class="fas fa-minus-circle"></i></a> <input type="submit" value="Ban Panel"> </form> </div> </div> <div class="button"> <div> <form action="http://google.com"> <a href="http://google.com"> <i class="fas fa-exclamation-circle"></i></a> <input type="submit" value="Warn Panel"> </form> </div> </div> <div class="button"> <div> <form action="http://google.com"> <a href="http://google.com"> <i class="fas fa-gift"></i></a> <input type="submit" value="Gift Panel"> </form> </div> </div> <div class="button"> <div> <form action="http://google.com"> <a href="http://google.com"> <i class="fas fa-user"></i></a> <input type="submit" value="User Info"> </form> </div> </div> <div class="sub-title"> <p>NEWS</p> </div> <div class="button"> <div> <form action="http://google.com"> <a href="http://google.com"> <i class="fas fa-newspaper"></i></a> <input type="submit" value="News Panel"> </form> </div> </div> </div> </div>事件。您可以在其中插入与TAction.OnUpdate中相同的代码,并且仅在数据真正更改时才触发。您还可以使用TField参数在不同字段之间进行分隔。

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

TDataSource.OnDataChanged