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

解決


ポント  2003-09-11 06:13:12  No: 4739

開発環境:Borland Delphi personal ver6.0

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

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


Halbow  URL  2003-09-11 06:58:57  No: 4740

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

下記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

Halbow です。

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

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


ポント  2003-09-12 19:07:38  No: 4743

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

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

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

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

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


ポント  2003-09-13 21:14:17  No: 4745

確かに、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

Halbow です。

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

uses に RichEdit を含めます。


ポント  2003-09-14 03:33:14  No: 4747

レスありがとうございます。おかげさまで、実装できました。自分なりに実験してみたのですが、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

Halbow です。

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

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

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

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

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


ポント  2003-09-14 05:57:18  No: 4749

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


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

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






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