При разработке приложений с использованием компонента TWebBrowser в Delphi может возникнуть необходимость в двусторонней связи между Delphi и JavaScript. Одним из способов реализации такой связи является использование событий, которые можно регистрировать в JavaScript и обрабатывать в Delphi. В частности, разработчики часто сталкиваются с необходимостью получения параметров, переданных в кастомные события из JavaScript.
Проблема
Разработчик столкнулся с задачей получения параметров, переданных в кастомные события из JavaScript в Delphi-приложение. Он смог зарегистрировать обработчик событий, но не смог получить доступ к параметрам, переданным в эти события.
Контекст
В контексте задачи разработчик использовал IDispatch для создания обработчика событий, который регистрировался в JavaScript. Однако, при попытке обработать событие в Delphi, параметры, переданные в событие, не были доступны.
Решение
Для доступа к параметрам кастомного события в Delphi необходимо выполнить следующие шаги:
Получить ссылку на IDOMEvent в обработчике событий.
Получить ссылку на IDOMCustomEvent из IDOMEvent.
Использовать позднюю привязку для доступа к свойству detail.
Ошибка заключалась в том, что разработчик не смог получить ссылку на IDOMEvent в обработчике, что препятствовало дальнейшему извлечению параметров события.
Альтернативное решение
Для корректной работы с кастомными событиями в TWebBrowser необходимо реализовать интерфейс IDispatchEx в обработчике событий. Это позволит обрабатывать события с параметрами, переданными через позднюю привязку.
Пример кода
Вот пример кода на Object Pascal (Delphi), который реализует интерфейс IDispatchEx и позволяет обрабатывать параметры кастомных событий:
uses
System.SysUtils, Winapi.Windows, Winapi.ActiveX, MSHTML;
type
THandleEvent = procedure(const Target: IDispatch; const DOMEvent: IDOMEvent) of object;
TWebBrowserEventListener = class(TInterfacedObject, IDispatchEx)
private
FOnHandleEvent: THandleEvent;
// Остальные методы интерфейса IDispatch
// ...
public
constructor Create(AOnHandleEvent: THandleEvent);
// Остальные методы интерфейса IDispatchEx
// ...
end;
constructor TWebBrowserEventListener.Create(AOnHandleEvent: THandleEvent);
begin
inherited Create;
FOnHandleEvent := AOnHandleEvent;
end;
function TWebBrowserEventListener.InvokeEx(const id: TDispID; const lcid: LCID; const wflags:
WORD; const pdp: PDispParams; out varRes: OleVariant; out pei:
TExcepInfo; const pspCaller: PServiceProvider): HResult;
var
DOMEvent: IDOMEvent;
begin
if (id = DISPID_VALUE) and (pdp^.cArgs = 2) and (pdp^.rgvarg^[0].vt = varDispatch) and
(pdp^.rgvarg^[1].vt = varDispatch) and Supports(IDispatch(pdp^.rgvarg^[1].dispVal), IDOMEvent, DOMEvent) then
begin
HandleEvent(IDispatch(pdp^.rgvarg^[0].dispVal), DOMEvent);
Result := S_OK;
end
else
Result := E_NOTIMPL;
end;
procedure TWebBrowserEventListener.HandleEvent(const Target: IDispatch;
const DOMEvent: IDOMEvent);
begin
if Assigned(FOnHandleEvent) then
FOnHandleEvent(Target, DOMEvent);
end;
procedure TWebBrowserEventListener.Realize(const DOMEvent: IDOMEvent; const DOMCustomEvent: IDOMCustomEvent);
begin
// Логика работы с кастомным событием и его параметрами
// ...
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; const URL: OleVariant);
var
Target : IEventTarget;
Listener: IDispatchEx;
begin
Target := WebBrowser1.Document as IEventTarget;
Listener := TWebBrowserEventListener.Create(WebBrowserEvent);
Target.addEventListener('change', Listener, True);
Target.addEventListener('pmweTest', Listener, True);
end;
procedure TForm1.WebBrowserEvent(const Target: IDispatch;
const DOMEvent: IDOMEvent);
var
DOMCustomEvent: IDOMCustomEvent;
begin
if DOMEvent.type_ = 'pmweTest' and Supports(DOMEvent, IDOMCustomEvent, DOMCustomEvent) then
TWebBrowserEventListener(Listener).Realize(DOMEvent, DOMCustomEvent);
end;
Важные замечания
В коде выше использованы примеры реализации интерфейсов, необходимых для работы с событиями в TWebBrowser, включая IDispatch и IDispatchEx.
При работе с кастомными событиями важно реализовать метод InvokeEx в IDispatchEx, который позволит обработать параметры события.
Для доступа к свойству detail кастомного события необходимо сначала получить ссылку на IDOMCustomEvent из IDOMEvent.
Используя данный подход, разработчик сможет успешно регистрировать и обрабатывать кастомные события в TWebBrowser, получая доступ к параметрам, переданным в эти события.
Контекст заключается в необходимости реализации двусторонней связи между Delphi-приложением и JavaScript в компоненте TWebBrowser для обработки событий с параметрами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.