サイトカレンダー

サイトカレンダーをスキップ

2018年 10月
«
»
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

記事カテゴリ

ユーザー機能


 2018年10月24日(水) 07:21 JST

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

  • 2005年8月10日(水) 12:45 JST
  • 投稿者:
  • 表示回数
    6,208

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

トラックバック

このエントリのトラックバックURL:
http://www.blackcatlab.com/trackback.php/ProgramingFAQ_del0057

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。