高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

Webブラウザをエディタに使う

 そういえば学校用兼自宅用(学校用というのはあくまでついでの気持ちだけど)に、アウトラインプロセッサを作っています。.NETで。
当初Delphi×TEditorで、TMemoの足がかりにしようというつもりだったんですけど、学校で急に表現力のあるエディタが必要になっちゃって…リッチエディットだと、テキストを得たときに可読性のないものになっちゃうし(XMLで保存する予定なので、直接でも読めるようにしたい)…。
ということで、みゃみゅ玉子さんのブログに前コメントがあった(どのエントリだったか覚えてませんが)のを参考に、IEコンポーネントをエディタに使えないかな と思ってやってみています。
結果は何とか、うまくいったかも…というところ。現在IEコンポーネントにノードの内容を表示し、それを編集させるところまでは行きました。
SHDocVw.dllをコントロールとして追加、mshtml.dllを参照設定にして、

  // フォームのロード時
  object o = null;
  editor.Navigate("about:blank", ref o, ref o, ref o, ref o );
  ((IHTMLDocument2)editor.Document).body.setAttribute("ContentEditable", true, 0);

  // ノードのロード時
  IHTMLDocument2 doc= (IHTMLDocument2)editor.Document;
  doc.body.innerHTML= node.Data;

 とすればOK。node.Dataには格納したいHTMLデータが入っているものとします。
 最初に、bodyタグに、"ContentEditable"属性を指定します。IE独自の属性で、これを指定されると、その部分は文字列の編集が可能になってしまいます。おんぷむらのうら、WEB素材置き場でまだ使ってますね。
でも、about:blankでも何でも良いので表示しないと、editor.Document.bodyは空っぽ=nullになってしまいエラーになります。なのでとりあえず、about:blankを表示させておく必要があります。ほんとはCompleteを待つ必要があるのかもしれませんが、とりあえずabout:blankを表示するだけなので、問題はなかったようです。
 実際これに他のタグを挿入したりするのが難しいのかもしれませんが…。innerHTMLをいじれば何とかなりそうですが、キャレット位置とかどうやって得るの?JavaScriptでも・・・できるのかなあ?
MSNスペースのブログエディタあたりが参考になるかもしれませんね、リンク消しちゃったんで、どうやっていけばいいか分からなくなってしまいました(^_^;)

参考サイト

 とりあえずCodeProject - For those who codeも見てみたんですが、結局使いませんでした。いっぱい情報がありそうなので、今後ともお世話になるかもしれませんね。