WebBrowserデザインモードの選択位置取得について

解決


ふろん  2008-09-19 22:23:26  No: 145191

以前ここでお世話になりました、ふろんです。

現在WebBrowserデザインモードで簡単なエディターを作成しています。

WebBrowserとRichTextBox間で編集のやり取りをしていますが
データが多くなると、WebBrowserの編集位置がRichTextBox側で
分かりません、WebBrowserのキャレット位置取得の情報を色々検索
したのですが見当たりません。
WebBrowser選択範囲のキャレット位置が分かればRichTextBoxの
キャレット範囲を反転表示等させると思うのですが、どなたか
WebBrowser選択範囲のキャレット位置についてお分かりの方
よろしくご教授の程お願いします。

VB2005 :.NET OS:xp


どま  2008-09-27 10:10:21  No: 145192

お役には立てませんが・・・私も興味があるし、ふろんさんに別件で声をかけたかったので・・・

http://d.hatena.ne.jp/brazil/20061021/1161377936

WebBrowserのキャレット位置取得は、上記URLを読んでTextRangeオブジェクトとかを使ってするのかなーと思って試してみたんですが、私の頭ではうまくいかず、下記のようにマーカーになる文字列をHTMLに挿入して、そこから選択位置をつかむようにして誤魔化しました(^^;

(WebBrowser1,TextBox1の2つのコントロールがあるとして)
Dim marker As String = "@@@"
Dim caret As Integer
Dim str As String = WebBrowser1.Document.DomDocument.selection.createRange.HtmlText
'str = WebBrowser1.Document.DomDocument.selection.createRange.Text
            
WebBrowser1.Document.DomDocument.selection.createRange.pasteHTML(marker & str)

TextBox1.Text = WebBrowser1.DocumentText
TextBox1.Focus()

caret = TextBox1.Text.LastIndexOf(marker)
TextBox1.Text = TextBox1.Text.Remove(caret, marker.Length)
TextBox1.SelectionStart = caret
If Not str = Nothing Then
    TextBox2.SelectionLength = str.Length
End If

そのままでいくと、HTMLタグのほうがとんでもないことになっていきますので使い物には・・・。
If文部分を除けば、範囲指定はせず、選択範囲の先頭にキャレットを移動するだけになります。

詳しい方からスマートな方法を伝授していただけるといいですね。(お互いに)

-------------------------------------------------------
ここに書くのはどうかなぁと思うんですが、解決済みのスレに書くよりはと思い書きます。

POPUP回避についてですが、あれで回避できてるのはwirte()は新規作成が機能だからかなと思ってます。

>・ソース編集後Urlがabout;_blankになって困ってしまい・・・
>の部分も理解できません。

あの方法で回避したあと、新規作成したものにテキストをコピーした状態になっているため、ファイルの場所(URL)がabout;_blankになってしまいます。そうすると相対パスで挿入している画像とかの表示ができなくなってしまい困りました。

ということでしたf(^^;;;

スレと関係ない話題で、すみません。


どま  2008-09-27 10:14:31  No: 145193

・・・改行もなく、読みづらくしてしまって、すみません。


どま  2008-09-28 22:09:01  No: 145194

TextRangeオブジェクトがうまく使えないなーと思っていたんですが、
毎回、 WebBrowser1〜createRange.〜と書いていたせいでした(汗

下記は、WebBrowser1側で選択範囲の前後にマーカーになる文字列を
挿入して、TextBox1側でマーカーから選択範囲を取得。マーカーを消
して、選択範囲を設定するようにしています。

(MSHTMLを参照、WebBrowser1,TextBox1の2つの
コントロールがあるとして)

Dim start_marker As String = "@START@"
Dim end_marker As String = "@END@"
Dim selection_start As Integer
Dim selection_end As Integer
Dim objRange As MSHTML.IHTMLTxtRange
objRange = WebBrowser1.Document.DomDocument.selection.createRange
objRange.collapse()
objRange.pasteHTML(start_marker)
objRange = WebBrowser1.Document.DomDocument.selection.createRange
objRange.collapse(False)
objRange.pasteHTML(end_marker)
TextBox1.Text = WebBrowser1.DocumentText
TextBox1.Focus()
selection_start = TextBox1.Text.LastIndexOf(start_marker)
TextBox1.Text = TextBox1.Text.Remove(selection_start, start_marker.Length)
selection_end = TextBox1.Text.LastIndexOf(end_marker)
TextBox1.Text = TextBox1.Text.Remove(selection_end, end_marker.Length)
TextBox1.SelectionStart = selection_start
TextBox1.SelectionLength = selection_end - selection_start


ふろん  2008-09-30 01:24:58  No: 145195

どま様

ご返事大変遅くなり申し訳ございません。
またまた、レスが中々付かなくてほぼ諦めていました。
早速マーカ方式のサンプルテストしてみましたが、ほぼ期待通りの
結果が得られました。
何時も貴重な情報を頂き厚く感謝申し上げます。
WebBrowserにマーカが表示されますが再表示等で解決できるのではと
思っています。
長いHTML文の中から目的の位置を見つけるのに苦労していましたが
これで解決できそうです。
現在携帯用のHP作成エディターを作成中ですがこれでほぼ必要な機能
が組み込めました、私の悪い癖で本来の目的は横に置いてすぐに
道具造りに没頭してしまいますww
これでやっと携帯HP作成に入れそうです。

>POPUP回避についてですが・・・・・
了解しました、私の場合画像関係でUrl指定がありますが全て相対パスを使用していませんでしたので、気がつきませんでした運用に注意しないといけませんね。
何時もピンチのときに助けていただいてありがとうございます。
今後ともよろしく、ご指導賜りますようお願い申し上げます。
By  ふろん


ふろん  2008-09-30 20:23:52  No: 145196

解決済み  チェック


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




  


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