delphi - DBEdit 仅接受来自 Stylehook 的背景颜色与左对齐文本
问题描述
我目前正在迁移到 Delphi 10.3,并且正在研究将样式合并到我的应用程序中的可能性。
在此过程中,我尝试实现自定义 StyleHook 以根据特定条件更改 DBEdits 的背景颜色。我这样做的方式与 Rodrigo Ruz 的教程类似,请参见此处
在我的测试过程中,我发现显示将“对齐”设置为“taRightJustify”的字段存在问题。对于这些 DBEdits,背景颜色会被忽略。
经过进一步调查,我发现,只要这些不集中,它就会被忽略。
这应该可以用以下代码重现
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, VCL.Styles, VCL.Themes,
Vcl.Mask, Vcl.DBCtrls, Data.DB, Datasnap.DBClient;
type
TForm2 = class(TForm)
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DataSource1: TDataSource;
ClientDataSet1: TClientDataSet;
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
TEditStyleHookColor = class(TEditStyleHook)
private
procedure UpdateColors;
protected
procedure WndProc(var Message: TMessage); override;
public
constructor Create(AControl: TWinControl); override;
end;
type
TWinControlH= class(TWinControl);
var
Form2: TForm2;
implementation
constructor TEditStyleHookColor.Create(AControl: TWinControl);
begin
inherited;
//call the UpdateColors method to use the custom colors
UpdateColors;
end;
//Here you set the colors of the style hook
procedure TEditStyleHookColor.UpdateColors;
var
LStyle: TCustomStyleServices;
begin
if Control.Enabled then
begin
Brush.Color := TWinControlH(Control).Color; //use the Control color
FontColor := TWinControlH(Control).Font.Color;//use the Control font color
end
else
begin
//if the control is disabled use the colors of the style
LStyle := StyleServices;
Brush.Color := LStyle.GetStyleColor(scEditDisabled);
FontColor := LStyle.GetStyleFontColor(sfEditBoxTextDisabled);
end;
end;
//Handle the messages of the control
procedure TEditStyleHookColor.WndProc(var Message: TMessage);
begin
case Message.Msg of
CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
begin
//Get the colors
UpdateColors;
SetTextColor(Message.WParam, ColorToRGB(FontColor));
SetBkColor(Message.WParam, ColorToRGB(Brush.Color));
Message.Result := LRESULT(Brush.Handle);
Handled := True;
end;
CM_ENABLEDCHANGED:
begin
//Get the colors
UpdateColors;
Handled := False;
end
else
inherited WndProc(Message);
end;
end;
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
ClientDataSet1.FieldDefs.Add('LeftAlign',ftWideString,100);
ClientDataSet1.FieldDefs.Add('RightAlign',ftWideString,100);
ClientDataSet1.CreateDataSet;
ClientDataSet1.FieldByName('RightAlign').Alignment := taRightJustify;
ClientDataSet1.Insert;
ClientDataSet1.Fields[0].AsString := 'testLeft';
ClientDataSet1.Fields[1].AsString := 'testRight';
DBEdit1.Color := clGreen;
DBEdit2.Color := clGreen;
DBEdit1.DataSource := DataSource1;
DBEdit2.DataSource := DataSource1;
DBEdit1.DataField := 'LeftAlign';
DBEdit2.DataField := 'RightAlign';
end;
initialization
begin
TStyleManager.Engine.RegisterStyleHook(TEdit, TEditStyleHookColor);
TStyleManager.Engine.RegisterStyleHook(TDBEdit, TEditStyleHookColor);
end;
end.
有人知道这里发生了什么吗?
解决方案
推荐阅读
- javascript - javascript中的replace方法是否不适用于变量?
- python - LogRecord格式的最后一个字母是什么
- java - 显示最小到最大库存数组 (Java) 的错误
- laravel - laravel 一对多关系为空
- excel - 如何在 SQL 连接字符串中给出单元格引用
- html - 调整 chrome 浏览器窗口的大小
- python - 'tanh' 激活函数有一个奇怪的输出
- sql - SQL:使用所有可能的组合进行更新
- sql - Oracle FETCH FIRST 1 ROW 与 UNION ALL 语句
- python - 保存没有背景opencv的图像