Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с TWebBrowser в Delphi: двусторонняя связь с JavaScript и использование IDispatchEx для получения параметров событий

Delphi , Интернет и Сети , Браузер

При разработке приложений с использованием компонента TWebBrowser в Delphi может возникнуть необходимость в двусторонней связи между Delphi и JavaScript. Одним из способов реализации такой связи является использование событий, которые можно регистрировать в JavaScript и обрабатывать в Delphi. В частности, разработчики часто сталкиваются с необходимостью получения параметров, переданных в кастомные события из JavaScript.

Проблема

Разработчик столкнулся с задачей получения параметров, переданных в кастомные события из JavaScript в Delphi-приложение. Он смог зарегистрировать обработчик событий, но не смог получить доступ к параметрам, переданным в эти события.

Контекст

В контексте задачи разработчик использовал IDispatch для создания обработчика событий, который регистрировался в JavaScript. Однако, при попытке обработать событие в Delphi, параметры, переданные в событие, не были доступны.

Решение

Для доступа к параметрам кастомного события в Delphi необходимо выполнить следующие шаги:

  1. Получить ссылку на IDOMEvent в обработчике событий.
  2. Получить ссылку на IDOMCustomEvent из IDOMEvent.
  3. Использовать позднюю привязку для доступа к свойству 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:30:44/0.0036671161651611/0