データベースから書式付きのテキストを複数呼び出して、一つのリッチテキストに挿入していきたいのですが、Assignでは上書きされるだけなので、どうにか追加したいのですが、そういうメソッドはないのでしょうか?
TMemoryStream メモリストリームに格納してから,
他の TRichEdit に読み込ませるのはどうでしょうか.
失礼 !!
>TMemoryStream メモリストリームに格納してから,
リッチテキストは,1つの文書でから,これはできないですね.
受け取る側で,挿入モードにしないと.
ということは, EM_STREAMIN メッセージを使用して受け取るということになりそうです.
Mr.XRAYさんの方法を受けて、TMemoryStream.CopyFromメソッドではどうでしょうか?
test1,2,3のテキストの内容をRichEdit1に出力します。(CopyFromメソッド今回初めて使いました★)
procedure TForm1.Button1Click(Sender: TObject);
var
mem,mem2:TMemoryStream;
int:integer;
begin
mem := TMemoryStream.Create;
mem2 := TMemoryStream.Create;
try
mem.LoadFromFile('test1.txt');//test1.txtを一旦MemoryStreamへ読み込み
int := mem2.CopyFrom(mem,0); //memからmem2にコピーする
mem.LoadFromFile('test2.txt');
int := mem2.CopyFrom(mem,0);
mem.LoadFromFile('test3.txt');
int := mem2.CopyFrom(mem,0);
mem2.Position := 0;
RichEdit1.Lines.LoadFromStream(mem2);//mem2に蓄積された内容をRichEdit1に出力する
finally
FreeAndNil(mem);
FreeAndNil(mem2);
end;
end;
データベースからだと、RichEditにデータベースから取得したものをセットしてからMemoryStreamに吐き出します。
>int := mem2.CopyFrom(mem,0);
おおっ.CopyFrom というのがありましたね.なるほどです.
レス遅くなり、すいません。
保存側がなかなかうまくできなくて、返事できませんでした。
実は、まだできてなくて、
FireBirdなんですが、
データセットの
Edit〜Post間の処理で保存できてません。
var
BS:TIBBlobStream;
begin
Edit;
BS := CreateBlobStream(TBlobField(FieldByName('NOTE')),bmWrite);
RichEdit1.Lines.SaveToStream(BS);
Post;
end;
BSの型をMemoryStreamにしてみたり、TStreamにしてみたりいろいろ試したんですが、うまくはまりません。
ヒントもらえませんか。お願いします。
ちわ !! Mr.XRAY です.
データベースへの格納ということですが.
できれば,別のスレッドにしていたたけると嬉しいです.
なぜかと言うと,もちろん,掲示板を検索もしますが,
タイトルで内容を判断して,読んだりします.
お願い !! m(_ _)m
いやだ !! というのであれば,いたしかたありません.私には強制する権限はありません.
でも,誰かレスしちゃうかも知れまいな......
Mr.XRAYさん、いつもすいません。
以前にストリームでスレ起てたことがあったんで、恥ずかしいなーと思って、控えてました。
んで、一応保存はできました。
TIBBlobStreamにこだわりすぎていましたが、
var
BS:TStream;
begin
Edit;
BS := CreateBlobStream(TBlobField(FieldByName('NOTE')),bmWrite);
RichEdit1.Lines.SavetoStream(BS);
Post;
end;
みたいな感じでいけました。
やっと読み込みまでたどり着きました。
それでなんですが、CopyFromって追記メソッドなんでしょうか?
1回目のストリームしか読んでくれません。
タイトルと本文があるんで、交互に追記して、最終リッチに戻す仕様にしたんですが、
タイトルしか読んでくれません。
何か他にコツがあるのかな。
While not EOF do
begin
//タイトル
frmMessageSet.retMessage.Clear;
frmMessageSet.retMessage.Lines.Add('『' + FieldByName('Title').AsString + '』');
frmMessageSet.retMessage.Lines.Add('FROM:' + IBEmployeeNameRead(FieldByName('INPUTUSER').AsString));
frmMessageSet.retMessage.Lines.SaveToStream(MSTitle);
int := MSTotal.CopyFrom(MSTitle,0);
//本文
frmMessageSet.retMessage.Lines.Assign(FieldByName('NOTE'));
frmMessageSet.retMessage.Lines.SaveToStream(MSNote);
int := MSTotal.CopyFrom(MSNote,0);
Next;
end;
//まとめ
MSTotal.Position := 0;
frmMessage.retToday.Lines.LoadFromStream(MSTotal);
DB上にある書式付きテキストって RichEdit で編集した内容そのもの
だと思うのだけど
そうすると各RTFはヘッダ付きになるので
単純に追記で読み込んでいくと
ヘッダー
本文
ヘッダー
本体
みなくなると思うけど
リッチテキスト形式の文書 (RTF文書) は,1つの文書となっています.
既にあるレスのように,
単にストリームから読み出しても,1つのリッチテキスト文書しか認識してくれません.
実際にはストリームとしてつなげれば,ストリームには保存されますが,
文書の区切りがあるためです.
複数の文書を,1つの文書して読み込むには,EM_STREAMINメッセージというのを使用します.
http://mrxray.on.coocan.jp/Delphi/plSamples/673_RichEdit_Stream.htm#list3 の
procedure TForm1.SpeedButton1Click(Sender: TObject);
を参考にしてください.
このコードは,FStreamにある内容を,
Flags := SF_RTF or SFF_SELECTION;
にすると,挿入モードでつなげることができます.
すいません。遅レスで。
EM_STREAMINを使ったんですが、なかなかうまくいかず、
結局、クリップボード経由でごまかしました。
せっかく教えて頂いたのにすいません。
ツイート | ![]() |