FMXのTStringGridでセル毎に文字色を変える

解決


yTake  2021-06-22 14:32:10  No: 149740

再び、TSrtrinGridの文字色です。

以前、StyleBook下での文字色変更で、文字色自体は変更が出来ました。
現在、セルへ値を入力する際、入力する値によって文字色を変えたいと思います。
セルへ文字を入力する際に、
TextSettings.FontColorで色を変えていますが、最後に入力した際の文字色で全ての文字が表示されます。

セル毎にプロパティを確認しましたが、セル毎にFontColorやTextFettingsなどの文字色・文字書式のプロパティは見つからない様です。
("Cells[ i, j ]."以下には文字色に関する設定は見つかりません)

何か見落としているでしょうか?
それともセル毎の文字色設定に"StyledSettings"の様なオンオフ設定があるのでしょうか?”Options”もみていますが、該当する様な項目はなさそうです。

セル毎に文字色を変える方法があれば、ご教授願えると幸いです。

当方、Windows 10 Pro+DELPHI XE6 with FMX


yTake  2021-06-22 20:09:49  No: 149742

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;

セル毎に値を判定してフォント色を設定していますが、全て同じ色で表示されています。


igy  2021-06-22 20:33:03  No: 149743

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;

みたいな感じは、いかがですか?


igy  2021-06-22 20:37:59  No: 149744

訂正です。
誤: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*)); 


yTake  2021-06-23 19:14:34  No: 149745

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;

二重表示の解消方法をご教授頂けるでしょうか?


igy  2021-06-23 19:37:43  No: 149746

>onDrawColumnCell"はセルへ文字を入力した際に同時に発生するイベントだと思いますが、文字が二重に描画されます。 

DefaultDrawingプロパティをFalseにしてみたら、どうなりますか?


yTake  2021-06-24 08:36:38  No: 149748

igyさん
ありがとうございます。

実は先のRESで、"DefaultDrawing"がみつからない件でも、お尋ねしようと思っていたのですが、ご指摘を受け、はたとコーディング中のコンプリージョン(変数名補完)機能を思い出し、試してみたら、見つかりました。
ちゃんと、確認すればお手数をお掛けせず済んだところ、大変失礼致しました。

DefaultDrawingをFalseで二重描画は解消されました。

ありがとうございました。


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








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