Как отловить событие прокрутки в DBGrid в Delphi - PullRequest
1 голос
/ 12 ноября 2009

У меня есть DBGrid, мне нужно запустить код, каждый раз, когда используется горизонтальная полоса прокрутки. Я не смог найти такое событие в DBGrid. Можете что-нибудь посоветовать?

Ответы [ 4 ]

4 голосов
/ 12 ноября 2009

В TCustomGrid есть процедура WMHScroll, но она является закрытой. Вы не можете использовать его в DBGrid.
Вы должны создать своего собственного потомка TDBGrid и сделать свой собственный

procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;

или совершите какой-нибудь серьезный хакерский взлом ...

Обновление : трюк / хак, чтобы проникнуть в ваш код в ...

[...]
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, Grids, DBGrids;

    type
      // Hack to redeclare your TDBGrid here whitout the the form designer going mad
      TDBGrid = class(DBGrids.TDBGrid)
        procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
      end;

      TForm8 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADODataSet1: TADODataSet;
        ADOConnection1: TADOConnection;
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form8: TForm8;

    implementation

    {$R *.dfm}

    { TDBGrid }

    procedure TDBGrid.WMHScroll(var Msg: TWMHScroll);
    begin
      case Msg.ScrollCode of
        SB_ENDSCROLL: OutputDebugString('SB_ENDSCROLL') ;
        SB_LEFT:OutputDebugString('SB_LEFT');
        SB_RIGHT:OutputDebugString('SB_RIGHT');
        SB_LINELEFT:OutputDebugString('SB_LINELEFT');
        SB_LINERIGHT:OutputDebugString('SB_LINERIGHT');
        SB_PAGELEFT:OutputDebugString('SB_PAGELEFT');
        SB_PAGERIGHT:OutputDebugString('SB_PAGERIGHT');
        SB_THUMBPOSITION:OutputDebugString('SB_THUMBPOSITION');
      end;
      inherited; // to keep the expected behavior
    end;
[...]

Update2 : обратите внимание, что вы можете переместить свой специальный код TDBGrid в отдельную единицу (рекомендуется), просто обязательно укажите это имя единицы ПОСЛЕ DBGrids в предложении вашей формы .

4 голосов
/ 12 ноября 2009

Может быть, это поможет. Он показывает пример для перехвата событий прокрутки обычного TStringGrid. Синхронизировать прокрутку двух TStringgrid?

0 голосов
/ 12 ноября 2009

РЕДАКТИРОВАТЬ: неправильный ответ, очевидно. Он ловит полосу прокрутки вертикальная , но не горизонтальная одна.

Вы не ловите это на уровне DBGrid. Вы ловите это в BeforeScroll или AfterScroll прикрепленного TDataSet. Он запускается либо с помощью полосы прокрутки, клавиш со стрелками вверх и вниз, страница вверх и клавиши вниз страницы и т. д., которые встречаются в DBGrid.

0 голосов
/ 12 ноября 2009

Я не могу проверить это в данный момент, но если я правильно помню, событие там, но не опубликовано. Попробуйте создать элемент управления, который происходит от TDBGrid и публикует событие полосы прокрутки.

...