![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| AnTeml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
Здравствуйте!
Наверное, задам глупейший вопрос, хотел даже в раздел для новичков написать, но это всё же ближе к винапи Есть форма, на ней контролы конкретно - TImage. Создаю их димамически, но не суть. для формы задана реакция на OnMouseMove, MouseDown/Up ну и ещё на кучу событий и что получается, когда мышь находится над дочерним контролом - есс-но, событие OnMouseMove формы не возникает, а отрабатывает одноимённое событие контрола а мне нужно обработать событие в обработчике формы! Пока сделал следующим образом, для всех контролов назначаю события, делегирующие отработку в событие формы, типа того:
но как-то некрасиво это. Может, я чего-то упустил, быть может, можно отключить перехват событий дочерними контролами? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
сделай форме обработчик WM_MOUSEMOVE
-------------------- Обижено школьников: 8 |
|||
|
||||
| AnTeml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
дак это... та же байда, даже попробовал - как только заезжаешь на родительский контрол, так всё... мессажи идут ему, т.е. в пустоту..
видимо, тут вопрос не столько делфи, сколько винапи, причём, насколько понимаю, вопрос по базовым понятиям диспетчирования событий венды Это сообщение отредактировал(а) AnTeml - 3.10.2012, 03:48 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
тут две вещи:
1) если мышь над дочерним контролом - наследником TGraphicControl (как например TImage про который ты говорил) то форма получает виндовое сообщение, но генерирует из него событие для дочернего контрола. Тут применим мой первый совет 2) если мышь над дочерним контролом - наследником TWinControl (как все контролы, которые могут быть родительскими для других) то винда шлет сообщение сразу в окно этого контрола. И тут пожалуй можно использовать хуки Добавлено через 11 минут и 29 секунд Щас проверил, обработчик сообщения должен быть именно в перекрытой процедуре WndProc а message-метод вызывается слишком поздно. наверное поэтому и была "та же байда" -------------------- Обижено школьников: 8 |
|||
|
||||
| AnTeml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
Спасибо! немного понятнее стало. Нет, хуками я пользоваться не буду. Напишу процедурку, переберу все контролы на форме и перебью им OnMouseMove и пр так, чтобы в вызов отправляли обратно в соответствующие обработчики формы
походу дела, это оказывается самым красивым решением Это сообщение отредактировал(а) AnTeml - 3.10.2012, 12:38 |
|||
|
||||
| AnTeml |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
Нет, это просто кошмар какой-то!
Сначала начиналось всё хорошо.... Меня интересуют только события мыши, точнее три этих события, которые покрываю, по-моему, все "мышиные" задачи:
По какой-то неведомой мне причине, все события у TControl-ов засунуты в protected секцию! предположу, что это потому, что наборы событий у различных наследником разный. Потому просто так пробежаться по Components, устанавливая им соответствующие события, не получилось, - приходится вручную перебирать все возможные типы :(
всё работает на ура, но это же полный трындец! вот и закончилась идея о "красоте"... на досуге почитаю о хуках... |
||||
|
|||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
с RTTI было бы красивее. Там можно установить свойство по имени
-------------------- Обижено школьников: 8 |
|||
|
||||
| Gwire |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: 1 Всего: 4 |
Для установки атрибутов можно использовать такой способ
Так-как SizeOf(TMouseEvent)=8 (64bit) может SetInt64Prop подойдет. Как-то типа
PS: B да результаты в студию. Интересно же, прокатит SetInt64Prop или нет. Это сообщение отредактировал(а) Gwire - 4.10.2012, 12:18 |
||||||||
|
|||||||||
| Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: 1 Всего: 4 |
И вот еще. Если у тебя есть TImage который ты используешь просто для красоты у него можно Enabled := True, тогда все события "останутся на форме".
|
|||
|
||||
| AnTeml |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
Прошу прощения! Завалило работой. Вот, кое как разгрёбся, возвращаюсь к моему прожекту.
Спасибо за ответы! , но.. папунктам
так что до установки атрибутов не дошёл :(
Да, у меня TImage для виду, просто чтобы было куда картинку загрузить. А какие могут быть подводные камни, если я его заенаблю в офф? Вообще, цель такая. Пишу игру для ребёнка, все объекты на экране - разные карточки-картинки, которые, собс-но, по сценарию можно таскать с одного места в другое, некоторые не таскаются, а играют роль кнопок. в общем, обрабатывается всего три события мыши. Карточек много. Решил по максимуму отвязаться от VCL, сам организую менеджер картинок, определяю, над кем мышь. Однако, чтобы не париться с перерисовкой картинки, для каждой карточки решил использовать свой TImage. Креатю их списком для каждой "комнаты" или как это назвать, собрался двигать, затем уничтожить. Может, по ходу дела появятся какие-нибудь более остроумные идеи реализации? Очень бы помогло! |
||||
|
|||||
| Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: 1 Всего: 4 |
Если тягать картинки нужно так тебе вообще достаточно только событие мышей на TImage-ах обрабатывать.
Размещаешь их в рабочей области (на TPanel) и ловишь на них эти 3 события.
MousePress, MousePressPos можно объявить в классе формы //----------------------------------------------------- А если нужно перемещать только по горизонтали или вертикали комментируй в Image1MouseMove все для Left или Top Это сообщение отредактировал(а) Gwire - 26.10.2012, 17:45 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |