powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MouseWheel перехватить
18 сообщений из 18, страница 1 из 1
MouseWheel перехватить
    #39134476
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть форма F1, которая лежит на форме F2.
На форме F2 есть грид, который имеет фокус. На форме F1 лежит скроллбокс, внутри которого несколько TChart-ов. И чарты и скроллбокс имеют свойство TabStop = true.
Но как не кликай по чартам, при вращении колесика мышки скролится грид. Событие OnMouseWheel для скроллбокса не возникает.
А мне нужно скролить скроллбокс, когда мышка над ним. Как это сделать?
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39134484
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minvaСобытие OnMouseWheel для скроллбокса не возникает.
Может скролллбокс и не подозревает о колесе?
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39134501
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, может, а надо, чтоб подозревал:)
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39134527
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minvaЕсть форма F1, которая лежит на форме F2.
На форме F2 есть грид, который имеет фокус. На форме F1 лежит скроллбокс, внутри которого несколько TChart-ов. И чарты и скроллбокс имеют свойство TabStop = true.
Но как не кликай по чартам, при вращении колесика мышки скролится грид. Событие OnMouseWheel для скроллбокса не возникает.
А мне нужно скролить скроллбокс, когда мышка над ним. Как это сделать?Гриды - они бывают разные... Если DBGrid -то это известный глюк Борланда...
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39134535
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva,

Один из вариантов
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TMyForm.OnWheelMouse(var Msg: tagMSG; var Handled: Boolean);
var
   i: SmallInt;
begin
   if Msg.message=WM_MOUSEWHEEL then
    begin
      if(FindControl(Msg.hwnd)<>nil) and (FindControl(Msg.hwnd).ClassName='TDBGrid') and (FindControl(Msg.hwnd).Focused) then
        begin
          if Msg.wParam>0 then
            TDBGrid(FindControl(Msg.hwnd)).DataSource.DataSet.MoveBy(StrToInt(Copy(IntToStr(Msg.wParam*-1),1,2)))
          else
            TDBGrid(FindControl(Msg.hwnd)).DataSource.Dataset.MoveBy(StrToInt(Copy(IntToStr(Msg.wParam*-1),1,1)));
          Msg.message:=0;
        end;
    end;
end;

...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39134557
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko, спасибо, но, наверное, немного не так. У меня форма F1 абсолютно независима. И надо обеспечить скрол мышкой вне зависимости от того, куда она, форма, ляжет потом.
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39134565
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minvaGerasimenko, спасибо, но, наверное, немного не так. У меня форма F1 абсолютно независима. И надо обеспечить скрол мышкой вне зависимости от того, куда она, форма, ляжет потом.Ну так переделай, как тебе надо... Делов-то...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
MouseWheel перехватить
    #39926687
Подниму эту тему, так как ответа тут не дали.
Есть форма, на ней панель. У панели прописаны обработчики OnMouseWheel.
В системе на которой программирую и компилируют фокус нормально переносится на панель и всё прекрасно работает.
При запуске программы на другую систему (где, во имя безопасности, отключено всё, что можно и выглядит она как 98я винда, хотя стоит 10ка). В этой системе фокус всегда остаётся на форме или последних выбранных компонентах, но не на панели, соответственно событие OnMouseWheel панели не срабатывает. Вопрос - почему?
Естественно можно накостылить десяток способов вызова события (самый банальный - при нахождении мыши над формой события панели вызываются из событий панели), но не хочется, так как недавно узнал красивое слово "инкапсуляция" и панель у меня - мой собственный наследный класс со всеми нужными мне параметрами и процедурами, и который могу нарисовать где угодно (рисование графики в OpenGL) и хотелось бы чтоб всё сразу работало.
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39926738
Андрей Игоревич
самый банальный - при нахождении мыши над формой события панели вызываются из событий панели),.

