TwebBrowserでTarget Blankさせない方法

解決


noby  2013-06-01 18:16:14  No: 44600

お世話になります。

TWebBrowserで表示しているブラウザの

LINKにTargetBlankが含まれている場合、IEが起動してしまいます。

それをWebBrowser1に表示させたいと思っています。つまり、常に

WebBrowser内で表示をさせる仕様としたいのですが。

以上、よろしくお願い致します。


takana  2013-06-01 18:48:33  No: 44601

WebBrowserのOnNewWindow2イベントを使えばどうでしょうか?

procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
begin
  WebBrowser1.Navigate(表示したいURL);
  Cancel := true;  //新しいウィンドウの起動をキャンセルするときにtrueを設定
end;

クリックされたURLを取得する方法は、私はわかりません。


  2013-06-01 22:26:16  No: 44602

使ったことありませんが、BeforeNavigate2イベントではどうでしょう。

procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);

キャンセルとURLがとれます。


けど  2013-06-02 02:48:25  No: 44603

「TWebBrowserでリンクを既定のブラウザで開くには」
https://www.petitmonte.com/bbs/answers?question_id=7126


noby  2013-06-02 08:52:57  No: 44604

takanaさん、あ  さん、けど  さん
ありがとうございます。

以下のソースで実行してみましたが、やはり新しいブラウザが開いて
しまいます。

---------------------------
WebBrowser1・・・表示用。
WebBrowser2・・・Width:=0;Height:=0にしておく。NewWindow用

usesにShellApiを追加。

procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
  var Cancel: WordBool);
var
  a: TObject;
begin
  //新しいウィンドウを開くとき、WebBrowser2に表示を任せる
  WebBrowser2.RegisterAsBrowser := True;
  ppDisp := WebBrowser2.Application;
  Cancel := False;
end;

procedure TForm1.WebBrowser2BeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  //WebBrowser2で開かれる前に渡されるURLでShellExecute。WebBrowser2のNavigateはキャンセル。
  ShellExecute(0, 'open', PChar(String(URL)), nil, nil, SW_NORMAL);
  Cancel := True;
end;


DEKO  2013-06-02 09:48:58  No: 44605

XE2 以降の (標準の) TWebBrowser なら、

procedure TForm1.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch;
  var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext,
  bstrUrl: WideString);
begin
  Cancel := True;
  WebBrowser1.Navigate(bstrUrl);
end;

OnNewWindow3 が使えると思います (けどさんのリンク先にも書いてありますが)。
それ以前なら MSHTML_TLB を取り込んで使うことになると思います。


Mr.XRAY  2013-06-02 10:05:12  No: 44606

こんちには,Mr.XRAY です.

>以下のソースで実行してみましたが、やはり新しいブラウザが開いて
>しまいます。

当然そうなりますね.そういうコードですから.
リンク先の文章をよく読んでください.

目的の仕様を実現するには,OnNewWindow3 イベントを使った方が確実です.
Delphi のバージョン等の環境が不明ですので,DEKO さんのレスを参考にしてください.
また,TEmbeddedWB というコンポーネントを利用するという手もあります.
リンク等はあえて示しません.自分で,検索語句を考えて調べてみてください.

TWebBrowser 関係は,過去に多くの方が質問したり,記事を書いています.


Mr.XRAY  2013-06-02 10:29:42  No: 44607

>LINKにTargetBlankが含まれている場合、IEが起動してしまいます。

これは,IE という新しいウィンドウが起動,開くわけです.
だから,新しい ( New ) ウィンドウ ( Window ) です.
そこで,何かが起こるのは,メッセージです.Delphi では多くのメッセージの処理を
イベントでとらえることができます.
つまり,New と Window のついたイベントを探します.
もし,なければ別のことを考えます.

ネットで検索する時も,検索語句によって検索結果が違ってきます.
例えば,「TargetBlank が含まれている場合」ではなく,
「ターゲットが _blank の場合」ですね.


takana  2013-06-02 18:06:50  No: 44608

ShellExecute(0, 'open', PChar(String(URL)), nil, nil, SW_NORMAL);

WebBrowser1.Navigate(URL);

に変更してください。
私の環境(Delphi 2005)では、うまくいきました。


noby  2013-06-02 18:56:04  No: 44609

akanaさん、あ  さん、けど  さん、DEKOさん、Mr.XRAYさん

たくさんの貴重なアドバイスありがとうございました。

なんとか以下のコードで実現出来ました。
(OnNewWindow3 )

ちなみに、DEL6Pです(XP、7)。

検索の仕方ももっと工夫しようと思います。

今後もよろしくお願い致します。
-----------------------------------------
procedure TForm1.WebBrowser1NewWindow3(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal;
  const bstrUrlContext, bstrUrl: WideString);

begin
        Cancel := True;
        WebBrowser1.Navigate(bstrUrl);
end;


Mr.XRAY  2013-06-02 20:13:01  No: 44610

>DEL6P

P ってなんですか ?


Mr.XRAY  2013-06-02 21:16:38  No: 44611

参考記事
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1186


noby  2013-06-02 21:16:52  No: 44612

すいません。pはパーソナル(無料版)のつもりでした。


Mr.XRAY  2013-06-04 17:01:29  No: 44613

>パーソナル(無料版)のつもりでした。

なるほど,最近はそう書くんですか !?
「俺は DEL6P と書くほどこの分野に精通しているんだ.お前らとは違うんだ」
というわけですね.人様に何かを教わろうとしている方が,ふざけた書き方するわけないですもんね.
私も時代に乗り遅れないように真似してみました.

[Delphi XE4 Fire Monkey プログラミングをするには] Mr.XRAY 2013/06/03(月) 20:34:32
https://www.petitmonte.com/bbs/answers?question_id=7998

ちなみに,私が非 Unicode 版のテストで主に使用しているのは,DEL2K7R2P ということになりますね(笑)
勉強になりました.


老害  2013-06-04 18:40:59  No: 44614

>Mr.XRAY氏
nobyさんは表記について謝罪していますよね。
間違いは誰にでもあることです。
あなたも過去に自分の環境で試さず見当違いの回答をしたことが何度もありますよね。
なのに何故そこまで執拗にネチネチ責め立てる必要があるのでしょうか。
はっきり言って気分が悪いです。
他の回答者に対しても、少しでも情報が欠けていたら同じように嫌味を言ってますし、
これでは質問者が萎縮してしまいコミュニティのためにならないと思います。


DEKO  2013-06-04 20:39:00  No: 44615

> 間違いは誰にでもあることです。
確かにそうです。

> あなたも過去に自分の環境で試さず見当違いの回答をしたことが何度もありますよね。
回答は義務ではなく、最初からパーフェクトな回答をできる事のほうが稀です。
環境を正しく書かない事と見当違いの回答はまったくの別問題です。

私の投稿で "XE2 以降の〜" とあるのは環境が書いてなかったからです。
この解決策もすべての Delphi で通用するものではなく、
例えば、Turbo Delphi Explorer だとポトリペタリはできません。

noby さんの環境が "Delphi 6 Personal" だったからまだよかったものの、
「実は Turbo Delphi Explorer です」
と後出しジャンケンされたらどうします?

Mr.XRAY さんの発言に行き過ぎた所があったかもしれませんが、
そもそも最初から環境を正しく書けば済む話だと思うのです。
それだけで条件が絞り込まれ、的確なアドバイスが貰える確率が上がるのですから。

> 他の回答者に対しても、少しでも情報が欠けていたら同じように嫌味を言ってますし、
> これでは質問者が萎縮してしまいコミュニティのためにならないと思います。
回答する側に立って考えてみれば解ると思うのですが、
後出しジャンケンされるとそれまでの議論がパーになる事があります。
解決策を提示した側の苦労と時間はどうなるのでしょう?
これでは回答者が辟易してしまいコミュニティのためにならないと思います。

...それと、人を批判するのなら貴方も名前を名乗りましょうか。
"老害" なんてハンドル名の方は見た記憶がないのですが。

言いたい事があるのでしたら (議論したいのでしたら)、
Delphi Forum へお越しください。文句も意見も歓迎しておりますよ。

[Delphi Forum]
http://ht-deko.minim.ne.jp/delphiforum/


Mr.XRAY  2013-06-04 23:04:01  No: 44616

DEKO さん,フォーローサンクスです.

ステハンなんかに反応はしたくないのですが (これも嫌味 ?),
「P ってなんですか ?」
と書いた後に,私は記事を書いています (リンクですが) 
もし,それを読んでいたら,"Delphi 6 Personal です" という反応があったと思います.
そうすれば,それで終わりだったと思います.今回の件については.

>あなたも過去に自分の環境で試さず見当違いの回答をしたことが何度もありますよね。

スミマセンね.何回もあります.サイトの記事も誤字脱字だらけです.
間違いの記事もあります.画面の上に表示されている自分のレスに赤面することもあります.
しかし,貴方とは違い,ちゃんとレスもしてしているも忘れないでください.

>はっきり言って気分が悪いです。
>他の回答者に対しても、少しでも情報が欠けていたら同じように嫌味を言ってますし、
>これでは質問者が萎縮してしまいコミュニティのためにならないと思います。

ということですので,貴方と,この掲示板の方が望むのであれは,ここでは発言しないようにします.
また,こんな人間の書いた記事も読みたくはないでしょう.
サイトも閉鎖します.言いたいところですが,ここまで管理してきたサイトですので,
できればご容赦下さればありがたいと思います.

Delphi Forum で返事をお待ちしています.
もし,来なければ,これからもこの掲示板で嫌味や皮肉をどんどん書いていきたい思います.
加速がつくかも知れません (笑)
≪黙っているということは,容認していることと同じである≫
と,誰かが言っていました.誰だかは失念しました.


嫌みったらしいわよ  2013-06-05 18:40:26  No: 44617

> なるほど,最近はそう書くんですか !?
> 「俺は DEL6P と書くほどこの分野に精通しているんだ.お前らとは違うんだ」
> というわけですね.人様に何かを教わろうとしている方が,ふざけた書き方するわけな> いですもんね.
> 私も時代に乗り遅れないように真似してみました.

  嫌みったらしい書き方だわ、これは・・・。
  こんな書き方する人でしたっけ???本当に本人??ひょっとしてなりすまし???


心は広く・・・  2013-06-05 18:54:16  No: 44618

心は広く、気は長く・・・。
ちょっと冷静になられては?


TAKA  2013-06-06 02:06:31  No: 44619

こんなにも性格が捻じ曲がった人だったとは。失望しました…。
DEKOさんが擁護されているのも残念です。
情報の漏れがあったとはいえ、あそこまで言われる理由はないと思います。
Delphiが閉鎖的なコミュニティと言われるのも理解できる気がします…。


TS  2013-06-06 03:58:25  No: 44620

>嫌みったらしい書き方だわ、これは・・・。 
普通  DEL6P とは書かれないと思います、突っ込みを入れたい気持ちは分かります、遊びの回答だと思います、問題ありません。

>こんなにも性格が捻じ曲がった人だったとは。失望しました…。
これは言い過ぎだと思います。

>Delphiが閉鎖的なコミュニティと言われるのも理解できる気がします…。
論理が飛躍しすぎています。

Mr.XRAYさんはとても親切な人です。
言いたい事がこの様な中傷で言えなくなるのは困ります。
回答者が親切丁寧に回答しなくてはいけない訳ではありません。

Mr.XRAYさんを理解されていない方が居ることは残念です。


  2013-06-06 04:06:19  No: 44621

もう少し穏やかにやりませんか。
環境の情報が不足していたとしても、「環境は何?」と一言聞けば済む
話で、もし漏れていて自分の手間になりそうだ、と感じたのであれば、
回答者は別段回答の義務を負っているわけでもなく、答えない自由も
持っているわけで、この対応は当然の話です。

ただ、他人が読んで不快になるような行為(書き込み)をするのは、
技術うんぬんの前にやはりどんな世界でも認められないと思います。
特に悪意なく情報を不備にしてしまっている方に対しては、それなり
の注意の仕方をしてもよいと思います。

XRayさんについては、ここで助けられた人も多いでしょう。私もあなた
に助けられたことのある一人です。今でも非常に感謝しています。
ただ、今回のようなケースに関しては、やはりもう少し相手を思いやった
対応をお願いしたいと思います。あなたのような貴重な指導者が、こんな
ことでご自身の評価を下げてしまわれかねないのは残念でなりません。

提供した情報に対して、相手から思うようなレスポンスがなかったときの
がっかりした気持ちは分かりますが、書き込む前に少しだけ周りのことを
考える時間をもうけてはいかがでしょうか。見ているのは質問の相手方
だけではありません。辛辣な書き込みが増えると、それは掲示板の雰囲気
の荒れ(悪化)、コミュニティの縮小につながってしまいます。
どんなコミュニティでも、結局は人対人のお話ですから。

※Xrayさんを攻撃しようとか、いなくなってほしいとか思って書いている
  のでは絶対にありません。その点だけは誤解しないでいただきたいと
  思います。


けど  2013-06-06 08:06:06  No: 44622

いまさらなんですが二つだけ気になった点をば

・謝った略し方を誰かから教えられて今まで誰からもツッコミがなかった
(全く本人に悪気がないというか事故)であった可能性もあるということ
もちろん質問をする限り出来るだけ正確に伝えなければいけませんが

>パーソナル(無料版)のつもりでした。
この時点で終わるなり
「そうですね、変に略したりせず正確に書くようにしてください」
でよろしかったのでは

・スレチ(というのかな)だと言うことは分かりますがここでの問題をすぐに
他のフォーラムに移動しましょう
というのはどうなんでしょう?
http://madia.world.coocan.jp/ なかでの雑談掲示板とかなら分かりますが

私はあちらも拝見させてもらってますが例えば五年後?とかに
必ず両者のリンクが生きているという保証もありませんし
また、こう言っては何ですがあちらのほうは常連さん方の
砕けた会話的な雰囲気があって
こちらではじめて質問してみた初心者さんではちょっと入りづらいものがありそうな気もします

