我在RAM数据库中有一个clientdataset
,它维护网络中活动节点的列表。
节点连续报告确认它们是活动的,从而保持数据集的更新。
数据集显示在dbgrid
中。
当节点停止报告状态时,它将在几秒钟不活动后从数据库中删除。
我是通过更新字段时更新超时值字段来做到这一点的。
每一秒,我都会遍历数据集,删除过时的记录。
这是可行的,但是当OnDrawColumnCell
刷新一行网格以自定义列颜色时,网格有时会闪烁。我调用了DisableControls
/EnableControls
,但是在OnDrawCell
重新绘制网格导致闪烁之前,似乎有一个小的延迟。
如果我禁用迭代以删除过时的记录,则闪烁停止。
有更好的方法吗?
发布于 2016-03-25 10:08:23
最小化网格中闪烁的一种方法是使用一个“技巧”,它利用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;
https://stackoverflow.com/questions/36213318
复制相似问题