Перейти к содержанию
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

Эксперемент №4 :) выяснил что в памяти хранится дискриптор последнего добавленного маркера так, как при добавлении маркеров нажатием на карте параллельно в мемо пишется подпись маркера. так вот. при нажатии в мемо маркер 1 маркер 2 маркер 3. далее при нажатии на маркер 2 в мемо все равно пишется маркер 3

Ссылка на комментарий
  • 0
unit Unit3;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Maps,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListBox, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf,
  FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys,
  FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs,
  FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt,
  System.Rtti, Data.Bind.EngExt, Fmx.Bind.DBEngExt, Fmx.Bind.Grid,
  System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.Components,
  Data.Bind.Grid, Data.Bind.DBScope, FMX.Layouts, FMX.Grid, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client,System.IOUtils, FireDAC.FMXUI.Wait,System.JSON, FireDAC.Comp.UI,
  FireDAC.Stan.StorageJSON, FMX.TabControl, FMX.ScrollBox, FMX.Memo, System.sensors,FMX.Edit,
  System.Sensors.Components, FMX.Objects, System.Actions, FMX.ActnList,
  FMX.StdActns, FMX.MediaLibrary.Actions,System.Threading, Unit5;
 
type
  TForm3 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    ComboBox1: TComboBox;
    Button1: TButton;
    FDConnection1: TFDConnection;
    FDGUIxWaitCursor1: TFDGUIxWaitCursor;
    FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;
    FDTable1: TFDTable;
    TabControl1: TTabControl;
    TabItem2: TTabItem;
    TabItem3: TTabItem;
    MapView1: TMapView;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Memo1: TMemo;
    Label2: TLabel;
    LocationSensor1: TLocationSensor;
    Button2: TButton;
    SpeedButton1: TSpeedButton;
    ActionList1: TActionList;
    TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
    Panel6: TPanel;
    Image1: TImage;
    Button3: TButton;
    procedure FormActivate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure LocationSensor1LocationChanged(Sender: TObject; const OldLocation,
      NewLocation: TLocationCoord2D);
    procedure Button2Click(Sender: TObject);
    procedure TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
    procedure MapView1MarkerClick(Marker: TMapMarker);
    procedure MapView1MapLongClick(const Position: TMapCoordinate);
    procedure MapView1MapClick(const Position: TMapCoordinate);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  //  List:TObjectList<TMapMarker>;
  public
    { Public declarations }
  end;
 
var
  Form3: TForm3;
  s:byte;
  tapDescr: TMapMarkerDescriptor;
tapMarker:TMapMarker;
implementation
 
{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID}
 
uses  Unit4;
//{$R *.NmXhdpiPh.fmx ANDROID}
//{$R *.LgXhdpiTb.fmx ANDROID}
//{$R *.XLgXhdpiTb.fmx ANDROID}
 
 
 
procedure TForm3.Button1Click(Sender: TObject);
 
begin
Close;
end;
 
procedure TForm3.Button2Click(Sender: TObject);
begin
LocationSensor1.Active:=true;
end;
 
 
procedure TForm3.FormActivate(Sender: TObject);
begin
s:=0;
s:=s+1;
  mapCenter := TMapCoordinate.Create(56.5031777,85.0110343);
  MapView1.Location := mapCenter;
  MapView1.Zoom:=11.5;
 
TabControl1.ActiveTab:=TabItem2;
 
 
end;
 
procedure TForm3.LocationSensor1LocationChanged(Sender: TObject;
  const OldLocation, NewLocation: TLocationCoord2D);
  var
  Latitude,Longitude:Double;
begin
 Latitude:= NewLocation.Latitude;
Longitude:= NewLocation.Longitude;
end;
 
procedure TForm3.MapView1MapClick(const Position: TMapCoordinate);
begin
  s:=s+1;
 
tapDescr := TMapMarkerDescriptor.Create(Position, 'Маркер'+inttostr(s));
 tapDescr.Snippet:='ertert' ;
