Текущий архив: 2007.09.16;
Скачать: CL | DM;
ВнизКак заблокировать CloseUp по LButtonClick для ComboBox? Найти похожие ветки
← →
xolin © (2006-10-07 10:55) [0]Необходимо сделать компонент ComboBox с выпадающим CheckList. (К слову, разместить CheckBox в выпадающем окне мне не удалось, пришлось рисовать битмапы в виде чекбоксов.)
Проблема в том, что при клике мышью выпадающее окно закрывается, чего мне, разумеется, не нужно. Перехват сообщения WM_LBUTTONDOWN и копание в исходниках QStdCtrls.pas решить проблему не помогли. Если кто-то опишет решение, буду очень признателен.
← →
Проггер из библиотеки (2006-10-08 15:41) [1]Зверский вариант: отправить ему имитацию щелчка, чтобы он тут же развернулся. А вообще меня бы такое поведение компонента только раздражало, но это уже моё личное восприятие... :)
← →
xolin © (2006-10-08 15:56) [2]Не, это я пробовал. Полный отстой: слишком долго происходит процесс повторного выпадения. Нужно блокировать щелчок.
Неужели никто не в курсе?
← →
Проггер из библиотеки (2006-10-08 15:59) [3]Не могу сейчас воспользоваться VCL справкой, да и память подводит: у ComboBox"а нет какого-нибудь события, отвечающего за сворачивание? Если есть, туда может передаваться var-параметр, определяющий разрешать или не разрешать сворачивание...
← →
xolin © (2006-10-08 18:05) [4]Под рукой спарвки нет, но, кажется, так: OnCloseUp(Sender: TObject).
Вроде бы, не предполагается такого параметра.
← →
ProgRAMmer Dimonych © (2006-10-08 22:02) [5]Вот, вернулся я домой, глянул: действительно нет там 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 23:16) [6]Спасибо за наводку :) Завтра на работе попробую. О результатах отпишусь.
← →
ProgRAMmer Dimonych © (2006-10-08 23:25) [7]> Спасибо за наводку :) Завтра на работе попробую. О результатах отпишусь.
Если не получится - будет на пиво :), т.е. будем искать дальше...
← →
xolin © (2006-10-09 18:48) [8]Не получилось. csSimple это параметр не из набора ComponentState, а свойство ComboBox.Style. При установке этого значение для ComboBox.Style не отображаются битмапы и кнопка для раскрытия выпадающего списка, так что - не подходит.
Целый день рылся в исходнике QStdCtrls.pas. Так ничего и не нарыл. Единственное, за что зацепился - процедура TCustomCombo.ComboWndProc, которая по описанию, кажется, отвечает за обработку сообщений окнами ComboBox"а. Однако при объявлении этой процедуры в своем компоненте с признаком override эффекта не получил. Для проверки в теле процедуры оставил только строку DroppedDown := true, но компонент все равно штатно реагирует на все манипуляции с устройствами ввода.
← →
ProgRAMmer Dimonych © (2006-10-09 18:56) [9]Так CLX используется? QStdCtrls.pas?
← →
xolin © (2006-10-09 19:00) [10]Нет, ошибся, VCL - StdCtrls.pas
← →
xolin © (2006-10-09 19:03) [11]А чувствую, что решение где-то рядом, но не хватает опыта: как с завязанными глазами. Наставьте на путь истинный, уважаемые Мастера.
← →
ProgRAMmer Dimonych © (2006-10-09 19:33) [12]http://home.att.net/~secondcut/nitecomb.htm
Может, здесь чего-нибудь есть?
← →
xolin © (2006-10-10 20:41) [13]Очередной день бесплодных попыток решить проблему.
Выяснилось, что процедура ComboWndProc срабатывает только при значениях стиля csDropDown и csSimple, то есть, когда имеется поле для редактирования, а процедура WndProc срабатывает в любом случае. Но и та и другая - только при кликах по полю редактирования в случае, если список свернут. Проверял срабатывание помещением в тело процедуры всего лишь одной строки ShowMessage("xyz").
Отловить щелчок по выпадающему списку никак не получается.
← →
ProgRAMmer Dimonych © (2006-10-11 18:19) [14]Добрался я наконец до Дельфи.
Хочу уточнить...
1. Если пользователь выбрал значение из списка - ComboBox должен закрываться?
2. Если пользователь хочет увести фокус с ComboBox (например, на Button), список должен закрываться?
← →
xolin © (2006-10-11 19:06) [15]1 - нет
2 - да
Еще хочется все-таки решить проблему с размещением в списке не изображения чекбоксов, а сами объекты TCheckBox, но это произвольная программа :)
Сегодня пошел по другому пути - сделал компонент на основе TEdit и TCheckList. В принципе - работает. Единственное, что не удалось решить, это закрытие списка при щелчке мимо него (сделал по OnExit для компонента, но в этом случае не срабатывает при клике по канве формы) и выпадающий список не может вылезать за пределы родительского объекта, но последнее для меня не критично.
И еще, как бы сделать кнопочку, по нажатии на которую выпадает список в стиле WinXP? А то сейчас в этой роли обычный SpeedButton, довольно убогонько выглядит на фоне экспишных контролов :)
← →
ProgRAMmer Dimonych © (2006-10-12 14:45) [16]1. Пробовать отлавливать click у формы (он, по-моему, сначала ей передаётся).
← →
ProgRAMmer Dimonych © (2006-10-12 14:45) [17]И всё-таки интересно, зачем нужен компонент с таким неприятным поведением?
← →
xolin © (2006-10-12 20:14) [18][на 16]
Не хочется показаться невеждой, но я не знаю как это сделать из компонента и бьюсь над этим уже с неделю 8-/ Был крайне признателен за краткий ликбез в этом вопросе или хотя бы за полезные ссылки.
[на 17]
Почему "неприятным"? Просто если юзеру нужно отметить галочками несколько элементов из выпадающего списка, его, вероятно, будет раздражать, когда список будет сворачиваться при каждом клике, особенно если этот список длинный, со скроллом, а отметить надо много записей.
← →
xolin © (2006-10-12 20:23) [19][еще на 16] Прошу прощения, все смешалось: люди, кони. Неделю я бьюсь над перехватом клика по выпадающему списку комбобокса.
Сегодня, потестив оба недокомпонента: на сонове комбобокса и на основе эдита с чеклистом, решил все-таки "добить" тот, который на основе комбобокса.
Так что главный вопрос остается прежним: как перехватить клик мыши по выпадающему списку и заблокировать его сворочивание?
← →
xolin © (2006-10-13 18:56) [20]Ура! Заблокировать сворачивание удалось перехватом сообщения WM_COMMAND. Теперь вопрос в том, как обрабатывать ввод. Например как распознать двойной щелчок?
← →
ProgRAMmer Dimonych © (2006-10-13 23:21) [21]> [20]
WM_LBUTTONDBLCLK?
← →
xolin © (2006-10-14 16:25) [22]не срабатывает на выпадающем списке, только на поле редактирования.
← →
GrayFace © (2006-10-15 15:57) [23]Метод из HSHintComboBox: ловить WM_CTLCOLORLISTBOX - там подается хэндл листбокса. Отрисовку возьми из TCheckedListBox. Вот мой комбобокс: http://www.grayface.nm.ru/RSComboBox.rar
Страницы: 1 вся ветка
Текущий архив: 2007.09.16;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.043 c