Перейти к содержанию

Вопросы

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

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
uses System.Threading

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

TThread.Synchronize

 

подключил System.Threading в uses. все равно Synchronize подчеркнуто и ошибка E2003 Undecleared identifier: 'Synchronize'

Поделиться сообщением


Ссылка на сообщение
  • 0

AndroidHalfNoob, просто русскую "c" написал вместо английской

  TThread.Synchronize(nil, procedure
  begin
   Form5.Show;
  end);
Отредактировал Rusland

Поделиться сообщением


Ссылка на сообщение
  • 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 пользователей онлайн

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

×
×
  • Создать...