Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Привязка курсора мыши к контролам на форме   Найти похожие ветки 

 
Nike   (2005-06-10 14:31) [0]

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


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

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


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

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


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


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

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


 
TUser ©   (2005-06-14 12:43) [4]

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


 
Digitman ©   (2005-06-14 12:49) [5]

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

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

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


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

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

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

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

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


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


> -=XP=- ©  

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


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


> Digitman ©

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


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


> -=XP=- ©  

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


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

> Nike   (21.06.05 12:03) [9]

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

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


 
vl_chel ©   (2005-06-21 14:47) [11]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
1-1118819243
dmitry501
2005-06-15 11:07
2005.07.11
Произвольное изменение региональных настроек


3-1117650654
Megabyte
2005-06-01 22:30
2005.07.11
Тип DATE в Dialect1


3-1117001327
ANB
2005-05-25 10:08
2005.07.11
Как скопировать таблицу из схемы в схему (Oracle)


6-1112963163
Макс Т.
2005-04-08 16:26
2005.07.11
enter и twebbrowser


8-1110291092
Delta
2005-03-08 17:11
2005.07.11
увеличить без тормозов