「C1TextPointer の理解」では、Selection プロパティを使用して現在の選択範囲に対応する C1TextRange オブジェクトを取得する方法について説明し、そのオブジェクトを使用してカスタム書式を検証し、ドキュメントの各部に適用する方法についても説明します。
ただし、範囲を選択することなく書式を検証したり範囲に適用したい場合もあります。Selection プロパティを使用してこれを実行するには、現在の選択範囲を保存し、すべての書式を適用してから、元の選択範囲を復元する必要があります。また、選択範囲を変更すると、新しい選択範囲を表示するために、ドキュメントがスクロールする可能性があります。
このような状況に対処するために、C1RichTextBox は GetTextRange メソッドを公開しています。GetTextRange メソッドは、現在の選択範囲に影響を与えずに C1TextRange を返します。
たとえば、GetTextRange メソッドを使用して、C1RichTextBox に HTML 構文の色指定を追加することもできます。最初の手順は、ドキュメントに対する変更を検出することです。この変更により、実際に構文の色指定を行うメソッドがトリガされます。
このコードは、ユーザーがドキュメントを変更するたびにオンになるタイマーを作成します。タイマーがオンになっているときにユーザーがドキュメントを変更すると、タイマーはリセットされます。これで、ユーザーがすばやく入力している間にコードが頻繁に構文の色指定を更新することがなくなります。
タイマーの時間が経過すると、構文の色指定の更新中に行われた変更によってタイマーがオンにならないようにするフラグを設定し、UpdateSyntaxColoring メソッドを呼び出します。
最初にコードは、HTML を解析するための正規表現パターンを定義します。これは、HTML を解析するための最も効率的な方法ではなく、表現も格別に読みやすく保守しやすいというわけではありません。サンプルコード以外で HTML の解析に正規表現を使用することはお勧めしません。サンプルコードでは、正規表現によってコードがコンパクトになり、理解しやすくなります。
次の手順では、残っている色指定を削除します。それには、ドキュメント全体をカバーする範囲を作成し、その Foreground プロパティを C1RichTextBox コントロールの Foreground に一致するように設定します。
次に、正規表現を使用してドキュメントを解析します。このコードは、各一致候補をスキャンし、C1TextRange オブジェクトを作成し、Foreground プロパティを目的の値に設定します。HTML タグには濃い青色、タグ名には濃い赤色、および属性名には明るい赤色を使用します。
必要なコードはこれだけです。次の画像は、今作成した構文の色指定を C1RichTextBox に適用し、その中に HTML ドキュメントを表示したところです。
任意の HTML テキストをコントロールに入力するか、貼り付けて、アプリケーションをテストしてください。入力を止めるとすぐに、入力したテキストに自動的に色が付けられます。
実際のアプリケーションでは、テキスト変更の種類を検出し、ドキュメントの小さな部分の色指定を更新することで、構文の色指定プロセスを最適化できます。さらにスタイルシート、コメントなどの要素を検出し、通常は正規表現の代わりに専用のパーサーを使用します。
ただし、基本的なメカニズムは同じです。ドキュメント内の範囲を検出し、C1TextRange オブジェクトを取得し、書式設定を適用します。