Перейти к содержанию
Fire Monkey от А до Я
  • 0

Работа с маркерами


Rusland

Вопрос

Создаю маркер так

procedure TFormMain.SetMarker(Lat,Lon:Double);
var
  Descrip: TMapMarkerDescriptor;
  MyLocation: TMapCoordinate;
  Angle:integer;
begin 
  TThread.Queue(nil, procedure
  begin
    try
      if (TabControl.ActiveTab=TabMap)and((PrevLat<>Lat) or (PrevLon<>Lon)) then
      begin        
        MyLocation:=TMapCoordinate.Create(Lat,Lon);
        MapView.Location:=MyLocation;
        Descrip:=TMapMarkerDescriptor.Create(MyLocation);
        Descrip.Icon := Image1.Bitmap;
        Descrip.Draggable:=True;   
        Descrip.Title:='Маркер '+#10+#13+Descrip.Position.ToString;
        if Assigned(MyMarker) then MyMarker.Remove;
        MyMarker:=MapView.AddMarker(Descrip); 
        PrevLat:=Lat;
        PrevLon:=Lon;
      end;
    except
      LabInfo.Text:='Произошла ошибка'; 
    end;
  end);
end;

Маркер я сделал Draggable, то есть его можно переносить сделав на нем долгий Tap.

Можно ли навесить какую-то свою функцию на изменение положения маркера? Я хочу при изменении положения маркера менять ему в Title его координаты.

И еще интересует как сделать Title в две строки?  #10+#13 почему-то не делает переноса.

Изменено пользователем Rusland
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Нашел решение второго вопроса: есть свойство Snippet куда можно вбивать текст :)

Осталось решить первый - как в Title загнать координаты? Менять заголовок либо при изменении положения маркера, либо во время нажатия на маркер. Не знаю как отследить ни то, ни это. Может кто подсказать? 

Ссылка на комментарий
  • 0

Во! Похоже то что мне нужно!

Это события самого TMapMarker? Почему я их не вижу?

Как например вызвать свою процедуру в OnMarkerClick? 

 

 

Дошло... это события MapView. Ушел разбираться дальше. krapotkin, спасибо.

 

Сразу родился еще один вопрос: если есть несколько маркеров на карте, то как их различать между собой? Есть ли у MapMarker какой-то скрытый параметр типа Tag (куда прописывать уникальный номер)?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Присоединяюсь к вопросу. 

 

Есть ли у MapMarker какой-то скрытый параметр типа Tag (куда прописывать уникальный номер)?

 

а то приходиться к тайтлу добавлять айдишник.

Ссылка на комментарий
  • 0

Пытаюсь изменить значение Title

 

procedure TFormMain.MapViewMarkerDragEnd(Marker: TMapMarker);
begin
  Marker.Descriptor.Title:=MapView.Position.ToString;
end;

Не компилируется, выдает E2064 Left side cannot be assigned to

Почему так?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

туповато канеш, мб Marker.Remove + MarkerAdd(...) ?

Да, можно конечно удалить и добавить новый, но как-то уж топорно. Неужели по другому никак?

 

 

 

ток MapView.Position не есть координаты маркера

 

Ошибся, надо было MapView.Location или Marker.Descriptor.Position

 

Хотя тоже не то. MapView.Location выдает центральную координаты карты  - в моем случае почти всегда совпадает с координатой Маркера. Но так как это не всегда, то значит надо использовать Marker.Descriptor.Position. Но он выдает только первичные координаты маркера и не фиксирует его перемещение (drag). Как быть?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Еще назрел такой вопрос: Если есть несколько маркеров на карте, то как отцентрировать карту так чтобы все маркеры были видны?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Еще назрел такой вопрос: Если есть несколько маркеров на карте, то как отцентрировать карту так чтобы все маркеры были видны?

если надо оцентровать карту, то 

MapView1.Location:= mapCenter;

а если маркеры не все влазят то зуммируй

MapView1.Zoom:=11.5;

че больше цифра, тем крупнее карта. поставь зум 3 и у тебя весь контитент влезет :)

Ссылка на комментарий
  • 0

При длительном нажатии на маркер хочу вызвать вторую форму, но приложение останавливается.

