Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2013, 20:55   #1
xrob
Форумчанин
 
Регистрация: 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
* это работает - самый главный плюс, покрывающий все минусы


Собственно интересно услышать ваши комментарии по поводу такого решения =)
Вложения
Тип файла: rar GlobalEventServer.rar (955 байт, 5 просмотров)

Последний раз редактировалось xrob; 12.05.2013 в 20:57.
xrob вне форума Ответить с цитированием
Старый 12.05.2013, 21:05   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Эмм может это вас ошеломит, но у ComboBox'а есть свойство AutoCloseUp которое и отвечает за автомат. закрытие списка ComboBox.
Человек_Борща вне форума Ответить с цитированием
Старый 12.05.2013, 21:21   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Человек_Борща, не ошеломит =)
Ибо тот ComboBox, о котором вы говорите (стандартный стало быть) меня совершенно не интересует.
У меня вообще стандартные компоненты используются только на ранних этапах проектирования приложений.
В конечной версии все визуальные компоненты - мои.
За исключением разве что Edit'ов и Memo - я делаю обертки над ними.
Но и то скоро и эти будут полностью свои (под полностью здесь понимается наследование с TPanel)
А кнопки, скролы, таблицы, панели закладок, флажки - все свои
ComboBox тоже свой есть, и работает как надо, но без возможности ввода с клавы.
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
контроль пользователя 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