Я следую Как вызвать код Delphi из скриптов, запущенных в TWebBrowser DelphiDabbler учебник (автор Peter Johnson), позволяющий Delphi прослушивать TWebBrowser
события JavaScript.
Это работает до того момента, когда я вижу, что мои процедуры Delphi вызываются. Однако оттуда мне нужно обновить некоторые метки форм, и я не вижу способа получить доступ к моей форме из этих процедур.
Код примера DelphiDabbler изящно обходит «прямой доступ к форме» с помощью создание THintAction.Create(nil);
, которое будет делать свое дело:
Это позволяет нам довольно хорошо отделить нашу реализацию внешнего объекта от формы программы.
Но я хочу получить доступ к своей форме! Передаваемые данные представляют собой целые числа и строки.
Я мог бы использовать сообщения PostMessage() и WM_COPYDATA, но для них все равно потребуется дескриптор формы. И нет ли «прямого» пути к форме?
Соответствующий код:
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;
У формы есть property FContainer: TExternalContainer;
, в FormCreate я делаю fContainer := TExternalContainer.Create(WebBrowser);
(параметр - время разработки TWebBrowser
), поэтому этому присваивается TExternalContainer.fExternalObj
.
Вопрос:
procedure TWebBrowserExternal.SetDistanceLabel(AValue: Integer);
begin
// **From here, how do I send AValue to a label caption on my form?**
end;
Должен признаться, что интерфейсы не моя сильная сторона ;-)
[Добавлено:] Примечание. Все мои формы создаются динамически, в текущем модуле нет экземпляра TForm.