Событие MouseWheelDown запускается несколько раз подряд - PullRequest
2 голосов
/ 13 сентября 2010

Delphi 7 в Windows 7

Я хочу прокрутить список (TElTree) с помощью колесика мыши ... поэтому я начинаю писать некоторый код в событии ElTree OnMouseWheelDown.Затем я замечаю, что он прокручивает 2 строки одновременно.Настройки колесика мыши на панели управления настроены на прокрутку только по одной строке за раз.Если я помещу точку останова в обработчик событий, я обнаружу, что сам обработчик событий выполняется дважды в быстрой последовательности .... Почему?Как убедиться, что он выполняется только один раз (пожалуйста, код)?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2010

Когда колесо прокручивается, ОС отправляет сообщения WM_MOUSEWHEEL. Старшее слово параметра wParam указывает , как далеко повернуло колесо. Если он повернул один «щелчок», то его значение будет 120 или WHEEL_DELTA. Но это может быть меньше, если колесо прокрутки распознает прокрутку меньше, чем ценность клика.

Правильный обработчик сообщений WM_MOUSEWHEEL должен учитывать этот параметр и либо хранить «прокручиваемый аккумулятор», чтобы отслеживать, как далеко колесо прокручивается, либо иметь возможность прокручивать меньше, чем полная строка. Обработчики сообщений, которые предполагают , что каждое сообщение означает полный щелчок колеса, будут сожалеть.

1 голос
/ 20 августа 2018

Решение довольно простое: после вызова функции, которую вы хотите выполнить OnMouseWheel, вы должны установить Handled:=True, чтобы подпрограмма не вызывалась несколько раз.например,

procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  YourFunctionToExecute(Sender, Shift, MousePos, Handled);
  Handled:=True;
end;
...