Delphi-dbcheckbox在读取记录值时更改颜色

Delphi-dbcheckbox在读取记录值时更改颜色,delphi,components,vcl,Delphi,Components,Vcl,我有一个dbcheckbox组件,我需要更改其背景颜色以表示选中或未选中状态。当用户使用dbnavigator组件在记录之间导航时,我需要更新它 数据集位于数据模块上,我无论如何都不想使用它的事件,因此请告知我是否应该覆盖该组件以及如何覆盖 谢谢,您可以使用DBCheckBox的OnClick事件,每次选中的属性更改时都会触发该事件。不幸的是,您不能使用dbcheckbox的背景色,因为在主题化窗口中,“color”属性没有效果。您可以在dbCheckbox后面放置一个TPanel,并使用面板的

我有一个dbcheckbox组件,我需要更改其背景颜色以表示选中或未选中状态。当用户使用dbnavigator组件在记录之间导航时,我需要更新它

数据集位于数据模块上,我无论如何都不想使用它的事件,因此请告知我是否应该覆盖该组件以及如何覆盖


谢谢,您可以使用DBCheckBox的OnClick事件,每次选中的属性更改时都会触发该事件。不幸的是,您不能使用dbcheckbox的背景色,因为在主题化窗口中,“color”属性没有效果。您可以在dbCheckbox后面放置一个TPanel,并使用面板的颜色。或者您可以更改字体。颜色。因此,OnClick事件如下所示:

procedure TForm1.DBCheckBox1Click(Sender: TObject);
begin
  if DBCheckBox1.Checked then
    DBCheckBox1.Font.Color := clRed
  else
    DBCheckBox1.Font.Color := clWindowText;
end;

启用Runtimethemes后,不可能更改颜色,更改FontStyle也可能适合您的需要。
如果没有,您可以使用
“Message.Msg=BM_SETCHECK”以另一种方式作出反应,例如更改基础形状的颜色

  TDBCheckBox=Class(DBCtrls.TDBCheckbox)
        procedure WndProc(var Message: TMessage); override;
  private
  End;

  TForm1 = class(TForm)
    DBCheckBox1: TDBCheckBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

{ TDBCheckBox }



procedure TDBCheckBox.WndProc(var Message: TMessage);
var
 fs:TFontStyles;
begin
  inherited;
   if Message.Msg =BM_SETCHECK then
         begin
         if checked then    Font.Color := clLime else Font.Color := clRed;  // Will only work if runtimethemes are disabled
         fs := Font.Style;
         if checked then  Include(fs, fsbold)  else Exclude(fs, fsbold);
         Font.Style := fs;
         end;
end;