使用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
答案 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