2016-03-25 11 views
2

clientdatasetはデータベースなしのRAMにあり、ネットワーク内のアクティブノードのリストを保持しています。
ノードは、それらが生存していることを継続的に報告し、データセットを更新したままにします。
データセットはdbgridに表示されます。更新されていないクライアントデータレコードを自動削除する方法

ノードがレポートのステータスを停止すると、数秒間使用しないとデータベースから削除されます。
これは、フィールドが更新されたときにタイムアウトフィールドを更新することで行います。
私は毎秒、古いレコードを削除するデータセットを繰り返します。

これは機能しますが、OnDrawColumnCellが列の色をカスタマイズするために1行のグリッドをリフレッシュすると、グリッドがちらつくことがあります。私はDisableControls/EnableControlsと呼んでいますが、OnDrawCellがちらつきを引き起こすグリッドを再描画するまでわずかな遅延があるようです。

古いレコードを削除するために繰り返しを無効にすると、フリッカーは停止します。
これを行うより良い方法はありますか?あなたのグリッドにちらつきを最小限に抑えるために

答えて

4

方法は

cdsDestination.Data := cdsSource.Data; 
のように、あなたはそれらのデータプロパティを割り当てることにより、それらの間でデータをコピーすることができますつまりこと、ClientDataSetsの特別な機能を利用した「トリック」を使用することです

これでできることは、2つのCDS(表示用にのみ使用するCDSとネットワークノードを処理する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

関連する問題