こんにちは
StringGridに表示している文字の一部に色をつけたいのです。
[1,2,3,4,5]セル内に左のような文字列があって、2と4に赤色をつけるにはどうすればいいのでしょうか。
OnDrawCell内で描画されたらいかがでしょうか?
黒は"1 3 5"
赤は" 2 4 "
で文字列を構成し、それぞれFont.ColorとDrawTextで描画する。
面倒ですけど、こうすればできます。
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の使い方はどうするのでしょうか。
単純に・・・
例えば以下のように文字列を返すようにメソッドを用意する
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を使用しないと多分上手く描画できないかも。
等幅フォントで無い場合は更に工夫が必要でしょう。
Canvas位置をずらさないと、同じ位置に文字を書きこむことになりますよ。
掲示板は等幅フォントじゃ無いからわかり辛かったですね。
まあ、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'
失礼しました。
色毎に分けるのですね。
特に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;
ツイート | ![]() |