Как определить, что мышь не двигается, а кнопка все еще нажата?

В Delphi я добавил компонент полосы прокрутки (ориентированный по вертикали) с правой стороны формы.

Я добавил событие Scrollbar OnChange, чтобы я мог изменить вид формы и положение большого пальца полосы прокрутки, когда пользователь нажимает кнопку "Стрелка вверх" или "Стрелка вниз" с помощью мыши, и это прекрасно работает.

Но событие OnChange, похоже, срабатывает только тогда, когда кнопка мыши изначально нажата на стрелке.

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

Итак, как я могу легко определить, что пользователь не двигал мышь и продолжает нажимать кнопку мыши, пока мышь остается над стрелкой?


Заключение. Каким-то образом что-то в полосе прокрутки в моем проекте испортилось. После того, как я удалил ScrollBar и добавил его снова, проблема исчезла.

Это одна из тех хитрых задач, на решение которых у меня ушло много времени. Спасибо за вашу помощь. Я закрываю этот вопрос.

3 ответа

Решение

Используйте событие OnScroll.

Следующий код добавляет "xxx" в заметку, пока на кнопке со стрелкой прокрутки удерживается мышь. Протестировано с Delphi 6.

procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
    Memo1.Lines.Add( 'xxx' );
end;

Обычный способ обработки автоповтора состоит в том, чтобы включить TTimer и проверить в обработчике события OnTimer(), нужно ли снова выполнять действие, и отключить таймер, если нет. Если вам нужен пример кода, я помню, что элемент управления SynEdit использовал аналогичную технику для автоматической прокрутки в операциях перетаскивания.

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

Я знаю, что требуется дополнительная работа, но это действительно лучший путь. Теперь, с Delphi, я, кажется, вспоминаю, что подклассовые компоненты нуждались в небольшой дополнительной работе, чтобы их можно было использовать из IDE для проектирования форм, возможно, это изменилось с версии 7.

Другие вопросы по тегам