Listbox Click не регистрируется - как исправить?

У меня есть два списка в форме, которые заполняются во время выполнения.

У меня есть событие OnClick, которое изменяет цвет (плюс множество других вещей) списка «Выбранные», чтобы я знал, какой из них активен для пользователя.

Все это работает просто отлично, если пользователь щелкает элемент в списке, но если он щелкает пробел в списке, OnClick не срабатывает.

Я думал об использовании OnMouseUp и указании на событие OnClick, но другие вещи в этом событии в то время не нужны.

Как я могу обнаружить щелчок в пустом пространстве ListBox?


person user2373289    schedule 30.06.2013    source источник


Ответы (2)


Хм... Listbox.ItemIndex = -1 означает, что вы щелкаете в пустой области. С mouseevent это должно помочь.

Другой вариант: возможно, вы могли бы попробовать проверить компонент, имеющий фокус, вместо использования события щелчка.

РЕДАКТИРОВАТЬ: Не имея доступного Delphi5, я могу сказать вам, что эта «ошибка» исправлена ​​​​в XE. Установите таймер и проверьте, какой список имеет фокус (Listbox.Focused), если, возможно, это свойство доступно.

person Greg M.    schedule 30.06.2013
comment
@Greg: #1 ItemIndex:=-1 ничего не сделал. # 2 для него нет HasFocus и # 3, Дэвид прав, Focused работал в OnMouseUp, который перемещает Focus в соответствующее поле. Спасибо вам обоим. - person user2373289; 30.06.2013
comment
OnMouseUp тоже не годится. Это точно не то, что вам здесь нужно. С чего вы взяли, что пользователь перемещается с помощью мыши. Они могут использовать клавиатуру или другое устройство ввода. Возможно, OnEnter это то, что вы действительно ищете. - person David Heffernan; 30.06.2013
comment
Но -- с этим приложением мышь обязательна по целому ряду других причин, поэтому они могут либо использовать мышь, либо нет, и результатом будет что-то или ничего. :) - person user2373289; 30.06.2013
comment
Я согласен, что таймер не является «чистым» способом сделать это. Может быть, вы можете проверить событие Application.OnMessage и отфильтровать те, которые связаны с фокусом? - person Greg M.; 30.06.2013

Кажется, что на самом деле вы ищете обнаружение смены фокуса. Вы хотите определить, когда элемент управления получает фокус, а затем теряет фокус. Для этого вы должны использовать события OnEnter и OnExit. Событие OnClick просто не подходит для задачи.

Из документации для OnEnter:

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

Событие OnEnter не возникает при переключении между формами или между другим приложением и приложением, включающим элемент управления.

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

Точно так же событие OnExit контейнера возникает после события OnExit элемента управления в контейнере, когда фокус перемещается на другой элемент управления вне контейнера.

Например, рассмотрим форму с кнопкой «ОК» и групповым полем, содержащим три переключателя, где в настоящее время фокус находится на кнопке «ОК». Когда пользователь щелкает один из переключателей, происходит событие OnExit для кнопки, за которым следует событие OnEnter для поля группы и, наконец, событие OnEnter для переключателя, который был нажат. Если затем пользователь нажимает кнопку OK, происходит событие OnExit для переключателя, за которым следует событие OnExit для поля группы, а затем происходит событие OnEnter кнопки.

person David Heffernan    schedule 30.06.2013