Delphi dbgrid непрерывная прокрутка - PullRequest
6 голосов
/ 03 августа 2011

Я делаю приложение, которое хранит заказы и печатает счета.У меня есть несколько меток, ярлыков, темем, кнопок, источника данных, таблицы, всплывающего меню и dbgrid в моей форме.

Когда я собираю программу и прокручиваю вниз полосу прокрутки dbgrid, она прокручивается после того, как я выпускаюкнопка мыши.Но я хочу непрерывную прокрутку.

Привет

Ответы [ 2 ]

10 голосов
/ 03 августа 2011

Это называется отслеживанием большого пальца. Получите новый класс, чтобы переопределить поведение прокрутки. Пример использования промежуточного класса:

type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    procedure WmVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  end;

  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    ..

implementation

procedure TDBGrid.WmVScroll(var Message: TWMVScroll);
begin
  if Message.ScrollCode = SB_THUMBTRACK then
    Message.ScrollCode := SB_THUMBPOSITION;
  inherited;
end;


Вы также можете заменить WindowProc элемента управления, если не хотите получать новый класс. Все, что вам нужно сделать, это обработать сообщение WM_VSCROLL. Здесь - пример того, как это сделать.

2 голосов
/ 26 августа 2015

Вот еще одно решение, упомянутое Сертаком Акьюзом без необходимости извлечения нового класса из TDBGrid:

  private
    FOrgDBGridWndProc: TWndMethod;
    procedure DBGridWndProc(var Msg: TMessage);
  // ...
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOrgDBGridWndProc:= DBGrid1.WindowProc;
  DBGrid1.WindowProc := DBGridWndProc;
end;

procedure TForm1.DBGridWndProc(var Msg: TMessage);
begin
  if (Msg.Msg = WM_VSCROLL) and
    (LongRec(Msg.wParam).Lo = SB_THUMBTRACK) then
  begin
      LongRec(Msg.wParam).Lo := SB_THUMBPOSITION;
  end;
  if Assigned(FOrgDBGridWndProc) then
    FOrgDBGridWndProc(Msg);
end;
...