StringGrid の内容更新を高速に行う
|
| 少々データ量が大きいので時間を稼ぐため、画面表示の Update を
| 停止したいのですが TStringGrid に BeginUpdate/EndUpdate は
| 無いようです。
【解法1】
描画更新の一次停止
SendMessage(StringGrid1.Handle, WM_SETREDRAW, 0, 0);
描画更新の再開
SendMessage(StringGrid1.Handle, WM_SETREDRAW, 1, 0);
StringGrid1.Refresh;
この方法は、すべての TWinControl に対して有効です。
【解法2】
描画更新の一次停止
StringGrid1.Rows[0].BeginUpdate;
描画更新の再開
StringGrid1.Rows[0].EndUpdate;
Rows[0] は Rows[1] でも何でも構いませんが、停止と開始で同じ添字を使わなければなりません。Cols[x] も使えます。一つの Rows[x] または Cols[x] に対して BeginUpdate すると StringGrid のすべての表示更新が停止になります。
BeginUpdate は TStrings の仮想メンバ関数なので、TMemo.Lines とか TListBox.Items などで BeginUpdate を使って TMemo/TListBox などの変更を高速に行うこともできます。
【メモ】
描画更新の再開を必ず行うために、BeginUpdate/EndUpdate は try/finally で保護した方が良いです。
StringGrid1.Rows[0].BeginUpdate;
try
// 更新処理
finally
StringGrid1.Rows[0].EndUpdate;
end;
また、BeginUpdate を繰り返し呼んだ場合には EndUpdate を同じ回数呼ばなければ描画は再開されません。さらに、BeginUpdate よりも多く EndUpdate を呼んでしまうとおかしなことになってしまうので注意が必要です。 |
|