2016-03-25 43 views
2

我在RAM中有一个clientdataset没有数据库,它维护网络中活动节点的列表。
节点连续回报确认它们是活着的,从而保持数据集更新。
数据集显示在dbgrid中。如何自动删除尚未更新的clientdataset记录

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

这可以工作,但当OnDrawColumnCell刷新单线网格以自定义列颜色时,网格有时会闪烁。我打电话DisableControls/EnableControls,但似乎有一个小的延迟,直到OnDrawCell重绘网格导致闪烁。

如果我禁用迭代删除过时的记录,闪烁停止。
有没有更好的方法来做到这一点?

回答

4

的一种方式,以尽量减少在网格闪烁在

cdsDestination.Data := cdsSource.Data; 
使用“绝招”,这使得使用ClientDataSets的一个特殊功能,即可以通过指定它们的数据属性复制它们之间的数据,如

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

你试过这个了吗? – MartynA

+0

否。闪烁在重新启动后消失。我不知道为什么。 – AndersJ

+0

谢谢。经历了写答案的麻烦,很高兴知道结果。 – MartynA