WebBrowserでスクロールバーの位置を設定するには?

解決


KenGo  2004-04-02 02:20:05  No: 82823  IP: [192.*.*.*]

TextBoxに書かれたHTMLタグをリアルタイムにWebBrowserに表示するプログラムを作っています。

Private Sub Text1_Change()
    Dim Contents As String
    Dim FileName As String
    
    Contents = Text1.Text
    FileName = "C:\temp.htm"

    Open FileName For Output As #1
    Print #1, Contents;
    Close #1
    
    WebBrowser1.Navigate "C:\temp.htm"
End Sub

とりあえずこんな感じでやってみているんですが、(この時点で相当無駄なことをしているかもしれませんが…)
これだとWebBrowserに表示されるHTMLが大きくなって垂直スクロールバーが表示されるようになると、
毎回スクロールバーが一番上に戻ってしまいます。
TextBoxに文字を入力する前にWebBrowserのスクロールバーの現在の位置を記憶して、
文字を入力した後にスクロールバーを記憶した位置にセットしようと思っているのですが上手くいきません。
どなたか分かる方いましたら教えてください。よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-04-02 09:26:38  No: 82824  IP: [192.*.*.*]

> この時点で相当無駄なことをしているかもしれませんが
問題無いと思いますよ。
WebBrowserにHTMLを表示させるには、幾つかの方法がありますが、
htmlファイルを作成して、そのパスをNavigate2(Navigate)するのは、
一時ファイルを作らなければならない、という点にさえ目をつぶれば、
比較的手軽な方法ですし。

> スクロールバーを記憶した位置にセットしようと思っているのですが
スクロール制御は、
  windowオブジェクトのscroll/scrollBy/scrollToメソッド
を使う事ができます。
あるいは、
  textRangeオブジェクトのscrollIntoViewメソッド
を使うこともできます。これらのメソッドについて調べてみてください。

例えば、scrollToを使ってピクセル単位でスクロールさせるなら、
  WebBrowser1.Document.parentWindow.scrollTo 0, 300
という感じです。

なお、window や textRangeは、WebBrowser自信の機能ではなく、
MSHTMLの機能です。(ダイナミックHTML、DOMと呼ばれる事もあります)

HTMLではなく、Excel文書を表示させているなら、Excelの機能
(ScrollRowプロパティなど)で制御する事になります。つまり、
WebBrowserに表示させている物によって、扱い方は異なるわけです。

編集 削除
KenGo  2004-04-02 12:47:36  No: 82825  IP: [192.*.*.*]

魔界の仮面弁士さん、レスありがとうございます。
scrollToを使って無事ウィンドウをスクロールすることはできたのですが、
値の取得はどのようにしたら可能でしょうか?
いろいろ調べたんですが分からなくて・・・。

編集 削除
IMA  2004-04-04 08:29:23  No: 82826  IP: [192.*.*.*]

こんにちはKenGoさん。
横から失礼します。

困難が予想される原因
・TextBoxのカレット位置はマウス等で前後どこへも移動できるので、前回位置を
  基準にはできない。
・Text1_Changeイベントは1文字でも変化すると発生する?ので表示文字列・タグ文字列
  javascript文の判断が困難

私が思いつく簡単なものは問題点も多いので、補完方法などを
考慮してご検討ください。


TextBoxの現在のカレット位置近傍のテキスト表示される文字列(タグ等で無い部分)
を適当な長さ取得しWebBrowser上でfindTextメソッドで検索・移動する。
  ↑正規検索などで取得できますが、javascriptの文字列など除外する必要もあります。

問題点
・検索文字列が複数ヒットする場合は誤った位置を取得することがあるので、
  何個ヒットしたか確認し、そのどれが正しいものかを判断する必要がある。
・検索文字列が反転されるので、解除必要
・検索文字列を画面中央位置にする為に、再度scrollし修正する必要も有る

参考リンク
(http://tomizawa-web.hp.infoseek.co.jp/index.htm)
http://tomizawa-web.hp.infoseek.co.jp/dom.htm
          ↓
http://tomizawa-web.hp.infoseek.co.jp/property/scrollTop.htm

scrollHeight:スクロールの高さを取得
scrollWidth: スクロールの幅を取得
scrollTop:   スクロールの上側の座標を設定するか取得
scrollLeft:  スクロールの左側の座標を設定するか取得

編集 削除
KenGo  2004-04-06 14:46:26  No: 82827  IP: [192.*.*.*]

IMAさん、レスありがとうございます。

IMAさんが書いていただいたのは、TextBoxに入力した文字列の場所に
WebBrowserのスクロール位置も動かすようでしたが、
単純に"C:\temp.htm"に保存したファイルを開く前と開いた後で
スクロール位置を同じにしたかっただけなので、
IMAさんに教えていただいたscrollLeftとscrollTopを使って無事解決しました。
魔界の仮面弁士さんとIMAさん、ありがとうございました。


プログラムは下記のようになりました。

Private Sub Text1_Change()

    Dim Contents As String
    Dim FileName As String
    
    Contents = Text1.Text
    FileName = "C:\temp.htm"

    Open FileName For Output As #1
    Print #1, Contents;
    Close #1
    
    x = WebBrowser1.Document.Body.scrollLeft
    y = WebBrowser1.Document.Body.scrollTop
    WebBrowser1.Navigate "C:\temp.htm"
    WebBrowser1.Document.parentWindow.scrollTo x, y

End Sub

編集 削除