我在RAM中没有clientdataset
数据库,它维护网络中的活动节点列表
节点不断报告确认它们还活着,从而保持数据集的更新
数据集显示在dbgrid
中。
当节点停止报告状态时,在几秒钟不活动后,它将从数据库中删除 我通过在更新字段时更新超时字段来执行此操作 每一秒我都会遍历数据集,删除过时的记录。
这样可行,但当OnDrawColumnCell
刷新单行网格以自定义列颜色时,网格有时会闪烁。我致电DisableControls
/ EnableControls
,但似乎有一点延迟,直到OnDrawCell
重绘网格导致闪烁。
如果我禁用迭代删除过时的记录,闪烁就会停止 有更好的方法吗?
答案 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;