MapView1.AddMarker(tapDescr);
tapDescr.Visible :=True;
end;
 
procedure TForm3.MapView1MarkerClick(Marker: TMapMarker);
begin
try
 
TThread.Synchronize(nil, procedure
begin
Memo1.Lines.Add(tapDescr.Snippet);
FreeAndNil(tapMarker);
MapView1.Enabled:=false;
Form4.Show;
 end);
 
finally
ShowMessage('ошибка формы');
 
end;
end;
 
procedure TForm3.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
  Image1.Bitmap.Assign(Image);
end;
 
end.
 
Главная проблема в процедуре TForm3.MapView1MarkerClick
по замыслу при нажатии на маркер должна открываться другая  форма и там уже на основе подписи маркера ищется информация в базе данных.
Сейчас процедура нажатия на маркер выдает только его подпись и все... ни чего не происходит.
Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0
  • Модераторы

кто будет создавать маркер?

tapMarker := MapView1.AddMarker(tapDescr);

что это за бред?

Memo1.Lines.Add(tapDescr.Snippet);
FreeAndNil(tapMarker);

освобождение будет выглядеть вот так

if assigned(tapMarker) then
   tapMarker.Remove;

а информация с нажатого маркера

Memo1.Lines.Add(Marker.Descriptor.Snippet);

И еще форматируйте код (в IDE нажать CTRL+D) И на на форуме не забывайте нажимать <>

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

что это за бред?

Memo1.Lines.Add(tapDescr.Snippet);
FreeAndNil(tapMarker);

ну да.... запарился уже. с утра разные варианты перебираю.

и еще... не могу понять в чем отличия между маркером и дискриптором? когда выполняется процедура 

tapDescr := TMapMarkerDescriptor.Create(Position, 'Событие'+inttostr(s));
 tapDescr.Snippet:='ertert'+#13+'123' ;
MapView1.AddMarker(tapDescr);
tapDescr.Visible :=True;

то маркер на карте тоже добавляется. хотя тут работа с дискрипторами идет.

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0
tapDescr := TMapMarkerDescriptor.Create(Position, 'Событие'+inttostr(s));
 tapDescr.Snippet:='ertert'+#13+'123' ;
MapView1.AddMarker(tapDescr);
tapDescr.Visible :=True;

то маркер на карте тоже добавляется. хотя тут работа с дискрипторами идет.

 

Конечно же маркер добавиться на карту, вы же вызываете MapView1.AddMarker

 

descriptor — с лат. описывающий

 

он описывает характеристики маркера,

а сам маркер можно получить как вам написал ZuBy

tapMarker := MapView1.AddMarker(tapDescr);

и дальше уже с ним работать

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

Хорошо. вроде разобрался... при нажатии на карту рисуется маркер и в Мемо добавляется запись. Но главная проблема то так и осталась...

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

Получается процедура

 

procedure TForm3.MapView1MarkerClick(Marker: TMapMarker);
begin
   try
   TThread.Synchronize(nil, procedure
        begin
        Memo1.Lines.Add(tapMarker.Descriptor.Title) ;
        if assigned(tapMarker) then
        tapMarker.Remove;
        MapView1.Enabled:=false;
        Form4.Show;
        end);
finally
ShowMessage('ошибка формы');
end;
end;

не работает

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

api_key вписать свой

 

смотрим внимательно

attachicon.gifdemo_sec_form.zip

А есть какая то разница какой api_key вписывать? точнее если я в одном проекте использовал один ключ а потом начал другой делать и такой же api_key использовал.

Просто в чем проблема.... пишу прогу на ХЕ8. скидываю все исходники и на 10 Seattle компилирую. приложение запускается но карта серым фоном и не отображается.

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

приложение запускается но карта серым фоном и не отображается

при запуске приложения не из под студии а с устройства, сервис google maps не просит обновления?

было у меня как то ... исправилось обновлением сервиса

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

