Ich folge dem How to call Delphi code from scripts running in a TWebBrowser DelphiDabbler-Tutorial (von Peter Johnson), damit Delphi JavaScript-Ereignisse TWebBrowser
hören kann.Erweitern des externen TWebBrowser-Objekts zum Ausführen von Delphi-Code: Wie kann ich auf meine Formularkomponenten zugreifen?
Das funktioniert bis zu dem Punkt, wo ich sehe, meine Delphi-Prozeduren aufgerufen werden. Von dort aus muss ich jedoch einige Formularbeschriftungen aktualisieren, und ich sehe keine Möglichkeit, über diese Prozeduren auf mein Formular zuzugreifen.
Der Code DelphiDabbler Beispiel umgeht schön ‚direkten Zugang Form‘ von creatingTHintAction.Create(nil);
der Sache es tun:
Diese lassen haben wir ganz schön unsere externe Objektimplementierung entkoppeln von der Form des Programms
Aber ich möchte auf mein Formular zugreifen! Zu übergebende Daten sind ganze Zahlen und Zeichenfolgen.
Ich könnte PostMessage() und WM_COPYDATA Nachrichten verwenden, aber diese würden immer noch das Formular behandeln. Und gibt es keinen "direkten" Weg zum Formular?
entsprechenden Code:
type
TWebBrowserExternal = class(TAutoIntfObject, IWebBrowserExternal, IDispatch)
protected
procedure SetVanLabel(const ACaption: WideString); safecall; // My 3 procedures that are called...
procedure SetNaarLabel(const AValue: WideString); safecall; // ... declared in the type library.
procedure SetDistanceLabel(AValue: Integer); safecall;
public
constructor Create;
destructor Destroy; override;
end;
type
TExternalContainer = class(TNulWBContainer, IDocHostUIHandler, IOleClientSite)
private
fExternalObj: IDispatch; // external object implementation
protected
{ Re-implemented IDocHostUIHandler method }
function GetExternal(out ppDispatch: IDispatch): HResult; stdcall;
public
constructor Create(const HostedBrowser: TWebBrowser);
end;
constructor TExternalContainer.Create(const HostedBrowser: TWebBrowser);
begin
inherited Create(HostedBrowser);
fExternalObj := TWebBrowserExternal.Create;
end;
der Form a property FContainer: TExternalContainer;
hat, in der Formcreate ich fContainer := TExternalContainer.Create(WebBrowser);
(Parameter der Entwurfszeit TWebBrowser
ist), so dass der TExternalContainer.fExternalObj
derjenigen zugeordnet ist.
Frage:
procedure TWebBrowserExternal.SetDistanceLabel(AValue: Integer);
begin
// **From here, how do I send AValue to a label caption on my form?**
end;
Ich muss gestehen, dass Schnittstellen nicht meine Stärke sind ;-)
[Added:] Hinweis: Meine Formulare dynamisch alle erstellt werden, gibt es keine TForm Instanz in die aktuelle Einheit.
wenn Sie das Formular Griff in TWebBrowserExternal, wie Funktion GetformHandle() zurück: Wort? – Passella
Es ist möglich, einen [viel einfacheren Ansatz zum Implementieren externer Methoden in Delphi] (http://stackoverflow.com/a/22184159/859646) zu verwenden, wobei die von ObjComAuto.TObjectDispatch bereitgestellte spät gebundene Funktionalität verwendet wird. Auf diese Weise müssen Sie weder Schnittstellen noch eine Typbibliothek definieren. – JRL