Для примера создал 3 формы и сделал нажатие кнопок. Запустил на телефоне, все нормально работает. переключается без проблем.

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0

Народ.... в чем может быть проблема?

 

procedure TForm3.MapView1MarkerDoubleClick(Marker: TMapMarker);
var
  tapDescr: TMapMarkerDescriptor;
begin
  try
    Form3.visible:=false;
    Form5.visible:=true;
  finally
    ShowMessage('ошибка');
  end;
end;
Так же пробовал делать 
MapView1.Visible:=false
чтобы просто скрыть компонент. вылазит ошибка.
до заключения кода в try finally приложение просто выдавало сообщение, что оно остановлено и сворачивалось окно.
Изменено пользователем Brovin Yaroslav
Ссылка на комментарий
  • 0
  • Модераторы

используйте правильные методы

Form3.Close;
Form5.Show;

что на этих формах содержится?

 

я бы на всякий случай весь код в событиях TMapView заключал бы в

TThread.Synhronize(nil, procedure
begin
// тут код который нужно выполнить
end);
Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

используйте правильные методы

Form3.Close;
Form5.Show;

что на этих формах содержится?

на форме 3 находится таб контрол. на первой вкладке Мап-Вивер и все. на второй вкладке едит, лэйбл, несколько кнопок.

если я буду использовать Form3.Close то все приложение закроется так как Form3 главная форма.

и еще... я так понял что у маркера есть событие по умолчанию: если на него нажимаешь то вылазит его описание.

но так же у Мап-Вивера есть событие MarkerClick. если я напишу обработчик этого события они же будут перекликаться? или они выполняются последовательно?

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0
  • Модераторы

на форме 3 находится таб контрол. на первой вкладке Мап-Вивер и все. на второй вкладке едит, лэйбл, несколько кнопок.

если я буду использовать Form3.Close то все приложение закроется так как Form3 главная форма.

Значит используйте Form5.Show; оно перекроет вашу форму

Ссылка на комментарий
  • 0

не помогло.... написал 

procedure TForm3.MapView1MarkerClick(Marker: TMapMarker);
begin
try
Form5.Show;
finally
ShowMessage('ошибка формы');
end;
end;
Приложение просто "вылетело" ни чего не написал
Alt+F11 Указал использовать Unit5
Видимо для MarkerClick первое событие идет это вывод его подписи и моя обработка вырубает приложение.
а для двойного клика по маркеру срабатывает событие масштабирование карты.
В общем задумка такая чтобы при нажатии на маркер открывалась форма и на ней была инфа о маркере. точнее о том описание того места на которое указывает маркер
Эксперемент №2 :)
при таком коде
try
ShowMessage('Привет');
finally
ShowMessage('ошибка формы');
end;
сначала выдается надпись маркера тут же появляется сообщение "ошибка формы"  нажимаю ОК и появляется сообщение 'Привет'
Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0
TThread.Synhronize(nil, procedure
begin
 Form5.Show;
end);

у меня не на столько большие познания. Просто вставил данный текст. Synhronize подчеркнуто красным. надо какой то модуль подключать?

Ссылка на комментарий
  • 0
  • Модераторы
uses System.Threading

правильно вот так пишется

TThread.Synchronize

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

а если маркеры не все влазят то зуммируй

MapView1.Zoom:=11.5;

че больше цифра, тем крупнее карта. поставь зум 3 и у тебя весь контитент влезет :)

Как зумом пользоваться - это и так понятно. Интереснее как поймать момент когда все маркеры становятся видны

Ссылка на комментарий
  • 0

Странное дело.... на работе работаю с кодом, тестю на телефоне прогу, Гугл-карты загружаются. на флеху все копирую. Дома запускаю...карта серым отображается и все. ни чего не видно на ней.

на работе Delphi XE8 Дома Delphi 10 Seattle

Может быть это связанно с тем что в этом проекте использую API key для отображения карты из другого своего проекта?

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0

Эксперемент №3 при выполнении кода 

try
TThread.Synchronize(nil, procedure
begin
 Form4.Show;
 end);
finally
ShowMessage('ошибка формы');
end;
и нажатии на маркер выдается ошибка
Access violation at address 62F1C8EA, accessing address 000000B1
и тут же выдается окно 'ошибка формы'
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...