Delphi ML の次の発言がありました.それで覚書を.
以下の動作確認は全て Windows 7 U64(SP1) + Delphi XE です.
[TDBGridの横スクロールのつまみについて]
http://www.freeml.com/delphi-users/3208/latest
その前にスクロールバーの各部の名称,名前なんですが,これは,いろいろあるようです.
例えば以下のような.以下「スクロールサム」を単に「サム」と言うことにします.
[魔法のほうき GUI部品図鑑 その 7 スクロールバー]
http://rryu.sakura.ne.jp/gui-book/scrollbar.html
TDBGrid にデータベースのデータを表示して,縦のスクロールバーのサムをマウスの左ボタンで下方にドラックします.
このままでは,DBGrid の内容に変化はありません.
マウスのボタンを放すと,DBGrid のデータがスクロールされて表示されます.
サムのドラッグと同時に DBGrid の表示もスクロールさせるためには,例えば次のような継承クラスを作成します.
このコードは,HDD に保存していたものですが,元はどこにあったか忘れました (記録していませんでした).
トラッキングのメッセージを,現在のポジションのメッセージにしてしまうわけです.
type TMyDBGrid = class(TDBGrid) protected procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; end;
procedure TMyDBGrid.WMHScroll(var Message: TWMHScroll); begin if Message.ScrollCode = SB_THUMBTRACK then begin Message.ScrollCode := SB_THUMBPOSITION; end; inherited; end;
procedure TMyDBGrid.WMVScroll(var Message: TWMVScroll); begin if Message.ScrollCode = SB_THUMBTRACK then begin Message.ScrollCode := SB_THUMBPOSITION; end; inherited; end;
end.
コンポーネントをインストールするのが面倒な人や,インストール,登録するコンポが増えるのは嫌だとか,
いう方は,Fusa さんが提供しているユニットを使うと便利です.私のところでも配布しています.
[04_複数行表示機能付きのコンポーネントを実行時に置き換える]
http://mrxray.on.coocan.jp/Delphi/plSamples/082_TPanelMultipleLines.htm#04
上のリンクで使用している plChgCompo.pas を利用すると,例えば以下のように書けます.
type TMyDBGrid = class(TDBGrid) protected procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; end;
TForm1 = class(TForm) DataSource1: TDataSource; Query1: TQuery; DBGrid1: TDBGrid; procedure FormCreate(Sender: TObject); private { Private 宣言 } MyDBGrid1 : TMyDBGrid; public { Public 宣言 } end;
var Form1: TForm1;
implementation
uses plChgCompo;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin Query1.Close;
//フォーム作成時にコンポーネントの入れ替え MyDBGrid1 := TMyDBGrid(ChangeComponent(DBGrid1, TMyDBGrid));
Query1.DatabaseName := 'DBDEMOS'; DataSource1.DataSet := Query1; MyDBGrid1.DataSource := DataSource1;
Query1.SQL.Clear; Query1.SQL.Add('SELECT * From biolife.db'); Query1.Open; end;
{ TMyDBGrid }
procedure TMyDBGrid.WMHScroll(var Message: TWMHScroll); begin if Message.ScrollCode = SB_THUMBTRACK then begin Message.ScrollCode := SB_THUMBPOSITION; end; inherited; end;
procedure TMyDBGrid.WMVScroll(var Message: TWMVScroll); begin if Message.ScrollCode = SB_THUMBTRACK then begin Message.ScrollCode := SB_THUMBPOSITION; end; inherited; end;
end.
このスクロールバーのメッセージは,TApplicationEvents コンポの OnMessage では補足できません.
ローカルフック WH_GETMESSAGE であれば補足できます.
素直に継承クラスを利用した方が確実です.
参考 [第7章 ウィンドウメッセージを捕まえる : ローカルフック]
http://mrxray.on.coocan.jp/Halbow/VCL07.html
|