StringGrid内の文字の一部に色をつけるには?


色吉害  2011-12-02 23:57:16  No: 41295

こんにちは
StringGridに表示している文字の一部に色をつけたいのです。

[1,2,3,4,5]セル内に左のような文字列があって、2と4に赤色をつけるにはどうすればいいのでしょうか。


StringGrid  2011-12-03 01:06:40  No: 41296

OnDrawCell内で描画されたらいかがでしょうか?

黒は"1  3  5"
赤は"  2  4  "
で文字列を構成し、それぞれFont.ColorとDrawTextで描画する。
面倒ですけど、こうすればできます。


色吉害  2011-12-03 04:54:16  No: 41297

font.colorの使い方はわかるのですが、drawtextというのはどのようにつかうのでしょうか。

StringGrid1.Cells[ACol,ARow]
      行
列[1,2,3,4,5]
列[6,2,8,4,10]
列[1,5,2,8,1]
行と列に数字がランダムに表示され、その中から2,4は赤色にする場合の、drawtextの使い方はどうするのでしょうか。


StringGrid  2011-12-05 23:15:19  No: 41298

単純に・・・

例えば以下のように文字列を返すようにメソッドを用意する

Cell[ACol,ARow]          → '1,2,3,4,5' ならば
_GetRedMoji(ACol,ARow)   → '  2   4  '
_GetBlackMoji(ACol,ARow) → '1, ,3, ,5'

Cell[ACol,ARow]          → '1,5,2,8,1'ならば
_GetRedMoji(ACol,ARow)   → '  5 2    '
_GetBlackMoji(ACol,ARow) → '1, , ,8,1'

//-----------------------------------------//
with StringGrid1 do
begin
  Canvas.FillRect(Rect);
  StrTxt := _GetRedMoji(ACol,ARow);//赤文字で描画する文字列取得
  Canvas.Font.Color := clRed;  
  DrawText(Canvas.Handle,PChar(StrTxt),
       Length(StrTxt),Rect,DT_LEFT or DT_VCENTER);
  StrTxt := _GetBlackMoji(ACol,ARow);//赤文字以外で描画する文字列取得
  Canvas.Font.Color := clBlack;  
  DrawText(Canvas.Handle,PChar(StrTxt),
       Length(StrTxt),Rect,DT_LEFT or DT_VCENTER);
end;
//----------------------------------------//

最も上記の例では等幅Fontを使用しないと多分上手く描画できないかも。
等幅フォントで無い場合は更に工夫が必要でしょう。


HOta  2011-12-06 16:27:27  No: 41299

Canvas位置をずらさないと、同じ位置に文字を書きこむことになりますよ。


StringGrid  2011-12-06 18:01:34  No: 41300

掲示板は等幅フォントじゃ無いからわかり辛かったですね。
まあ、2,4を2,5で勘違いしてるし・・・

Cell[ACol,ARow]          → '1,2,3,4,5' ならば
_GetRedMoji(ACol,ARow)   → '    2      4    '
_GetBlackMoji(ACol,ARow) → '1,  ,3,  ,5' 

Cell[ACol,ARow]          → '1,5,2,8,1'ならば
_GetRedMoji(ACol,ARow)   → '        2        '
_GetBlackMoji(ACol,ARow) → '1,5,  ,8,1'


HOta  2011-12-06 20:46:40  No: 41301

失礼しました。
色毎に分けるのですね。


tor  2011-12-07 02:46:05  No: 41302

特にDrawTextにこだわる必要がなければ、TextOutで座標を計算しながら1文字ずつ出力していくのもありかと。

var
  str: WideString;
  c: WideChar;
  x, y: Integer;
  i: Integer;

...

with StringGrid1 do
begin
  Canvas.Font := Font; // 描画するフォントを割り当てておく

  str := Cells[ACol, ARow]; // 描画する文字
  x := Rect.Left + 4; // 左に少し余白を開ける
  y := (Rect.Top + Rect.Bottom - Canvas.TextHeight(str)) div 2; // 縦方向は中央揃え

  for i := 1 to Length(str) do
  begin
    c := str[i];
    case c of  // 文字に応じて描画色を決める
      '2', '4': Canvas.Font.Color := clRed
      else      Canvas.Font.Color := Font.Color;
    end;
    Canvas.TextOut(x, y, c); // 1文字出力して...
    Inc(x, Canvas.TextWidth(c)); // 次の文字に進む
  end;
end;


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

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






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