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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2016, 15:44   #1
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию Реакция компонента при потере им фокуса

Приветствую.
Есть самописный визуальный компонент, ComboBox с отображением дерева элементов вместо плоского списка. При потере фокуса или клике вне компонента (уйти можно на форму или компонент без фокуса) дерево надо прятать, как это делает стандартный Combobox. Первое сделал путем реагирования на событие OnExit. Как реализовать второе?
NaumOff вне форума Ответить с цитированием
Старый 04.08.2016, 16:04   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

http://programmersforum.ru/showthread.php?t=294246
http://programmersforum.ru/showthread.php?t=233329
в твоем случае это видимо будет DoExit
Цитата:
Первое сделал путем реагирования на событие OnExit.
которое в свою очередь есть всего лишь обработка соответствующего сообщения windows

Цитата:
Код:
procedure TWinControl.CMExit(var Message: TCMExit);
begin
  DoExit;
end;
так что можно еще и просто (или не совсем просто, с учетом необходимости реакции на данное сообщение и в родительском компоненте) написать обработку соответствующего сообщения.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.08.2016, 16:38   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
которое в свою очередь есть всего лишь обработка соответствующего сообщения windows
Если быть точным, то CM_XXXX это сообщения VCL. К Windows они отношения не имеют.
northener вне форума Ответить с цитированием
Старый 04.08.2016, 19:52   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ComboBoxEx сильно не подходит?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2016, 15:05   #5
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию

evg_m
Не хотел делать сабклассинг дерева. Раз так то лучше ловить WM_KILLFOCUS. Но суть не в этом. Фокус не меняется при клике по форме или панелям. А вот стандартный комбобокс имеет процедурку
Код:
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
где и происходит закрытие списка. Как заставить систему отсылать моему дереву такое сообщение?

Аватар
ComboBoxEx примитивен. Набросав пару десятков строк кода я уже получил крутотенечку использующую всю мощь VirtualTree. Закрытие дерева пока реализовал кнопкой в заголовке.
Автор IBExpert`a как то реализовал такой контрол. См. вложение.
Не могу понять на базе чего он сделан. Если жамкнуть Alt+PrintScreen то сохраняется только выпадающий список. Это отдельная форма? Тогда почему не меняется фокус основной формы?
Изображения
Тип файла: png IB.png (29.6 Кб, 82 просмотров)
NaumOff вне форума Ответить с цитированием
Старый 09.08.2016, 16:37   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Должно создаваться всплывающее окно с соответствующими параметрами. Здесь пример для начала, ну и дальше мучения с отображением дерева
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2016, 22:04   #7
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию

Аватар
Теперь понятно как реализовывают такие окна. Только к сожалению я не смог нормально отобразить всплывающее окно без потери фокуса основной формы.
В Delphi у меня сработал метод
Код:
procedure TMyFrm.WMMouseActivate(var Message: TMessage); // message WM_MOUSEACTIVATE;
begin
  Message.Result := MA_NOACTIVATE;
end;
и почему то не работает
Код:
Params.ExStyle := Params.ExStyle + WS_EX_NOACTIVATE;
в CreateParams.
Но по правде говоря компонент я пишу для Лазаруса (переводим на него все проекты и прощаемся с Delphi), а в нем не работают оба метода. Досадно.
С формой как мне кажется было бы предпочтительнее, возможностей больше, но тогда придется смириться с дерганьем заголовков форм, которое побороть я пока не могу.
Кстати по главному вопросу этой темы-воспользовался костылем: глобальный хук на клик мышью. Работает как надо.
NaumOff вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение снятия фокуса с компонента Lokos Компоненты Delphi 2 15.09.2014 10:17
Как запустить процедуру при потере фокуса определённым листом? PAMAC Microsoft Office Excel 2 09.11.2012 11:23
Закрытие формы при потере фокуса werrey Общие вопросы Delphi 11 19.11.2011 14:08
Реакция из компонента на OnShow формы... GydruS Компоненты Delphi 2 28.07.2011 10:56
Проблемы при потере фокуса приложения Sibedir Общие вопросы Delphi 9 23.05.2011 21:27