9

dbgridの場合、スクロールバーを常に非表示にする必要があります。TDBGridには「scrollbars」プロパティがないため、次を使用します。

ShowScrollBar(DBGrid1.Handle, SB_VERT, False);
ShowScrollBar(DBGrid1.Handle, SB_HORZ, False);

ただし、ウィンドウ(およびdbgridを含むパネル)のサイズを変更すると、上記の2つのメソッドを呼び出した後でのみ、スクロールバーが表示され、再び非表示になります。

解決策は、DrawColumnCellでこれらのメソッドを呼び出すことですが、これにより、DoubleBufferedがtrueに設定されている場合でも、dbgridがちらつきます。

スクロールバーを完全に非表示にする方法はありますか?

前もって感謝します!

4

3 に答える 3

7

のスクロールバーを非表示にするとTDBGridCreateParams非常に短時間の効果があります。UpdateScrollBarスクロールバーを表示する手順があります。これは、表示されるデータに応じてスクロールバーの表示が制御されるために発生します。したがって、このプロシージャは、データが変更されるたびに呼び出されます。

また、このプロシージャは、スクロールバーを更新する必要があるときはいつでも呼び出され、仮想であるため、オーバーライドする必要があります。
次のコードサンプルは挿入クラスを使用しているため、TDBGridこのユニットに属するフォーム上のすべてのコンポーネントは同じように動作します。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    procedure UpdateScrollBar; override;
  end;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TDBGrid.UpdateScrollBar;
begin
  // in this procedure the scroll bar is being shown or hidden
  // depending on data fetched; and since we never want to see 
  // it, do just nothing at all here
end;

end.
于 2012-03-29T11:23:07.070 に答える
1

スクロールバーはで更新されTDBGrid.UpdateScrollBarます。残念ながら、このルーチンは仮想ではありません(少なくともD7では)。そのルーチン内で、SetScrollInfoが呼び出され、傍受される可能性のあるメッセージを送信しないWindows関数が呼び出されます。運がない。

残っている唯一の可能性は、コントロールのサイズが変更されるたびに送信されるメッセージのメッセージハンドラーをオーバーライドすることです。

type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    procedure WMWindowPosChanged(var Message: TWMWindowPosChanged);
      message WM_WINDOWPOSCHANGED;
  end;

procedure TDBGrid.WMWindowPosChanged(var Message: TWMWindowPosChanged);
begin
  inherited;
  Windows.ShowScrollBar(Handle, SB_VERT, False);
end;

UpdateScrollBarデータが変更されたときやデータセットのプロパティが変更されたときにも呼び出されますActiveが、これはちらつきなく機能しているようです。

于 2012-03-29T11:31:14.193 に答える
0

おそらく、メソッドをオーバーライドし、ビット形式をCreateParams()削除すると違いが生じます。カスタムの子孫を書きたくない場合は、クラスヘルパーを使用してそれを試みることができます。WS_HSCROLLWS_VSCROLLParams.Style

SetWindowLongPtr APIを使用してウィンドウのスタイルを変更することもできます GWL_STYLEが、何らかの理由でグリッドのウィンドウが再作成されると、変更は失われます(したがって、オーバーライドするほど信頼性は高くありませんCreateParams)。

于 2011-09-23T13:38:59.760 に答える