2016-03-25 44 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