| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как отключить "перехват" событий контролами? |
| Автор: AnTeml 2.10.2012, 14:04 | ||
| Здравствуйте! Наверное, задам глупейший вопрос, хотел даже в раздел для новичков написать, но это всё же ближе к винапи Есть форма, на ней контролы конкретно - TImage. Создаю их димамически, но не суть. для формы задана реакция на OnMouseMove, MouseDown/Up ну и ещё на кучу событий и что получается, когда мышь находится над дочерним контролом - есс-но, событие OnMouseMove формы не возникает, а отрабатывает одноимённое событие контрола а мне нужно обработать событие в обработчике формы! Пока сделал следующим образом, для всех контролов назначаю события, делегирующие отработку в событие формы, типа того:
но как-то некрасиво это. Может, я чего-то упустил, быть может, можно отключить перехват событий дочерними контролами? |
| Автор: bems 2.10.2012, 21:11 |
| сделай форме обработчик WM_MOUSEMOVE |
| Автор: AnTeml 3.10.2012, 03:48 |
| дак это... та же байда, даже попробовал - как только заезжаешь на родительский контрол, так всё... мессажи идут ему, т.е. в пустоту.. видимо, тут вопрос не столько делфи, сколько винапи, причём, насколько понимаю, вопрос по базовым понятиям диспетчирования событий венды |
| Автор: bems 3.10.2012, 03:54 |
| тут две вещи: 1) если мышь над дочерним контролом - наследником TGraphicControl (как например TImage про который ты говорил) то форма получает виндовое сообщение, но генерирует из него событие для дочернего контрола. Тут применим мой первый совет 2) если мышь над дочерним контролом - наследником TWinControl (как все контролы, которые могут быть родительскими для других) то винда шлет сообщение сразу в окно этого контрола. И тут пожалуй можно использовать хуки Добавлено через 11 минут и 29 секунд Щас проверил, обработчик сообщения должен быть именно в перекрытой процедуре WndProc а message-метод вызывается слишком поздно. наверное поэтому и была "та же байда" |
| Автор: AnTeml 3.10.2012, 12:36 |
| Спасибо! немного понятнее стало. Нет, хуками я пользоваться не буду. Напишу процедурку, переберу все контролы на форме и перебью им OnMouseMove и пр так, чтобы в вызов отправляли обратно в соответствующие обработчики формы походу дела, это оказывается самым красивым решением |
| Автор: AnTeml 3.10.2012, 13:34 | ||||
| Нет, это просто кошмар какой-то! Сначала начиналось всё хорошо.... Меня интересуют только события мыши, точнее три этих события, которые покрываю, по-моему, все "мышиные" задачи:
По какой-то неведомой мне причине, все события у TControl-ов засунуты в protected секцию! предположу, что это потому, что наборы событий у различных наследником разный. Потому просто так пробежаться по Components, устанавливая им соответствующие события, не получилось, - приходится вручную перебирать все возможные типы :(
всё работает на ура, но это же полный трындец! вот и закончилась идея о "красоте"... на досуге почитаю о хуках... |
| Автор: bems 3.10.2012, 18:03 |
| с RTTI было бы красивее. Там можно установить свойство по имени |
| Автор: Gwire 4.10.2012, 12:02 | ||||||||
Для установки атрибутов можно использовать такой способ
Так-как SizeOf(TMouseEvent)=8 (64bit) может SetInt64Prop подойдет. Как-то типа
PS: B да результаты в студию. Интересно же, прокатит SetInt64Prop или нет. |
| Автор: Gwire 4.10.2012, 12:28 |
| И вот еще. Если у тебя есть TImage который ты используешь просто для красоты у него можно Enabled := True, тогда все события "останутся на форме". |
| Автор: AnTeml 13.10.2012, 13:12 | ||||
| Прошу прощения! Завалило работой. Вот, кое как разгрёбся, возвращаюсь к моему прожекту. Спасибо за ответы! , но.. папунктам
так что до установки атрибутов не дошёл :(
Да, у меня TImage для виду, просто чтобы было куда картинку загрузить. А какие могут быть подводные камни, если я его заенаблю в офф? Вообще, цель такая. Пишу игру для ребёнка, все объекты на экране - разные карточки-картинки, которые, собс-но, по сценарию можно таскать с одного места в другое, некоторые не таскаются, а играют роль кнопок. в общем, обрабатывается всего три события мыши. Карточек много. Решил по максимуму отвязаться от VCL, сам организую менеджер картинок, определяю, над кем мышь. Однако, чтобы не париться с перерисовкой картинки, для каждой карточки решил использовать свой TImage. Креатю их списком для каждой "комнаты" или как это назвать, собрался двигать, затем уничтожить. Может, по ходу дела появятся какие-нибудь более остроумные идеи реализации? Очень бы помогло! |
| Автор: Gwire 26.10.2012, 17:36 | ||
| Если тягать картинки нужно так тебе вообще достаточно только событие мышей на TImage-ах обрабатывать. Размещаешь их в рабочей области (на TPanel) и ловишь на них эти 3 события.
MousePress, MousePressPos можно объявить в классе формы //----------------------------------------------------- А если нужно перемещать только по горизонтали или вертикали комментируй в Image1MouseMove все для Left или Top |