*при нахождении над панелью вызываются события панели из событий формы...
(о блин написал фигню в первый раз).
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39926756
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ системе на которой программирую и компилируют фокус нормально переносится на панель и всё прекрасно работает.
Панель не имеет фокуса. Вы не можете перенести фокус с TEdit на TPanel
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39926787
DimaBr
авторВ системе на которой программирую и компилируют фокус нормально переносится на панель и всё прекрасно работает.

Панель не имеет фокуса. Вы не можете перенести фокус с TEdit на TPanel
У меня работает... - постоянно колесом "скролю", как видно, фокус прекрасно переходит между всем (и трекбары, и эдиты), если "скролить" над панелью -происходит маштабирование.
Но на другой системе это не работает. Если надо делать костыль - как бы его сделать, чтоб он был включен в мой класс, а не в родителя?

...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39927101
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич, в Windows 10, в системе есть настройка, отвечающая за передачу событий колеса мыши в контрол под курсором. В зависимости от неё и будет разное поведение.
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39927387
white_nigger
Андрей Игоревич, в Windows 10, в системе есть настройка, отвечающая за передачу событий колеса мыши в контрол под курсором. В зависимости от неё и будет разное поведение.

В общем на MouseMove панели сделал self.SetFocus, вроде всё работает.
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39927433
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
В общем на MouseMove панели сделал self.SetFocus, вроде всё работает.
Изменение фокуса на движении мыши - плохое решение. Более правильно сделать так:
1. Проверить текущую настройку системы через SPI_GETMOUSEWHEELROUTING
2. Перекрыть DoMouseWheel, если wheel routing отключен - то определять контрол под мышью и перенаправлять текущее действие ему.

PS: Есть ещё конечно вариант принудительно включить этот режим в системе через SPI_SETMOUSEWHEELROUTING, но за это можно (и нужно) схлопотать люлей от пользователя
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39927448
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Application.OnMessage. Можно, даже, через компонент TApplicationEvents обрабатывать.
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39927680
white_nigger
Андрей Игоревич
В общем на MouseMove панели сделал self.SetFocus, вроде всё работает.
Изменение фокуса на движении мыши - плохое решение. Более правильно сделать так:
1. Проверить текущую настройку системы через SPI_GETMOUSEWHEELROUTING
2. Перекрыть DoMouseWheel, если wheel routing отключен - то определять контрол под мышью и перенаправлять текущее действие ему.

PS: Есть ещё конечно вариант принудительно включить этот режим в системе через SPI_SETMOUSEWHEELROUTING, но за это можно (и нужно) схлопотать люлей от пользователя

Перекрывать DoMouseWheel как-то спорно, а если мой класс разместить на панели, которая находиться на панели и та опять на панели (когда делаешь аккуратную разметку такое постоянно) и уже (parent as TWinControl).DoMouseWheel не даст результата. Сверху идти как-то тоже костыльно. Или есть пути попроще?

Kazantsev Alexey
Application.OnMessage. Можно, даже, через компонент TApplicationEvents обрабатывать.

А это не стрельба в муху с пушки? У меня в MouseWhee всё таки чуть математики считается (всякие масштабирования и прочее), не приведет ли к подтормаживаниям? Но можно попробовать.
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39927684
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
А это не стрельба в муху с пушки? У меня в MouseWhee всё таки чуть математики считается (всякие масштабирования и прочее), не приведет ли к подтормаживаниям?

Если оно сейчас не тормозит, с чего должно начать-то?
...
Рейтинг: 0 / 0
MouseWheel перехватить
    #39927838
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Перекрывать DoMouseWheel как-то спорно, а если мой класс разместить на панели, которая находиться на панели и та опять на панели (когда делаешь аккуратную разметку такое постоянно) и уже (parent as TWinControl).DoMouseWheel не даст результата.
Это у панели делается. Напиши своего наследника и перекрой метод как я написал. После этого у тебя будет специализированный контрол который ты можешь положить куда угодно и он будет работать как тебе надо.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MouseWheel перехватить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]