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

リッチテキストの文字列連結

環境/言語:[WinXP .NET Framework1.1]
分類:[.NET]

はじめまして、四季と申します。

現在、リッチテキストを用いて簡易掲示板なるものを作っているのですが、リッチテキストの内容を連結する方法が分からずに悩んでおります。

仕掛け的には

掲示内容フォルダ
→ 掲示内容001.rtf
→ 掲示内容002.rtf
→ 掲示内容003.rtf

という感じで、指定されたフォルダ内に、掲示したい内容が書かれたリッチテキストファイルを終結させます。
リッチテキスト内には、フォント変更、色の変更などが行われたデータになっています。
(実際はネットワーク内なので、ファイル名は書き込みの行われたコンピュータ名になります)

で、表示用のリッチテキストボックスと、読み込み専用のリッチテキストボックスを用意。
読み込み専用の方にLoadFileを用いて読み込み。
までは何とか思いついたのですが、あとはこれを順次表示側に連結していくところで止まってしまっています。

知りたい内容としては、
・リッチテキストボックスの内容を、ほかのリッチテキストボックスに連結方法。
・もしくは、リッチテキストファイルの中身を連結して表示させるいい手段。
があればご教授願えないでしょうか?

お忙しいところ恐れ入りますが、よろしくお願いいたします。
■No3472に返信(四季さんの記事)
> はじめまして、四季と申します。
>
> 現在、リッチテキストを用いて簡易掲示板なるものを作っているのですが、リッチテキストの内容を連結する方法が分からずに悩んでおります。
>
> 仕掛け的には
>
> 掲示内容フォルダ
> → 掲示内容001.rtf
> → 掲示内容002.rtf
> → 掲示内容003.rtf
>
> という感じで、指定されたフォルダ内に、掲示したい内容が書かれたリッチテキストファイルを終結させます。
> リッチテキスト内には、フォント変更、色の変更などが行われたデータになっています。
> (実際はネットワーク内なので、ファイル名は書き込みの行われたコンピュータ名になります)
>
> で、表示用のリッチテキストボックスと、読み込み専用のリッチテキストボックスを用意。
> 読み込み専用の方にLoadFileを用いて読み込み。
↑このLoadFileとは何ですか?自分で作成したメソッドですか?

> までは何とか思いついたのですが、あとはこれを順次表示側に連結していくところで止まってしまっています。
>
> 知りたい内容としては、
> ・リッチテキストボックスの内容を、ほかのリッチテキストボックスに連結方法。
> ・もしくは、リッチテキストファイルの中身を連結して表示させるいい手段。
> があればご教授願えないでしょうか?
>
> お忙しいところ恐れ入りますが、よろしくお願いいたします。
>
まずはStreamReaderを用いて、読み込む。
あらかじめStringBuilderオブジェクトを作っておいて、Append()メソッドで
読み込んだ文字列を連結してゆく。
ざっと、こんなところでしょうか?

StringBuilderクラスを用いたのは、こちらの方が、効率がいいからです。
stringオブジェクトを+=して連結しているのでは、いちいちオブジェクトを生成してしまい、非常に効率が悪いです。
お忙しいところありがとうございます。

■No3473に返信(りょうさんの記事)
>>読み込み専用の方にLoadFileを用いて読み込み。
> ↑このLoadFileとは何ですか?自分で作成したメソッドですか?

リッチテキストボックスにあるメソッドです。
ファイルを指定するだけでリッチテキストの書式通りにリッチテキストボックスに表示してくれるので便利だなぁとおもって使っています。

> まずはStreamReaderを用いて、読み込む。
> あらかじめStringBuilderオブジェクトを作っておいて、Append()メソッドで
> 読み込んだ文字列を連結してゆく。
> ざっと、こんなところでしょうか?
>
> StringBuilderクラスを用いたのは、こちらの方が、効率がいいからです。
> stringオブジェクトを+=して連結しているのでは、いちいちオブジェクトを生成してしまい、非常に効率が悪いです。

単純にStreamReaderを用いると、

{\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fnil\fcharset128 MS UI Gothic;}}
{\colortbl ;\red0\green255\blue0;\red255\green0\blue0;}
{\*\generator Msftedit 5.41.15.1503;}\viewkind4\uc1\pard\cf1\lang1041\f0\fs18\'8e\'96\'96\'b1\'8b\'c7\'82\'51\cf0\par
\par
\'83\'65\'83\'58\'83\'67\'82\'c5\'82\'b7\'81\'42\par
\cf2\'82\'a8\'82\'dc\'82\'af\'82\'c5\'82\'b7\'81\'42\par
\cf0\par
}
と、なってしまうのですが、リッチテキストに対応した読み込み方があるのでしょうか?

● ファイル内容
===============
掲示内容001.rtf

おはよう(←赤文字)
===============
掲示内容002.rtf

こんにちは(←青文字)
===============

と書かれたリッチテキストファイルの内容を読み込んで、リッチテキストボックスに、

● VB.netのフォーム内リッチテキストボックス
===============
おはよう(←赤文字)
こんにちは(←青文字)
===============

と表示したいのです…

スキル不足で申し訳ありません。
RTFとRichTextBoxコントロールについてはみんな悩まされます(私もRichTextBoxには苦い思いを何度もさせられました)。

RTFファイルには書式情報が含まれるため、そのままテキストデータとしては使用できません(HTMLファイルのようなものです)。
RichTextBoxの多くの操作にはSelect()メソッドを使用します。そうして選択されたテキストをSelectionColorプロパティを使って色を変更したり、SelectionFontプロパティを使ってフォントを変更したりします。こうした選択されたテキストを操作するプロパティの中にSelectedRtfプロパティがあります。
このプロパティは選択されたテキストを、RTFの書式情報のついた文字列を正しく処理したテキストに置き換えます。

これを利用して、今回の問題を解決できると思います。

'RTFファイルを読み込みます
StreamReader stream = New StreamReader(fileName)

'すでに入力されたテキストの最後を選択します
Me.RichTextBox1.Select(Me.RichTextBox1.TextLength, 0)

'選択された部分を書式付文字列に置き換えます
Me.RichTextBox1.SelectedRtf = stream.ReadToEnd()
■No3475に返信(Codingslaveさんの記事)
> RTFとRichTextBoxコントロールについてはみんな悩まされます(私もRichTextBoxには苦い思いを何度もさせられました)。
>
> RTFファイルには書式情報が含まれるため、そのままテキストデータとしては使用できません(HTMLファイルのようなものです)。
> RichTextBoxの多くの操作にはSelect()メソッドを使用します。そうして選択されたテキストをSelectionColorプロパティを使って色を変更したり、SelectionFontプロパティを使ってフォントを変更したりします。こうした選択されたテキストを操作するプロパティの中にSelectedRtfプロパティがあります。
> このプロパティは選択されたテキストを、RTFの書式情報のついた文字列を正しく処理したテキストに置き換えます。
>
> これを利用して、今回の問題を解決できると思います。
>
> 'RTFファイルを読み込みます
> StreamReader stream = New StreamReader(fileName)
>
> 'すでに入力されたテキストの最後を選択します
> Me.RichTextBox1.Select(Me.RichTextBox1.TextLength, 0)
>
> '選択された部分を書式付文字列に置き換えます
> Me.RichTextBox1.SelectedRtf = stream.ReadToEnd()

簡潔にいうと、複数のRTFファイルを連結させて、RichTectBoxに表示するには、
ずべてのRTFをプレーンテキストとして読み込んで、連結して、
そして、その文字列を
RichTextBox.RTFプロパティ
に代入すればいいのではないですか?
> 簡潔にいうと、複数のRTFファイルを連結させて、RichTectBoxに表示するには、
> ずべてのRTFをプレーンテキストとして読み込んで、連結して、
> そして、その文字列を
> RichTextBox.RTFプロパティ
> に代入すればいいのではないですか?

Dim newRtfText As New StringBuilder(Me.RichTextBox1.Rtf)
Dim reader As New StreamReader(fileName)

newRtfText.Append(reader.ReadToEnd())
Me.RichTextBox1.Rtf = newRtfText.ToString()
reader.Close()

このような処理を想定していらっしゃるのでしたらお試しあれ。

RtfはHTMLのように決められた書式があります。
RichTextBox.Rtfプロパティはドキュメント全体をString型で扱うものですが、これはいわばRtfファイルをメモ帳で開くようなものです。そのため、このプロパティに代入を行っても渡された文字列の書式に則った適切な変換は行わないため期待するような動作はしません(たとえるならXMLでルート要素が複数あるような状態になります)。
夜分になってしまいました、四季です。

■No3475に返信(Codingslaveさんの記事)
> RichTextBoxの多くの操作にはSelect()メソッドを使用します。そうして選択されたテキストをSelectionColorプロパティを使って色を変更したり、SelectionFontプロパティを使ってフォントを変更したりします。こうした選択されたテキストを操作するプロパティの中にSelectedRtfプロパティがあります。
> このプロパティは選択されたテキストを、RTFの書式情報のついた文字列を正しく処理したテキストに置き換えます。
>
> これを利用して、今回の問題を解決できると思います。
>
> 'RTFファイルを読み込みます
> StreamReader stream = New StreamReader(fileName)
>
> 'すでに入力されたテキストの最後を選択します
> Me.RichTextBox1.Select(Me.RichTextBox1.TextLength, 0)
>
> '選択された部分を書式付文字列に置き換えます
> Me.RichTextBox1.SelectedRtf = stream.ReadToEnd()

仰られる通り、上記方法でやってみましたところ、ばっちりうまくいきました^^。
Me.RichTextBox1.rtfに直接stream.ReadToEnd()を代入すると、リッチテキストとして反映されるのまではいろいろやって分かったのですが、選択部分を(最後の部分を選択したことにして)置き換えるとは、いやはや、なるほどと歓心させられました。

■No3477に返信(りょうさんの記事)

> 簡潔にいうと、複数のRTFファイルを連結させて、RichTectBoxに表示するには、
> ずべてのRTFをプレーンテキストとして読み込んで、連結して、
> そして、その文字列を
> RichTextBox.RTFプロパティ
> に代入すればいいのではないですか?

りょうさんの仰られている方法で試してみましたところ、一番最初のものしか表示されませんでした。
もしその方法でもできるようでしたら、他のパターンの参考として勉強させていただきたいので、ソースなどいただければ幸いです。

Codingslaveさん、りょうさん、お手数をおかけいたしました。
おかげで無事に解決いたしました^^。
今後も何かとお世話になるかと思いますが、よろしくお願いいたします。
ありがとうございました^^。
解決済み!

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