Я следую за How to call Delphi code from scripts running in a TWebBrowser Учебник DelphiDabbler (от Peter Johnson), чтобы позволить Delphi прослушивать TWebBrowser
события JavaScript.Расширение внешнего объекта TWebBrowser для выполнения кода Delphi: как получить доступ к моим компонентам формы?
Это работает до такой степени, что я вижу, что мои процедуры Delphi вызываются. Однако оттуда мне нужно обновить некоторые ярлыки формы, и я не вижу доступа к моей форме из этих процедур.
Пример кода DelphiDabbler хорошо обходит «прямой доступ формы» по creatingTHintAction.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;
Я должен признать, что интерфейсы не моя сильная сторона ;-)
[Добавлено:] Примечание: Мои формы все созданные динамически, нет ни одного случая ТГогт в текущий блок.
если вы возвращаете форму ручки в TWebBrowserExternal, как функции GetformHandle(): Word? – Passella
Можно использовать [более простой подход для реализации внешних методов в Delphi] (http://stackoverflow.com/a/22184159/859646), используя поздние функции, предоставляемые ObjComAuto.TObjectDispatch. Таким образом, вам не нужно определять какие-либо интерфейсы или библиотеку типов. – JRL