タブを使ったウェブブラウザを作成しているのですが、ウェブブラウザの切り替え(表示、非表示)がうまくできないので教えてください。
タブはTabStripを使用し、ウェブブラウザはコントロール配列を使っています。タブ番号の取得は別途作成したDLLにより取得しています。DLLの動作は正常です。それでコマンドボタンをによりウェブブラウザ、タブ、タブの数を数える変数"TabCount"を増やしています。下のプログラムはタブをクリックした時のものです。
Dim Count As Integer 'カウンタ変数
Dim TabNum As Integer '左クリックしたときのタブの番号を入れる変数
TabNum = タブ番号を取得するDLL
For Count = 0 To TabCount
WebBrowser1(Count).Visible = False
Next Count
WebBrowser1(TabNum).Visible = True
動作的には0〜TabCount分のウェブブラウザを全部非表示にして、押されたタブ番号のウェブブラウザを表示するというものです。
何がうまくいかないのかというと、タブを3個増やしたとします。(タブは4つ)それでタブの2つ目をクリックしてもウェブブラウザが表示されません。タブの3つ目、4つ目も同様です。しかしタブの1つ目は正常に動作するんです。TabStripの後ろに隠れているということはないようですし、ウェブブラウザも正常にロードされています。
よろしくお願いします。
どうも原因は他のところにあったようで、フォームのリサイズをするプロシージャがだめなようでした。
Private Sub Form_Resize()
Dim Count As Integer
'タブ全体のサイズ変更
TabCtrl.Top = Form1.ScaleTop + 1500
TabCtrl.Left = Form1.ScaleLeft
TabCtrl.Height = Form1.ScaleHeight - 1500
TabCtrl.Width = Form1.ScaleWidth
'ウェブブラウザのサイズ変更
For Count = 0 To TabCount
WebBrowser1(Count).Top = TabCtrl.Top + 320
WebBrowser1(Count).Left = TabCtrl.Left
WebBrowser1(Count).Height = TabCtrl.Height - 380
WebBrowser1(Count).Width = TabCtrl.Width - 50
Next Count
End Sub
リサイズのプロシージャは上のようなプログラムになっているのですが、このプロシージャを消すと正常に切り替えができているようです。(タブをウェブブラウザの位置が違うため切り替わっているのが確認できました。)そのため、上の質問で書いた"TabStripの後ろに隠れているということはないようですし"というのは間違っていたようで実際は隠れていると言うことになると思います。ただ、なぜ隠れるのかがわかりません。この隠れる現象が何とかなれば大丈夫だと思うのですが。。。
引き続きよろしくお願いします。
上のTabCtrlというのはTabStripのことです。
編集 削除これだけで原因を特定することは無理です。
WebBrowser1(TabNum).Visible = True
これをコメントアウトすると、全ての WebBrowser1は
非表示になるのですか?
>これだけで原因を特定することは無理です。
そうでしたか。。。
>WebBrowser1(TabNum).Visible = True
>これをコメントアウトすると、全ての WebBrowser1は
>非表示になるのですか?
コメントアウトしたところ実行直後は表示されていますが、タブのどれかを押すことにより非表示になります。
>コメントアウトしたところ実行直後は表示されていますが、タブのどれかを押すことにより非表示になります。
最初に書かれたコードは、タブのどれかを押したら実行されますので、当然そうなりますよね。
この様態で、プログラムを中断して、イミディエイトウィンドウで
WebBrowser1(TabNum).Visible = True
としたらどうなりますか?(TabNumには数字を入れてね)
やり方が間違っているかもしれませんが。。。
1.タブをいくつかふやす(ここでは4つ)
2.中断を押す
3.イミディエイトウィンドウでTabNumの数値をいれる(0〜3)
やり方としてはこのようでいいのでしょうか?
このやり方でやってTabNumの数値を0〜3まで入れていきましたが、1〜3は更新ボタンを押したような感じ(視覚的に変化)になったのですが、0に関してはイミディエイトウィンドウ上でカーソルが下へ下へ行ってしまいます。
また、1〜3で切り替わった感じがしたと書いたのですが、正確には切り替わっていません。0以降のウェブブラウザはgoogleが設定されているのですが、(ちなみに0はyahoo)1〜3を入れてもyahooのページが表示されています。
こうしましょう
1. WebBrowser1(TabNum).Visible = Trueをコメントアウトする。
2.タブをいくつかふやす(ここでは4つ)
3.WebBrowser1(TabNum).Visible = Trueが書かれているSubのEnd Subにブレークポイントを設定する。
これでWebBrowser1が全て表示されていないことを確認する。
4.イミディエイトウィンドウで WebBrowser1(0).Visible = Trueをやってみる。
5.イミディエイトウィンドウで WebBrowser1(0).Visible = False、 WebBrowser1(1).Visible = Trueをやる
これでどうなりますか。
ブレークポイントを設定するとイミディエイトウィンドウに入力することができないのですが。。。また、実行前にイミディエイトウィンドウに入力し、Enterを押すとSubまたはFunctionが設定されていませんと表示されます。
編集 削除イミディエイトウィンドウを表示するのは、タブを選択して
ブレークポイントで中断してからです。
返事が遅くなってすみません。
それでやってみたのですが、Webbrowser1(0)に関してはTrue、Falseともに正常に動作しましたが、Webbrowser1(1)はうまく動作しませんでした(表示されませんでした)。
>Webbrowser1(1)はうまく動作しませんでした(表示されませんでした)
エラーも出ないし、表示もされないなどということは無いと思いますが。
何度やっても表示されません。
ためしにタブを一個増やし、WebBrowser1(2).Visible = True
とやってみたら"コントロール配列要素2がありません"と表示されたので
WebBrowser1(1)はロードされているのだと思います。
やはりタブの後ろに隠れているのだと思うのですが。。。
>>やはりタブの後ろに隠れているのだと思うのですが。。。
単にTabStripのVisibleをFalseにしてみればわかるのでは・・・?
この記事、すごくないですか?
http://kiss0808.blog19.fc2.com/
ありゃー!
WebBrowser1(1)を追加した時、ZOrderを設定してありませんか?
WebBrowser1(1).ZOrder 0
としてください。
途中で変な物が足跡つけたので気が散った。
TabStripのSelectedItem.Indexは1ベースで、
WebBrowserの配列は0ベースの為、其のままだと
1つずつずれるのね、昔作ったタブブラウザーを参考にどうぞ。
Option Explicit
Dim url(0 To 1, 0 To 3) As String
Const NoOfTab = 4
Private Sub Form_Load()
Dim n As Integer
Me.Caption = "タブブラウザー"
url(0, 0) = "google": url(1, 0) = "http://www.google.co.jp/"
url(0, 1) = "yahoo": url(1, 1) = "http://www.yahoo.co.jp/"
url(0, 2) = "goo": url(1, 2) = "http://www.goo.ne.jp/"
url(0, 3) = "msn": url(1, 3) = "http://www.msn.co.jp/home.armx"
For n = 1 To NoOfTab - 1
Load WebBrowser1(n)
TabStrip1.Tabs.Add
TabStrip1.Tabs(n + 1).Caption = url(0, n)
Next
TabStrip1.Tabs(1).Caption = url(0, 0)
With WebBrowser1(0)
.Visible = True
.Navigate2 url(1, 0)
.ZOrder 0
End With
Form_Resize
End Sub
Private Sub Form_Resize()
Dim n As Integer
With TabStrip1
.Left = 0
.Top = 0
.Width = Me.Width - 100
.Height = Me.Height - 500
End With
For n = 0 To TabStrip1.Tabs.Count - 1
With WebBrowser1(n)
.Top = TabStrip1.ClientTop
.Left = TabStrip1.ClientLeft
.Width = TabStrip1.ClientWidth
.Height = TabStrip1.ClientHeight
End With
Next
End Sub
Private Sub TabStrip1_Click()
Dim n As Integer
For n = 0 To TabStrip1.Tabs.Count - 1
WebBrowser1(n).Visible = False
Next
WebBrowser1(TabStrip1.SelectedItem.Index - 1).Visible = True
WebBrowser1(TabStrip1.SelectedItem.Index - 1).ZOrder 0
WebBrowser1(TabStrip1.SelectedItem.Index - 1).Navigate2 _
url(1, TabStrip1.SelectedItem.Index - 1)
End Sub
ZOrderにより表示させることができました。
>>通ってみたさん
TabStripを非表示にするとタブがクリックできないので。。。
ねろさんのプログラムぜひ参考にさせていただきます。
ありがとうございました。
>>TabStripを非表示にするとタブがクリックできないので。。。
いや・・・
表示されない→タブの後ろにあるのでは?→タブ押してWebBrowser増やしたら同時にVisibleをFalseにしてみれば後ろにあればそいつが表示されるので確認できる
という流れだったんですが・・・まぁ解決したのでいいけど
「こうなんじゃないか?」と思ったら、それを確認する方法を考えるのも大事なことだと思いますよ