Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

Как заблокировать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.049 c
9-1159903864
kurt
2006-10-03 23:31
2007.09.16
как делать меню к игре


15-1187762538
umbra
2007-08-22 10:02
2007.09.16
Никто не встречал такого вируса/трояна/руткита


2-1187861485
TPel
2007-08-23 13:31
2007.09.16
снимок TPanel


15-1187213795
SaMar
2007-08-16 01:36
2007.09.16
Предлагаю книги по DELPHI для скачивания!!!


2-1187587032
Александр_К
2007-08-20 09:17
2007.09.16
Сокеты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский