2014-05-01 12 views
5

Ich muss eine Anwendung auf Delphi XE6 für Android und iOS erstellen. Diese Anwendung soll einen TWebBrowser verwenden, um Google Maps anzuzeigen, dann muss ich "send" von Delphi zu Javascript und "empfange" Befehl von Javascript zu Delphi. Auf diese Weise kann ich einen Markt auf der Karte anzeigen und dann wissen, wann der Benutzer auf den Marker klickt. Ich habe diese article im Web gefunden, um Javascript per Delphi-Code auszuführen.Callback Delphi-Funktion von TWebBrowser von Javascript auf Delphi XE6 für alle Plattformen (einschließlich iOS, ANDROID)?

Aber ich habe keine Ahnung, wie kann man eine Delphi-Prozedur von Javascript aufrufen. Zum Beispiel habe ich dieses Verfahren auf Delphi:

procedure JSFeekback(aParm1, aParm2, aParm3, aParm4: string); 

und ich möchte Javascript-Code auf TWebBrowser verwenden Sie es 4 Parameter, um eine Pass zu rufen. Ich habe ähnliche Fragen gefunden, aber nur für Windows-Anwendung und die Antworten funktionieren nicht auf Android (Ich habe nicht auf iOS versucht).

+0

prüfen diese [link] (http://delphidabbler.com/articles?article=22), wenn Sie noch nicht haben. Obwohl es mit COM (ergo Windows) gemacht wird, könnte es Ihnen eine Idee geben. Andererseits habe ich diesen Link auch in [Google-Gruppen] gefunden (https://groups.google.com/forum/#!topic/delphichromiumvermedde/uDxAUTvXqzc), wo sie stattdessen darüber sprechen, wie man es mit TChromium macht von 'TWebBrowser'. Vielleicht ein Blick wert (wenn "TChromium" für iOS/Android verwendet werden kann?) –

Antwort

0

Mit JavaScript ist es sehr üblich auf HTTP-Server zuzugreifen, zum Beispiel über jQuery. Wenn Sie Ihren Delphi-Code entweder als lokalen Server oder im Web über HTTP bereitstellen können, kann Ihr JavaScript-Code Delphi-Code durch Senden einer HTTP-Anforderung aufrufen und Daten von Delphi-Funktionen als HTTP-Antwort empfangen.

Eine weitere Option sind WebSockets. Sie sind eine Erweiterung von HTTP und arbeiten asynchron, sodass der Delphi-Server Daten an das Skript senden kann - ohne erst auf eine Anfrage warten zu müssen (bekannt als Server Push/Comet).

Dies wäre eine auf Standards basierende, weit verbreitete Lösung, die nicht auf einem bestimmten Webclient beruht. Die kostenlose Open-Source-Bibliothek Internet Direct (Indy) kann auf allen unterstützten Plattformen verwendet werden, um HTTP-Server zu erstellen, die eigenständig oder in Ihre Anwendung integriert sind.

Weitere Protokolle, die für die Kommunikation zwischen JavaScript und Servern verfügbar sind, können ebenfalls einen Blick wert sein, z. B. STOMP.

Für Ihre spezifische Funktion, der HTTP-Aufruf eine GET-Anforderung mit Parametern verwenden:

http://localhost/JSFeekback?par1=val1&par2=val2&par3=val3&par4=val4 
+0

Mein Delphi-Code ist nicht über HTTP verfügbar. Ich brauche eine Lösung wie einen Kommentar von @Guillem Vicens, aber schreibe auf Android und iOS und ich benutze gerne den neuen TWebBrowser auf Delphi XE6. Ich denke, TChromium ist ein bisschen kompliziert. – Martin

+0

@Martin Ich habe meine Antwort aktualisiert, vielleicht ist es hilfreich für andere – mjn

2

Der richtige Weg zu tun, ist es mit der addJavascriptInterface Funktion des Android WebView, wie here zu sehen ist, here und here.

Der Firemonkey TWebBrowser stellt diese Funktion nicht standardmäßig zur Verfügung.

Es gibt eine benutzerdefinierte WebView-Wrapper-Steuerelement in DPF Android wie here zu sehen ist.

Sie können dieses Steuerelement ändern, um die addJavascriptInterface-Funktion hinzuzufügen.

Für TWebBrowser auf IOS können Sie die benutzerdefinierten Webbrowser-Steuerelemente in sourceforge und here verwenden.

Eine andere Möglichkeit, dies zu tun, ist mit dem Ereignis OnShouldStartLoadWithRequest von TWebBrowser.

<script language=”javascript” type=”text/javascript”> 
window.location.href=”#param1&param2&param3&param4”; 
</script> 

oder

<script language=”javascript”> 
window.navigate(”javascript:thisisatest();”); 
</script> 

Und sehen, ob die URL-Eigenschaft von OnShouldStartLoadWithRequest#param1&param2&param3&param4 oder javascript:thisisatest(); enthält: Sie könnte so etwas wie zu tun.

Grundsätzlich besteht die Idee darin, zu einer URL zu navigieren, die die URL der vorhandenen Seite nicht ändert und diese URL im OnShouldStartLoadWithRequest-Ereignis abruft.

window.location.href=”#param1&param2&param3&param4”; 

führen Sie dann einen Timer zu überprüfen TWebBrowser.URL, bekommen Sie die params, rufen Sie Ihren JSFeekback, setzen Sie die URL:

0

TWebBrowser.URL innerhalb Javascript geändert werden.

Oder kein Timer, Code wie folgt:

wb1.EvaluateJavaScript("window.location.href=”#param1&param2&param3&param4”;"); 
    getParams(wb1.URL); 
    JSFeekback(p1, p2, p3, p4); 
Verwandte Themen