![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заблокировать CloseUp по LButtonClick для ComboBox? [D6, WinXP]
xolin © (2006-10-07 10:55:00)Необходимо сделать компонент ComboBox с выпадающим CheckList. (К слову, разместить CheckBox в выпадающем окне мне не удалось, пришлось рисовать битмапы в виде чекбоксов.)
Проблема в том, что при клике мышью выпадающее окно закрывается, чего мне, разумеется, не нужно. Перехват сообщения WM_LBUTTONDOWN и копание в исходниках QStdCtrls.pas решить проблему не помогли. Если кто-то опишет решение, буду очень признателен.
GrayFace (2006-10-15 15:57:00) [1]Метод из HSHintComboBox: ловить WM_CTLCOLORLISTBOX - там подается хэндл листбокса. Отрисовку возьми из TCheckedListBox. Вот мой комбобокс: http://www.grayface.nm.ru/RSComboBox.rar
xolin (2006-10-14 16:25:00) [2]не срабатывает на выпадающем списке, только на поле редактирования.
ProgRAMmer Dimonych (2006-10-13 23:21:00) [3]> [20]
WM_LBUTTONDBLCLK?
xolin (2006-10-13 18:56:00) [4]Ура! Заблокировать сворачивание удалось перехватом сообщения WM_COMMAND. Теперь вопрос в том, как обрабатывать ввод. Например как распознать двойной щелчок?
xolin (2006-10-12 20:23:00) [5][еще на 16] Прошу прощения, все смешалось: люди, кони. Неделю я бьюсь над перехватом клика по выпадающему списку комбобокса.
Сегодня, потестив оба недокомпонента: на сонове комбобокса и на основе эдита с чеклистом, решил все-таки "добить" тот, который на основе комбобокса.
Так что главный вопрос остается прежним: как перехватить клик мыши по выпадающему списку и заблокировать его сворочивание?
xolin (2006-10-12 20:14:00) [6][на 16]
Не хочется показаться невеждой, но я не знаю как это сделать из компонента и бьюсь над этим уже с неделю 8-/ Был крайне признателен за краткий ликбез в этом вопросе или хотя бы за полезные ссылки.
[на 17]
Почему "неприятным"? Просто если юзеру нужно отметить галочками несколько элементов из выпадающего списка, его, вероятно, будет раздражать, когда список будет сворачиваться при каждом клике, особенно если этот список длинный, со скроллом, а отметить надо много записей.
ProgRAMmer Dimonych (2006-10-12 14:45:00) [7]И всё-таки интересно, зачем нужен компонент с таким неприятным поведением?
ProgRAMmer Dimonych (2006-10-12 14:45:00) [8]1. Пробовать отлавливать click у формы (он, по-моему, сначала ей передаётся).
xolin (2006-10-11 19:06:00) [9]1 - нет
2 - да
Еще хочется все-таки решить проблему с размещением в списке не изображения чекбоксов, а сами объекты TCheckBox, но это произвольная программа :)
Сегодня пошел по другому пути - сделал компонент на основе TEdit и TCheckList. В принципе - работает. Единственное, что не удалось решить, это закрытие списка при щелчке мимо него (сделал по OnExit для компонента, но в этом случае не срабатывает при клике по канве формы) и выпадающий список не может вылезать за пределы родительского объекта, но последнее для меня не критично.
И еще, как бы сделать кнопочку, по нажатии на которую выпадает список в стиле WinXP? А то сейчас в этой роли обычный SpeedButton, довольно убогонько выглядит на фоне экспишных контролов :)
ProgRAMmer Dimonych (2006-10-11 18:19:00) [10]Добрался я наконец до Дельфи.
Хочу уточнить...
1. Если пользователь выбрал значение из списка - ComboBox должен закрываться?
2. Если пользователь хочет увести фокус с ComboBox (например, на Button), список должен закрываться?
xolin (2006-10-10 20:41:00) [11]Очередной день бесплодных попыток решить проблему.
Выяснилось, что процедура ComboWndProc срабатывает только при значениях стиля csDropDown и csSimple, то есть, когда имеется поле для редактирования, а процедура WndProc срабатывает в любом случае. Но и та и другая - только при кликах по полю редактирования в случае, если список свернут. Проверял срабатывание помещением в тело процедуры всего лишь одной строки ShowMessage('xyz').
Отловить щелчок по выпадающему списку никак не получается.
ProgRAMmer Dimonych (2006-10-09 19:33:00) [12]http://home.att.net/~secondcut/nitecomb.htm
Может, здесь чего-нибудь есть?
xolin (2006-10-09 19:03:00) [13]А чувствую, что решение где-то рядом, но не хватает опыта: как с завязанными глазами. Наставьте на путь истинный, уважаемые Мастера.
xolin (2006-10-09 19:00:00) [14]Нет, ошибся, VCL - StdCtrls.pas
ProgRAMmer Dimonych (2006-10-09 18:56:00) [15]Так CLX используется? QStdCtrls.pas?
xolin (2006-10-09 18:48:00) [16]Не получилось. csSimple это параметр не из набора ComponentState, а свойство ComboBox.Style. При установке этого значение для ComboBox.Style не отображаются битмапы и кнопка для раскрытия выпадающего списка, так что - не подходит.
Целый день рылся в исходнике QStdCtrls.pas. Так ничего и не нарыл. Единственное, за что зацепился - процедура TCustomCombo.ComboWndProc, которая по описанию, кажется, отвечает за обработку сообщений окнами ComboBox'а. Однако при объявлении этой процедуры в своем компоненте с признаком override эффекта не получил. Для проверки в теле процедуры оставил только строку DroppedDown := true, но компонент все равно штатно реагирует на все манипуляции с устройствами ввода.
ProgRAMmer Dimonych (2006-10-08 23:25:00) [17]> Спасибо за наводку:) Завтра на работе попробую. О результатах отпишусь.
Если не получится - будет на пиво :), т.е. будем искать дальше...
xolin (2006-10-08 23:16:00) [18]Спасибо за наводку :) Завтра на работе попробую. О результатах отпишусь.
ProgRAMmer Dimonych (2006-10-08 22:02:00) [19]Вот, вернулся я домой, глянул: действительно нет там var-параметра. Зато есть такое:
Use csSimple to create a combo box with a fixed list that does not close. Be sure to resize the combo box so that the list items are displayed (VCL only).
Т.е. ComboBox.ComponentState:=ComboBox.ComponentState + [csSimple].
Поможет?
xolin (2006-10-08 18:05:00) [20]Под рукой спарвки нет, но, кажется, так: OnCloseUp(Sender: TObject).
Вроде бы, не предполагается такого параметра.