• 0
Alex7wrt

OnMouseLeave для заполненного ListBox, Windows

Вопросы

Добрый день

Столкнулся со следующей задачей, и пока не могу ее решить:

Есть заполненный ListBox, в общем случае он с вертикальной полосой прокрутки. Нужно отработать для него событие OnMouseLeave. Точнее говоря, нужно сделать так, чтобы, когда курсор мыши покидает его пределы, то делаем ListBox.Visible:=False.

Но дело в том, что, во-первых, событие OnMouseLeave в общем случае не сработает, так как в заполненном ListBox-е это событие перехватывается его дочерними элементами, а во вторых вертикальная полоса прокрутки не учитывается в событиях мыши ListBox-а. К тому же, даже если я сделаю какую-нибудь внешнюю рамку, и буду обрабатывать OnMouseLeave для нее, то все равно при быстром движении мыши событие не происходит.

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

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

 

 

Изменено пользователем Alex7wrt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 ответов на этот вопрос

  • 0
23 минуты назад, Alex7wrt сказал:

Добрый день

Столкнулся со следующей задачей, и пока не могу ее решить:

Есть заполненный ListBox, в общем случае он с вертикальной полосой прокрутки. Нужно отработать для него событие OnMouseLeave. Точнее говоря, нужно сделать так, чтобы, когда курсор мыши покидает его пределы, то делаем ListBox.Visible:=False.

Но дело в том, что, во-первых, событие OnMouseLeave в общем случае не сработает, так как в заполненном ListBox-е это событие перехватывается его дочерними элементами, а во вторых вертикальная полоса прокрутки не учитывается в событиях мыши ListBox-а. К тому же, даже если я сделаю какую-нибудь внешнюю рамку, и буду обрабатывать OnMouseLeave для нее, то все равно при быстром движении мыши событие не происходит.

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

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

 

 

Таймер, эдак милисекунд на 200. И в нем проверять координаты мыши, дальше уже арифметика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Спасибо за совет, но это смахивает на костыль ))

И в каком событии проверять координаты?

Кстати, есть ли способ узнать координаты курсора мыши в пределах всей формы с учетом дочерних компонентов?

Изменено пользователем Alex7wrt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
29 минут назад, Alex7wrt сказал:

Спасибо за совет, но это смахивает на костыль ))

И в каком событии проверять координаты?

Кстати, есть ли способ узнать координаты курсора мыши в пределах всей формы с учетом дочерних компонентов?

Проверяйте не в событии, а в таймере. Координаты в глобальной переменной   Screen.MousePos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да нет, таймер не походит. Нужен прямой подход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
24 минуты назад, Alex7wrt сказал:

Да нет, таймер не походит. Нужен прямой подход.

Этот подход прямее некуда. Думаете как контролы генерируют событие OnMouseLeave (Enter)? Точно не посредством колдовства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу