|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.05.2013, 20:55 | #1 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
GlobalEventServer (контроль сообщений)
В общем я заколебался искать нормальный способ сделать ComboBox,
чтобы выпадающий список убирался при тыке мышкой в другое место... Одно время меня спасало CM_CANCELMODE - это сообщение возникало после клика мышкой мимо активного окна, но вот пришла пора мне сделать ComboBox с возможностью ручного ввода, а для этого нужен TEdit. И вот такая ситуация: фокус в TEdit, список открыт... Как его закрыть? CM_CANCELMODE не придет, потому что фокус в эдите... короче - никак... Microsoft, вашу мать, трудно было сделать сообщение WM_MouseDownOutside?!! теперь вот приходится извращаться... А вот, собственно, суть изврата: Задача: создать легко развертываемую систему, которая обеспечивала бы правильную работу ComboBox'ов (под легкостью понимается как можно меньшее кол-во действий, которые нужно сделать в пустом проекте, чтобы система начала работать). Реализация: Я написал класс TGlobalEventServer (глобальный в пределах приложения) Его задача состоит в том, чтобы получать все сообщения и рассылать их всем, кто на них подписан. Класс описан в юните GlobalEventServer.pas, там же создан объект GES и по-умолчанию подключен к Application.OnMessage. Все, что нужно - это подключить модуль в Uses. Для того, чтобы подписаться на сообщение, необходимо передать в GES сообщение, на которое подписываемся и процедуру, которая будет запущена при получении этого сообщения: GES.AddEvent(myProcedure, WM_LBUTTONDOWN); эти данные будут добавлены в массив, а функция вернет id этой записи. (по этому id впоследствии можно будет отписаться от сообщения) Работа ComboBox'a: каждый ComboBox подписывается на сообщения от мышки, а при их возникновении проверяет ее координаты и если она находится за его пределами, значит это WM_MouseDownOutside и список пора сворачивать =) ComboBox'ы буду разрабатывать с зависимостью от GlobalEventServer.pas поэтому подписываться и отписываться они будут сами при создании/удалении Можно обойтись и без такой зависимости - тогда каждый создаваемый ComboBox надо будет подписывать/отписывать вручную. Минусы системы: * зависимость от Application (других пока не вижу) Плюсы системы: * полный контроль над сообщениями - Application.OnMessage --получает сообщения раньше, чем они дойдут до адресатов * простота развертывания - просто добавь в uses * это работает - самый главный плюс, покрывающий все минусы Собственно интересно услышать ваши комментарии по поводу такого решения =) Последний раз редактировалось xrob; 12.05.2013 в 20:57. |
12.05.2013, 21:05 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Эмм может это вас ошеломит, но у ComboBox'а есть свойство AutoCloseUp которое и отвечает за автомат. закрытие списка ComboBox.
|
12.05.2013, 21:21 | #3 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
Человек_Борща, не ошеломит =)
Ибо тот ComboBox, о котором вы говорите (стандартный стало быть) меня совершенно не интересует. У меня вообще стандартные компоненты используются только на ранних этапах проектирования приложений. В конечной версии все визуальные компоненты - мои. За исключением разве что Edit'ов и Memo - я делаю обертки над ними. Но и то скоро и эти будут полностью свои (под полностью здесь понимается наследование с TPanel) А кнопки, скролы, таблицы, панели закладок, флажки - все свои ComboBox тоже свой есть, и работает как надо, но без возможности ввода с клавы. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
контроль пользователя | SkrudjMakdak | Софт | 0 | 06.07.2012 16:02 |
Сбор сообщений службы сообщений Windows XP | testor48 | Работа с сетью в Delphi | 3 | 31.03.2011 20:20 |
Контроль запуска | SONce | Общие вопросы Delphi | 7 | 17.04.2009 17:43 |
Контроль трафика... | Phantom | Работа с сетью в Delphi | 4 | 10.04.2009 14:02 |
Перехват сообщений от Службы сообщений (Messenger) | SJMS | Win Api | 6 | 17.07.2008 10:26 |