WebブラウザコントロールでリッチテキストボックスのSelLengthと同じ情報を取得するには?

解決


マロン  2005-05-21 16:19:35  No: 89950

皆様はじめまして。マロンと申します。

早速質問なのですが、リッチテキストボックスに何か文字列を表示させておき、マウスでその文字列をドラッグして反転させると、SelChangeというイベントが発生します。そしてSelLengthというプロパティに反転した文字列の長さがセットされますよね。
これと同じ情報をWebブラウザコントロールで得ようとする場合には、どのような方法があるのでしょうか。

いろいろ調べたのですが、まったく解決の糸口がつかめません。
そもそも、Webブラウザコントロールに表示されているHTMLページの文字をマウスでドラッグした場合、発生するイベントがないようなのですが、何か方法があるのでしょうか。
もしご存知の方がいらしたら教えて頂けないでしょうか。よろしくお願いします。


魔界の仮面弁士  2005-05-22 02:06:28  No: 89951

> 文字をマウスでドラッグした場合、発生するイベント
→ onselectstartイベント, onselectイベント, onmouse系イベントでは如何でしょう。

> SelLengthと同じ情報
→ TextRangeオブジェクトを取得後、そのtextプロパティの長さを調べてみてください。


マロン  2005-05-22 03:36:17  No: 89952

早速のお返事ありがとうございます。
私はVB6.0を使っているのですが、ブラウザコントロールに「onselectstartイベント, onselectイベント, onmouse系イベント」というのがないんです。
VBのデザイン画面でon〜とあるのは、
  OnFullScreen
  OnMenuBar
  OnQuit
  OnStatusBar
  OnTheaterMode
  OnToolBar
  OnVisible
なんですが、どのようにしたらおっしゃるようなイベントを使うことができるのでしょうか。


魔界の仮面弁士  2005-05-22 05:26:43  No: 89953

WebBrowserは、HTMLだけでなく、Word, Excel, フォルダなどといった、
各種ドキュメントを表示する事ができますよね。ですから、表示する
ドキュメントによって、取り扱えるイベントもプロパティも異なります。

文書固有のイベントを扱う場合には、WebBrowserオブジェクト自体の
イベントではなく、その内に表示したHTMLドキュメント、すわなち、
WebBrowser1.Documentが返すオブジェクトのイベントを利用してください。


マロン  2005-05-22 06:37:27  No: 89954

なるほど。でもすみません。私にはいまいちピンと来ません。
もしかしたらすごく初歩的な質問なのかも知れませんが、教えてください。

WebBrowser1でHTMLを表示させている状態でマウスをドラッグする場合、具体的にどのようにコードを記述すれば、WebBrowser1.Documentというイベントを認識することができるのでしょうか。


pi  2005-05-23 02:17:30  No: 89955

参考。
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q246/2/47.ASP&NoWebContent=1


魔界の仮面弁士  2005-05-23 02:31:38  No: 89956

> WebBrowser1.Documentというイベントを認識することが

WebBrower1.Documentはイベントではありません。プロパティです。
そのプロパティから、固有のオブジェクトを取得し、
そのオブジェクトごとに適したイベントを使いましょう、という事です。

具体的には、個々のオブジェクトに適したタイプライブラリを参照設定し、
それらを、「WithEvents」宣言付きの変数で受け取ります。

  Private WithEvents Body As MSHTML.HTMLBody
  Private WithEvents Sheet As Excel.Worksheet
  Private WithEvents FolderView As Shell32.ShellFolderView
        :
        :

そして、ドキュメントの読み込み完了後、それぞにあった型の変数に、
WebBrowser1.Document を渡してやればOKです。

  Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
   If TypeOf WebBrowser1.Document Is MSHTML.HTMLDocument Then
     Set Body = WebBrowser1.Document.Body
   ElseIf TypeOf WebBrowser1.Document Is Excel.Workbook Then
     Set Sheet = WebBrowser1.Document.Sheets(1)
   ElseIf TypeOf WebBrowser1.Document Is Shell32.ShellFolderView Then
     Set FolderView = WebBrowser1.Document
   ElseIf ………
      :
      :
   End If
 End Sub

