いつも拝見させていただいています。
わからないことがあるので質問させてください。
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も表示させ、さらに特定の文字色も変更できるのでしょうか?
よろしくお願いいたします。
>DBGrid内でCheckBoxを表示させています。
>(columnのPickListでCHECKBOXと入力するとGrid内にCHECKBOXが描写されるようになっています。)
これはDBGridの標準の機能ですか?
(標準でない場合、どのようなコードでCheckBoxを描画しているのですか?)
>>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を描写しているソースです。
よろしくお願いいたします。
>ソースは↓です。
最初の質問にある DrawColumnCell イベントには、
今回、書かれたCheckBox描画処理は記載しているのですか?
>igyさま
いえ、していません…
CHECKBOX描写のソースはコンポーネントのソースです。
何度もすみません。。
試したわけではないので、正しく動作するかわかりませんが、
セルが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
この部分を実行するようにしたら、どうなりますか?
>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が表示されません。。
>セルが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;
で、ダメでしたか?
>igyさま
!!!!
すみません、意味を勘違いしていました。。。
今おっしゃるとおりしてみるとできました!!
何度も回答ありがとうございました☆
ツイート | ![]() |