TRichEditの末尾に書式付テキストを追加したい

解決


studio-take  2012-08-24 05:26:54  No: 42820

データベースから書式付きのテキストを複数呼び出して、一つのリッチテキストに挿入していきたいのですが、Assignでは上書きされるだけなので、どうにか追加したいのですが、そういうメソッドはないのでしょうか?


Mr.XRAY  2012-08-24 10:30:09  No: 42821

TMemoryStream メモリストリームに格納してから,
他の TRichEdit に読み込ませるのはどうでしょうか.


Mr.XRAY  2012-08-24 23:04:16  No: 42822

失礼 !!

>TMemoryStream メモリストリームに格納してから,

リッチテキストは,1つの文書でから,これはできないですね.
受け取る側で,挿入モードにしないと.
ということは,  EM_STREAMIN メッセージを使用して受け取るということになりそうです.


Atchoum  2012-08-25 00:42:01  No: 42823

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に吐き出します。


Mr.XRAY  2012-08-25 01:08:05  No: 42824

>int := mem2.CopyFrom(mem,0);

おおっ.CopyFrom というのがありましたね.なるほどです.


studio-take  2012-08-27 01:05:26  No: 42825

レス遅くなり、すいません。
保存側がなかなかうまくできなくて、返事できませんでした。
実は、まだできてなくて、
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  2012-08-27 02:08:52  No: 42826

ちわ !! Mr.XRAY です.

データベースへの格納ということですが.
できれば,別のスレッドにしていたたけると嬉しいです.

なぜかと言うと,もちろん,掲示板を検索もしますが,
タイトルで内容を判断して,読んだりします.
お願い !! m(_ _)m

いやだ !! というのであれば,いたしかたありません.私には強制する権限はありません.
でも,誰かレスしちゃうかも知れまいな......


studio-take  2012-08-27 04:17:33  No: 42827

Mr.XRAYさん、いつもすいません。
以前にストリームでスレ起てたことがあったんで、恥ずかしいなーと思って、控えてました。

んで、一応保存はできました。
TIBBlobStreamにこだわりすぎていましたが、
var
  BS:TStream;
begin
  Edit;
  BS := CreateBlobStream(TBlobField(FieldByName('NOTE')),bmWrite);
  RichEdit1.Lines.SavetoStream(BS);
  Post;
end;

みたいな感じでいけました。


studio-take  2012-08-27 04:55:52  No: 42828

やっと読み込みまでたどり着きました。
それでなんですが、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);


KHE00221  2012-08-27 06:32:39  No: 42829

DB上にある書式付きテキストって RichEdit で編集した内容そのもの
だと思うのだけど
そうすると各RTFはヘッダ付きになるので

単純に追記で読み込んでいくと
ヘッダー
本文
ヘッダー
本体

みなくなると思うけど


Mr.XRAY  2012-08-27 15:45:32  No: 42830

リッチテキスト形式の文書 (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;
にすると,挿入モードでつなげることができます.


studio-take  2012-09-05 17:24:15  No: 42831

すいません。遅レスで。
EM_STREAMINを使ったんですが、なかなかうまくいかず、
結局、クリップボード経由でごまかしました。

せっかく教えて頂いたのにすいません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加