Держите полосы прокрутки скрытыми в dbgrid Delphi (даже при изменении размера) - PullRequest
8 голосов
/ 23 сентября 2011

Для нашей dbgrid мы хотим, чтобы полосы прокрутки были постоянно скрыты. Поскольку у TDBGrid нет свойства 'полосы прокрутки', мы используем:

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

Однако, когда мы изменяем размеры окна (и панели, содержащей dbgrid), для через секунду полосы прокрутки появляются и снова становятся скрытыми только после вызова два вышеуказанных метода.

Решением является вызов этих методов в DrawColumnCell, но это вызывает мерцание dbgrid, даже если DoubleBuffered имеет значение true.

Есть ли способ навсегда скрыть полосы прокрутки?

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 29 марта 2012

Скрытие полосы прокрутки TDBGrid в CreateParams имеет очень короткий временной эффект.Есть процедура 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.
1 голос
/ 29 марта 2012

Полоса прокрутки обновляется в 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 набора данных, похоже, это работает без мерцания.

0 голосов
/ 23 сентября 2011

Возможно переопределение CreateParams() метода и удаление WS_HSCROLL и WS_VSCROLL битов формы Params.Style имеет значение. Вы можете попытаться сделать это с помощью class helper , если вы не хотите писать собственный потомок.

Вы также можете использовать SetWindowLongPtr API с GWL_STYLE для изменения стиля окна, но тогда изменения будут потеряны, когда окно сетки по какой-то причине будет воссоздано (поэтому это не так надежно, как переопределение CreateParams).

...