なんかえらそうに書いてすんません


DEKO  2013-06-06 08:56:23  No: 44623

> ・スレチ(というのかな)だと言うことは分かりますがここでの問題をすぐに
> 他のフォーラムに移動しましょう
> というのはどうなんでしょう?

「匿名 (捨てハン) で文句だけ言って書き逃げするのはアンフェアだから、
意見があるならちゃんと議論できるトコでやりましょう」

...という "老害" 氏への提言だったのです。
フザけた "お名前" でなければ誘導なんかしなかったのですけどね。

> また、こう言っては何ですがあちらのほうは常連さん方の
> 砕けた会話的な雰囲気があって

え?砕けてない方がいいですか?
ガッチガチの業務調で書いてもいいですよ(^^;A

> こちらではじめて質問してみた初心者さんではちょっと入りづらいものがありそうな気もします

むしろ Q&A オンリーでない分敷居は低いと思います。
世間話のできるフォーラムもありますし。


けど  2013-06-06 09:21:26  No: 44624

あ、お呼びだてしてしまったようですみません

>...という "老害" 氏への提言だったのです。
確かにあの捨てハンは酷いと思いますがあくまでも名前欄ですから自分のことをへりくだって名乗っているんだととってあげましょう、というか最初私は素直にそんなハンドルなんだと思ってました
内容自体は理性的で暴言など含まれていませんでしたので

>え?砕けてない方がいいですか?
「常連さん方」のほうに少しだけ力を込めてキーを打ったのでしたw


悩める通りすがり  2013-06-10 09:29:17  No: 44625

ステハン、ステハンって言われますけど、そういうのって、自分のHNを決めることができたからですよね?
あるHNをずっとずっと使ってきたはずなのに、誰かに使われていたら、どうすればいいの?元祖○○?本家○○?
めんどくせえ「通りすがり」でもいいや。
そして、これを使いつづけてもステハン?

初めて書き込むけど、HNを考えるのがめんどくさい。
そもそもHNを考えることが本題じゃなく、質問の内容が本題だ!と
適当な名前で質問したけど、次回以降は、いいのが思いついたから使う。
初回質問はステハン?

なんか気分変えたくてHN変えるわ ==> 書き込み ==> やっぱ戻すわ
一時的に使ったHNはステハン?

HNは何回使ったらステハンじゃなくなるんですか?

適当な文字の羅列もだめですか?
「あ」さんなんて、正直、適当にもほどがありますけど、いいんですか?
「くぁwせdrftgyふじこlp」との違いはなんですか?

口に出して読めるか読めないか?
「天使」と書いて「みっしぇる」とかキラキラネームだと、ちょっと読めませんね。

悪質なステハンだっているけど、コテハンになれないステハン使いだっているんですけど、だめなんですか?

某有名RPGとか、平気で「ああああ」とかでプレイするんで、HNなんて思いつかないの。
いっそのこと、「勇者ああああ」にでも、すればいいですか?(やけくそ


TS  2013-06-10 17:42:49  No: 44626

悩める通りすがり さんへ

個人的な意見ですが命名はかなり自由で良いと思います。

ただ、「名は体を現す」と言いますが、ステハンされる
人に回答しても放置されたりする確率が高い事、
「老害」「嫌みったらしいわよ」等、発言を聞くまでも
無く毒を吐く行為を行う人が多いので始めからステハン
に対しては拒否反応を起こしてしまうと言う事だと思います。


take  2013-06-10 17:57:34  No: 44627

本題と話題がズレていってますね。
新たな質問がないからかな?

ここは数少ないDelphiのコミュニティですから
ほかのサイトみたいに閉鎖されないことを祈ります。

管理とか返信が自分の思い通りにいかないことはわかりますが
じゃあ自分でサイトを立ち上げろというのも難しい話ですよね。

私も古い人間なので一部補足しましょう。
その昔は掲示板に書き込む行為は、いわゆるコテハン必須だったのです。
※しかも有料
ですから自然と発言には責任を伴いました。

時は流れて現代、無料で名前なしで書き込む事が出来るようになり
敷居は下がりましたが、無責任な発言も増えました。

そこで「自分は発言に責任を持ちますよ」と固定で名前を
付けるようにできたのがコテハンです。

ID制になった今では、名前は好きに付けられるようになりましたが
実際はみなさんコテハンみたいなものですよ。

ちなみに私も名前を考えるのが苦手で、RPGでは1時間ほど悩みます。
それで始めて、結局途中から変えたくなって
最初からやり始める事もしばしば

本題とズレてるって指摘した私が一番ズレているかも


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

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






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