フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: TDBGrid のスムーズなスクロール ?
Mr.XRAY
メンバー
投稿数: 192
TDBGrid のスムーズなスクロール ?
on: 2013/06/14 09:55 Fri

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

Mr.XRAY
メンバー
投稿数: 192
Re: TDBGrid のスムーズなスクロール ?
on: 2013/06/14 10:15 Fri

TStringGrid の場合は,GridOptions プロパティに goThumbTracking というメンバーがあります.この値をTureにします.

[Vcl.Grids.TGridOptions] (DocWiki)
http://docwiki.embarcadero.com/Libraries/XE3/ja/Vcl.Grids.TGridOptions

TScrolBox の場合は,縦横,各々のスクロールバーの Tracking プロパティを True にします.

  ScrollBox1.HorzScrollBar.Tracking := True;
ScrollBox1.VertScrollBar.Tracking := True;

 
次のサンプルでもそうしています.
このサンプルでは,スクロールバーのサムをドラッグすると同時に,画像もスクロールします.
[03_ビットマップ画像の矩形選択範囲をビットマップ出力]
http://mrxray.on.coocan.jp/Delphi/plSamples/154_Rubberband.htm#03

参考 [Vcl.Forms.TControlScrollBar.Tracking] (DocWiki)
http://docwiki.embarcadero.com/Libraries/XE4/ja/Vcl.Forms.TControlScrollBar.Tracking

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.035 sec.