代码之家  ›  专栏  ›  技术社区  ›  AndersJ

如何自动删除尚未更新的客户端数据集记录

  •  2
  • AndersJ  · 技术社区  · 10 年前

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

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

    这是有效的,但当 OnDrawColumnCell 刷新单线网格以自定义列颜色。我打电话给你 DisableControls / EnableControls ,但似乎有一点延迟,直到 OnDrawCell 重新绘制导致闪烁的网格。

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

    1 回复  |  直到 10 年前
        1
  •  4
  •   MartynA    10 年前

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

    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;