TedgeBrowser1でTargetBlankをクリックした時、TedgeBrowser1で表示をしたいのですが

解決


Jhon  2022-09-28 16:43:59  No: 150553  IP: 192.*.*.*

FormにTedgeBrowser1を貼り付け、簡易ブラウザとして使用していますが、
リンク中のTargetBlankをクリックした時には、別ブラウザが開いてしまいます。
targer Blankを無効にして遷移先のページをそのままTedgeBrowser1で表示をしたいのですが
色々と検索をしても情報に出会えませんでした。ご教示いただけましたら幸いです。

編集 削除
take  URL  2022-09-28 22:57:45  No: 150554  IP: 192.*.*.*

参考サイトを見る限りは
新しいブラウザを開こうとしたとき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

編集 削除
Jhon  2022-09-29 02:40:39  No: 150555  IP: 192.*.*.*

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;

そもそもの問題箇所を解決する前の段階のトラブルとなりますが、引き続きご教示下さればありがたく存じます。

編集 削除
mam  2022-09-29 04:06:02  No: 150556  IP: 192.*.*.*

>TedgeBrowserは今後使用できなくなり
それは違います。
XE10.4以降はTedgeBrowserが使えます。
WebView4DelphiはXE4以降で使えるそうです。つまり、古いDelphiでも使えるみたいです。

(4)ー1.ライブラリパスの追加
は行ってますか?

編集 削除
mam  2022-09-29 04:26:56  No: 150557  IP: 192.*.*.*

上記の投稿は言葉足らずでした。すいません。

もし、WebView4Delphiを使うのであれば
(4)ー1.ライブラリパスの追加
は行ってますか?

TEdgeBrowserが使えるバージョンをお使いでしたら、わざわざWebView4Delphiをインストールして使う必要がないので、TEdgeBrowserを使うことをお勧めします。

TEdgeBrowserにもOnNewWindowRequestedイベントがありますので、そこで処理をすればいいと思います。

ただし、どちらを使うにしても、タブブラウザとして実装すると思いますので、TPageControlを使って動的にタブを追加して、動的にTEdgeBrowserのインスタンスを作成して配置する必要があります。

また、タブを閉じる対応も必要となり、OnWinowCloseRequestedの対応が必要です。

その他諸々対応が必要なので、ソコソコソースコードは長くなるでしょう。

編集 削除
jhon  2022-09-29 10:32:04  No: 150559  IP: 192.*.*.*

mamさん ご親切にありがとうございます。
>TEdgeBrowserを使うことをお勧めします。
そうだったんですね。勘違いをしていました。

takaさんの内容も、
パスは通したつもりでしたが再度確認すると階層を間違えていて、再度、設定しなおすと
エラーはすべてなくなりましたが、URLを指定してもどういうわけかWebは開かないですね。
WebView2Loader.dllは 作成されたexeフォルダーに置いているのですが、なぜなのでしょう?

実行環境としては DELPHI10.4 windws10Homeです。

編集 削除
mam  2022-09-29 22:56:16  No: 150560  IP: 192.*.*.*

以下、外していたらすいません

(1)Microsoft WebView2 ランタイムのインストール
はされましたか。

dllは32bit用と64bit用の2つがありますが、どちらを配置されしたでしょうか。
32bitコンパイルするなら32bit版のdllを、64bitコンパイルするなら64bit版の配置が必要です。

編集 削除
jhon  2022-09-30 05:04:40  No: 150561  IP: 192.*.*.*

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.

編集 削除
mam  2022-09-30 05:46:20  No: 150562  IP: 192.*.*.*

最小構成は以下になります。


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.

編集 削除
jhon  2022-09-30 07:39:52  No: 150563  IP: 192.*.*.*

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;

編集 削除
mam  2022-09-30 07:53:29  No: 150564  IP: 192.*.*.*

当方delphi XE10.2で、上記ソースコードそのままで動いているので不思議ですね。

ないと思いますが、そのまま貼っただけではなく、フォームデザイナのForm1のイベントのOnCreateプロパティや、WVBrowser1のイベントのOnAfterCreatedプロパティに、イベントを与えていますよね?

編集 削除
jhon  2022-09-30 08:47:01  No: 150565  IP: 192.*.*.*

mamさん、久しぶりにDelphiを触ったのでイベントを与えていませんでした。
きちんと表示されました。お騒がせ致しました。
taget_blankの制御もコードを一部書き換えて実現出来ました。
皆様、本当にありがとうございました。

  //新しいブラウザウィンドウの要求URLを取得する
  aArgs.Get_uri(pUri);
  //showmessage('新しいブラウザウィンドウを開こうとしました'+
  //  #13#10+pUri);
    WVBrowser1.Navigate(pUri);
end;

編集 削除
jhon  2022-10-04 08:27:17  No: 150575  IP: 192.*.*.*

【追記】
その後、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;

編集 削除