Delphi初心者です。
Microsoft Internet Controlを使って現在ブラウザを作っているのですが、
タイトルの通り、リンクを新しいウィンドウで開こうとすると、
作っているブラウザではなく、IEが起動してしまいます。
それで調べてみて、OnNewWindow2というイベントが関係しているのは
分かったのですが、具体的な解決策がわかりません。
どなたか教えていただけないでしょうか?
環境はWinxp home でDelphi 6 Personalを使っています。
よろしくお願いします。
onNavigateか何かでできるはずです
http://delphi.sakura.vg/index2.html
OnNavigateとは
OnNavigateError イベントのことでしょうか?
質問がチョット曖昧なんですけど...
リンクをIEで開くのではなく、自前の新しい別のWebBrowserウィンドウに表示したいということですか?
それとも、別のウィンドウを開かずに、元のWebBrowserに表示したいということですか?
「リンクをIEで開くのではなく、自前の新しい別のWebBrowserウィンドウ」
で表示したいと言うことです。
説明不足ですいません…
http://delphi.sakura.vg/index2.html
のサンプルを見てください
タブブラウザのサンプルだったと思います
先ほどのサイトから引用
procedure TIEWindow.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
var
Child:TIEWindow;//ウインドウの型
begin
Child := TIEWindow.Create(Application);//ウインドウを作成
ppDisp := Child.WebBrowser1.Application;
end;
http://delphi.sakura.vg/index2.html
はどうも参考にしていたサイトなのですが、
MDIのやり方は書いてるみたいなんですが、SDIのやり方は…
>先ほどのサイトから引用
指定するウィンドウの型を自前のフォームに直してやってもIEが起動しなくなるだけでした…
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;
外してたらすいません。
ShellExecuteで自分自身を起動し引数でURLを渡しCancel:=True;
ShellExecute(Handle, 'open',PChar(application.ExeName),PChar({開くアドレス}),'', SW_SHOWNORMAL);
FormのonCreateでnavigate(ParamStr(1));
URLの取得方法が不明
>>先ほどのサイトから引用
>指定するウィンドウの型を自前のフォームに直してやっても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;
るるとん@Kです
はてな?氏の方法ではメインフォームを閉じるとアプリが終了し全て閉じてしまいます
var WindowCount:integer=0;
メインフォームは非表示にして
ブラウザウインドウのonCreateで
inc(WindowCount);
ブラウザウインドウのonCloseで
dec(WindowCount);
で、0になったらメインフォームを閉じる
これでどうでしょうか?>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;
ごめんなさい、上のやり方では多分エラーが出ます。
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;
こちらのほうが良いです
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;
ツイート | ![]() |