Delphi Tips 
-----------------------------

0190  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/05/19 osamu rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2000/01/02 osamu 編集
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 を呼んでしまうとおかしなことになってしまうので注意が必要です。
参照: [Delphi-ML:38146] [builder:19539] <Additional> <コンポーネント >

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp