- PR -

RichTextBoxでのRtf編集(キーワードの文字色変更)

1
投稿者投稿内容
shibamu
会議室デビュー日: 2006/01/05
投稿数: 5
投稿日時: 2007-05-26 14:51
自分のソフト(Windowsアプリです)に載せるための簡易なエディタを作成しており、それにキーワードをハイライトする機能を持たせようと思っています。
最初はSelectionStart、SelectionLength、SelectionColorを用いて色の変更を行っていたのですが、どこが引っ掛かっているのか、実現はできるもののかなり処理に時間がかかってしまう結果になってしまいました。(最初にファイルを開いて表示させる際、10秒程度かかります)
そこで、RichTextBoxのRTFの文書を直に編集(\colortblの追加と、キーワードを\cf1〜\cf0で囲んで色変更を行うなど)するようにすれば少しまともになるかもしれないと思い、方針を変更しました。(全くの見当違いかもしれません)
しかし、RtfプロパティからRTFを取り出して\viewtextの前に{\colortbl〜}を挿入してやってから再びRtfプロパティへと設定を行うと、挿入した部分が消えてしまいます。
この挿入に用いているのは以下のコードです。(RichTextBoxを継承したクラスのメソッドになります)

public void SetColor(Color c)
{
string rtf_text = this.Rtf;
int index = rtf_text.IndexOf(@"\viewkind");

// \viewkindを検索し、その部分にcolortblを挿入する
if(index != -1)
{
StringBuilder sb = new StringBuilder();
sb.Append(@"{\colortbl ;\red");
sb.Append(c.R.ToString());
sb.Append(@"\green");
sb.Append(c.G.ToString());
sb.Append(@"\blue");
sb.Append(c.B.ToString());
sb.Append(";}\n");
rtf_text = rtf_text.Insert(index, sb.ToString());
}
// MessageBox.Show(rtf_text); // ←{\colortbl〜}は挿入されています
this.Rtf = rtf_text;
// MessageBox.Show(this.Rtf); // ←{\colortbl〜}は削除されています
}

また、上記コードでのRtfプロパティに設定する前のrtf_textの内容は以下のとおりです。
{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset128 \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e;}}
{\colortbl ;\red0\green0\blue255;}
\viewkind4\uc1\pard\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\tx5400\tx5760\tx6120\tx6480\tx6840\tx7200\tx7560\tx7920\tx8280\tx8640\tx9000\tx9360\tx9720\tx10080\tx10440\tx10800\tx11160\tx11520\lang1041\f0\fs18 public class test\{\par
\tab public static void main(String[] args)\{\par
\tab\tab int a;\par
\tab\tab System.out.println("TEST");\par
\tab\}\par
\}\par
}

設定後のRtfプロパティは以下のとおりです。
{\rtf1\ansi\ansicpg932\deff0{\fonttbl{\f0\fnil\fcharset128 \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e;}}
\viewkind4\uc1\pard\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\tx5400\tx5760\tx6120\tx6480\tx6840\tx7200\tx7560\tx7920\tx8280\tx8640\tx9000\tx9360\tx9720\tx10080\tx10440\tx10800\tx11160\tx11520\lang1041\f0\fs18 public class test\{\par
\tab public static void main(String[] args)\{\par
\tab\tab int a;\par
\tab\tab System.out.println("TEST");\par
\tab\}\par
\}\par
}

何が原因で失敗しているのかが分からず詰まっています。
よろしければご教示ください。
また、別の方法でキーワードの文字色変更を高速に行う方法があれば、お教えいただければと思います。
よろしくお願いします。
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2007-05-26 16:49
引用:

shibamuさんの書き込み (2007-05-26 14:51) より:

何が原因で失敗しているのかが分からず詰まっています。
よろしければご教示ください。


colortbl を追加してもそれを使用している部分がありません。
RTF プロパティに値を設定すると RichTextBox が内部で RTF を解析します。その際に不要な書式などが取り除かれます。colortbl があってもそれを使用する部分が無いため取り除かれてしまったのだと思います。
引用:

そこで、RichTextBoxのRTFの文書を直に編集(colortblの追加と、キーワードをcf1〜cf0で囲んで色変更を行うなど)するようにすれば少しまともになるかもしれないと思い、方針を変更しました。(全くの見当違いかもしれません)


この処理を行った結果を RTF プロパティに設定してください。そうすれば、colortbl が消える事はありません。

引用:

また、別の方法でキーワードの文字色変更を高速に行う方法があれば、お教えいただければと思います。
よろしくお願いします。


RichTextBox を使用する中で RTF を直接編集するのが私は一番早いと思います。しかし RTF の情報がとても大きい場合はとても処理が遅くなってしまいます。
shibamu
会議室デビュー日: 2006/01/05
投稿数: 5
投稿日時: 2007-05-26 16:56
>ダッチさん
ご回答ありがとうございます。
なるほど、Rtfプロパティに設定した際に「\cf1」などが使用されていないと削除されてしまうのですね。
キーワードに対する色変更処理を行ってからRtfプロパティへの設定を行うようにしてみます。
本当にありがとうございました。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2007-05-27 11:06
引用:

最初はSelectionStart、SelectionLength、SelectionColorを用いて色の変更を行っていたのですが、どこが引っ掛かっているのか、実現はできるもののかなり処理に時間がかかってしまう結果になってしまいました。(最初にファイルを開いて表示させる際、10秒程度かかります)


Form に配置したRichTextBoxで直接処理せず、一旦ローカルなRichTextBoxのインスタンスにRtfを渡して上記の色変更を行い、処理後のRftを元のRichTextBoxに戻すと速度は速くなりませんか?

IEEE-CSDP 2004-2007
iStation
shibamu
会議室デビュー日: 2006/01/05
投稿数: 5
投稿日時: 2007-05-28 00:21
ダッチさんの方法でRTFを直に編集する方法を用いたところ、最初とは比べ物にならないくらい高速にすることができました。
1000行クラスのJavaソースコードで試したので、2倍3倍となると厳しいかもしれませんが、主に使うのは1000行以内と思っているので十分すぎるほどになりました。
本当にありがとうございました。

>iStationさん
ご回答ありがとうございます。
ローカルにインスタンスを作成し、必要なフィールドをコピーしてから処理を実行するようにしてみたところ、最初に比べて十分高速になりました。
しかし、Rtfのコピーのためかメモリ使用量が増大し、速度もRTFの編集に比べれば劣ってしまうようでした。
Formに配置していないコントロールでは無駄な(?)処理を発生させずに高速に目的の処理を行えることが分かり、今後に生かせそうです。
ご教示ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)