FMXのTStringGridのDrawColumnCell

解決


Moe  2023-09-01 04:16:21  No: 151070  IP: 192.*.*.*

お世話になります。
FMXのTStringGridに、幾つかのTStringColumnとTCheckColumnを設けまして、最初のTStringColumnはNoとして自動で行番号を割り当てる様にするために次の様なコードを書きました。
併せて、CheckCloumnも描画するコードも記述しておりますが、セルが編集状態から抜けた際にチェックボックスが消えてしまいます。
どの様に記述すれば良いかご存知の方居られましたらアドバイス頂けないでしょうか?
procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
  const Row: Integer; const Value: TValue; const State: TGridDrawStates);
begin
  if Column is TCheckColumn then
  begin
    TCheckColumn(Column).DefaultDrawCell(Canvas, Bounds, Row, Value, State);
  end
  else if Column.Name = 'AutoNo' then
    TStringColumn(Column).DefaultDrawCell(Canvas, Bounds, Row, Row + 1, State);
end;

編集 削除
mam  2023-09-05 00:33:45  No: 151075  IP: 192.*.*.*

procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
  const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var obj:TFMXObject;
    stl:TStyleObject;
begin
  if Column is TCheckColumn then
  begin
    //以下は何も描画しないみたいです
    //TCheckColumn(Column).DefaultDrawCell(
    //  Canvas,Bounds,Row,Value,State
    //);
    if Assigned(Self.StyleBook) then
      obj:=Self.StyleBook
    else
      obj:=TStyleManager.ActiveStyle(Self);
    if LowerCase(Value.AsString)='true' then
      stl:=TStyleObject(obj.FindStyleResource('checkcellstyle.checkboxchecked'))
    else
      stl:=TStyleObject(obj.FindStyleResource('checkcellstyle.checkboxunchecked'));
    stl.DrawToCanvas(Canvas,Bounds,1);
  end
  else if Column.Name='AutoNo' then
    Column.DefaultDrawCell(
      Canvas,Bounds,Row,Row+1,State
    );
end;

Delphi XE10.2 Tokyo Pro
では動いているように思いますが動かなかったらすいません。

編集 削除
mam  2023-09-05 00:34:17  No: 151076  IP: 192.*.*.*

uses FMX.Styles,FMX.Styles.Objects;
を入れるのを忘れてました。
すいません。

編集 削除
mam  2023-09-05 01:08:11  No: 151077  IP: 192.*.*.*

度々すいません。ミスがありました。

uses FMX.Styles,FMX.Styles.Objects;

procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
  const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var obj:TFMXObject;
    stl:TStyleObject;
begin
  if Column is TCheckColumn then
  begin
    //以下は何も描画しないみたいです
    //TCheckColumn(Column).DefaultDrawCell(
    //  Canvas,Bounds,Row,Value,State
    //);
    if Assigned(Self.StyleBook) then
      obj:=Self.StyleBook.Style //←ココミスしていました
    else
      obj:=TStyleManager.ActiveStyle(Self);
    if LowerCase(Value.AsString)='true' then
      stl:=TStyleObject(TStyleBook(obj).FindStyleResource('checkcellstyle.checkboxchecked'))
    else
      stl:=TStyleObject(TStyleBook(obj).FindStyleResource('checkcellstyle.checkboxunchecked'));
    stl.DrawToCanvas(Canvas,Bounds,1);
  end
  else if Column.Name='AutoNo' then
    Column.DefaultDrawCell(
      Canvas,Bounds,Row,Row+1,State
    );
end;

編集 削除
Moe  2023-09-06 07:29:41  No: 151080  IP: 192.*.*.*

mamさん
有難うございます。
そのままコードを拝借しまして、チェックボックスが見事に表示され、テキストも問題無く表示出来ています。
凄いです。私もTCheckColumnのDefaultDrawCellのコードを見て、何も描画される気配が無いと感じておりましたが、解決策が見い出せず仕様を制限しようかなぁと悩んでいるところでした。
気のせいか、DefaultDrawingプロパティの扱いもVCLとは少し違う様な気がしています。もう少し勉強が必要ですね。
この度は本当に助かりました。

編集 削除