これまで複数のRichTextBoxでデータを同期するプログラムを作成してきました。今回は検索と置換機能を持たせることにします。

まず検索機能について。

検索するのであれば RichTextBox.Findメソッドが使えます。

あと後ろから前に検索することもできます。

endからstartに向かって検索し、一番endに近い文字の位置を返します。

さて置換ですが、1回だけ置換するのであればこんなのはどうでしょうか?

現在選択されている位置から一番近くにある文字列を置換します。問題は一括で置換する場合です。

一応これで動きますが、対象文字列が多いとフリーズしてしまったようになります。そこでプログレスバーを表示することにしました。

ところがこれだと処理中にプログレスバーを表示しているダイアログを動かすことができません。

そこで

一応、これで動いてくれます。ただ処理中、両方のRichTextBoxのカーソルが激しく動きます。また途中でキャンセルしたくなるかもしれません。そのようなものを作ってみましょう。

イベントを利用して、一括置換だけでなく逐次置換の選択もできるようにしています。

別のSyncRichTextBoxを作成して、そこにデータをコピーします。そしてそこで置換処理をおこなってできあがったデータをコピーします。またUndobufのリストもコピーします。

途中で[中止]ボタンを押すと処理が中止されます。