DOBON.NET DOBON.NETプログラミング掲示板過去ログ

webbrowser1.document.writeを使うとundo(ctrl+Z)ができません。

環境/言語:[windows7 vb.net framework4 ]
分類:[.NET]

vb.netとframework4を使って フォーム系HTML EDITORを製作しています。

webbrowser1.documenttextが効かないPCもあったのでそれを

webbrowser1.document.writeに変えて作っていますが、なぜか

webbrowser1.document.writeを使うとテキストで入力した文字が

undo(ctrl+Z)ができません。

解決方法ありますでしょうか?
■No29192に返信(tamuraさんの記事)
> vb.netとframework4を使って フォーム系HTML EDITORを製作しています。
>
> webbrowser1.documenttextが効かないPCもあったのでそれを
>
> webbrowser1.document.writeに変えて作っていますが、なぜか
>
> webbrowser1.document.writeを使うとテキストで入力した文字が
>
> undo(ctrl+Z)ができません。
>
> 解決方法ありますでしょうか?

どの様な作り方をしてるか知らんけど、undoって自分で実装するんじゃないの?
UNDOってMSHTMLなら自動でできるものだよ。知らないなら答えしないで。そんなもしらないくせに返事書くな!


■No29214に返信(ヴァンさんの記事)
> ■No29192に返信(tamuraさんの記事)
>>vb.netとframework4を使って フォーム系HTML EDITORを製作しています。
>>
>>webbrowser1.documenttextが効かないPCもあったのでそれを
>>
>>webbrowser1.document.writeに変えて作っていますが、なぜか
>>
>>webbrowser1.document.writeを使うとテキストで入力した文字が
>>
>>undo(ctrl+Z)ができません。
>>
>>解決方法ありますでしょうか?
>
> どの様な作り方をしてるか知らんけど、undoって自分で実装するんじゃないの?
>
解決済み!
■No29227に返信(tamuraさんの記事)
> UNDOってMSHTMLなら自動でできるものだよ。
> 知らないなら答えしないで。そんなもしらないくせに返事書くな!

とりあえず、書き込みのルールを読みましょう。
(少なくともこの引用部分は抵触するはずです)

あるコンポーネントが Undo/Redo を実装していたとしても、それが対応する範囲は限られると考えた方がよいでしょう。
たとえば、ユーザー入力であればちゃんと Undo してくれても、プログラムから無理矢理書き換えたらそれは Undo バッファに積まないとか。
既存のコンポーネントに横やりを入れたわけですから、自分で Undo 操作を横取りして、自分で Undo 処理を割り込ませる or コンポーネントにやらせるなど、工夫が必要になる可能性は高いと思われます。
■No29227に返信(tamuraさんの記事)
> UNDOってMSHTMLなら自動でできるものだよ。

プログラム側で webbrowser1.document.write とやってるわけだから、Undoも何もないと思うんだが。

write した文字列をバッファに格納して行って、Undoすればいいんじゃないの?

その前に、webbrowser1.documenttext の時はUndoが効くなら、webbrowser1.documenttext が使えないPCの原因を見つけた方が良いんじゃないの?
2011/10/15(Sat) 18:00:51 編集(投稿者)

#(訂正です。コード部分にて、OpenNewを書かない乱暴な記述をしていたので変数dに受け取るよう書き換えました。なお、結果は同じです。)

こんにちは。
「MSHTMLなら」とありますが、そもそも「webbrowser1」がどのクラスなのかが書かれていないのでそこははっきりさせてください。
(System.Windows.Forms.WebBrowser以外にも参照追加で使えるものがあります。といっても、7でも他の方があるかはよく分かりませんが。)


(事象の確認のみで解決できずすみませんが…。)
HTMLエディタを作ってるという話でしたので、
最初はForm上のTextBoxにあるHTMLコード内容をWebBrowserに書いたものがアンドゥーできないという話なのかと思ったのですが、
ドキュメント上に生成されたtextareaボックスでのアンドゥーの話、でしょうか。

確かに
FormにWebBrowserを貼って初期URLを「about:blank」にしておいて
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    Dim d As HtmlDocument = WebBrowser1.Document.OpenNew(True)
    d.Write("<html><body><form><textarea></textarea></form></body></html>")
End Sub
ないし
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    WebBrowser1.DocumentText="<html><body><form><textarea></textarea></form></body></html>"
End Sub
ないし
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    Dim d As HtmlDocument = WebBrowser1.Document.OpenNew(True)
    d.Write("<html><body><form><input type='text'></form></body></html>")
