ちらつきのない生活?

派生コンポーネントを作った場合、派生元の private メソッドは当然利用できません。
そのために、作業中の無駄な再描画による画面のフラッシュやちらつきを、阻止できない場合があります。
それを防ぐために BeginUpdate, EndUpdate が、幾つかのコンポーネントには存在しているのですが・・・ないものもあります。
TStringGrid は無いほうに含まれます。
私は一時期、自力でちらつきを止めようと努力しましたが・・・止めれませんでした(弱)
しかし、ついに勝利したのでここに書き留めます。

TStringGridEx = class(TStringGrid)
private
  FUpdateLock: Integer;
protected
  procedure BeginUpdate;
  procedure EndUpdate;
public
  constructor Create(AOwner: TComponent); override;
published
end;

constructor TStringGridEx.Create(AOwner: TComponent);
begin
  FUpdateLock := 0;
end;

procedure TStringGridEx.BeginUpdate;
begin
  if FUpdateLock = 0 then SendMessage(Handle, WM_SETREDRAW, 0, 0);
  Inc(FUpdateLock);
end;

procedure TStringGridEx.EndUpdate;
begin
  if FUpdateLock > 0 then Dec(FUpdateLock);

  if FUpdateLock = 0 then
  begin
    SendMessage(Handle, WM_SETREDRAW, 1, 0);
    Invalidate;
  end;
end;

uses に Messages を追加するのをお忘れなく。
Handle を持つもの (=Window) ならどれでも流用できる・・はず。
一般に描画を停止状態にしておくと高速になるようです。


Return index page