link Здесь объясняется, что вам нужно знать.
В принципе, вам нужно либо ввести «нулевой крючок», что вы уже знали, либо вам нужно вставить крючок «VCL colors», что составляет половину того, чего вам не хватает. Другая половина - ваша проблема с указателем на nil.
Для того, чтобы производные TEdit (как у вас) выглядят как стандартные цвета VCL код, который вы должны заставить его работать с вашим контролем заключается в следующем:
uses
Winapi.Messages,
Vcl.Controls,
Vcl.StdCtrls,
Vcl.Forms,
Vcl.Themes,
Vcl.Styles;
type
TEditStyleHookColor = class(TEditStyleHook)
private
procedure UpdateColors;
protected
procedure WndProc(var Message: TMessage); override;
constructor Create(AControl: TWinControl); override;
end;
implementation
type
TWinControlH= class(TWinControl);
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;
Procedure ApplyVCLColorsStyleHook(ControlClass :TClass);
begin
if Assigned(TStyleManager.Engine) then
TStyleManager.Engine.RegisterStyleHook(ControlClass, TEditStyleHookColor);
end;
initialization
ApplyVCLColorsStyleHook(TwwDBComboDlg);
Ваша проблема с NIL в том, что если у вас нет Темы VCL включены, затем «Двигатель» равен нулю, и вы должны проверить и просто вернуться из этого кода, не вызывая эту функцию, которую вы вызываете. Вот где вы поворачиваете на темы, в случае, если вы пропустили его:
Интересная сторона материал: Получить the VCL Styles utils библиотеку. Вот пример использования его для изменения цвета материала:
TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleColor(scEdit, clWindow);
TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleFontColor(sfEditBoxTextNormal
,clWindowText);
Вы можете создавать стили и применять эти стили конкретных элементов управления, и даже расширить тематизации двигатель, можно было бы использовать VCL стили Utils инструмент чтобы получить желаемый результат, но это не будет тривиально.
В чем исключение? – RRUZ
Нарушение доступа к вызову выше. его в части инициализации формы я пытаюсь отключить компонент. – mike
Попробуйте TStyleManager.Engine.RegisterStyleHook (ClrMeans.TwwDBComboDLG, TStyleHook); – RRUZ