End Sub
とだけしてテストしてみたところ、
画面でボックスに手入力してCtrl-ZしてもWriteでtextareaの場合だけアンドゥーできませんでした。入力キャレットだけが先頭に戻ります。
input type='text'の場合と、DocumentTextの場合は効くようです。
(なお、当方の環境はXPProで.NET3.5SP1です。)
このことだと、根深いかもしれません。
なので、
>webbrowser1.documenttextが効かないPC
の方を何とかするのがよいかと思います。
この件は、どのように「documenttextが効かない」のでしょうか。画面に何も書かれないということでしょうか。



ところで、マナーについては見解は管理人のどぼんさんが出されると思いますが、
その前の最初の回答の文体自体が同様に「全ての投稿に関するルール」の一番目の
「礼儀や言葉遣いなどの実社会でのマナーをお守りください。基本は、初対面の人に接する態度でお願いします。タメ口は禁止です。」
に該当すると思いますし、私自身、第三者として回答を目にして不快だと思いました。
…売り言葉、と思います。
(
詳細は
http://dobon.net/vb/bbs/index.html#reigi
にあります。
)
No29227 のtamuraさんのご投稿は、明らかにルール違反です。しかも、捉え方によっては喧嘩を売っているようにも読め、もしそうであれば、かなり悪質です。tamuraさんにも言い分があると思いますので今回は注意だけにさせて頂きますが、今後ルール違反があった場合は、警告無く何らかの処置を取らせていただくことをご了承ください。

No29214 のヴァンさんのご投稿についてもタメ口禁止のルールに違反するのではないかとのご指摘がありましたが、その通りで、ルール違反となります。タメ口かタメ口でないかの明確な判断は難しいですし、それができないという方もいらっしゃるかもしれませんが、できるだけ丁寧な言葉づかいでお願いいたします(その気持ちが伝われば十分ですので)。

私の No29214 へのルール違反の指摘が遅れたことで問題が大きくなってしまったとしたら、申し訳ありませんでした。

なおルールについてご不満な点などございましたら、お気楽掲示板や「管理人に連絡」等でお知らせ下さい。
■No29233に返信(管理人さんの記事)
自分の回答で荒れたなら申し訳ありません。
今後は注意して回答するようにします。

ご親切な回答ありがとうございます。

この件は、どのように「documenttextが効かない」のでしょうか。画面に何も書かれないということでしょうか。
←こちらのないようですが、はいそうです。designmode="ON"の状態ですが、
入力ができないです。全てのパソコンではなく今の現在ではパナソニックのLet'sNoteの種類(バージョン違い3代全てNGでした。)がこのような現状に
なります。色々調べましたが原因がわからず、一応時間がなかったのでそれを
よけるためdocumenttextを→document.Writeに変えて開発を進んでおりました。
UNDO問題もこの時発生しました。documenttextを使った時にはUNDOも
正常でした。

document.Writeは webbrowserをデザインモードにして使っています。

どうか原因がご存知でしたらよろしくお願い致します。


