2015-07-11 51 views
1

我目前使用Inno Setup創建安裝程序,這需要Google地圖。對於我使用TLama的inno-web-browser的地圖。Inno設置Google地圖自定義頁面

所以我有一個自定義InputQueryPage顯示谷歌地圖。以及用戶點擊地圖時用於緯度和經度的2個輸入框,它顯示信息窗口中的座標。 是否有可能解析座標,以便上面的2個輸入框可以從地圖填充lat和long? 上面可以然後希望被寫入註冊表作爲一個浮動格式。 但那是另一個問題..

感謝任何答覆關於這個..

+0

這將需要特定的JavaScript interop,這是不容易實現的。解析文檔並從該信息窗口讀取位置是一個選項,但它很笨拙,除非用戶單擊地圖時不會收到通知。那麼在JavaScript中創建這些編輯框並通過解析DOM來讀取它們的值呢?這會比從信息窗口讀取更好,因爲您知道他們的ID不會改變。 – TLama

+0

TLama,首先我可以感謝你,因爲如果不是你在這個網站上的答案,我將永遠不會與各種Inno安裝程序有這麼多的距離...時間去學習一些JavaScript ..因爲我從來沒有使用JavaScript之前... – Atlas

+0

我剛纔提交的版本公開了瀏覽器的'OleObject',通過它你可以訪問它的文檔(搜索一個使用'TWebBrowser.OleObject.Document.GetElementByID('ElementId')的Delphi示例...' ,這個版本中的'WebBrowserGetOleObject'函數可以獲得相同的'OleObject')。 – TLama

回答

1

你問什麼就需要特定的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; 
+0

完美的TLama,非常感謝你花費你的時間幫助我.. – Atlas

+0

不客氣! – TLama