皆様はじめまして。マロンと申します。
早速質問なのですが、リッチテキストボックスに何か文字列を表示させておき、マウスでその文字列をドラッグして反転させると、SelChangeというイベントが発生します。そしてSelLengthというプロパティに反転した文字列の長さがセットされますよね。
これと同じ情報をWebブラウザコントロールで得ようとする場合には、どのような方法があるのでしょうか。
いろいろ調べたのですが、まったく解決の糸口がつかめません。
そもそも、Webブラウザコントロールに表示されているHTMLページの文字をマウスでドラッグした場合、発生するイベントがないようなのですが、何か方法があるのでしょうか。
もしご存知の方がいらしたら教えて頂けないでしょうか。よろしくお願いします。
> 文字をマウスでドラッグした場合、発生するイベント
→ onselectstartイベント, onselectイベント, onmouse系イベントでは如何でしょう。
> SelLengthと同じ情報
→ TextRangeオブジェクトを取得後、そのtextプロパティの長さを調べてみてください。
早速のお返事ありがとうございます。
私はVB6.0を使っているのですが、ブラウザコントロールに「onselectstartイベント, onselectイベント, onmouse系イベント」というのがないんです。
VBのデザイン画面でon〜とあるのは、
OnFullScreen
OnMenuBar
OnQuit
OnStatusBar
OnTheaterMode
OnToolBar
OnVisible
なんですが、どのようにしたらおっしゃるようなイベントを使うことができるのでしょうか。
WebBrowserは、HTMLだけでなく、Word, Excel, フォルダなどといった、
各種ドキュメントを表示する事ができますよね。ですから、表示する
ドキュメントによって、取り扱えるイベントもプロパティも異なります。
文書固有のイベントを扱う場合には、WebBrowserオブジェクト自体の
イベントではなく、その内に表示したHTMLドキュメント、すわなち、
WebBrowser1.Documentが返すオブジェクトのイベントを利用してください。
なるほど。でもすみません。私にはいまいちピンと来ません。
もしかしたらすごく初歩的な質問なのかも知れませんが、教えてください。
WebBrowser1でHTMLを表示させている状態でマウスをドラッグする場合、具体的にどのようにコードを記述すれば、WebBrowser1.Documentというイベントを認識することができるのでしょうか。
> 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の場合には、タイプライブラリを使わずにイベントを取得する方法も
# ありますが、最初のうちは、タイプライブラリを使った方が楽でしょう。
piさん、魔界の仮面弁士さん、本当にありがとうございます。
アドバイスを元にやってみましたら、なんとか目的に近づけたように思います。
ところで、HTMLドキュメントを表示させている状態で、文字列の上でマウスをドラッグして反転させた場合、その選択された文字列はどうやったら取得できるんでしょうか。
〜Textと名のつくプロパティ(例えばinnerTextなど)を使い、onselectstarとかonclickの時に内容を見るのですが、選択文字列のみの取得には至らないようです。
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
ご面倒をおかけします。
なるほど、J(ava)Scriptの方向で調べればよいのですね。
なんだかとんちんかんな質問で誠に恐縮です(汗)。
きちんと理解できましたらご報告させて頂きますので、しばらくお時間を下さいね。
私の研究結果をご報告します。
■ケース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のやり方でいいのかな? と思うのですがいかがでしょうか。
ということで、なんとか当初の目的は達成できたように思います。
ありがとうございました。
ツイート | ![]() |