FormにTedgeBrowser1を貼り付け、簡易ブラウザとして使用していますが、
リンク中のTargetBlankをクリックした時には、別ブラウザが開いてしまいます。
targer Blankを無効にして遷移先のページをそのままTedgeBrowser1で表示をしたいのですが
色々と検索をしても情報に出会えませんでした。ご教示いただけましたら幸いです。
参考サイトを見る限りは
新しいブラウザを開こうとしたときNewWindowRequested っていうイベントが発生するらしいので
そこでブラウザを開かせないようにして自分で開けばどうなりますか?
procedure TForm1.WVBrowser1NewWindowRequested(Sender: TObject; const aWebView: ICoreWebView2; const aArgs: ICoreWebView2NewWindowRequestedEventArgs);
var pUri:PChar;
begin
//<a target="_blank" rel="noreferrer">をクリックし、
//新しいブラウザWindowを開こうとした場合
//とりあえず、新しいブラウザウィンドウを開かせないようにキャンセルする
aArgs.Set_Handled(-1);
//キャンセルしない場合は別ウィンドウが開く
//aArgs.Set_Handled(0);
//新しいブラウザウィンドウの要求URLを取得する
aArgs.Get_uri(pUri);
showmessage(
'新しいブラウザウィンドウを開こうとしました'+
#13#10+pUri
);
end;
参考
https://mam-mam.net/delphi/tedgebrowser_webview4delphi.html
takaさん
ご親切にアドバイス下さりありがとうございます。
TedgeBrowserは今後使用できなくなり、それに代わるのがWVBrowser(Chrome版Edge)と知りました。
参考リンクに従ってインストールWebView4Delphi-main.zipも解凍し、パス設定、WebView2Loader.dllのインストール(は以前行っていました)と
実行環境にWebView2Loader.dllの設置等、一通り済ませ、参考リンクのプロジェクトを一旦はそのまま実行しましたがコードに複数のエラーが出たので、今度は最小構成(FormsにButton、Edit、WbBrowser1、WVWindowsParent1を設置して最小コードでコンパイルしますが、
uwvwinControlが見つかりません。とエラーが出ます。
ソースを見ると
usesには追加されているようですが、
uWVWinControl, uWVWindowParent,
uWVBrowserBase, uWVBrowser の部分でユニットはコンパイル出来ませんと出ています。
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uWVWinControl, uWVWindowParent,
uWVBrowserBase, uWVBrowser, Vcl.StdCtrls, Vcl.ExtCtrls;
そもそもの問題箇所を解決する前の段階のトラブルとなりますが、引き続きご教示下さればありがたく存じます。
>TedgeBrowserは今後使用できなくなり
それは違います。
XE10.4以降はTedgeBrowserが使えます。
WebView4DelphiはXE4以降で使えるそうです。つまり、古いDelphiでも使えるみたいです。
(4)ー1.ライブラリパスの追加
は行ってますか?
上記の投稿は言葉足らずでした。すいません。
もし、WebView4Delphiを使うのであれば
(4)ー1.ライブラリパスの追加
は行ってますか?
TEdgeBrowserが使えるバージョンをお使いでしたら、わざわざWebView4Delphiをインストールして使う必要がないので、TEdgeBrowserを使うことをお勧めします。
TEdgeBrowserにもOnNewWindowRequestedイベントがありますので、そこで処理をすればいいと思います。
ただし、どちらを使うにしても、タブブラウザとして実装すると思いますので、TPageControlを使って動的にタブを追加して、動的にTEdgeBrowserのインスタンスを作成して配置する必要があります。
また、タブを閉じる対応も必要となり、OnWinowCloseRequestedの対応が必要です。
その他諸々対応が必要なので、ソコソコソースコードは長くなるでしょう。
mamさん ご親切にありがとうございます。
>TEdgeBrowserを使うことをお勧めします。
そうだったんですね。勘違いをしていました。
takaさんの内容も、
パスは通したつもりでしたが再度確認すると階層を間違えていて、再度、設定しなおすと
エラーはすべてなくなりましたが、URLを指定してもどういうわけかWebは開かないですね。
WebView2Loader.dllは 作成されたexeフォルダーに置いているのですが、なぜなのでしょう?
実行環境としては DELPHI10.4 windws10Homeです。
以下、外していたらすいません
(1)Microsoft WebView2 ランタイムのインストール
はされましたか。
dllは32bit用と64bit用の2つがありますが、どちらを配置されしたでしょうか。
32bitコンパイルするなら32bit版のdllを、64bitコンパイルするなら64bit版の配置が必要です。
Microsoft WebView2 ランタイムのインストールは再度行おうとしましたら、既にインストール済と出ましたので入っているようです。
それから、ランタイムは32bit用をexeのファルダーに入れています。試しに62bit用を入れてみましたが、エラーになったので32Bit用で
間違いはなさそうです。
以下、最小構成で再度テストをしましたが、現状では変わらないです。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, uWVWinControl,
uWVWindowParent, uWVBrowserBase, uWVBrowser, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
WVBrowser1: TWVBrowser;
WVWindowParent1: TWVWindowParent;
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
WVBrowser1.Navigate('https://www.google.com');
end;
end.
最小構成は以下になります。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
uWVLoader, uWVWinControl,
uWVWindowParent, uWVBrowserBase, uWVBrowser, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
WVBrowser1: TWVBrowser;
WVWindowParent1: TWVWindowParent;
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure WVBrowser1AfterCreated(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
WVBrowser1.Navigate('https://www.google.com');
end;
procedure TForm1.FormCreate(Sender: TObject);
var ct:integer;
begin
WVWindowParent1.Browser:=WVBrowser1;
if GlobalWebView2Loader.InitializationError then
begin
ShowMessage(GlobalWebView2Loader.ErrorMessage);
end
else
begin
ct:=0;
while (ct<20) and (not GlobalWebView2Loader.Initialized) do
begin
sleep(500);
Application.ProcessMessages;
inc(ct);
end;
if GlobalWebView2Loader.Initialized then
begin
WVBrowser1.CreateBrowser(WVWindowParent1.Handle);
end
else
begin
ShowMessage('WebView2初期化失敗');
end;
end;
end;
procedure TForm1.WVBrowser1AfterCreated(Sender: TObject);
begin
//以下必須
WVWindowParent1.UpdateSize;
end;
initialization
// GlobalWebView2Loaderをロードして初期化
GlobalWebView2Loader := TWVLoader.Create(nil);
//キャッシュやクッキー等の保存場所を指定する
GlobalWebView2Loader.UserDataFolder :=
ExtractFilePath(Application.ExeName) + 'CustomCache';
GlobalWebView2Loader.StartWebView2;
end.
mamさん度々ありがとうございます。
ご掲載のコードをそのまま掲載してコンパイルして実行しましたが、やはり表示はされないようです。
やはり、TEdgeBrowserでした方が良いのでしょうか?
takeさんのコードだと、そのままTEdgeBrowserでは使用できないようで色々ググってもドキュメントが少なく探せていない状況です。
今回は、taget_blankをクリックしたら新しくTabを開くのではなく、今開いているブラウザに遷移先のURLをセットして表示させる
だけにしたいと思っています。
Procedure TForm1.EdgeBrowser1NewWindowRequested(Sender: TCustomEdgeBrowser;
Args: TNewWindowRequestedEventArgs);
begin
//クリックしたリンクURLにtaget_blankが含まれていたら
//target_blankを削除して
//現在表示している.EdgeBrowser1.Navigate('遷移先URL');で遷移
end;
当方delphi XE10.2で、上記ソースコードそのままで動いているので不思議ですね。
ないと思いますが、そのまま貼っただけではなく、フォームデザイナのForm1のイベントのOnCreateプロパティや、WVBrowser1のイベントのOnAfterCreatedプロパティに、イベントを与えていますよね?
mamさん、久しぶりにDelphiを触ったのでイベントを与えていませんでした。
きちんと表示されました。お騒がせ致しました。
taget_blankの制御もコードを一部書き換えて実現出来ました。
皆様、本当にありがとうございました。
//新しいブラウザウィンドウの要求URLを取得する
aArgs.Get_uri(pUri);
//showmessage('新しいブラウザウィンドウを開こうとしました'+
// #13#10+pUri);
WVBrowser1.Navigate(pUri);
end;
【追記】
その後、TEdgeBrowserのTargetBlank対策もしました。
自己レスですが、以下で実現できました。
皆様、ありがとうございました。
procedure TForm1.EdgeBrowser1NewWindowRequested(Sender: TCustomEdgeBrowser;
Args: TNewWindowRequestedEventArgs);
var
pUri:PChar;
begin
//<a target="_blank" rel="noreferrer">をクリックし、
//新しいブラウザWindowを開こうとした場合
//とりあえず、新しいブラウザウィンドウを開かせないようにキャンセルする
Args.ArgsInterface.Set_Handled(-1);
//新しいブラウザウィンドウの要求URLを取得する
Args.ArgsInterface.Get_uri(pUri);
//
Form1.Caption:='Target_Blankですよ';
EdgeBrowser1.Navigate(pUri);
end;
ツイート | ![]() |