WebBrowserでリンクをIEではなく、作っているブラウザで新しいウィンドウで開くには?


Delphi初心者  2004-07-11 02:43:14  No: 9861

Delphi初心者です。
Microsoft Internet Controlを使って現在ブラウザを作っているのですが、
タイトルの通り、リンクを新しいウィンドウで開こうとすると、
作っているブラウザではなく、IEが起動してしまいます。
それで調べてみて、OnNewWindow2というイベントが関係しているのは
分かったのですが、具体的な解決策がわかりません。
どなたか教えていただけないでしょうか?
環境はWinxp home でDelphi 6 Personalを使っています。
よろしくお願いします。


TtPIPICH  2004-07-11 07:58:51  No: 9862

onNavigateか何かでできるはずです
http://delphi.sakura.vg/index2.html


Delphi初心者  2004-07-11 20:28:02  No: 9863

OnNavigateとは
OnNavigateError イベントのことでしょうか?


はてな?  2004-07-11 21:14:43  No: 9864

質問がチョット曖昧なんですけど...
リンクをIEで開くのではなく、自前の新しい別のWebBrowserウィンドウに表示したいということですか?
それとも、別のウィンドウを開かずに、元のWebBrowserに表示したいということですか?


Delphi初心者  2004-07-11 22:24:14  No: 9865

「リンクをIEで開くのではなく、自前の新しい別のWebBrowserウィンドウ」
で表示したいと言うことです。
説明不足ですいません…


TtPIPICH  2004-07-11 22:27:02  No: 9866

http://delphi.sakura.vg/index2.html
のサンプルを見てください
タブブラウザのサンプルだったと思います


TtPIPICH  2004-07-11 22:29:35  No: 9867

先ほどのサイトから引用
procedure TIEWindow.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
var
  Child:TIEWindow;//ウインドウの型
begin
  Child := TIEWindow.Create(Application);//ウインドウを作成
  ppDisp := Child.WebBrowser1.Application;
end;


Delphi初心者  2004-07-11 23:12:05  No: 9868

http://delphi.sakura.vg/index2.html
はどうも参考にしていたサイトなのですが、
MDIのやり方は書いてるみたいなんですが、SDIのやり方は…

>先ほどのサイトから引用
指定するウィンドウの型を自前のフォームに直してやってもIEが起動しなくなるだけでした…


トーク  2004-07-12 01:33:02  No: 9869

1つのフォームに2つのWebBrowser(WebBrowser1とWebBrowser2)が
あるとして、WebBrowser1で新しいウインドウを開く時は、
WebBrowser1NewWindow2のイベントですから、
その時ppDispにWebBrowser2を渡せば、
望み通りの処理になるのではないでしょうか。

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
  ppDisp := WebBrowser2.Application;
end;

外してたらすいません。


TtPIPICH  URL  2004-07-12 05:25:25  No: 9870

ShellExecuteで自分自身を起動し引数でURLを渡しCancel:=True;
ShellExecute(Handle, 'open',PChar(application.ExeName),PChar({開くアドレス}),'', SW_SHOWNORMAL);
FormのonCreateでnavigate(ParamStr(1));
URLの取得方法が不明


はてな?  2004-07-13 05:41:40  No: 9871

>>先ほどのサイトから引用
>指定するウィンドウの型を自前のフォームに直してやってもIEが起動しなくなるだけでした…

MDIでは作成したフォームがデフォルトで表示されるけれど、SDIではデフォルトで非表示なので…

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
begin
  with TForm1.Create(Application) do begin  // 自前の新フォームで
   Top := TForm(TOLEControl(Sender).Parent).Top + 20;
   Left := TForm(TOLEControl(Sender).Parent).Left + 20;
   WebBrowser1.RegisterAsBrowser := True;
   ppDisp := WebBrowser1.DefaultDispatch;
   Show;                                    // SDIでは Show が必要
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;                        // 作成したフォームは閉じる時に破棄
end;


TtPIPICH  URL  2004-07-13 06:25:50  No: 9872

るるとん@Kです
はてな?氏の方法ではメインフォームを閉じるとアプリが終了し全て閉じてしまいます


TtPIPICH  URL  2004-07-13 17:07:11  No: 9873

var WindowCount:integer=0;
メインフォームは非表示にして
ブラウザウインドウのonCreateで
inc(WindowCount);
ブラウザウインドウのonCloseで
dec(WindowCount);
で、0になったらメインフォームを閉じる


縦巻髪  2004-07-24 10:44:23  No: 9874

これでどうでしょうか?>Delphi初心者さん

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
  Cancel := False;
  ppDisp := WebBrowser2.ControlInterface;
end;

procedure TForm1.WebBrowser2BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  ShellExecute(Handle,'OPEN',PChar(ParamStr(0)),PChar(URL),'',SW_SHOWNORMAL);
  Cancel := True;//うまく動作しない場合はこの行を消す 
end;

(WebBrowser1はWeb表示用で、WebBrowser2は新しく開くブラウザにURLを渡すのに使うため、
WebBrowser2をWebBrowser1の後ろに隠すか、WebBrowser2.VisibleをFalseにする)

で、FormCreate時に次の処理を行なわせれば、自前の新しい別のWebBrowserウインドウが開くはずです。

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate(ParamStr(1));
end;


縦巻髪  2004-07-24 10:58:30  No: 9875

ごめんなさい、上のやり方では多分エラーが出ます。
WebBrowser2BeforeNavigate2を以下のように修正してください。

procedure TForm1.WebBrowser2BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
var
  newURL: String;
begin
  newURL := URL;
  ShellExecute(Handle,'OPEN',PChar(ParamStr(0)),PChar(newURL),'',SW_SHOWNORMAL);
  Cancel := True; 
end;


TtPIPICH  2004-07-26 01:09:09  No: 9876

こちらのほうが良いです
procedure TForm1.WebBrowser2BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  ShellExecute(Handle,'OPEN',PChar(ParamStr(0)),PChar(string(URL)),'',SW_SHOWNORMAL);
  Cancel := True; 
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加