Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 189

/ вопрос открыт /

Доброго всем времени суток!
В Дельфи программирую недавно, поэтому часто возникают вопросы. Например, такой: как создать всплывпющую подсказку. На "канве" карта. Нужно при перемещении мыши вблизи точки расположения населенного пункта (из базы данных) всплывала подсказка с названием города.
Заранее благодарю за конкретную помощь.

Драганов Василий Михайлович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Драганов Василий Михайлович (статус: Посетитель)
Вопрос отправлен: 8 декабря 2006, 22:42
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Виталий Лещенко

Здравствуйте, Драганов!
Можно сделать так:
1. в базе хранишь координыта на карте + дополнительную информацию для показа.
2. в класс TImage грузишь нужную картинку.
3. замем делаешь обработчик события OnMouseMove
4. в нем делаешь выборку из базы по нужным координатам. (тебе будут переданы координыты мыши)
5. позиционируешь компонент TLabel, например, в нужное место... и все.
6. если при выборке не найдено ниодного населенного пункта, то просто скрываешь TLabel

Приложение:
  1.  
  2.  


Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 8 декабря 2006, 23:31
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: ANBsoft

Делал когда-то подобную вещь на базе MapObject.
Только это делал не на OnMouseMove, а по таймеру.
Приведу кусок своего кода, думаю можно понять:
Если переделать определение координат с MapObject на свое, и свой массив точек с метками, остальное должно работать.
Успехов.

Приложение:
  1. procedure TFormMap.Timer1Timer(Sender: TObject);
  2. Const Interval=3;
  3. Var p,p1,p2:IMoPoint;
  4. f:Integer;
  5. d:Double;
  6. begin
  7.  
  8. if (MapX=MapLX) and (MapY=MapLY) then begin
  9. // mouse didn't move
  10. Timer1.Enabled:=False;
  11. p:=IMoPoint(CreateOleObject('MapObjects2.Point'));
  12. p1:=Map1.ToMapPoint(MapX-Interval,MapY-Interval);
  13. p2:=Map1.ToMapPoint(MapX+Interval,MapY+Interval);
  14. if P2.X<P1.X then begin
  15. D:=P2.X;
  16. P2.X:=P1.X;
  17. P1.X:=D;
  18. end;
  19. if P2.Y<P1.Y then begin
  20. D:=P2.Y;
  21. P2.Y:=P1.Y;
  22. P1.Y:=D;
  23. end;
  24. for f:=0 to Map1.TrackingLayer.EventCount-1 do begin
  25. P.X:=Map1.TrackingLayer.Event[f].X;
  26. P.Y:=Map1.TrackingLayer.Event[f].Y;
  27. if (P.X>=P1.X) and (P.Y>=P1.Y) and (P.X<=P2.X) and (P.Y<=P2.Y) then begin
  28. LabelInfo.Caption:=EventInfo[f];
  29. LabelInfo.Left:=MapX+10;
  30. LabelInfo.Top:=MapY;
  31. LabelInfo.Visible:=True;
  32. Break;
  33. end
  34. else
  35. LabelInfo.Visible:=False;
  36. end;
  37. end
  38. else begin
  39. MapLX:=MapX;
  40. MapLY:=MapY;
  41. end;
  42. end;


Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 9 декабря 2006, 12:42
Оценка за ответ: 2

Ответ #3. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Драганов!

То что описал Виталий Лещенко достаточно приемлимый вариант, только в дополнение к написанномиу им
1. База данных хранит координаты границ населённого пункта к примеру определенного прямоугольником(Xmin, Ymin, Xmax, Ymax) иначе точку в один пиксель на экране ловить не очень удобно. Необходимо объявить переменную типа TRect для хранения координат объекта и str типа String для значения Caption TLabel
2. На OnMouseMove проверяется нахождение курсора в границах области объекта выбрав значения X и Y и проверив соответствие координат X, Y в пределах TRect.
X, Y не в TRect - запрос в БД на наличие объекта в БД если его нет то проверяем TLabel, если TLabel Visible=true, то Visible=false и Caption='' иначе ничего не делаем.
Если объект в баазе данных то если TLabel не видима то включаем её со значением из БД и присваиваем координаты объекта переменной TRect и значение заносим в str, если видима то если значение в БД <> str то изменяем Caption у TLabel в противном случае ничего не делаем.
Это необходимо для избежания мерцания TLabel и чрезмерных количеств выполнения запросов к БД. Вместо TLabel можно использовать Hnt: THintWindow

Подробно обращайся в ICQ 165711772

Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 9 декабря 2006, 16:09
Оценка за ответ: 3


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 10 декабря 2006, 01:42; участников в обсуждении: 3.
ANBsoft

ANBsoft (статус: Студент), 9 декабря 2006, 12:53 [#1]:

Забыл добавить к предыдущему примеру:
procedure TFormMap.Map1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
MapX:=x;
MapY:=y;
if Not Timer1.Enabled then begin //start the timer
MapLX:=x;
MapLY:=y;
Timer1.Enabled:=True;
end
else
LabelInfo.Visible:=False;
end;
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 9 декабря 2006, 19:29 [#2]:

Тупо накладываешь картинку этой точки на эту же точку, в свойстве Hint этой картинки пишешь название города. При удерживании указателя на этой картинке в течении нескольких секунд всплывёт подсказка с названием города.
}{отт@бь)ч.
Alex Van Glukhman

Alex Van Glukhman (статус: 7-ой класс), 10 декабря 2006, 01:42 [#3]:

To Полушин Сергей Анатольевич
И размер файла увеличивается на размер битмэпов картинок которые хранятся не в сжатом виде а в реальном размере BMP взятые из DFM

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.02 сек.