開発環境:Borland Delphi personal ver6.0
TRichEditコントロールに文字列を表示させることは出来たのですが、リッチエディットテキストなので、部分的に文字列のフォントやサイズ、色などを変化させたいと考えているのですが、どのようにしたら良いのか、プロパティやメソッドが分かりませんでした。ヘルプファイルでも検索しましたが、何も知らない初心者なので探し方が下手だったと思いますが、どなたか、ご存知の方、ご教授お願いします。
(TRichEdit.Textで文字列自体は、変更できました。TRichEdit.Fontで全体の色やサイズは変更できましたが、色を部分的につけたり、サイズを部分的に大きくしたりの方法が分かりません。)
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;
下記Tipsをごらんください。
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=33#0216.txt
Delphiの関数だけでは、遅いそうです。
Halbow です。
> Delphiの関数だけでは、遅いそうです。
コードを読んでみましたが、これは再描画の抑制とイベントマスクをリセットして
いるだけで、色やサイズやフォントの設定に使っている EM_SETCHARFORMAT
メッセージは、SelAttributes を設定するのと同じですね。高速化は一括変換の
ときだけに有効です。これは今回の質問と関係ありませんね。
たくさんのご返事、どうもありがとうございます。
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メッセージを送ったときの方が高速ということですか?
高速化で重要なのは、コメントで
高速化1
高速化2
と書かれている部分です。
BeginUpdateをすることで、変更が通知されても再描画しないようにします。
EM_SETEVENTMASKメッセージも、同じく変更通知を無効にしています。
これらを無効にした後は、再度有効にしないと問題が出てきます。
確かに、SelAttributesを何度も設定すると、画面がちらついていましたが、BeginUpdateをすることで、画面のちらつきがなくなっていました。ご教授、ありがとうございます。
Halbow です。
> これらは、どのようにして、インクルードすればよいのですか?
uses に RichEdit を含めます。
レスありがとうございます。おかげさまで、実装できました。自分なりに実験してみたのですが、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 です。
> 10000回で3秒しか高速化されていませんが
上から3番目にレスしましたとおり、EM_SETCHARFORMAT メッセージは、SelAttributes を設定するのと同じです。SelAttributes で複数設定
するときは API を使った方が速くなりますが、色の設定ひとつだと、
メッセージを直接おくってもあまり速くなることは期待できません。
VCL もコントロールを制御するときは API やメッセージを使っています。
それよりも、当初のサブジェクトは
> TRichEditで部分的に文字列の書式を変更するには?
で、この部分は達成されたわけですから、検索や書式設定を高速化する
ための質問はべつのスレッドにした方がよいのでは?
はい、別スレッドに次回からするようにします。
レスありがとうございました。
ツイート | ![]() |