TEdgeBrowser - OnNewWindowRequested - Открыть новое окно в другом TEdgeBrowser

Delphi 10.4.2

Я впервые работаю с TEdgeBrowser и экспериментирую с некоторыми идеями в небольшом демонстрационном приложении, которое я создал. До сих пор мне удалось программно перейти на веб-сайт, войти в систему (ввести имя пользователя и пароль и нажать кнопку «Войти»), нажать кнопку («Мои дела»), чтобы перейти на другую страницу, а затем заполнить поле редактирования. и поле со списком для поиска конкретного случая. Пока все хорошо. Теперь, когда дело доступно, у меня есть возможность щелкнуть либо «История», либо «Служебная информация». Я нажал кнопку «История» и хочу, чтобы новое окно открылось в другом компоненте TEdgeBrowser. Вот код, который я использую, чтобы сделать это, но он не работает.

      procedure TfrmMain.EdgeBrowserNewWindowRequested(Sender: TCustomEdgeBrowser;
  Args: TNewWindowRequestedEventArgs);
begin
  //* Natigate to the history page
  pgeMain.ActivePage := tabHistory;

  //* Open link in another WebView2 (new tab):
  Args.ArgsInterface.Set_NewWindow(EdgeBrowserHistory.DefaultInterface);
end;

Обратите внимание, что в событии FormShow у меня есть следующее.

      procedure TfrmMain.FormShow(Sender: TObject);
begin
  EdgeBrowser.UserDataFolder := 'C:\Temp\';

  EdgeBrowserHistory.CreateWebView;
end;

Примечание. Мой основной браузер называется EdgeBrowser.

      procedure TfrmMain.btnGoClick(Sender: TObject);
begin
  pgeMain.ActivePage := tabBrowser;
  EdgeBrowser.Navigate(edtWebSiteURL.Text);
end;

Читая другой пост на этом сайте, я подумал, что, возможно, это связано с наличием TEdgeBrowser на другой странице TPageControl, поэтому я переместил его в основную форму, и он по-прежнему не работает.

Если у меня нет кода в событии EdgeBrowserNewWindowRequested, он отлично откроется в новом окне. Кто-нибудь знает, что мне нужно сделать, чтобы он заработал?

3 ответа

Первый подход уже был правильным:

      Args.ArgsInterface.Set_NewWindow(EdgeBrowserHistory.DefaultInterface);

Важно, чтобы новый браузер был предварительно инициализирован. Поэтому заранее вызовите любой веб-сайт с помощью EdgeBrowserHistory.Navigate. Тогда это работает.

Вам просто нужно перейти во втором TEdgeBrowser к URL-адресу, на который вы хотите перейти. (Кроме того, обратите внимание, что когда вы используете интерфейс Args для получения PWideChar, вам нужен соответствующий вызов CoTaskMemFree). И, предполагая, что у вас могут быть другие «вкладки» или любые другие кнопки/ссылки, которые могут запускать NewWindowRequest, вам может понадобиться некоторая логика для обработки этих других случаев, поскольку приведенный ниже код перейдет на вкладку «История» для любого NewWindowRequest. Я не уверен, нужно ли вам также устанавливать EdgeBrowserHistory.UserDataFolder или по умолчанию он будет таким же, как и первый.

Попробуйте что-то вроде этого:

      procedure TfrmMain.EdgeBrowserNewWindowRequested(Sender: TCustomEdgeBrowser; Args: TNewWindowRequestedEventArgs);
var
  PUri: PWideChar;
  Url: string;
begin
  //* Navigate to the history page
  pgeMain.ActivePage := tabHistory;

  //* Open link in another WebView2 (new tab):
  Args.ArgsInterface.Get_uri(PUri);
  Url := PUri;
  CoTaskMemFree(PUri);
  EdgeBrowserHistory.Navigate(Url);
  Args.ArgsInterface.Set_Handled(1);
end;

Приветствую Грега,

Спасибо за ваш ответ. Я пытался сделать то, что вы предложили вчера, пытаясь сделать все, что я мог придумать, чтобы заставить эту работу работать, но, поскольку мне нужно войти на этот сайт, мне не нравится пытаться получить доступ к этой странице с помощью Navigate().

Здесь вы видите основной TEdgeBrowser слева и второй справа. И да, на этот раз он заполнил его хотя бы чем-то (предупреждающим сообщением). Любые другие идеи о том, как заставить это работать в другом браузере EdgeBrowser?

Если мы не можем заставить это работать в другом EdgeBrowser, что является предпочтительным способом, я согласен с отображением страницы в текущем EdgeBrowser, используя следующий код:

      procedure TfrmMain.EdgeBrowserNewWindowRequested(Sender: TCustomEdgeBrowser;
  Args: TNewWindowRequestedEventArgs);
begin
  //* Open link in current WebView2:
  Args.ArgsInterface.Set_NewWindow(Sender.DefaultInterface);
end;

Хотя открытие «Истории» в текущем EdgeBrower работает, теперь есть другая проблема: кнопка «Назад» отключена, и если кнопка «Назад» отключена, я не могу вернуться на предыдущую страницу и нажать кнопку «Служебная информация».

Если я использую MSEdge для перехода на этот веб-сайт, нахожу дело и нажимаю кнопку «История», веб-сайт открывает страницу в новой вкладке, и если я вернусь на главную вкладку, конечно, кнопка «Назад» там отключена, поэтому Я не вижу в любом случае вокруг этой проблемы, если вы не знаете об одном.

Таким образом, остается только один вариант, который меня действительно не очень волнует, и это позволяет EdgeBrower делать свое дело и открывать историю в новом окне. Это представляет собой собственный набор проблем.

  1. Можно ли контролировать размер нового окна?
  2. Можно ли контролировать размещение нового окна?
  3. Если я закрою форму, два новых окна (История и Служебная информация) останутся открытыми. Это не хорошо.

Итак, в итоге, если это мой единственный вариант, мне действительно нужно иметь возможность контролировать эти окна. Любые идеи, если это возможно?

Еще раз спасибо за любую помощь, которую вы можете предоставить.

Другие вопросы по тегам