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

Использование `OnNewWindow3` в старых проектах Delphi для корректной обработки ссылок

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

Использование 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




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


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


реклама


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

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