■No29230に返信(とん。さんの記事)
> 2011/10/15(Sat) 18:00:51 編集(投稿者)
>
> #(訂正です。コード部分にて、OpenNewを書かない乱暴な記述をしていたので変数dに受け取るよう書き換えました。なお、結果は同じです。)
>
> こんにちは。
> 「MSHTMLなら」とありますが、そもそも「webbrowser1」がどのクラスなのかが書かれていないのでそこははっきりさせてください。
> (System.Windows.Forms.WebBrowser以外にも参照追加で使えるものがあります。といっても、7でも他の方があるかはよく分かりませんが。)
>
>
> (事象の確認のみで解決できずすみませんが…。)
> HTMLエディタを作ってるという話でしたので、
> 最初はForm上のTextBoxにあるHTMLコード内容をWebBrowserに書いたものがアンドゥーできないという話なのかと思ったのですが、
> ドキュメント上に生成されたtextareaボックスでのアンドゥーの話、でしょうか。
>
> 確かに
> FormにWebBrowserを貼って初期URLを「about:blank」にしておいて
> Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
> Dim d As HtmlDocument = WebBrowser1.Document.OpenNew(True)
> d.Write("<html><body><form><textarea></textarea></form></body></html>")
> End Sub
> ないし
> Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
> WebBrowser1.DocumentText="<html><body><form><textarea></textarea></form></body></html>"
> End Sub
> ないし
> Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
> Dim d As HtmlDocument = WebBrowser1.Document.OpenNew(True)
> d.Write("<html><body><form><input type='text'></form></body></html>")
> End Sub
> とだけしてテストしてみたところ、
> 画面でボックスに手入力してCtrl-ZしてもWriteでtextareaの場合だけアンドゥーできませんでした。入力キャレットだけが先頭に戻ります。
> input type='text'の場合と、DocumentTextの場合は効くようです。
> (なお、当方の環境はXPProで.NET3.5SP1です。)
> このことだと、根深いかもしれません。
> なので、
> >webbrowser1.documenttextが効かないPC
> の方を何とかするのがよいかと思います。
> この件は、どのように「documenttextが効かない」のでしょうか。画面に何も書かれないということでしょうか。
>
>
>
> ところで、マナーについては見解は管理人のどぼんさんが出されると思いますが、
> その前の最初の回答の文体自体が同様に「全ての投稿に関するルール」の一番目の
> 「礼儀や言葉遣いなどの実社会でのマナーをお守りください。基本は、初対面の人に接する態度でお願いします。タメ口は禁止です。」
> に該当すると思いますし、私自身、第三者として回答を目にして不快だと思いました。
> …売り言葉、と思います。
> (
> 詳細は
> http://dobon.net/vb/bbs/index.html#reigi
> にあります。
> )
こんばんは。
    
>>この件は、どのように「documenttextが効かない」のでしょうか。画面に何も書かれないということでしょうか。
>←こちらのないようですが、はいそうです。designmode="ON"の状態ですが、
>入力ができないです。
書き方のせいで分かりにくかったかもしれませんが…
私は「documenttextにHTMLソースを代入してもそれが表示されないのでしょうか」という意味で書きました。
「入力ができない」とは、つまりdocumenttextの際に一部のマシンで起きている症状は、
『HTML通りに表示されるけれど「入力ができない」』ということですか?
だとすると私が想定した事象とは異なるようです。(どちらにしろ原因は分からないですが。)


ところでdocumentetextの方の話ではなくwriteを使用する方ですが、
肝心なことが抜けていました。
document.writeの場合は、最後にcloseをかけてドキュメントを終了してあげないと
部分的に不完全な動作をすると思います。
上の私のコード例で書きますが、
Dim d As HtmlDocument = WebBrowser1.Document.OpenNew(True)
d.Write("<html><body><form><textarea></textarea></form></body></html>")
CType(d.DomDocument, mshtml.IHTMLDocument2).close()
のように最後にcloseが必要だと思います。
ひょっとしたらtamuraさんの方でも抜けていませんか?
(こちらでは、うっかり抜けていたこれを書いたところUndoできるようになりました。)
お世話になります。

とん様、本当に有難うございます。
無事解決できました。
感謝します。




■No29250に返信(とん。さんの記事)
> こんばんは。
>
> >>この件は、どのように「documenttextが効かない」のでしょうか。画面に何も書かれないということでしょうか。
> >←こちらのないようですが、はいそうです。designmode="ON"の状態ですが、
> >入力ができないです。
> 書き方のせいで分かりにくかったかもしれませんが…
> 私は「documenttextにHTMLソースを代入してもそれが表示されないのでしょうか」という意味で書きました。
> 「入力ができない」とは、つまりdocumenttextの際に一部のマシンで起きている症状は、
> 『HTML通りに表示されるけれど「入力ができない」』ということですか?
> だとすると私が想定した事象とは異なるようです。(どちらにしろ原因は分からないですが。)
>
>
> ところでdocumentetextの方の話ではなくwriteを使用する方ですが、
> 肝心なことが抜けていました。
> document.writeの場合は、最後にcloseをかけてドキュメントを終了してあげないと
> 部分的に不完全な動作をすると思います。
> 上の私のコード例で書きますが、
> Dim d As HtmlDocument = WebBrowser1.Document.OpenNew(True)
> d.Write("<html><body><form><textarea></textarea></form></body></html>")
> CType(d.DomDocument, mshtml.IHTMLDocument2).close()
> のように最後にcloseが必要だと思います。
> ひょっとしたらtamuraさんの方でも抜けていませんか?
> (こちらでは、うっかり抜けていたこれを書いたところUndoできるようになりました。)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板