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

タイトル Re^7: withEventsで生成したInternetExplorerが捕捉できない
投稿日: 2015/04/11(Sat) 01:00
投稿者魔界の仮面弁士
> 書き方って難しいですね。For Eachのコードは標準モジュールに書いています。
> それ以外はフォームモジュールです。
> なので競合はしていないかと。
VB6 では、WithEvents を標準モジュールに書けないので、
フォームモジュール等に置く、というのは分かりますが…いずれにせよ
各コードが何処においてあるかは、今回の本質では無いように思います。


そもそも、For Each は何のために必要なのでしょうか?

毎回 For Each でのサーチが必要なのだとすれば、それは、
複数起動されている IE を扱っているという事を意味しますよね。

ですが現在のコードは、WithEvents で管理している IE は一つだけのようです。
それゆえ終了検知も、特定の1インスタンスしか拾えないことになりますが、
それで十分なのであれば、For Each の出番自体が無くなってしまいます。


あるいは、たとえば10個のIEを扱うなら、WithEvents も10個用意しておかないと無意味ですし、
自アプリから起動したものを拾うだけなら、For Each で再列挙の必要もなさそう。

もしも IE の同時起動数が不定で、WithEvents を事前に用意できないなら、
「コントロール配列」のようにイベントを管理するコレクションクラスを
独自に用意してそこに集約させるとか、あるいはイベントシンクを直接 Advise するなど、



> タブも単一を想定しており、その後ユーザーがほかのサイトに移動したとしてもそれを考慮する
> つもりはありません。
であれば、No16105 の方法をベースにして対処できないでしょうか?

ShellWindows だと、アプリ以外で起動されたものまで拾ってしまいますが、
アプリで起動した IE だけを管理すれば良いのなら、そもそも列挙しなおす必要は無いわけで。


VB6 入りの環境が手元にないので、掲示板に直書きのコードですが、
イメージ的にはこんな感じ。
最大化等のコード等は省いていますので、必要に応じて追加してみてください。

Option Explicit
Private WithEvents IE As InternetExplorer
Private Sub Command1_Click()
 If IE Is Nothing Then
    Set objIE = OpenIE(List1.Text)
 Else
  IE.Navigate2 List1.Text
 End If
End Sub
Private Sub IE_OnQuit()
 Set IE = Nothing
End Sub
Private Sub Form_QueryUnload(…
 If Not IE Is Nothing Then IE.Quit
End Sub

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

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