|
Вопрос # 189/ вопрос открыт / |
|
Доброго всем времени суток!
В Дельфи программирую недавно, поэтому часто возникают вопросы. Например, такой: как создать всплывпющую подсказку. На "канве" карта. Нужно при перемещении мыши вблизи точки расположения населенного пункта (из базы данных) всплывала подсказка с названием города.
Заранее благодарю за конкретную помощь.
 |
Вопрос задал: Драганов Василий Михайлович (статус: Посетитель)
Вопрос отправлен: 8 декабря 2006, 22:42
Состояние вопроса: открыт, ответов: 3.
|
Ответ #1. Отвечает эксперт: Виталий Лещенко
Здравствуйте, Драганов!
Можно сделать так:
1. в базе хранишь координыта на карте + дополнительную информацию для показа.
2. в класс TImage грузишь нужную картинку.
3. замем делаешь обработчик события OnMouseMove
4. в нем делаешь выборку из базы по нужным координатам. (тебе будут переданы координыты мыши)
5. позиционируешь компонент TLabel, например, в нужное место... и все.
6. если при выборке не найдено ниодного населенного пункта, то просто скрываешь TLabel
 |
Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 8 декабря 2006, 23:31
Оценка за ответ: 4
|
Ответ #2. Отвечает эксперт: ANBsoft
Делал когда-то подобную вещь на базе MapObject.
Только это делал не на OnMouseMove, а по таймеру.
Приведу кусок своего кода, думаю можно понять:
Если переделать определение координат с MapObject на свое, и свой массив точек с метками, остальное должно работать.
Успехов.
Приложение: Переключить в обычный режим- procedure TFormMap.Timer1Timer(Sender: TObject);
- Const Interval=3;
- Var p,p1,p2:IMoPoint;
- f:Integer;
- d:Double;
- begin
-
- if (MapX=MapLX) and (MapY=MapLY) then begin
- // mouse didn't move
- Timer1.Enabled:=False;
- p:=IMoPoint(CreateOleObject('MapObjects2.Point'));
- p1:=Map1.ToMapPoint(MapX-Interval,MapY-Interval);
- p2:=Map1.ToMapPoint(MapX+Interval,MapY+Interval);
- if P2.X<P1.X then begin
- D:=P2.X;
- P2.X:=P1.X;
- P1.X:=D;
- end;
- if P2.Y<P1.Y then begin
- D:=P2.Y;
- P2.Y:=P1.Y;
- P1.Y:=D;
- end;
- for f:=0 to Map1.TrackingLayer.EventCount-1 do begin
- P.X:=Map1.TrackingLayer.Event[f].X;
- P.Y:=Map1.TrackingLayer.Event[f].Y;
- if (P.X>=P1.X) and (P.Y>=P1.Y) and (P.X<=P2.X) and (P.Y<=P2.Y)
then begin
- LabelInfo.Caption:=EventInfo[f];
- LabelInfo.Left:=MapX+10;
- LabelInfo.Top:=MapY;
- LabelInfo.Visible:=True;
- Break;
- end
- else
- LabelInfo.Visible:=False;
- end;
- end
- else begin
- MapLX:=MapX;
- MapLY:=MapY;
- end;
- 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 (статус: Студент), 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 (статус: 7-ой класс), 10 декабря 2006, 01:42 [#3]:
To Полушин Сергей Анатольевич
И размер файла увеличивается на размер битмэпов картинок которые хранятся не в сжатом виде а в реальном размере BMP взятые из DFM
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|