DOBON.NET DOBON.NETプログラミング掲示板過去ログ

リッチテキストの色分け

環境/言語:[Windows XP、VB.NET、.NET Framework 1.1]
分類:[.NET]

こんばんは!

何度やってもうまくいかないので質問させて下さい。
検索してもヒットしませんでした。(キーワードが悪いのかな?)
リッチテキストで色分けを行う処理を実装しようと思い、頑張っているのですがどうしてもうまくいきません。自分の頭では無理っぽいですのでお力を。
条件としては、リッチテキストを快適に使う為に、リッチテキストを一行ずつ読み込んで置き換える処理はNGって事で。RTFを直接置き換えるのもNGで。

理由は、RTFを直接置き換えると確かに高速ではありますが、この方法でも容量の大きい内容の文章では違和感があり、快適に使う事が出来ません。そこで、自分が考えている方法として、対象の文字が入力されたら即色分けという処理を考えております。不可能かも知れませんが、一つ力を貸して下さい。

以下のソースは、リッチテキストのチェンジイベントにて行っておりますが、IMEモードが非表示であれば思った動作を行ってくれます。しかし、IMEがオンの状態だと、「<」や「>」を認識してくれません。つまり、変換中の文字はスルーされてしまいます。これを認識できるような命令などはあるのでしょうか?

//////////////////////////////////
Dim pos As Integer = RichTextBox1.SelectionStart - 1

With RichTextBox1
  If .Text.Chars(pos) = "<" Then
    .SelectionStart = .SelectionStart - 1
    .SelectionLength = 1
    .SelectionColor = Color.Blue
    .SelectionStart = pos + 2
  ElseIf .Text.Chars(pos) = ">" Then
    .SelectionColor = Color.Black
  End If
End With
//////////////////////////////////

上記のようなソースですが、やはりこのソースでは駄目なのでしょうか?
よろしくお願いします。
2007/11/06(Tue) 08:00:46 編集(投稿者)

■No20862に返信(狂死労さんの記事)
> リッチテキストのチェンジイベントにて行っておりますが、IMEモードが非表示であれば思った動作を行ってくれます。しかし、IMEがオンの状態だと、「<」や「>」を認識してくれません。つまり、変換中の文字はスルーされてしまいます。これを認識できるような命令などはあるのでしょうか?

> Dim pos As Integer = RichTextBox1.SelectionStart - 1
Console.WriteLine("p=" & pos)
> With RichTextBox1
...
としてみたら、スルーされる原因は明らかですよネ?
RichTextBox1は、あなたの狙い?と同じように「快適に使う事」を意識しているので(多分)、IMEがオンでは個々のイベントは発生しないのでしょう
対策を見つけるのも、ひとつの方法でしょうが、それでうまく出来ても、まだ問題は残ります。
それは、カーソルを、前に戻して "<"を入力されたら、どうしたいのですか?
やはり、<aaaa>と囲まれたところの色を変えたいですよネ?
だったら、1行の処理をしましょう。入力中の1行を、無駄でも先頭からナメて色を変えればIMEの問題も一挙に解決?できませんか?

でも、1行がちらつくとは思います。間に合わせとしては、前回のposを記憶しておいて、今回のposまでの間を、一文字づつ検査するのもいいかも、です
回答どうもです。

投稿した次の日に解決入れようとしたのですが、スパム扱いされたので。
もう一度チャレンジ。

テキストの変更時にはIME変換中に無視されます。
しかし、KeyUPにてIME変換中であっても無視されない事に気づきました。
そちらで処理を行ったら無事に解決いたしました。

> だったら、1行の処理をしましょう。入力中の1行を、無駄でも先頭からナメて色を変えればIMEの問題も一挙に解決?できませんか?

その作業は確認済みでした。
どうやら、一行処理を行ってもposの記憶した位置はやはり上から辿ってくるようです。これを一行のみ置換えを行っても結果としては全部置き換えた処理と同様の結果となります。なぜならば、一行置き換えてもリアル更新で進むために、結果を反映しないといけないからです。

やはり、高度なエディタを作るにはリッチテキストでは無理っぽいです。
他のサイトで指摘されてるように、色分けを自動処理するには自作しないと使えないらしいです。しかし、自作するほど時間がないのでリッチテキストを有効に使えないかなと思い質問してみました。この質問には的確に答えが出ているサイトなどもありません事に気づき、これにて解決と致します。結果的にはタグや属性などの色分けなら十分に使えることも確認できました。数万行の処理でもまったく違和感なく使えます。

回答して頂き有難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板