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 делать свое дело и открывать историю в новом окне. Это представляет собой собственный набор проблем.
- Можно ли контролировать размер нового окна?
- Можно ли контролировать размещение нового окна?
- Если я закрою форму, два новых окна (История и Служебная информация) останутся открытыми. Это не хорошо.
Итак, в итоге, если это мой единственный вариант, мне действительно нужно иметь возможность контролировать эти окна. Любые идеи, если это возможно?
Еще раз спасибо за любую помощь, которую вы можете предоставить.