Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Привязка курсора мыши к контролам на форме [D7]


Nike ©   (2005-06-10 14:31:00) 

Здравствуйте! Ситуация такова: на форме есть TPanel, на к-й размещаются объекты TShape. Мне необходимо, чтобы при приближении мыши к углам ТShape-ов (скажем на расстояние до 5 пикселов) срабатывала привязка - курсор "становился на угол" соответствующего TShape-а (При этом курсор мыши необязательно будет находиться именно над этим Тшейпом - он может быть и над другим шейпом и над панелью)
Как это можно осуществить в Delphi 7 наиболее рациональным способом?


vl_chel   (2005-06-21 14:47:00) [1]

2 -=XP=- ©   (14.06.05 12:51) [6]

Желательно все примитивы унаследовать от одного класса и пп 1 и 2 в нем сделать абстрактными. Все примитивы нужно хранить в одном списке и перебирая список находить нужный.

2 Nike   (21.06.05 12:00) [8]
в автокаде курсор мыши не скачет, а только прорисовывается знак привязки


Юрий Зотов   (2005-06-21 13:14:00) [2]

> Nike   (21.06.05 12:03) [9]

> Что дает использование слова const?

Параметр будет передан не по значению, а по ссылке, как и в случае var - но с тем отличием, что менять его внутри процедуры все равно будет нельзя, не пропустит компилятор. Обычно используется для экономии места в стеке, когда надо передать параметр размером более 4 байт, но так, чтобы на выходе из процедуры он остался гарантированно неизменным.


Nike   (2005-06-21 12:03:00) [3]


> -=XP=- ©  

У меня родился к вам вопрос. Почему в функции IsPointonBorderаргумент aPointобъявлен как константа? Что дает использование слова const?


Nike   (2005-06-21 12:00:00) [4]


> Digitman ©

Я хочу сделать "привязку" похожей на используемую в Автокаде. Там она именно так и работает - подводишь мышь к объекту, он ее "притягивает" и загорается желтенький значок привязки над точкой. И по-моему для Автокада, как графического редактора, это удачное и удобное решение.


Nike   (2005-06-21 11:56:00) [5]


> -=XP=- ©  

Спасибо, буду пробовать.


-=XP=-   (2005-06-14 12:51:00) [6]

Создать базовый графический примитив, со свойствами и поведением:
1. procedure Draw; virtual; - для перерисовки примитива;
2. function IsPointOnBorder(const APoint: TPoint): boolean; - для определения, находится ли мышь над границей;
3. прочее, прочее, прочее...

Породить этот базовый класс можно от TObject. Так же долже быть реализован специальный класс - владелец, на котором, собственно, примитивы будут "жить" - отрисовываться, и который будет обеспечивать эти примитивы событиями от мыши (диспетчеризировать). Все остальные примитивы (окружности, прямоугольники, полигоны) порождаются от этого базового примитива.
При создании, экземпляр класса должен регистрироваться у владельца. Владелец, при получении события от мыши (например, OnMouseMove), пробегается по списку зарегистрировавшихся примитивов, и, обнаружив, что мышь находится над границей одного из них (IsPointOnBorder) - сообщает примитив об этом (как угодно, хоть сообщение передавать). Примитив отрабатывает это событие заранее прописанным способом.

То-есть, реально событие от мыши в любом случае обрабатывать будет владелец. А уж кому он его потом передаст - зависит от того, какой примитив откликнется.

В общем, как обычно.


Digitman   (2005-06-14 12:49:00) [7]

некрасивое дело ты задумал.

не заставлять курсор "скакать", это крайне неприятно для юзера.

при входе в "зону" просто зафиксируй этот факт установкой некоего внутреннего флага и измени изображение курсора на нужное


TUser   (2005-06-14 12:43:00) [8]

Обрабатывать OnMouseMove у панели. Если расстояние до шейпа меньше порога - помещать мышь на шейп (см. св-ва объекта Mouse).


Nike   (2005-06-14 12:38:00) [9]


> TUser ©   (10.06.05 14:58) [2]
> Обрабатывать OnMouseMove

Интересный совет. Поясните, пожалуйста.
У чего обрабатывать это событие? Ведь мышь может находиться как над Шейпом в нужной зоне (вблизи вершины), так и над панелью (рядом с вершиной).


TUser   (2005-06-10 14:58:00) [10]

Обрабатывать OnMouseMove


Nike   (2005-06-10 14:44:00) [11]

...Привязка должна происходить во время выполнения программы (run-time, а не design)


Наверх

Титульная страница Поиск, карта сайта Написать письмо