Адаптация кастомной реализации IDocHostUIHandler для TWebBrowser в Delphi 10.0 Seattle
С появлением Delphi 10.0 Seattle, компания Embarcadero обновила реализацию компонента TWebBrowser. В предыдущих версиях Delphi, TWebBrowser был классом, наследуемым от TOleControl, но начиная с Seattle, TWebBrowser также наследует интерфейсы IDocHostUIHandler, IDocHostShowUI, IOleCommandTarget. Это изменение затронуло разработчиков, которые использовали собственные реализации интерфейса IDocHostUIHandler для управления поведением TWebBrowser.
Проблема
Разработчики, использовавшие старую версию TWebBrowser, столкнулись с проблемой, поскольку новый TWebBrowser теперь включает в себя реализацию IDocHostUIHandler, что делает невозможным использование их кастомных реализаций, ранее регистрируемых как клиентские сайты/хосты. Это связано с тем, что новый TWebBrowser скрывает свои реализации этих интерфейсов и не предназначен для наследования.
Альтернативный ответ
В качестве альтернативного решения предлагается использовать более старую версию модуля ShDocVw.Pas или создать собственный модуль импорта для TWebBrowser, не прибегая к использованию компонента, предоставляемого Delphi.
Подтвержденный ответ
Разработчикам, столкнувшимся с проблемой, предлагается следующий подход к решению:
Вы можете создать класс, наследующийся от TWebBrowser и предоставляющий свою реализацию интерфейса IDocHostUIHandler. Это можно сделать следующим образом:
Type
TMyWebBrowser = class( TWebBrowser, IDocHostUIHandler )
// Определение дополнительных методов класса
end;
Важно: вы должны предоставить реализации всех функций интерфейса IDocHostUIHandler, которые уже должны быть у вас, поскольку вы ранее реализовывали этот интерфейс.
Пример кода
Type
TMyWebBrowser = class( TWebBrowser )
private
{ Члены }
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function GetInterface(const IID: TGUID): Pointer;
procedure Initialize; override;
public
{ Члены, реализующие методы IDocHostUIHandler }
function ShowContextMenu(in ActiveObject: Pointer; in pptpt: TPoint; in pcmdTarget: Pointer; var ShowUI: Boolean): HResult; stdcall;
// Здесь следует определить остальные методы интерфейса
end;
procedure TMyWebBrowser.Initialize;
begin
inherited;
// Регистрация вашего класса как реализации IDocHostUIHandler
// Можно использовать CoCreateInstance для создания и регистрации объекта
end;
Этот подход позволяет вам продолжить использование вашей кастомной реализации IDocHostUIHandler, не вступая в конфликт с реализацией, предоставляемой новым TWebBrowser.
Заключение
С обновлением TWebBrowser в Delphi 10.0 Seattle, разработчикам необходимо пересмотреть свой код и адаптировать его для работы с новым поведением компонента. Приведенный выше пример кода демонстрирует, как можно сохранить кастомную реализацию IDocHostUIHandler, наследуя TWebBrowser и предоставляя свою реализацию необходимых методов. Это позволит продолжить использование функционала, ранее разработанного для старых версий Delphi, в новых версиях среды разработки.
С изменением реализации компонента `TWebBrowser` в Delphi 10.0 Seattle, разработчикам необходимо адаптировать свои кастомные реализации интерфейса `IDocHostUIHandler` для их дальнейшей совместимости с новым поведением компонента.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.