I want a user in a Delphi VCL application to be able to create a Polygon in FNCGoogleMaps, modify it and then save it to a database so that it can be reloaded at a later date. I can create, modify and save it as a string of JSONArray using the AEventData.CustomData on the OnPolyElementEditEnd event. Is there any way of loading this JSONArray straight into a FNCMapsPolygon or FNCMapsCoordinateRecArray or do i have to parse it before loading it into a FNCMapsCoordinateRecArray?
Yes, it requires some additional class wrapping, but here is the code.
type
TCoordinateList = class(TObjectList<TTMSFNCMapsCoordinateItem>, ITMSFNCBaseListIO, ITMSFNCBasePersistenceIO)
private
FOwnerInterface: IInterface;
protected
function GetItemClass: TClass;
function CreateObject(const AClassName: string; const ABaseClass: TClass): TObject;
{ IInterface }
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
end;
procedure TForm1.TMSFNCGoogleMaps1PolyElementEditEnd(Sender: TObject;
AEventData: TTMSFNCMapsEventData);
var
p: TTMSFNCGoogleMapsPolyline;
a: TCoordinateList;
I: Integer;
begin
if Assigned(AEventData.PolyElement) then
begin
if (AEventData.PolyElement is TTMSFNCGoogleMapsPolyline) then
begin
p := (AEventData.PolyElement as TTMSFNCGoogleMapsPolyline);
a := TCoordinateList.Create;
a.JSON := AEventData.CustomData;
TMSFNCGoogleMaps1.BeginUpdate;
try
p.Recreate := True;
p.Coordinates.Clear;
for I := 0 to a.Count - 1 do
p.Coordinates.Add.Assign(a[I]);
TTMSFNCUtils.Log(p.Coordinates.JSON);
finally
a.Free;
end;
TMSFNCGoogleMaps1.EndUpdate;
end;
end;
end;
{ TCoordinateList }
function TCoordinateList.CreateObject(const AClassName: string;
const ABaseClass: TClass): TObject;
begin
Result := TTMSFNCMapsCoordinateItem.Create(nil);
end;
function TCoordinateList.GetItemClass: TClass;
begin
Result := TTMSFNCMapsCoordinateItem;
end;
function TCoordinateList._AddRef: Integer;
begin
if FOwnerInterface <> nil then
Result := FOwnerInterface._AddRef else
Result := -1;
end;
function TCoordinateList._Release: Integer;
begin
if FOwnerInterface <> nil then
Result := FOwnerInterface._Release else
Result := -1;
end;
function TCoordinateList.QueryInterface(const IID: TGUID;
out Obj): HResult;
const
E_NOINTERFACE = HResult($80004002);
begin
if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;
end;
Thank you for that but I think there is something wrong. I do not believe that TCoordinateList has a JSON property as a.JSON is an error. As i could not get this to work i was not able to progress with testing but what i had hoped for was something like:
procedure TFormBoundary.TMSFNCGoogleMaps1PolyElementEditEnd(Sender: TObject;
AEventData: TTMSFNCMapsEventData);
var p: TTMSFNCGoogleMapsPolyline;
a: TCoordinateList;
I: Integer;
begin
if Assigned(AEventData.PolyElement) then
begin
try
tblData.edit;
tblData['PolygonBoundary'] := AEventData.CustomData;
tblData.Post;
finally
end;
end;
end;
procedure TFormBoundary.LoadBoundary;
var aData : String;
ca : TTMSFNCMapsCoordinateRecArray;
pg: TTMSFNCGoogleMapsPolygon;
begin
if tblData['PolygonBoundary'] <> null then
begin
aData := tblData['PolygonBoundary'];
ca.LoadJSON(aData); // To be replaced with routine
TMSFNCGoogleMaps1.BeginUpdate;
pg := TTMSFNCGoogleMapsPolygon(TMSFNCGoogleMaps1.AddPolygon(ca));
pg.Editable := true;
pg.StrokeColor := clRed;
pg.StrokeWidth := 2;
TMSFNCGoogleMaps1.EndUpdate;
end;