api_key вписать свой

 

смотрим внимательно

attachicon.gifdemo_sec_form.zip

Вписал. создал новый проект и к нему подключил формы. Приложение запускается и тут же вываливается с сообщением. Приложение остановлено.

А если открываю твой проект то при F9 выдается сообщение 

post-1544-0-83881900-1448031781_thumb.jp

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

Короче фигня какая то с этим FMX. Создаю новый проект. добавляю Мап-вивер. Задаю в свойствах проекта 

 

В итоге запускается приложение и просто черный экран.

post-1544-0-16812700-1448036290_thumb.jp

post-1544-0-84643100-1448036293_thumb.jp

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

1) Удали этот файлик и компилируй

2) В опциях проекта в Entitlement List забыл включать карты

Удалил. запустилось, но Мап-Вивер серого цвета. и карта не отображается.

По Мап-Виверу клацаю, и в Мемо добавляется инфа, но карты не видно.

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

Телефон самсунг 4 S mini

все сервисы вроде обновлены.

Google карты версии 9.17.1

прошивка родная

Такая же фигня на другом телефоне Zopo ZP980

запускается и Мап-Вивер серый фон

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

Карты тут не причём, тут работа идёт через G сервис

Вот это приложениеpost-59-0-78710300-1448038598_thumb.png

Поверь апикей, значит что-то с ним

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

Карты тут не причём, тут работа идёт через G сервис

Вот это приложениеattachicon.giftmp_17899-Screenshot_20151120-225518~01-1370332022.png

Поверь апикей, значит что-то с ним

8.3.01. (2385995-034)

и нет кнопки "Обновить". Активна только "Отключить"

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

Скорее всего лажа какая то с апикей. так как скачал твой MapsEngine и карта нормаль отображается.

Но что там может приключиться с апикей я искренне хз так как скидывал срины и там вроде все просто. в 3 местах указываешь данные и еще в проекте подключаешь поддержку работы с сетью.

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

Не знаю, что произошло, но заработало. ошибок не выдается. вторая форма появляется. Сделал при нажатии на кнопку. Хотя раньше не зависимо на каком элементе делаешь вызов второй формы, приложение вываливалось с ошибкой о приостановке.

По нажатию на маркер так же проблема осталась. появляется подпись маркера но форма не появляется.

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

Кстати.... у тебя идет нажатие на саму карту. потом ты добавляешь маркер, потом нажимаешь на маркер и выдается его подпись, но для повторного открытия формы ты опять нажимаешь на карту, а мне надо чтобы на маркер нажимаешь и открывалась вторая форма. сейчас в принципе так и работает, но я выяснил что в памяти всегда хранится дискриптор последнего добавленного маркера на карту.

добавлял Маркер1, Маркер2, Маркер3. по очереди из Подпись выводил в Мемо и если нажимаешь на второй маркер то в Мемо добавляется Маркер3.

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

Кстати.... у тебя идет нажатие на саму карту. потом ты добавляешь маркер, потом нажимаешь на маркер и выдается его подпись, но для повторного открытия формы ты опять нажимаешь на карту, а мне надо чтобы на маркер нажимаешь и открывалась вторая форма. сейчас в принципе так и работает, но я выяснил что в памяти всегда хранится дискриптор последнего добавленного маркера на карту.

добавлял Маркер1, Маркер2, Маркер3. по очереди из Подпись выводил в Мемо и если нажимаешь на второй маркер то в Мемо добавляется Маркер3.

смотрим в книгу, видим фигу. я уже скинул проект до видео. там было так как тебе нужно, нажатие на маркер.

 

 

 

но я выяснил что в памяти всегда хранится дискриптор последнего добавленного маркера на карту.

да, если ты работаешь не с маркером, а с описанием маркера. это ведь очевидно, что вбил в него последнее, то и прочитал

а если читать с маркера, то будешь получать правильные данные

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

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

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

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

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

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

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

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

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

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

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