From 70b015fd81387c5ab196a396ed1025f0a0cca524 Mon Sep 17 00:00:00 2001 From: Tristan Marlow Date: Mon, 7 Apr 2025 07:38:22 +0800 Subject: [PATCH] New WaitUntilInitialized procedure that can raise event OnViewerReadyWait to prompt user to continue waiting. ShowMap will not check FInitComplete has been set and call InitMap if not. This is because Loaded is not called when TEdgeGoogleMapViewer is created at runtime. Demo application for RunTime creation --- Demo/Runtime/GoogleMapsRuntimeTest.dpr | 17 + Demo/Runtime/GoogleMapsRuntimeTest.dproj | 926 +++++++++++++++++++++++ Demo/Runtime/GoogleMapsTest_Icon.ico | Bin 0 -> 12862 bytes Demo/Runtime/MainForm.dfm | 276 +++++++ Demo/Runtime/MainForm.pas | 330 ++++++++ Source/Vcl.GoogleMap.pas | 50 +- 6 files changed, 1593 insertions(+), 6 deletions(-) create mode 100644 Demo/Runtime/GoogleMapsRuntimeTest.dpr create mode 100644 Demo/Runtime/GoogleMapsRuntimeTest.dproj create mode 100644 Demo/Runtime/GoogleMapsTest_Icon.ico create mode 100644 Demo/Runtime/MainForm.dfm create mode 100644 Demo/Runtime/MainForm.pas diff --git a/Demo/Runtime/GoogleMapsRuntimeTest.dpr b/Demo/Runtime/GoogleMapsRuntimeTest.dpr new file mode 100644 index 0000000..e73d174 --- /dev/null +++ b/Demo/Runtime/GoogleMapsRuntimeTest.dpr @@ -0,0 +1,17 @@ +program GoogleMapsRuntimeTest; + +uses + Forms, + MIdasLib, + MainForm in 'MainForm.pas' {formMain}, + Vcl.GoogleMap in '..\..\Source\Vcl.GoogleMap.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.Title := 'Delphi with Edge Google Maps Viewer Component Demo'; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TformMain, formMain); + Application.Run; +end. diff --git a/Demo/Runtime/GoogleMapsRuntimeTest.dproj b/Demo/Runtime/GoogleMapsRuntimeTest.dproj new file mode 100644 index 0000000..455eb7e --- /dev/null +++ b/Demo/Runtime/GoogleMapsRuntimeTest.dproj @@ -0,0 +1,926 @@ + + + {89b008d3-2b9c-414e-8323-2a1b0e524f1c} + GoogleMapsRuntimeTest.dpr + Debug + DCC32 + GoogleMapsTest.exe + 20.1 + Debug + True + 3 + Application + VCL + Win32 + GoogleMapsTest + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + 1033 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + GoogleMapsRuntimeTest + CompanyName=Ethea S.r.l.;FileDescription=Edge GoogleMap Viewer Demo;FileVersion=1.0.0.0;InternalName=;LegalCopyright=CopyRight (c) 2021 - Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0;Comments= + GoogleMapsTest.exe + ..\Source;$(DCC_UnitSearchPath) + .\Bin\$(Platform) + true + .\Dcu\$(Platform) + + + $(BDS)\bin\default_app.manifest + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + GoogleMapsTest_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + PerMonitorV2 + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\default_app.manifest + GoogleMapsTest_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + PerMonitorV2 + CompanyName=Ethea S.r.l.;FileDescription=Edge GoogleMap Viewer Demo;FileVersion=1.0.0.0;InternalName=;LegalCopyright=CopyRight (c) 2021 - Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProgramID=;ProductName=;ProductVersion=1.0;Comments= + + + 7.0 + 0 + False + 0 + RELEASE;$(DCC_Define) + + + true + Debug + + + true + CompanyName=Ethea S.r.l.;FileDescription=Edge GoogleMap Viewer Demo;FileVersion=1.0.0.0;InternalName=;LegalCopyright=CopyRight (c) 2021 - Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProgramID=;ProductName=;ProductVersion=1.0;Comments= + + + true + 7.0 + DEBUG;$(DCC_Define) + + + Debug + + + true + CompanyName=Ethea S.r.l.;FileDescription=Edge GoogleMap Viewer Demo;FileVersion=1.0.0.0;InternalName=;LegalCopyright=CopyRight (c) 2021 - Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProgramID=;ProductName=;ProductVersion=1.0;Comments= + + + Delphi.Personality.12 + VCLApplication + + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 13322 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + GoogleMapsRuntimeTest.dpr + + + + + True + True + + + + + GoogleMapsRuntimeTest.exe + true + + + + + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + 12 + + + + MainSource + + +
formMain
+
+ + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + + + +
diff --git a/Demo/Runtime/GoogleMapsTest_Icon.ico b/Demo/Runtime/GoogleMapsTest_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..18f949f99ba791138370f669a981ed7cd0ba9f25 GIT binary patch literal 12862 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 0; + +end. diff --git a/Source/Vcl.GoogleMap.pas b/Source/Vcl.GoogleMap.pas index 691111c..0b2d75e 100644 --- a/Source/Vcl.GoogleMap.pas +++ b/Source/Vcl.GoogleMap.pas @@ -96,6 +96,7 @@ TLatLng = record TEdgeGoogleMapViewJavascript = procedure(ASender : TObject; var AJavascript : string) of object; TEdgeGoogleMapViewMapClick = procedure(ASender : TObject; ALatLng : TLatLng) of object; TEdgeGoogleMapViewZoomChanged = procedure(ASender : TObject; AZoom : integer) of object; + TEdgeGoogleMapViewerReadyWait =procedure(ASender : TObject; var AWait : boolean) of object; { TEdgeGoogleMapViewer } [ComponentPlatforms(pidWin32 or pidWin64)] @@ -105,6 +106,7 @@ TEdgeGoogleMapViewer = class(TCustomEdgeBrowser) class var FUserDataFolder: string; private FMapIsBusy: boolean; + FInitComplete : boolean; FViewerReady: boolean; FAddress: string; FOverviewMapControl: boolean; @@ -137,7 +139,7 @@ TEdgeGoogleMapViewer = class(TCustomEdgeBrowser) FOnMapClick: TEdgeGoogleMapViewMapClick; FOnMapRightClick: TEdgeGoogleMapViewMapClick; FOnMapZoom: TEdgeGoogleMapViewZoomChanged; - + FOnViewerReadyWait: TEdgeGoogleMapViewerReadyWait; //variables for result functions FDistance: Variant; @@ -185,6 +187,8 @@ TEdgeGoogleMapViewer = class(TCustomEdgeBrowser) procedure SetOnMapClick(const Value: TEdgeGoogleMapViewMapClick); procedure SetOnMapRightClick(const Value: TEdgeGoogleMapViewMapClick); procedure SetOnMapZoom(const Value: TEdgeGoogleMapViewZoomChanged); + procedure WaitUntilInitialized; + procedure SetOnViewerReadyWait(const Value: TEdgeGoogleMapViewerReadyWait); protected procedure Loaded; override; procedure ShowMap(AMapCenter: TLatLng; const AAddress: string = ''); overload; @@ -338,6 +342,7 @@ TEdgeGoogleMapViewer = class(TCustomEdgeBrowser) property OnMapClick : TEdgeGoogleMapViewMapClick read FOnMapClick write SetOnMapClick; property OnMapRightClick : TEdgeGoogleMapViewMapClick read FOnMapRightClick write SetOnMapRightClick; property OnMapZoom : TEdgeGoogleMapViewZoomChanged read FOnMapZoom write SetOnMapZoom; + property OnViewerReadyWait : TEdgeGoogleMapViewerReadyWait read FOnViewerReadyWait write SetOnViewerReadyWait; end; implementation @@ -492,6 +497,7 @@ constructor TEdgeGoogleMapViewer.Create(AOwner: TComponent); Self.UserDataFolder := FUserDataFolder; if WebViewCreated then DefaultScriptDialogsEnabled := False; + FInitComplete := false; FMapVisible := false; FPanControl := true; FZoomControl := true; @@ -871,7 +877,33 @@ function TEdgeGoogleMapViewer.GetHTMLScript : string; end; +procedure TEdgeGoogleMapViewer.WaitUntilInitialized; +var + LLoop: integer; + LWait : boolean; +begin + Sleep(1000); + LLoop := 0; + while (not FViewerReady) and (LLoop < 1000) do + begin + sleep(10); + Application.ProcessMessages; + Inc(LLoop); + end; + if not FViewerReady then + begin + LWait := False; + if Assigned(FOnViewerReadyWait) then + begin + FOnViewerReadyWait(Self,LWait) + end; + if LWait then + begin + WaitUntilInitialized; + end; + end; +end; procedure TEdgeGoogleMapViewer.ShowMap(AMapCenter: TLatLng; const AAddress: string = ''); var @@ -882,11 +914,10 @@ procedure TEdgeGoogleMapViewer.ShowMap(AMapCenter: TLatLng; const AAddress: stri if csDesigning in ComponentState then Exit; - while not FViewerReady do - begin - application.ProcessMessages; - Sleep(10); - end; + if not FInitComplete then + InitMap; + + WaitUntilInitialized; if Assigned(FBeforeShowMap) then FBeforeShowMap(Self); @@ -1064,6 +1095,7 @@ procedure TEdgeGoogleMapViewer.InitMap; Self.UserDataFolder := FUserDataFolder; Self.Navigate(ABOUT_BLANK_PAGE); + FInitComplete := True; end; procedure TEdgeGoogleMapViewer.Loaded; @@ -1226,6 +1258,12 @@ procedure TEdgeGoogleMapViewer.SetOnMapZoom( FOnMapZoom := Value; end; +procedure TEdgeGoogleMapViewer.SetOnViewerReadyWait( + const Value: TEdgeGoogleMapViewerReadyWait); +begin + FOnViewerReadyWait := Value; +end; + procedure TEdgeGoogleMapViewer.SetOnWebUnhandledMessageReceived( const Value: TWebMessageReceivedEvent); begin