如何自动删除未更新的clientdataset记录
How to auto delete clientdataset records that have not been updated
我在 RAM 中有一个 clientdataset
无数据库,用于维护网络中活动节点的列表。
节点不断报告确认它们还活着,从而保持数据集更新。
数据集显示在 dbgrid
中。
当一个节点停止报告状态时,它将在几秒钟不活动后从数据库中删除。
我通过在更新字段时更新超时字段来做到这一点。
我每秒遍历数据集删除过时的记录。
这可行,但当 OnDrawColumnCell
刷新单行网格以自定义列颜色时,网格有时会闪烁。我调用 DisableControls
/EnableControls
,但似乎有一个小延迟,直到 OnDrawCell
重绘导致闪烁的网格。
如果我禁用删除过时记录的迭代,闪烁就会停止。
有更好的方法吗?
一种最小化网格中闪烁的方法是使用 'trick',它利用了 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;
我在 RAM 中有一个 clientdataset
无数据库,用于维护网络中活动节点的列表。
节点不断报告确认它们还活着,从而保持数据集更新。
数据集显示在 dbgrid
中。
当一个节点停止报告状态时,它将在几秒钟不活动后从数据库中删除。
我通过在更新字段时更新超时字段来做到这一点。
我每秒遍历数据集删除过时的记录。
这可行,但当 OnDrawColumnCell
刷新单行网格以自定义列颜色时,网格有时会闪烁。我调用 DisableControls
/EnableControls
,但似乎有一个小延迟,直到 OnDrawCell
重绘导致闪烁的网格。
如果我禁用删除过时记录的迭代,闪烁就会停止。
有更好的方法吗?
一种最小化网格中闪烁的方法是使用 'trick',它利用了 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;