我目前使用Inno Setup創建安裝程序,這需要Google地圖。對於我使用TLama的inno-web-browser的地圖。Inno設置Google地圖自定義頁面
所以我有一個自定義InputQueryPage顯示谷歌地圖。以及用戶點擊地圖時用於緯度和經度的2個輸入框,它顯示信息窗口中的座標。 是否有可能解析座標,以便上面的2個輸入框可以從地圖填充lat和long? 上面可以然後希望被寫入註冊表作爲一個浮動格式。 但那是另一個問題..
感謝任何答覆關於這個..
我目前使用Inno Setup創建安裝程序,這需要Google地圖。對於我使用TLama的inno-web-browser的地圖。Inno設置Google地圖自定義頁面
所以我有一個自定義InputQueryPage顯示谷歌地圖。以及用戶點擊地圖時用於緯度和經度的2個輸入框,它顯示信息窗口中的座標。 是否有可能解析座標,以便上面的2個輸入框可以從地圖填充lat和long? 上面可以然後希望被寫入註冊表作爲一個浮動格式。 但那是另一個問題..
感謝任何答覆關於這個..
你問什麼就需要特定的JavaScript互操作這是不容易實現。因此,我建議您在JavaScript中製作這些編輯框,以便與Google Maps API進行互操作,並在瀏覽器離開頁面後讀取這些值。我已經通過新的WebBrowserGetOleObject
函數向插件添加了對OleObject
的訪問。
下面是一個帶有2個輸入框(您將在腳本中從Google Maps API進行同步)的示例JavaScript。該腳本是由文件名固定稱爲下面的例子中(在真正的變化,爲了從安裝程序包中提取的臨時文件):
<!DOCTYPE html>
<html>
<body>
<input id="latinput" type="text">
<input id="loninput" type="text">
</body>
</html>
在創新安裝然後可以從這些輸入框這種方式讀取的值:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Files]
Source:"WebBrowser.dll"; Flags: dontcopy
[Code]
const
EVENT_BEFORE_NAVIGATE = 1;
EVENT_FRAME_COMPLETE = 2;
EVENT_DOCUMENT_COMPLETE = 3;
type
TWebBrowserEventProc = procedure(EventCode: Integer; URL: WideString);
procedure WebBrowserCreate(ParentWnd: HWND; Left, Top, Width, Height: Integer;
CallbackProc: TWebBrowserEventProc);
external '[email protected]:webbrowser.dll stdcall';
procedure WebBrowserDestroy;
external '[email protected]:webbrowser.dll stdcall';
procedure WebBrowserShow(Visible: Boolean);
external '[email protected]:webbrowser.dll stdcall';
procedure WebBrowserNavigate(URL: WideString);
external '[email protected]:webbrowser.dll stdcall';
function WebBrowserGetOleObject: Variant;
external '[email protected]:webbrowser.dll stdcall';
var
CustomPage: TWizardPage;
procedure InitializeWizard;
begin
CustomPage := CreateCustomPage(wpWelcome, 'Web Browser Page',
'This page contains web browser');
WebBrowserCreate(WizardForm.InnerPage.Handle, 0, WizardForm.Bevel1.Top,
WizardForm.InnerPage.ClientWidth, WizardForm.InnerPage.ClientHeight - WizardForm.Bevel1.Top, nil);
WebBrowserNavigate('C:\AboveScript.html');
end;
procedure DeinitializeSetup;
begin
WebBrowserDestroy;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
WebBrowserShow(CurPageID = CustomPage.ID);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
Latitude: Variant;
Longitude: Variant;
OleObject: Variant;
begin
Result := True;
if CurPageID = CustomPage.ID then
begin
OleObject := WebBrowserGetOleObject;
if not VarIsNull(OleObject) then
begin
Latitude := OleObject.Document.GetElementByID('latinput').value;
Longitude := OleObject.Document.GetElementByID('loninput').value;
MsgBox(Format('Lat: %s, Lon: %s', [Latitude, Longitude]), mbInformation, MB_OK);
end;
end;
end;
這將需要特定的JavaScript interop,這是不容易實現的。解析文檔並從該信息窗口讀取位置是一個選項,但它很笨拙,除非用戶單擊地圖時不會收到通知。那麼在JavaScript中創建這些編輯框並通過解析DOM來讀取它們的值呢?這會比從信息窗口讀取更好,因爲您知道他們的ID不會改變。 – TLama
TLama,首先我可以感謝你,因爲如果不是你在這個網站上的答案,我將永遠不會與各種Inno安裝程序有這麼多的距離...時間去學習一些JavaScript ..因爲我從來沒有使用JavaScript之前... – Atlas
我剛纔提交的版本公開了瀏覽器的'OleObject',通過它你可以訪問它的文檔(搜索一個使用'TWebBrowser.OleObject.Document.GetElementByID('ElementId')的Delphi示例...' ,這個版本中的'WebBrowserGetOleObject'函數可以獲得相同的'OleObject')。 – TLama