そうすれば、個々のイベントを拾うことができるようになります。
  Private Function Body_onselectstart() As Boolean
    Debug.Print "HTML:選択開始"
    Body_onselectstart = True   '選択を許可
  End Function
  Private Sub Sheet_SelectionChange(ByVal Target As Excel.Range)
    Debug.Print "Excel:選択範囲変更"
  End Sub
  Private Sub FolderView_SelectionChanged()
    Debug.Print "フォルダ:選択項目変更"
  End Sub
      :
      :

オブジェクトによっては、WithEvents付きの変数として宣言できない物も
ありますので、全てのドキュメントについて、上記のような方法で
取得できるというわけではありませんが、HTMLページであるならば、
上記のように、MSHTML.TLB のライブラリを利用する事ができるでしょう。

# HTMLの場合には、タイプライブラリを使わずにイベントを取得する方法も
# ありますが、最初のうちは、タイプライブラリを使った方が楽でしょう。


マロン  2005-05-23 09:54:52  No: 89957

piさん、魔界の仮面弁士さん、本当にありがとうございます。
アドバイスを元にやってみましたら、なんとか目的に近づけたように思います。

ところで、HTMLドキュメントを表示させている状態で、文字列の上でマウスをドラッグして反転させた場合、その選択された文字列はどうやったら取得できるんでしょうか。

〜Textと名のつくプロパティ(例えばinnerTextなど)を使い、onselectstarとかonclickの時に内容を見るのですが、選択文字列のみの取得には至らないようです。


魔界の仮面弁士  2005-05-23 11:37:19  No: 89958

HTMLドキュメントの操作には、DHTMLの知識が要求されますので、
DHTML関連の資料を読んで見てください。多くは、J(ava)Script向けの
資料でしょうが、VB + WebBrowserから制御する時も、基本は一緒です。

> その選択された文字列はどうやったら取得できるんでしょうか。
その点は、最初に書いたはずですが……。(^^;
とにかく、TextRangeオブジェクトについて調べて見てください。

http://homepage3.nifty.com/aya_js/dom/dom04.htm
http://www.microsoft.com/japan/msdn/library/ja/jpisdk/dhtml/content/TextRange.asp

> 〜Textと名のつくプロパティ(例えばinnerTextなど)を使い、
調べる方向が間違っている気がするので……具体例を書きます。

  Label1.Caption = Me.WebBrowser1.Document.selection.createRange().text


マロン  2005-05-23 18:49:44  No: 89959

ご面倒をおかけします。
なるほど、J(ava)Scriptの方向で調べればよいのですね。

なんだかとんちんかんな質問で誠に恐縮です(汗)。
きちんと理解できましたらご報告させて頂きますので、しばらくお時間を下さいね。


マロン  2005-05-24 17:12:43  No: 89960

私の研究結果をご報告します。

■ケース1
    Private WithEvents Body As MSHTML.HTMLBody

    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
        Set Body = WebBrowser1.Document.Body
    End Sub

    Private Function Body_onclick() As Boolean
        Debug.Print Body.createTextRange.Text
        Body_onclick = True   '選択を許可
    End Function

■ケース2
    Private WithEvents Body As HTMLDocument

    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
        Dim htm As IHTMLDocument2
        Set htm = WebBrowser1.Document
        Set Body = htm
    End Sub

    Private Function Body_onclick() As Boolean
        Debug.Print Body.selection.createRange.Text
        Body_onclick = True
    End Function

これまでにご紹介頂いたサイトの資料や、ここでのアドバイスを参考に試行錯誤をやってみましたら、ケース1と2で結果の違いがありました。

まずケース1では、選択した文字列ではなく、表示されているドキュメント全てが表示されてしまいます。
これは、createTextRangeだからかな?と思いますが、ご紹介の
http://homepage3.nifty.com/aya_js/dom/dom04.htm
によれば、createRangeであれば良さそうなんですが、ここでのBodyに続くcreateRangeがVBのデザイン画面ではないようなので、私には対処のしようがありませんでした。

次にケース2ですが、これだと選択した部分がきちんと認識されて表示されました。
私は未だ、DHTMLのことをよく理解していない状態でこれらの実験をやっておりますので、熟練された方から見れば笑われるかも知れないのですが、今のところ以上のような結果がでました。

結論として、私の考えとしてはケース2のやり方でいいのかな?  と思うのですがいかがでしょうか。


マロン  2005-05-25 20:08:25  No: 89961

ということで、なんとか当初の目的は達成できたように思います。
ありがとうございました。


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

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






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