まず、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 に変えたら出来ると思い、やってみたが出来なかった。何か一ひねり必要なのかもしれない...