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