[Delphi] DBGrid のスクロールバーを消す

まず、TDBGird コンポーネントから垂直スクロールバーを消すためには、UpdateScrollBar メソッドをオーバーライドする必要がある。

UpdateScrollBar メソッドの内部で、スクロールバーの最小値と最大値を 0 に変更するために SetScrollnfo API を呼び出さなくてはならない。 (最小値と最大値をともに 0 に変更することで、スクロールバーを表示しないよう視することが出来る。TCustomDBGrid のUpdateScrollBar でこのAPIを用いてスクロールバーの処理を行っている。)

以下にスクロールバーの非表示化を行ったコンポーネントのコードを示す。

unit NoScrollbarDBGrid;

interface

uses
  SysUtils, Classes, Controls, Grids, DBGrids;

type
  TNoScrollbarDBGrid = class(TDBGrid)
  protected
    procedure UpdateScrollBar; override;
  end;

procedure Register;

implementation

uses
  Windows;

procedure Register;
begin
  RegisterComponents('Black Cat', [TNoScrollbarDBGrid]);
end;

{ TNoScrollbarDBGrid }

procedure TNoScrollbarDBGrid.UpdateScrollBar;
var
  si: TScrollInfo;
begin
  inherited;
  si.cbSize := sizeof(si);
  si.fMask := SIF_RANGE;
  si.nMin := 0;
  si.nMax := 0;
  SetScrollInfo(Handle, SB_VERT, si, false);
end;

end.

一般的に実際に使う場合には、TDBGrid を継承したコンポーネントを作成するより、TCustomDBGrid の様に TCustom~ で始まるコンポーネントを継承する方がオススメだ。 なぜならコーディング量は多少多くなるが、不要なプロパティなどを見せなくすることが出来るからだ。理由として、C++ だと親クラスのメンバを子クラス側で見せないようにすることも可能だが、Delphi では出来ないということがある。

ちなみに、水平スクロールバーを消すには、SB_VERT を SB_HORZ に変えたら出来ると思い、やってみたが出来なかった。何か一ひねり必要なのかもしれない...

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0057