リッチエディットの話(1)(1999/06/05)

HTMLエディタを作る上で、リッチエディットにはお世話になった(いろんな意味で)。これからDelphiでTRichEditを使おうと思っている諸兄への一助になれば幸いである。



実行中、文字に色を付ける
書式を変更する場合、SelAttiributesプロパティに設定を行う。基本的にはダイアログなどで決定したフォントを、SelAttributes.Assign(FontDialog1.Font)等とする方が楽。
文字を選択していない場合はカーソルキーの位置から書式が変更されるのでOnChangeイベントでは間に合わない。初期化の時点でDefAttribues.Protect := Trueを実行しておき、OnProtectChangeイベントで処理すると、文章の変更前に書式が切り替わってくれる。

一時的に表示を止める
LinesプロパティBeginUpdateメソッドを呼び出せば、EndUpDateメソッドを呼び出すまでの間は表示が更新されなくなるので、大量の修正を行う場合に美観を損ねにくくなる。ただし、EndUpdateメソッドの中でOnChageイベントが発生する為、OnChangeイベントの中で実行すると無限ループに陥る場合もある。
TRichEditを継承してChangeメソッドをオーバーライトする時これに躓きやすい。

ファイルのロードと同時に色を塗る
詳しく書くと大事になるので、InsideWindows98年12月号を入手すれば書いてあるので、なんとかゲットするように スペースなどの空白文字で区切られた構造なら簡単に色分けする事が出来る。
HTMLの場合はかなり自分で解析しなければならないが、それもあまり難しくはない。

TConversionクラスの登録
上記に関して、TConvertionクラスの登録は、TRichEditを継承したコンポーネントのコンストラクタで行っても構わない。現在これを行っているが不都合は出ていない。
継承の段階でTConvertionクラスを追加する場合にも外部から設定すなければならないと思い込んでいる人は少なくないはず(笑)(って俺だけか?)

TConvertionクラスでのパレット
この中で、文章の書式を指定する為にはRTFタグを挿入していかなければならず、SelAttributeプロパティ等での書式とは大きく異なる為に相互の互換性が取れない。
解決策の一つとしては、アプリのオプション設定などで書式を変えた時、RTFタグ形式に変換してレジストリに記録。TConvertionのなかでそれを読み出す、と言った手が考えられる。
もしくは、TConvertionTRicEditの継承を一つのユニットで実装すれば、お互いにPrivate識別子を認識できるので、こちらの方が簡単だろう。ただし、識別子スコープの整頓から言えば望ましいとは思えないが…

HideSelectionプロパティ
TRichEditを継承したコンポーネントで、HideSelectionプロパティのデフォルト値をFalseとして再宣言すると、何故か判らないがオブジェクトインスペクタで設定した値が反映されなくなったりする。何かしくじってるのだろうか……他のプロパティの再宣言には問題がないようだが。



また何か気がついた事があれば書き込みたい。また、役に立つパクリネタでないTipsをご存知でしたらご一報頂きたい……しかし、プログラミングにおいて一番オイシイのは失敗談ではないだろうか?

宛先はこちらである。