調査に半日ほどつぶしてわからなかったので質問させてください。。
RichEditではアトリビュートの設定で、文字色等が設定できますが、
いわゆる文字単位の BG_COLOR が設定できなくて困っています。
部分背景色の設定はどうすればいいでしょうか?
よろしくお願いいたします。
Memoは無理だろう。
var
Format: CHARFORMAT2;
begin
FillChar(Format, SizeOf(Format), 0);
with Format do begin
cbSize := SizeOf(Format);
dwMask := CFM_BACKCOLOR + CFM_COLOR;
crTextColor := clRed;
crBackColor := ciYellow;
RichEdit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
end;
※ ただし、Win9X系では無効。
レスありがとうございます・・なんですが、
環境のせいか、未定義がでまくって、どうにもなりません。
Delphi 4 + Windows Me ではできないのでしょうか?
RichEdit はusesに入ってますか?
未定義がでるなら、どれが未定意義になるかぐらい書きましょう。
今回は、たまたまRichEdit関連ということで、RichEditのusesの可能性がありますが、
普通は、ただ未定義と言われてもわかりませんよ。
未定義なら、現在usesにあるユニット以外に定義されている
→なら、どのユニットに定義されているのか?
→Pro以上ならソースがあるはずなので、ソースの中で検索
→見つかったら再質問の必要なし
→ソースがないなら、「どのユニットに記載されているか」と質問。
半日調べるコトができるんだから、これくらいしようゼ。
すみません。すぐ理解していただけそうに思って書き出しませんでした。
//////////////////////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls,
richedit;
type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Format: CHARFORMAT2;
begin
FillChar(Format, SizeOf(Format), 0);
with Format do begin
cbSize := SizeOf(Format);
dwMask := CFM_BACKCOLOR + CFM_COLOR;
crTextColor := clRed;
crBackColor := ciYellow;
RichEdit1.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
end;
end;
end.
/////////////////////
未定義・・・
CHARFORMAT2
cbSize
dwMask
crTextColor
crBackColor
ciYellow
なんていうか・・・伝わらないねぇ。。。
しかも、「半日?まだアマイ」さんの丸写しですね。
ciYellowは、clYellowのタイプミスでしょうな。
あと、それ以外の未定義は、CHARFORMAT2構造体の宣言がないためでしょう。
ちなみに、今調べてみましたが、D4のRicheditユニットには、
CHARFORMAT2は用意されていないようです。
# ソースがあって、RichEditユニットに定義がなかったのか、
# ソースがなくて定義があるかどうかわからんか、ってこともも書いてくれよぅ。
# 前レスの意味がねぇぢゃん(ノ_・、)
そんなわけで、D4しかないのであれば、こういうサイトを参照して、
定義を追加するしかありません。
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/CHARFORMAT2.html
書き忘れ
> Delphi 4 + Windows Me ではできないのでしょうか?
Delphi 4 が標準で用意している定義だけではできませんが、
自分で定義を追加することでできます。
オシ解決だ(笑)
補足
いぢめているわけではなくて、質問された側の気持ちも知ってほしいのです。
いぢめられていると思ったら、書き方が悪いのですね。
すいません、謝ります m(v_v)m
CharFormat2をTCharFormat2にして見てください.
CharFormat2が,Delphi4にないとすれば,Delphi5で追加されたものと思われます.
//Delphi5のRichEdit.pasから抜粋
CHARFORMAT2 = CHARFORMAT2A;
{$EXTERNALSYM CHARFORMAT2A}
TCharFormat2A = CHARFORMAT2A;
{$EXTERNALSYM CHARFORMAT2W}
TCharFormat2W = CHARFORMAT2W;
{$EXTERNALSYM TCharFormat2}
TCharFormat2 = TCharFormat2A;
一応レコードし通しましたが、何も変化しません。
ボタンを止めて、マウスアップ・イベントにアサインしてみたんですが・・。
ちょっ下記の部分がイマイチわかりません。
const
LF_FACESIZE = 32;
type CHARFORMAT2 = record
(...)
// szFaceName: PCHAR;
szFaceName: array[0..LF_FACESIZE] of CHAR; // これでいいんでしょうか?
(...)
end;
これが直接の原因でないとすると、どうやら動かない雰囲気です。
> Delphi 4 + Windows Me ではできないのでしょうか?
WinMeではダメでしょうね。
Mr.XRAY 様
なるほど
Format: TCHARFORMAT2;
・・・とパスカル流にすると、レコードを自前で定義しなくても通りますね。
ソースを検索すれば良かったです。。
・・・とそれはともかく、どちらにしても、何の変化も起こりません。
Delphi が取り込んでるのは、想像では、RichEdit1 のバージョンが、
1.0 なのかなぁ思ったりしています。 Windows のシステム・ディレクトリには
RICHED.DLL
RICHED20.DLL
RICHED32.DLL
がありましたが、下の二つは他のソフトからインストールされたのかも知れません。
結局、キャレットの位置に、StaticText を貼り付ける方法で
やることにしました。これなら、バージョン依存しませんし・・。
TMemo でも応用できそうです。
いろいろありがとうございました。
ツイート | ![]() |