tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^5: withEventsで生成したInternetExplorerが捕捉できない
投稿日: 2015/04/10(Fri) 18:15
投稿者魔界の仮面弁士
これ、実際のコードをそのまま貼った物では無いですよね。
実行するまでも無くコンパイルエラーになりそうな箇所さえありますし…。


それはさておき:

> Private WithEvents objIE as InternetExplorer
フォームモジュールレベルの変数「objIE」と

> Private sub Command1_Click
>     Dim objIE As Object
プロシージャーレベルの変数「objIE」が競合していますよね。


ですから、Command1_Click 内で幾ら objIE を参照しても、
それは WithEvents 変数とは無関係になってしまう、ということです。


このコードには、他にもいろいろな問題点を抱えていますが、とりあえず
今回の主題である WithEvents の件から片付けてしまいましょうか。

そのためにまずは、For Each で使われているループ変数と、
WithEvents のための変数を、別の変数名に置き換えることから
はじめてみてください。



> 既に開いていたらそれを、なければNavigateとしたいのですが
まず、この仕様自体もかなり曖昧になっていますよ。

たとえば、IE が 2 つ起動されていたと思ってください。
A は Apple、B は Google を表示している状態です。

ここで新たに、Microsoft のサイトを開きたいとした場合、

 (1) A で開く(Apple のサイトは見えなくなる)
 (2) B で開く(Google のサイトは見えなくなる)
 (3) C で開く(新たにもうひとつ IE を開く)
 (4) A または B で開く(既存のウィンドウのいずれかで開く)

のどれにしたいのでしょうか?


仮に(4) だとしたら、A と B を区別する必要は無いので、
LocationURL や HWND の出番は無いはずです。

一方、(1) や (2) だとするのなら、どういう時に A (あるいは B)を
選択するのか明らかにしてもらわないと、仕様が曖昧すぎて回答できないです。
とはいえ、「極力同じ IE を使い続ける」のが目的なのだとすれば、
WithEvents 変数一つだけで事足りますので、そもそも For Each は不要となります。


さて、問題は (3) のケース。もしもこのパターンを望んでいるんだとしたら、
再度、同じURL(Microsoft のサイト)を開きなおしたい場合に、

 (5) C を再利用してそこに Navigate
 (6) C とは別に D のウィンドウを開く

のどちらにしたいのかが、今までの質問からは読み取れませんでした。


もし (6) なのだとしたら、そもそも For Each での列挙は不要でしょう。
常に新しい IE を起動するだけなので、WithEvents も For Each も不要で、
毎回 OpenIE を呼び出すだけで事足ります。


一方 (5) の場合はどうかというと、これは現状のコードでは不十分に見えます。
たとえばユーザーが、A で Apple ではなく Microsoft を表示し始めてしまい、
C では Microsoft ではなく、Amazon に遷移させていたとします。
この場合、LocationURL で判断すると、C ではなく A で Navigate しちゃいますよね。

その場合は A で表示したい、というのであればそれでも良いですが、
問題は先ほど表示した C で表示させたいケース。LocationURL に加えて HWND を
併用すれば良いかといえば、これも怪しいところ。一つの IE 上で複数のタブが開かれていた場合、
同じウィンドウハンドルを持つ複数の InternetExplorer が存在することがありえるからです。

もし、HWND も LocationURL も合致するウィンドウが複数あったら、
そのなかのどれを Navigate するのか、曖昧なままですよね。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。