前回の続きです。

複数のRichTextBoxの内容を同期する 内容が同期されたRichTextBox(その1)

複数のRichTextBoxを同期する OnKeyPress編です。KeyPress イベントは、実行中のフォームで、フォームまたはそのコントロールにフォーカスがあるときに、ユーザーが入力可能な文字を生成するキーが押されることで発生します。

ただちょっと注意することがあります。Ctrl+Zなどのキーを押したときもこのイベントは発生するようです。

ではどうするか? 処理が必要なのは、数字、アルファベット、記号などのキーが押されたときです。そこでどうするか? 文字コードをみてみましょう。

ORANGE-FACTORY (オレンジ工房) UTF8 1byte

これによると0x21から0x7eまでが必要であることがわかります。それ以外は無視してOKです。

選択されている文字(これから削除されようとしている文字)とこれから追加されようとしている文字をUndobufのなかに保存し、これを利用して他のコントロールのデータも同期させます。

ところでRichTextBoxにはテキストが変化したらTextChangedというイベントが発生します。だったらテキストが変化しようとしているときもイベントがあっていいのではないでしょうか。そこでTextChangingというイベントを作成しました。Undobufの内容を参照してデータを変更したくないときは処理をキャンセルすることもできるようにしました。

文字が削除されたり追加されたときにカーソルが以前に選択されていたものと対応するものに移動できるようにしました。

あとUndo処理を考える必要があります。

Undoは逆の処理をすればいいので、逆の結果を返しています。

これでKeyPressイベントに関しては、UndoとRedo処理ができるようになります。