TDBCtrlGridのスクロールバーを非表示にしたい

79 views
Skip to first unread message

太田@Gracix

unread,
May 19, 2021, 2:41:30 AM5/19/21
to Japan RAD Studio User Group
みなさまお世話になっております。

TDBCtrlGridのスクロールバーを非表示にしたいのですが、うまくいきません。

TDBCtrlGridへは、高さ160pxに収まる程度のコンポーネント(20個ほど)を置く。
TScrollBoxに置き、AlignをalTopにする。
レコード数は10行ほど。



試したこと

・そのまま開く

10行全て表示され、各行の高さは十分なのに、なぜかスクロールバーは表示されたままになる。スクロールバーを動かしても、スクロールバーのみが動き、行は動かない。


・ShowScrollBarを送る

  ShowScrollBar(DBCtrlGrid1.Handle, SB_BOTH, False);

結果: 効果なし


メンテナンスの問題などで独自コンポーネント化は最終手段と考えています。
ほかになにか方法が方法がありますでしょうか?

よろしくお願いいたします。


太田

DEKO

unread,
May 19, 2021, 4:20:56 AM5/19/21
to Japan RAD Studio User Group
> ほかになにか方法が方法がありますでしょうか?

こういうのでしょうか?
https://codeverge.com/embarcadero.delphi.vcl.using/hiding-scrollbars-for-dbctrlgrid/1067707

次のようなユニットを作っておき、

unit uHideScrollbars;

interface

uses
  Winapi.Windows, Winapi.Messages, Vcl.DBCGrids;

type
  TDBCtrlGrid = class(Vcl.DBCGrids.TDBCtrlGrid)
  private
    procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE;
  end;

implementation

{ TDBCtrlGrid }

procedure TDBCtrlGrid.WMNCCalcSize(var msg: TMessage);
begin
  var Style := getWindowLong(Handle, GWL_STYLE);
  if (Style and WS_HSCROLL) <> 0 then
    SetWindowLong(Handle, GWL_STYLE, Style and not WS_HSCROLL);
  if (Style and WS_VSCROLL) <> 0 then
    SetWindowLong(Handle, GWL_STYLE, Style and not WS_VSCROLL);
  inherited;
end;

end.

スクロールバーを消したい  TDBCtrlGrid が載ったフォームユニットの  uses 句で、
Vcl.DBCGrids よりも後に uHideScrollbars を指定すればいいかと思います。

DEKO

Takefumi Ota

unread,
May 19, 2021, 4:59:04 AM5/19/21
to radstu...@googlegroups.com
DEKOさん

いつもありがとうございます!
このユニットで速攻消えました!感謝です。

ユニット定義して上書きするということですね。
Mr.XRAYさんのページで似たような構文を見たものの、使い方がわからずMLに頼ってしまいました。
勉強になりました。


太田

Reply all
Reply to author
Forward
0 new messages