none
RichTextBoxに色をつけて変数の値を表示したい。 RRS feed

  • 質問

  • こんばんわ
    下記のプログラムでRichTextBox1に「青(青色で表示) 黄(黄色で表示) 赤(赤色で表示)」と表示されることを
    期待していましたが、「青(青色で表示) 黄(青色で表示) 赤(赤色で表示)」と表示されます。
    期待どおりに表示されるようにはどうすればよろしいでしょうか?
    よろしくご教示お願いいたします。
    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 = ""
                a = "青"                         '.......(1)
                .Text &= a
                .SelectionStart = .Text.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)
                .Text &= a
                .SelectionStart = .Text.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)
                .Text &= a
                .SelectionStart = .Text.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
    2011年12月7日 11:49

回答

  • 書式情報がどのように記憶されているか、どのように失われているかがわかりません。

    Text プロパティに書式情報ってありましたか?
    例のコードの最後に以下を加えた場合、一つの色になりませんか。
    Text = ""
    Text = "てすと"

    書式情報の記憶を失わなくする方法があるのでしょうか?

    Text プロパティを使うなと言うことです。
    使わないで文字列を加える方法を調査してみてください。

    1 ~ 2 年前にも全く同じ原因でとのことで「最初の 1 文字が期待しない色」だったそうですが、私の場合は、「2文字目」です。

    記憶で語っているので、その辺は私の記憶違いかもしれません。
    どちらにせよ、色をつけた後に Text プロパティを触っているので色が期待結果と異なるというのは同じことです。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年12月7日 21:29
    モデレータ
  • 外池と申します。

    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
    2011年12月8日 1:30

すべての返信

  • そうなる理由は知っているのですが、ちょっと聞かせてください。
    これって、何かの課題ですか?それとも、どこかのサンプルを元に実験しているのですか?

    1 ~ 2 年前にも全く同じ原因で困っている質問を見ました。1 文字ずつ色を変えて RichTextBox に設定するプログラムでしたが、最初の 1 文字が期待しない色になっているというものでした。
    同じ問題が何度も発生するのであれば、サンプルが元であればそのサイトにフィードバックしておくことも考えたいです。
    あるいは、学校・会社の課題であれば、自分でデバッグしていただきたいと思います。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年12月7日 14:02
    モデレータ
  • Azuleanさん こんばんは

    プログラム作成中、変数の値をTextBoxに表示させていましたが、色わけして表示させたほうが見やすいのではないかと思いその方法を考えています。

    RichTextBoxには出来そうだったのでやってみましたが期待通りにはなりません。

    私自身、SelectionStart、SelectionLength、SelectionColor などの意味や使い方に間違いや、勘違いがあるのでしょうかうまくいきません。

    (SelectionStartの文字位置から、SelectionLengthの文字数を、SelectionColor で色をつけると思っていますが)

    質問につけたプログラムは、自分の期待とその結果が違うのがわかりやすくするためにつくったプログラムです。

    ご教示願えれば幸いです。

    2011年12月7日 14:50
  • Text &= a の意味と、Text プロパティの性質を考えれば見えてくるかもしれませんね。
    書式情報がどのように記憶されているか、どのように失われているか。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年12月7日 15:31
    モデレータ
  • Text &= a はText=Text+a と思いますが、書式情報がどのように記憶されているか、どのように失われているかがわかりません。

    書式情報の記憶を失わなくする方法があるのでしょうか?

    なお、1 ~ 2 年前にも全く同じ原因でとのことで「最初の 1 文字が期待しない色」だったそうですが、私の場合は、「2文字目」です。

    ご教示願えれば幸いです。

     

    追伸

     このフォーラムの調子が悪いようで、なかなかつながりませんですみませんでした。

    2011年12月7日 19:03
  • 書式情報がどのように記憶されているか、どのように失われているかがわかりません。

    Text プロパティに書式情報ってありましたか?
    例のコードの最後に以下を加えた場合、一つの色になりませんか。
    Text = ""
    Text = "てすと"

    書式情報の記憶を失わなくする方法があるのでしょうか?

    Text プロパティを使うなと言うことです。
    使わないで文字列を加える方法を調査してみてください。

    1 ~ 2 年前にも全く同じ原因でとのことで「最初の 1 文字が期待しない色」だったそうですが、私の場合は、「2文字目」です。

    記憶で語っているので、その辺は私の記憶違いかもしれません。
    どちらにせよ、色をつけた後に Text プロパティを触っているので色が期待結果と異なるというのは同じことです。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年12月7日 21:29
    モデレータ
  • 外池と申します。

    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
    2011年12月8日 1:30
  • 外池さん先日もお世話になりました。

    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

     

    2011年12月8日 7:48