我有一个 dbcheckbox 组件,我需要更改其背景颜色以表示已选中或未选中状态。当用户使用 dbnavigator 组件在记录之间导航时,我需要更新它。
数据集在数据模块上,无论如何我都不想使用它的事件,所以请告知我是否应该覆盖组件以及如何覆盖?
谢谢
我有一个 dbcheckbox 组件,我需要更改其背景颜色以表示已选中或未选中状态。当用户使用 dbnavigator 组件在记录之间导航时,我需要更新它。
数据集在数据模块上,无论如何我都不想使用它的事件,所以请告知我是否应该覆盖组件以及如何覆盖?
谢谢
启用运行时主题后,无法更改颜色,也许更改字体样式也可能满足您的需求。
如果不是,您可以在代码部分调用自己的 Notifyevent,使用
“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;
您可以使用 DBCheckBox 的 OnClick-Event,每次 Checked 属性更改时都会触发此事件。不幸的是,您不能使用 dbcheckbox 的背景颜色,因为在主题窗口中,属性“颜色”无效。您可以在 dbCheckbox 后面放置一个 TPanel,并使用面板的颜色。或者,您可以改为更改 Font.Color。所以事件 OnClick 看起来像这样:
procedure TForm1.DBCheckBox1Click(Sender: TObject);
begin
if DBCheckBox1.Checked then
DBCheckBox1.Font.Color := clRed
else
DBCheckBox1.Font.Color := clWindowText;
end;