再び、TSrtrinGridの文字色です。
以前、StyleBook下での文字色変更で、文字色自体は変更が出来ました。
現在、セルへ値を入力する際、入力する値によって文字色を変えたいと思います。
セルへ文字を入力する際に、
TextSettings.FontColorで色を変えていますが、最後に入力した際の文字色で全ての文字が表示されます。
セル毎にプロパティを確認しましたが、セル毎にFontColorやTextFettingsなどの文字色・文字書式のプロパティは見つからない様です。
("Cells[ i, j ]."以下には文字色に関する設定は見つかりません)
何か見落としているでしょうか?
それともセル毎の文字色設定に"StyledSettings"の様なオンオフ設定があるのでしょうか?”Options”もみていますが、該当する様な項目はなさそうです。
セル毎に文字色を変える方法があれば、ご教授願えると幸いです。
当方、Windows 10 Pro+DELPHI XE6 with FMX
yTakeです。
一応、次の様に記述しています。
StringGrid1.StyledSettingsの"FontColor"は"False"に設定
for j := 1 to cnt.y do
for i := 1 to cnt.x do
begin
val := get_Dat();
if ( val < thrhld1 ) then
StringGrid1.TextSettings.FontColor := TAlphaColor.Blue
else if ( thrhld1 <= value ) and ( val < thrhld2 ) then
StringGrid1.TextSettings.FontColor := TAlphaColor.Green
else if ( thrhld2 <= value )
StringGrid1.TextSettings.FontColor := TAlphaColor.Red;
StringGrid1.Cells[ i, j ] := FloatToStrF( val, ffFixed, 7, 4 );
end;
セル毎に値を判定してフォント色を設定していますが、全て同じ色で表示されています。
OnDrawColumnCellイベントで、
procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject;
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var
isWordWrap: Boolean;
begin
isWordWrap := True;
Canvas.Fill.Color := TAlphaColorRec.Black;
とか
Canvas.Fill.Color := TAlphaColorRec.Blue;
Canvas.FillText(Bounds, Value.AsString, isWordWrap, 1.0, [], TTextAlign(Column.tag), TTextAlign.Center(*TTextAlign.Leading*));
end;
みたいな感じは、いかがですか?
訂正です。
誤:Canvas.FillText(Bounds, Value.AsString, isWordWrap, 1.0, [], TTextAlign(Column.tag), TTextAlign.Center(*TTextAlign.Leading*));
正:Canvas.FillText(Bounds, Value.AsString, isWordWrap, 1.0, [], TTextAlign.Center(*or TTextAlign.Trailing*), TTextAlign.Center(*or TTextAlign.Leading*));
igyさん、ありがとうございます。
onDrawColumnCellイベントですね。
試してみました。
一応、色分けは出来ました。然しながら、問題も残っています。
"onDrawColumnCell"はセルへ文字を入力した際に同時に発生するイベントだと思いますが、文字が二重に描画されます。
TextSettings.FontColorの文字色とCanvas.Fill.Colorの文字色で文字列は当然同じです。
これはCanvas.Fill.Colorの方の表示のみには出来ないのでしょうか?
Value.AsStringにそのセルの文字内容が格納されていて、その文字をFill.Color色で描画しているので、元々入力されている文字列二重描画になってしまうと思います。
セル内容のClearさせる方法が分からなかったので、Value.AsStringの内容を一旦退避させて、’ ’(スペース文字列)を入力してから、退避した内容を入力し直すとしてみましたが、二重表示は解消されませんでした。
begin
aOpt := 1.0;
str := value.AsString;
tmp := StrToFloat( str );
if ( tmp < -0.2 ) then
Canvas.Fill.Color := TAlphaColors.Blue
else if ( -0.2 <= tmp ) and ( tmp <= 0.2 ) then
Canvas.Fill.Color := TAlphaColors.Lightyellow
else if ( 0.2 < tmp ) then
Canvas.Fill.Color := TAlphaColors.Red;
Canvas.FillText( Bounds, ' ', False, aOpt, [], TTextAlign.Leading, TTextAlign.Center );
Canvas.FillText( Bounds, str, False, aOpt, [], TTextAlign.Leading, TTextAlign.Center );
end;
二重表示の解消方法をご教授頂けるでしょうか?
>onDrawColumnCell"はセルへ文字を入力した際に同時に発生するイベントだと思いますが、文字が二重に描画されます。
DefaultDrawingプロパティをFalseにしてみたら、どうなりますか?
igyさん
ありがとうございます。
実は先のRESで、"DefaultDrawing"がみつからない件でも、お尋ねしようと思っていたのですが、ご指摘を受け、はたとコーディング中のコンプリージョン(変数名補完)機能を思い出し、試してみたら、見つかりました。
ちゃんと、確認すればお手数をお掛けせず済んだところ、大変失礼致しました。
DefaultDrawingをFalseで二重描画は解消されました。
ありがとうございました。
ツイート | ![]() |