我在没有数据库的RAM中有一个clientdataset,它维护着网络中活动节点的列表。
节点不断报告,以确认它们是否还处于活动状态,从而使数据集保持更新。
数据集显示在dbgrid中。

节点停止报告状态后,几秒钟不活动后,将从数据库中删除该节点。
我通过在更新字段时更新超时字段来做到这一点。
我每秒都要遍历数据集,以删除过时的记录。

这可行,但是当OnDrawColumnCell刷新单个行网格以自定义列颜色时,网格有时会闪烁。我称DisableControls / EnableControls,但是在OnDrawCell重画网格导致闪烁之前似乎有一个小的延迟。

如果禁用迭代以删除过时的记录,闪烁将停止。
有一个更好的方法吗?

最佳答案

减少网格闪烁的一种方法是使用“技巧”,该技巧利用了ClientDataSets的特殊功能,即可以通过分配它们的Data属性在它们之间复制数据,如下所示:

cdsDestination.Data := cdsSource.Data;


因此,您可以做的是拥有两个CDS,一个CDS仅用于显示目的,另一个CDS用于处理网络节点。这意味着将对复制CDS的更改保持在绝对最低限度,并且您可以对源CDS进行几乎任何您想做的事,并且只要您愿意就可以花很多时间(当然,只要您能得到它,在下一个目标CDS更新之前完成)。像这样:

const
  NodeCount = 1000;

procedure TForm1.DoDataUpdate;
begin
  //  do something to CDS1's data here
  cdsCopy.Data := CDS1.Data;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  CDS1.CreateDataSet;
  for i := 1 to NodeCount do
    CDS1.InsertRecord([i, Now]);
  CDS1.First;
  DBGrid1.DataSource := DataSource1;
  DataSource1.DataSet := cdsCopy;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  DoDataUpdate;
end;

关于delphi - 如何自动删除尚未更新的客户端数据集记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36213318/

10-11 04:00
查看更多