トップ回答者
RichTextBoxに色をつけて変数の値を表示したい。

質問
-
こんばんわ下記のプログラムでRichTextBox1に「青(青色で表示) 黄(黄色で表示) 赤(赤色で表示)」と表示されることを期待していましたが、「青(青色で表示) 黄(青色で表示) 赤(赤色で表示)」と表示されます。期待どおりに表示されるようにはどうすればよろしいでしょうか?よろしくご教示お願いいたします。Public Class Form1Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim a As StringWith RichTextBox1.Text = ""a = "青" '.......(1).Text &= a.SelectionStart = .Text.Length - a.Length.SelectionLength = a.LengthSelect Case aCase "赤".SelectionColor = Color.RedCase "黄".SelectionColor = Color.YellowCase "青".SelectionColor = Color.BlueEnd Selecta = "黄" '.......(2).Text &= a.SelectionStart = .Text.Length - a.Length.SelectionLength = a.LengthSelect Case aCase "赤".SelectionColor = Color.RedCase "黄".SelectionColor = Color.YellowCase "青".SelectionColor = Color.BlueEnd Selecta = "赤" '.......(3).Text &= a.SelectionStart = .Text.Length - a.Length.SelectionLength = a.LengthSelect Case aCase "赤".SelectionColor = Color.RedCase "黄".SelectionColor = Color.YellowCase "青".SelectionColor = Color.BlueEnd SelectEnd WithEnd SubEnd Class
回答
-
書式情報がどのように記憶されているか、どのように失われているかがわかりません。
Text プロパティに書式情報ってありましたか?
例のコードの最後に以下を加えた場合、一つの色になりませんか。
Text = ""
Text = "てすと"書式情報の記憶を失わなくする方法があるのでしょうか?
Text プロパティを使うなと言うことです。
使わないで文字列を加える方法を調査してみてください。1 ~ 2 年前にも全く同じ原因でとのことで「最初の 1 文字が期待しない色」だったそうですが、私の場合は、「2文字目」です。
記憶で語っているので、その辺は私の記憶違いかもしれません。
どちらにせよ、色をつけた後に Text プロパティを触っているので色が期待結果と異なるというのは同じことです。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 編集済み AzuleanMVP, Moderator 2011年12月7日 21:29
- 回答としてマーク jun1-hirakawa 2011年12月8日 7:50
-
外池と申します。
jun1-hirakawaさんが遭遇した現象は私も再現できて、ただ、何故なのかはわかりませんでした。回避する方法として、
文字を付け加える前に、
SelectionStartが文字列の末尾に、
SelectionLengthがゼロにしておいて、
SelectionColorを指定し、
そして、AppendTextを使うが良さそうなこともとよいこともわかりました。ただ、これで大丈夫な理由もわかりません。
ドキュメントを読んでも、Textプロパティーと書式の内部表現の関係はわからず、Azuleanさんの仰る「Textプロパティーを使わないように」というのも、なんとなく理由を想像する以上のことはできません。
その上で、以下、根本的な疑問なんですが・・・、ユーザーがRichTextBoxの画面上で文字列を編集するのではなく、プログラムで制御する場合に、
文字列の末尾に文字列を追加する操作はAppendTextでできます。これで既存の文字列の書式を壊さずに、意図する書式で文字列を末尾に追加できそうなことは判りました。
では、既存文字列の途中に新たな文字列を追加したり、途中の文字列を削除したりする操作はどうすれば良いのでしょうか? Textプロパティーを使わずにはできないような。そうすると、この場合、既存文字列の書式が壊れる可能性は、常にある、ということになるんでしょうか?
ーーー失礼、解決かもーーー
SelectedTextで操作すればいいのか・・・
(ホームページを再開しました)
- 編集済み 外池 2011年12月8日 1:41
- 回答としてマーク jun1-hirakawa 2011年12月8日 7:50
すべての返信
-
そうなる理由は知っているのですが、ちょっと聞かせてください。
これって、何かの課題ですか?それとも、どこかのサンプルを元に実験しているのですか?
1 ~ 2 年前にも全く同じ原因で困っている質問を見ました。1 文字ずつ色を変えて RichTextBox に設定するプログラムでしたが、最初の 1 文字が期待しない色になっているというものでした。
同じ問題が何度も発生するのであれば、サンプルが元であればそのサイトにフィードバックしておくことも考えたいです。
あるいは、学校・会社の課題であれば、自分でデバッグしていただきたいと思います。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 編集済み AzuleanMVP, Moderator 2011年12月7日 14:04
-
Azuleanさん こんばんは
プログラム作成中、変数の値をTextBoxに表示させていましたが、色わけして表示させたほうが見やすいのではないかと思いその方法を考えています。
RichTextBoxには出来そうだったのでやってみましたが期待通りにはなりません。
私自身、SelectionStart、SelectionLength、SelectionColor などの意味や使い方に間違いや、勘違いがあるのでしょうかうまくいきません。
(SelectionStartの文字位置から、SelectionLengthの文字数を、SelectionColor で色をつけると思っていますが)
質問につけたプログラムは、自分の期待とその結果が違うのがわかりやすくするためにつくったプログラムです。
ご教示願えれば幸いです。
-
書式情報がどのように記憶されているか、どのように失われているかがわかりません。
Text プロパティに書式情報ってありましたか?
例のコードの最後に以下を加えた場合、一つの色になりませんか。
Text = ""
Text = "てすと"書式情報の記憶を失わなくする方法があるのでしょうか?
Text プロパティを使うなと言うことです。
使わないで文字列を加える方法を調査してみてください。1 ~ 2 年前にも全く同じ原因でとのことで「最初の 1 文字が期待しない色」だったそうですが、私の場合は、「2文字目」です。
記憶で語っているので、その辺は私の記憶違いかもしれません。
どちらにせよ、色をつけた後に Text プロパティを触っているので色が期待結果と異なるというのは同じことです。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 編集済み AzuleanMVP, Moderator 2011年12月7日 21:29
- 回答としてマーク jun1-hirakawa 2011年12月8日 7:50
-
外池と申します。
jun1-hirakawaさんが遭遇した現象は私も再現できて、ただ、何故なのかはわかりませんでした。回避する方法として、
文字を付け加える前に、
SelectionStartが文字列の末尾に、
SelectionLengthがゼロにしておいて、
SelectionColorを指定し、
そして、AppendTextを使うが良さそうなこともとよいこともわかりました。ただ、これで大丈夫な理由もわかりません。
ドキュメントを読んでも、Textプロパティーと書式の内部表現の関係はわからず、Azuleanさんの仰る「Textプロパティーを使わないように」というのも、なんとなく理由を想像する以上のことはできません。
その上で、以下、根本的な疑問なんですが・・・、ユーザーがRichTextBoxの画面上で文字列を編集するのではなく、プログラムで制御する場合に、
文字列の末尾に文字列を追加する操作はAppendTextでできます。これで既存の文字列の書式を壊さずに、意図する書式で文字列を末尾に追加できそうなことは判りました。
では、既存文字列の途中に新たな文字列を追加したり、途中の文字列を削除したりする操作はどうすれば良いのでしょうか? Textプロパティーを使わずにはできないような。そうすると、この場合、既存文字列の書式が壊れる可能性は、常にある、ということになるんでしょうか?
ーーー失礼、解決かもーーー
SelectedTextで操作すればいいのか・・・
(ホームページを再開しました)
- 編集済み 外池 2011年12月8日 1:41
- 回答としてマーク jun1-hirakawa 2011年12月8日 7:50
-
外池さん先日もお世話になりました。
AppendTextという便利なものがあるのですね?
探せませんでした。これからは使用させてもらいます。
Azuleanさんからのご教示で、自分なりにネットで調べて、Tagプロパティでどうにか出来ないかなどやってみましたが、だめで思案に暮れていたところでした。
AppendTextとせっかくですからTagプロパティを使ってプログラムし、期待通りの結果がでました。
Azuleanさん、外池さんありがとうございました。
これからも、ご教示よろしくお願いします。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As String
With RichTextBox1
.Text = ""
.Tag = .Text
a = "青" '.......(1)
.AppendText(a)
.Tag &= a
.SelectionStart = .Tag.Length - a.Length
.SelectionLength = a.Length
Select Case a
Case "赤"
.SelectionColor = Color.Red
Case "黄"
.SelectionColor = Color.Yellow
Case "青"
.SelectionColor = Color.Blue
End Select
a = "黄" '.......(2)
.AppendText(a)
.Tag &= a
.SelectionStart = .Tag.Length - a.Length
.SelectionLength = a.Length
Select Case a
Case "赤"
.SelectionColor = Color.Red
Case "黄"
.SelectionColor = Color.Yellow
Case "青"
.SelectionColor = Color.Blue
End Select
a = "赤" '.......(3)
.AppendText(a)
.Tag &= a
.SelectionStart = .Tag.Length - a.Length
.SelectionLength = a.Length
Select Case a
Case "赤"
.SelectionColor = Color.Red
Case "黄"
.SelectionColor = Color.Yellow
Case "青"
.SelectionColor = Color.Blue
End Select
End With
End Sub
End Class