DBGrid内でCheckBoxと文字色変更

解決


sa  2008-12-19 18:51:17  No: 32929

いつも拝見させていただいています。
わからないことがあるので質問させてください。

DBGrid内でCheckBoxを表示させています。
(columnのPickListでCHECKBOXと入力するとGrid内にCHECKBOXが描写されるようになっています。)

次は特定の行のみの文字色を変更したいのですが、

procedure TFrom1.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if ClientDataSet1.FieldByName('aaaaa').AsInteger <> ClientDataSet1.FieldByName('aaaaa').OldValue then
  begin
    TDBGrid(Sender).Canvas.Font.Color := clRed;
  end;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);  //※1

以上のようにするとCheckBoxが消えてしまいます。
この場合、どのようにしてCheckBoxも表示させ、さらに特定の文字色も変更できるのでしょうか?

よろしくお願いいたします。


igy  2008-12-19 22:02:18  No: 32930

>DBGrid内でCheckBoxを表示させています。
>(columnのPickListでCHECKBOXと入力するとGrid内にCHECKBOXが描写されるようになっています。)

これはDBGridの標準の機能ですか?
(標準でない場合、どのようなコードでCheckBoxを描画しているのですか?)


sa  2008-12-19 22:16:19  No: 32931

>>igyさま

すみません、標準ではないです…

ソースは↓です。
procedure TFRDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState);
var
  X, Y: Integer;
begin
  if  (0 < Column.PickList.Count)
  and (Column.PickList[0] = 'CHECKBOX')
  and (Column.ButtonStyle = cbsNone)
  and not (Column.Field.DataSet.Bof and Column.Field.DataSet.Eof)
  then
  begin
    // チェックボックスを描画
    X := (Rect.Left + Rect.Right) div 2 - 6;
    Y := (Rect.Top + Rect.Bottom) div 2 - 6;
    with Canvas do
    begin
      FillRect(Rect);
      Pen.Color := Canvas.Font.Color;
      Rectangle(X, Y, X + 11, Y + 11);
      if (Column.Field.AsString <> '') and (Column.Field.AsString <> 'F') then
      begin
        MoveTo(X + 2, Y + 4);
        LineTo(X + 2, Y + 7);
        MoveTo(X + 3, Y + 5);
        LineTo(X + 3, Y + 8);
        MoveTo(X + 4, Y + 6);
        LineTo(X + 4, Y + 9);
        MoveTo(X + 5, Y + 5);
        LineTo(X + 5, Y + 8);
        MoveTo(X + 6, Y + 4);
        LineTo(X + 6, Y + 7);
        MoveTo(X + 7, Y + 3);
        LineTo(X + 7, Y + 6);
        MoveTo(X + 8, Y + 2);
        LineTo(X + 8, Y + 5);
      end;
    end;
  end
  else
  begin
    // 標準のテキストを描画
    DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;

これがCHECKBOXを描写しているソースです。
よろしくお願いいたします。


igy  2008-12-19 22:20:40  No: 32932

>ソースは↓です。

最初の質問にある DrawColumnCell イベントには、
今回、書かれたCheckBox描画処理は記載しているのですか?


sa  2008-12-19 22:25:13  No: 32933

>igyさま

いえ、していません…
CHECKBOX描写のソースはコンポーネントのソースです。

何度もすみません。。


igy  2008-12-19 22:43:12  No: 32934

試したわけではないので、正しく動作するかわかりませんが、
セルがCheckBox描画対象でないときのみ

>  if ClientDataSet1.FieldByName('aaaaa').AsInteger <> ClientDataSet1.FieldByName('aaaaa').OldValue then
>  begin
>    TDBGrid(Sender).Canvas.Font.Color := clRed;
>  end;
>  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);  //※1

この部分を実行するようにしたら、どうなりますか?


sa  2008-12-19 22:57:41  No: 32935

>igyさま

>  if ClientDataSet1.FieldByName('aaaaa').AsInteger <> ClientDataSet1.FieldByName('aaaaa').OldValue then
>  begin
>    TDBGrid(Sender).Canvas.Font.Color := clRed;
>  end;
>  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);  //※1

この部分を実行すると
文字色が赤くなり、CHECKBOXが表示されません。。


igy  2008-12-19 23:00:41  No: 32936

>セルがCheckBox描画対象でないときのみ

と書いたように

    if (セルがCheckBox描画対象でない)then
    begin
      if ClientDataSet1.FieldByName('aaaaa').AsInteger <> ClientDataSet1.FieldByName('aaaaa').OldValue then
      begin
        TDBGrid(Sender).Canvas.Font.Color := clRed;
      end;
      TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);  //※1
    end;

で、ダメでしたか?


sa  2008-12-19 23:25:34  No: 32937

>igyさま

!!!!
すみません、意味を勘違いしていました。。。
今おっしゃるとおりしてみるとできました!!
何度も回答ありがとうございました☆


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

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






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