Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Передать сообщение прокрутки колесом другому компоненту  [new]
aford
Member

Откуда:
Сообщений: 52
Собственно, все в заголовке. Например, у меня на форме лежат ScrollBox и в нем DBGrid и другие компоненты. Если я прокручиваю колесико мыши над таблицей, то прокручивается таблица, а не скроллбокс, это вполне ожидаемо, а вот как передать это событие скроллбоксу? Мне не нужно прокручивать таблицу, разве только что дергать левой кнопкой мыши за скроллбар на ней.
Вообще отменить реакцию таблицы на колесико у меня получилось:

private
  FGridWndProc: TWndMethod;
  procedure DbGridWindowProc(var Msg: TMessage);

в OnCreate:
  FGridWndProc:= DBGrdEhReading.WindowProc;
  DBGrdEhReading.WindowProc:= DbGridWindowProc;

...
procedure TFrmMain.DbGridWindowProc(var Msg: TMessage);
begin
  case Msg.Msg of
    WM_MOUSEWHEEL: Exit;
  end;
  if Assigned(FGridWndProc) then
    FGridWndProc(Msg);
end;


Как передать ее в скроллбокс пока не знаю.
11 окт 18, 17:51    [21701876]     Ответить | Цитировать Сообщить модератору
 Re: Передать сообщение прокрутки колесом другому компоненту  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 8745
aford,
SetFocus
11 окт 18, 17:58    [21701886]     Ответить | Цитировать Сообщить модератору
 Re: Передать сообщение прокрутки колесом другому компоненту  [new]
aford
Member

Откуда:
Сообщений: 52
Соколинский Борис,

  case Msg.Msg of
    WM_MOUSEWHEEL: begin
                     ScrlBxReading.SetFocus;
                     Exit;
                   end;
  end;


Фокус передается, а сообщения о прокрутке нет
12 окт 18, 09:05    [21702168]     Ответить | Цитировать Сообщить модератору
 Re: Передать сообщение прокрутки колесом другому компоненту  [new]
aford
Member

Откуда:
Сообщений: 52
Нашел решение, может кому пригодится, всего-то нужно было дописать
PostMessage(ScrlBxReading.Handle, WM_MOUSEWHEEL, Msg.WParam, Msg.LParam);

Полный код:
private
  FGridWndProc: TWndMethod;
  procedure DbGridWindowProc(var Msg: TMessage);

в OnCreate:
  FGridWndProc:= DBGrdEhReading.WindowProc;
  DBGrdEhReading.WindowProc:= DbGridWindowProc;

...
procedure TFrmMain.DbGridWindowProc(var Msg: TMessage);
begin
  case Msg.Msg of
    WM_MOUSEWHEEL:  begin
                                     PostMessage(ScrlBxReading.Handle, WM_MOUSEWHEEL, Msg.WParam, Msg.LParam);
                                     Exit;
                                   end;
  end;
  if Assigned(FGridWndProc) then
    FGridWndProc(Msg);
end;
12 окт 18, 11:13    [21702290]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить