TRichEditで部分的に文字列の書式を変更するには?

解決


ポント  2003-09-11 06:13:12  No: 4739  IP: [192.*.*.*]

開発環境:Borland Delphi personal ver6.0

TRichEditコントロールに文字列を表示させることは出来たのですが、リッチエディットテキストなので、部分的に文字列のフォントやサイズ、色などを変化させたいと考えているのですが、どのようにしたら良いのか、プロパティやメソッドが分かりませんでした。ヘルプファイルでも検索しましたが、何も知らない初心者なので探し方が下手だったと思いますが、どなたか、ご存知の方、ご教授お願いします。

(TRichEdit.Textで文字列自体は、変更できました。TRichEdit.Fontで全体の色やサイズは変更できましたが、色を部分的につけたり、サイズを部分的に大きくしたりの方法が分かりません。)

編集    削除
Halbow  URL  2003-09-11 06:58:57  No: 4740  IP: [192.*.*.*]

Halbow です。

某BBSでの回答をそのまま示します。

新規で  Form1 に  RichEdit1 と Button1 を置いて以下の
コードを試してみてください。

procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.Lines.Text := 'ABCDEFGHIJKLMN';
  RichEdit1.SelStart := 3;
  RichEdit1.SelLength := 5;
  RichEdit1.SelAttributes.Name := 'MS 明朝';
  RichEdit1.SelAttributes.Size := 15;
  RichEdit1.SelAttributes.Color := clRed;
  RichEdit1.SelAttributes.Style := [fsBold];
  RichEdit1.SelLength := 0;
  RichEdit1.SetFocus;
end;

編集    削除
たかみちえ  URL  2003-09-11 07:18:49  No: 4741  IP: [192.*.*.*]

下記Tipsをごらんください。
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=33#0216.txt

  Delphiの関数だけでは、遅いそうです。

編集    削除
Halbow  URL  2003-09-11 09:52:05  No: 4742  IP: [192.*.*.*]

Halbow です。

> Delphiの関数だけでは、遅いそうです。

コードを読んでみましたが、これは再描画の抑制とイベントマスクをリセットして
いるだけで、色やサイズやフォントの設定に使っている EM_SETCHARFORMAT 
メッセージは、SelAttributes を設定するのと同じですね。高速化は一括変換の
ときだけに有効です。これは今回の質問と関係ありませんね。

編集    削除
ポント  2003-09-12 19:07:38  No: 4743  IP: [192.*.*.*]

たくさんのご返事、どうもありがとうございます。

Halbowさんの

>  RichEdit1.Lines.Text := 'ABCDEFGHIJKLMN';
>  RichEdit1.SelStart := 3;
>  RichEdit1.SelLength := 5;
>  RichEdit1.SelAttributes.Name := 'MS 明朝';
>  RichEdit1.SelAttributes.Size := 15;
>  RichEdit1.SelAttributes.Color := clRed;
>  RichEdit1.SelAttributes.Style := [fsBold];
>  RichEdit1.SelLength := 0;
>  RichEdit1.SetFocus;



>コードを読んでみましたが、これは再描画の抑制とイベントマスクをリセットして
>いるだけで、色やサイズやフォントの設定に使っている EM_SETCHARFORMAT 
>メッセージは、SelAttributes を設定するのと同じですね。高速化は一括変換の
>ときだけに有効です。これは今回の質問と関係ありませんね。

で、前者と後者の方法で高速化されているのは、どの部分の処理なのですか?
SelAttributesを設定するよりEM_SETCHARFORMATメッセージを送ったときの方が高速ということですか?

編集    削除
にしの  2003-09-12 19:45:01  No: 4744  IP: [192.*.*.*]

高速化で重要なのは、コメントで
高速化1
高速化2
と書かれている部分です。

BeginUpdateをすることで、変更が通知されても再描画しないようにします。
EM_SETEVENTMASKメッセージも、同じく変更通知を無効にしています。

これらを無効にした後は、再度有効にしないと問題が出てきます。

編集    削除
ポント  2003-09-13 21:14:17  No: 4745  IP: [192.*.*.*]

確かに、SelAttributesを何度も設定すると、画面がちらついていましたが、BeginUpdateをすることで、画面のちらつきがなくなっていました。ご教授、ありがとうございます。

http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=33#0216.txtのページに載っているチップスを、自分で実装してみようとしたのですが、コード内の、TCharFormat型や、TCharRanget型、EM_SETCHARFORMAT定数などの値が、コード補完リストにも載っていないので、分かりませんでした。これらは、どのようにして、インクルードすればよいのですか? ご教授、お願いします。

編集    削除
Halbow  URL  2003-09-13 23:29:11  No: 4746  IP: [192.*.*.*]

Halbow です。

> これらは、どのようにして、インクルードすればよいのですか? 

uses に RichEdit を含めます。

編集    削除
ポント  2003-09-14 03:33:14  No: 4747  IP: [192.*.*.*]

レスありがとうございます。おかげさまで、実装できました。自分なりに実験してみたのですが、WinAPIを使用して高速化しても、10000回の書式設定をするのに、11秒ぐらいは掛かってしまうものなのですか。(誰も、10000回書式設定する方はおられないと思いますけれども。)

色々実験してみましたが、ちらつきをなくすために、BeginUpdate()しただけで、SelStart、SelLength、SelAttributesのDelphi関数を他の処理は使用して、10000回の処理を繰り返すと、14秒掛かり、http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=33#0216.txtのページに載っているチップス通りにAPIで実装して、10000回の処理を繰り返しても、11秒掛かってしまいました。10000回で3秒しか高速化されていませんが、これくらいなのですか。

編集    削除
Halbow  URL  2003-09-14 04:05:10  No: 4748  IP: [192.*.*.*]

Halbow です。

> 10000回で3秒しか高速化されていませんが

上から3番目にレスしましたとおり、EM_SETCHARFORMAT メッセージは、SelAttributes を設定するのと同じです。SelAttributes で複数設定
するときは API を使った方が速くなりますが、色の設定ひとつだと、
メッセージを直接おくってもあまり速くなることは期待できません。
VCL もコントロールを制御するときは API やメッセージを使っています。

それよりも、当初のサブジェクトは

> TRichEditで部分的に文字列の書式を変更するには?

で、この部分は達成されたわけですから、検索や書式設定を高速化する
ための質問はべつのスレッドにした方がよいのでは?

編集    削除
ポント  2003-09-14 05:57:18  No: 4749  IP: [192.*.*.*]

はい、別スレッドに次回からするようにします。
レスありがとうございました。

編集    削除