如何自动删除尚未更新的clientdataset记录

时间:2016-03-25 02:54:35

标签: delphi tclientdataset

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

当节点停止报告状态时,在几秒钟不活动后,它将从数据库中删除 我通过在更新字段时更新超时字段来执行此操作 每一秒我都会遍历数据集,删除过时的记录。

这样可行,但当OnDrawColumnCell刷新单行网格以自定义列颜色时,网格有时会闪烁。我致电DisableControls / EnableControls,但似乎有一点延迟,直到OnDrawCell重绘网格导致闪烁。

如果我禁用迭代删除过时的记录,闪烁就会停止 有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

最小化网格中闪烁的一种方法是使用“技巧”,它利用ClientDataSets的一项特殊功能,即您可以通过分配数据属性在它们之间复制数据,如

cdsDestination.Data := cdsSource.Data;

所以你可以做的就是有两个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;