Использование OnNewWindow3 в старых проектах Delphi для корректной обработки ссылок
В современных веб-приложениях, написанных на Delphi, для обработки событий браузера часто используется событие OnNewWindow3. Это событие предоставляет информацию о новом окне, которое браузер пытается открыть, и позволяет разработчику контролировать этот процесс. В частности, оно может быть использовано для получения URL адреса ссылки, которая была кликнута пользователем.
Проблема
При работе с TWebBrowser в старых проектах Delphi, возникает проблема, когда при клике по ссылке, имеющей атрибут target="_blank", не срабатывает событие BeforeNavigate2. В результате становится невозможным узнать URL ссылки, которую пользователь хочет открыть, и выполнить необходимые действия, например, открыть ссылку в стандартном браузере.
Решение
Для решения этой проблемы можно использовать метод getAttribute из DOM, но перед этим необходимо загрузить нужную страницу и после этого заменить стандартные обработчики событий на собственные. Ниже приведен пример кода, который демонстрирует, как это можно сделать:
uses
SHDocVw, MSHTML;
// Другие необходимые модули
type
TForm1 = class(TForm)
// Остальные компоненты формы
procedure WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
// Остальные процедуры
private
// Собственные обработчики событий
procedure New_BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
procedure New_NewWindow2(ASender: TObject; var ppDisp: IDisplay; var Cancel: WordBool);
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
begin
(ASender as TWebBrowser).OnBeforeNavigate2 := New_BeforeNavigate2;
(ASender as TWebBrowser).OnNewWindow2 := New_NewWindow2;
end;
procedure TForm1.New_BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
begin
ShowMessage('New URL will be: ' + URL);
Cancel := True; // Отмена стандартного поведения браузера
end;
procedure TForm1.New_NewWindow2(ASender: TObject; var ppDisp: IDisplay; var Cancel: WordBool);
var
S: String;
begin
S := ((TWebBrowser(ASender).Document as IHTMLDocument2).ActiveElement as IHTMLElement).GetAttribute('href', 0);
ShowMessage('New window''s URL is: ' + S);
Cancel := True; // Открытие в стандартном браузере
end;
Также, начиная с более новых версий Delphi, существует событие OnNewWindow3, которое позволяет получить необходимый URL напрямую. Однако его интеграция в существующий TWebBrowser может вызвать затруднения. Для реализации OnNewWindow3 можно использовать следующий подход:
uses
ActiveX, OleCtrls, SHDocVw;
// Другие необходимые модули
const
DISPID_NEWWINDOW3 = 273;
type
TWebBrowserNewWindow3 = procedure(ASender: TObject; var ppDisp: IDisplay; var Cancel: WordBool; dwFlags: Longint; const bstrUrlContext: WideString; const bstrUrl: WideString) of object;
TWebBrowser = class(SHDocVw.TWebBrowser)
private
FOnNewWindow3: TWebBrowserNewWindow3;
protected
procedure InvokeEvent(ADispID: TDispID; var AParams: TDispParams); override;
public
property OnNewWindow3: TWebBrowserNewWindow3 read FOnNewWindow3 write FOnNewWindow3;
end;
procedure TWebBrowser.InvokeEvent(ADispID: TDispID; var AParams: TDispParams);
begin
if (ADispID = DISPID_NEWWINDOW3) and Assigned(FOnNewWindow3) then
begin
FOnNewWindow3(Self, AParams.rgvarg^[4].pdispVal^, AParams.rgvarg^[3].pbool^,
AParams.rgvarg^[2].lVal, WideString(AParams.rgvarg^[1].bstrVal), WideString(AParams.rgvarg^[0].bstrVal));
end
else
inherited;
end;
Этот подход позволяет перехватить событие NewWindow3 и обработать его в соответствии с требованиями проекта.
Выводы
Использование OnNewWindow3 в старых проектах Delphi требует внимательной настройки и может потребовать дополнительной работы с интерфейсом COM. Однако, с правильной реализацией, разработчики могут добиться более гибкой и контролируемой обработки веб-событий в своих приложениях.
В контексте рассматривается использование и настройка события `OnNewWindow3` в старых проектах Delphi для корректной обработки ссылок и управления открытием новых окон браузера.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.