MemoやRichEditで文字単位で背景色の設定

解決


わからんちん  2006-01-03 12:57:34  No: 19462

調査に半日ほどつぶしてわからなかったので質問させてください。。
RichEditではアトリビュートの設定で、文字色等が設定できますが、
いわゆる文字単位の BG_COLOR が設定できなくて困っています。
部分背景色の設定はどうすればいいでしょうか?
よろしくお願いいたします。


半日?まだアマイ  2006-01-03 20:38:53  No: 19463

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系では無効。


わからんちん  2006-01-03 22:54:49  No: 19464

レスありがとうございます・・なんですが、
環境のせいか、未定義がでまくって、どうにもなりません。
Delphi 4 + Windows Me ではできないのでしょうか?


ハレ  2006-01-04 03:07:08  No: 19465

RichEdit はusesに入ってますか?

未定義がでるなら、どれが未定意義になるかぐらい書きましょう。
今回は、たまたまRichEdit関連ということで、RichEditのusesの可能性がありますが、
普通は、ただ未定義と言われてもわかりませんよ。

未定義なら、現在usesにあるユニット以外に定義されている
→なら、どのユニットに定義されているのか?
→Pro以上ならソースがあるはずなので、ソースの中で検索
  →見つかったら再質問の必要なし
→ソースがないなら、「どのユニットに記載されているか」と質問。

半日調べるコトができるんだから、これくらいしようゼ。


わんらんちん  2006-01-04 04:25:30  No: 19466

すみません。すぐ理解していただけそうに思って書き出しませんでした。

//////////////////////////
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


ハレ  2006-01-04 05:29:46  No: 19467

なんていうか・・・伝わらないねぇ。。。
しかも、「半日?まだアマイ」さんの丸写しですね。

ciYellowは、clYellowのタイプミスでしょうな。
あと、それ以外の未定義は、CHARFORMAT2構造体の宣言がないためでしょう。

ちなみに、今調べてみましたが、D4のRicheditユニットには、
CHARFORMAT2は用意されていないようです。
# ソースがあって、RichEditユニットに定義がなかったのか、
# ソースがなくて定義があるかどうかわからんか、ってこともも書いてくれよぅ。
# 前レスの意味がねぇぢゃん(ノ_・、)

そんなわけで、D4しかないのであれば、こういうサイトを参照して、
定義を追加するしかありません。
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/CHARFORMAT2.html

書き忘れ
> Delphi 4 + Windows Me ではできないのでしょうか?
Delphi 4 が標準で用意している定義だけではできませんが、
自分で定義を追加することでできます。

オシ解決だ(笑)


ハレ  2006-01-04 05:32:04  No: 19468

補足
いぢめているわけではなくて、質問された側の気持ちも知ってほしいのです。
いぢめられていると思ったら、書き方が悪いのですね。
すいません、謝ります  m(v_v)m


Mr.XRAY  URL  2006-01-04 06:33:02  No: 19469

CharFormat2をTCharFormat2にして見てください.
CharFormat2が,Delphi4にないとすれば,Delphi5で追加されたものと思われます.

  //Delphi5のRichEdit.pasから抜粋
  CHARFORMAT2 = CHARFORMAT2A;
  {$EXTERNALSYM CHARFORMAT2A}
  TCharFormat2A = CHARFORMAT2A;
  {$EXTERNALSYM CHARFORMAT2W}
  TCharFormat2W = CHARFORMAT2W;
  {$EXTERNALSYM TCharFormat2}
  TCharFormat2 = TCharFormat2A;


わからんちん  2006-01-04 07:00:57  No: 19470

一応レコードし通しましたが、何も変化しません。
ボタンを止めて、マウスアップ・イベントにアサインしてみたんですが・・。
ちょっ下記の部分がイマイチわかりません。

const
  LF_FACESIZE  =   32;
type CHARFORMAT2  = record
  (...)
//    szFaceName: PCHAR;
  szFaceName: array[0..LF_FACESIZE] of CHAR; // これでいいんでしょうか?
  (...)
end;

これが直接の原因でないとすると、どうやら動かない雰囲気です。


RichEdit 2.0  2006-01-04 07:12:57  No: 19471

> Delphi 4 + Windows Me ではできないのでしょうか?

WinMeではダメでしょうね。


わからんちん  2006-01-04 07:15:14  No: 19472

Mr.XRAY 様
なるほど
Format: TCHARFORMAT2;
・・・とパスカル流にすると、レコードを自前で定義しなくても通りますね。
ソースを検索すれば良かったです。。

・・・とそれはともかく、どちらにしても、何の変化も起こりません。
Delphi が取り込んでるのは、想像では、RichEdit1 のバージョンが、
1.0 なのかなぁ思ったりしています。  Windows のシステム・ディレクトリには

RICHED.DLL
RICHED20.DLL
RICHED32.DLL

がありましたが、下の二つは他のソフトからインストールされたのかも知れません。


わからんちん  2006-01-04 12:31:23  No: 19473

結局、キャレットの位置に、StaticText を貼り付ける方法で
やることにしました。これなら、バージョン依存しませんし・・。
TMemo でも応用できそうです。
いろいろありがとうございました。


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

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






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