第8回 検索と置換
公開日:2018-05-24 更新日:2019-06-04
[メモ帳作成講座]
1. 内容
1. 検索・置換機能の追加
メニューの検索をクリック、または Ctrl + F で検索・置換用の検索画面を起動して、検索と置換が行えるようにしました。
検索画面で検索ボタンや置換ボタンがクリックされた場合、直接フォームのテキストを操作するのではなく、検索対象(フォーム)に対して、検索処理依頼を出す形にしています。
実際の検索処理は、検索対象側で行い、検索画面は操作するためのI/Fと言う位置付けです。
これにより、今後、検索画面を別のものと入れ替えたり、ツールバーで操作させると言うことができます。
また、検索対象を扱う場合は、MainForm ではなく、ISearchString と言う interface で扱っています。
これにより、ISearchString を実装した別アプリなどに対しても、今回の検索画面をそのまま再利用することができます。
検索画面で検索ボタンや置換ボタンがクリックされた場合、直接フォームのテキストを操作するのではなく、検索対象(フォーム)に対して、検索処理依頼を出す形にしています。
実際の検索処理は、検索対象側で行い、検索画面は操作するためのI/Fと言う位置付けです。
これにより、今後、検索画面を別のものと入れ替えたり、ツールバーで操作させると言うことができます。
また、検索対象を扱う場合は、MainForm ではなく、ISearchString と言う interface で扱っています。
これにより、ISearchString を実装した別アプリなどに対しても、今回の検索画面をそのまま再利用することができます。
2. StringComparison について
検索処理は IndexOf()、LastIndexOf() を使用していますが、StringComparison を指定すると、
カルチャを意識した文字列の比較ができます。
それ以外を指定すると、日本語の順番でソートされ、「ヴ」は「ウ」の前に移動します。
「ヴ」は「ウ」の後ろになって欲しいところですが。
【参考】.NET の文字列を使用するためのベスト プラクティス
カルチャを意識した文字列の比較ができます。
var list = new List<string>{
"オルガン",
"ウクレレ",
"エレクトーン",
"アコーディオン",
"ヴァイオリン",
"イングリッシュホルン"
};
list.Sort((a, b) => String.Compare(a, b, StringComparison.CurrentCulture));
foreach (var item in list) Console.WriteLine(item);
Console.WriteLine("----------");
list.Sort((a, b) => String.Compare(a, b, StringComparison.InvariantCulture));
foreach (var item in list) Console.WriteLine(item);
Console.WriteLine("----------");
list.Sort((a, b) => String.Compare(a, b, StringComparison.Ordinal));
foreach (var item in list) Console.WriteLine(item);
アコーディオン
イングリッシュホルン
ヴァイオリン
ウクレレ
エレクトーン
オルガン
----------
アコーディオン
イングリッシュホルン
ヴァイオリン
ウクレレ
エレクトーン
オルガン
----------
アコーディオン
イングリッシュホルン
ウクレレ
エレクトーン
オルガン
ヴァイオリン
Ordinal または OrdinalIgnoreCase を指定すると、Unicodeの定義された順番でソートされます。それ以外を指定すると、日本語の順番でソートされ、「ヴ」は「ウ」の前に移動します。
「ヴ」は「ウ」の後ろになって欲しいところですが。
【参考】.NET の文字列を使用するためのベスト プラクティス
3. Configファイルの読込、保存の修正
前回はMainForm側で値の反映などを行っていましたが、MainForm側の処理を軽くするため、Configファイルの読込、保存、Formへの反映処理を、全てAppConfigクラス側で行うように修正しました。
初めは、AppConfigクラスはデータ(プロパティ)だけ定義して、AppConfig操作クラスで読込と保存、Form側で値の反映処理を行おうと考えました。
データクラスと操作クラスに分けることにより、データクラスがXMLファイルと依存しなくなり、他の媒体のデータも扱えるようにするためです。
しかし、処理を分けると柔軟になる反面、使う側はコントロールする処理が多くなります。
そこで今回は、クラスの使用者がいかに簡単に使えるかを最優先として、全てAppConfigに処理をまとめるようにしました。
初めは、AppConfigクラスはデータ(プロパティ)だけ定義して、AppConfig操作クラスで読込と保存、Form側で値の反映処理を行おうと考えました。
データクラスと操作クラスに分けることにより、データクラスがXMLファイルと依存しなくなり、他の媒体のデータも扱えるようにするためです。
しかし、処理を分けると柔軟になる反面、使う側はコントロールする処理が多くなります。
そこで今回は、クラスの使用者がいかに簡単に使えるかを最優先として、全てAppConfigに処理をまとめるようにしました。
2. 動画
3. 画面
4. 今後の課題
1. ドラッグ&ドロップでファイルオープン
エクスプローラーからファイルをドラッグ&ドロップしてファイルを開けるようにする。
2. 変換機能
大文字・小文字変換、半角・全角変換、10進数・16進数の変換を、ポップアップメニューで行えるようにする。
3. インデント調整など。
行を選択して、TABキーでインデント調整ができるようにする。
4. 独自のテキストボックスの作成
リッチテキストボックスを継承して、独自のテキストボックスの作成する。
これにより、Formの処理を軽くすることができる。
これにより、Formの処理を軽くすることができる。
5. その他
grep、選択した数式の計算、タブ化、ファイルツリー・リストを付けた3ペイン構成にする、プラグインでテキストの加工を行えるようにする、プラグインでカレンダーをつけて日記をつけられるようにする、などなど。
ダウンロード
ver | 実行ファイル | ソース |
---|---|---|
1.0.7 2018/05/24 | ncm_1_0_7.zip | ncm_1_0_7_src.zip |