2012-02-03 4 views
4

Я пытаюсь следовать примеру, чтобы отключить цвет элемента управления в моей форме.Delphi XE2: Отключение vcl Стиль на компоненте

TStyleManager.Engine.RegisterStyleHook (ClrMeans.TwwDBComboDLG, TEditStyleHook);

Но я получаю исключение, когда либо регистрирую, либо отменяя регистрацию либо стороннего элемента управления (инфопользователя TwwDBComboDlg), либо стандартного VCL TEdit. У кого-нибудь были проблемы с этим или любыми предложениями

+0

В чем исключение? – RRUZ

+0

Нарушение доступа к вызову выше. его в части инициализации формы я пытаюсь отключить компонент. – mike

+0

Попробуйте TStyleManager.Engine.RegisterStyleHook (ClrMeans.TwwDBComboDLG, TStyleHook); – RRUZ

ответ

3

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 включены, затем «Двигатель» равен нулю, и вы должны проверить и просто вернуться из этого кода, не вызывая эту функцию, которую вы вызываете. Вот где вы поворачиваете на темы, в случае, если вы пропустили его:

enter image description here

Интересная сторона материал: Получить the VCL Styles utils библиотеку. Вот пример использования его для изменения цвета материала:

TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleColor(scEdit, clWindow); 
TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleFontColor(sfEditBoxTextNormal 
        ,clWindowText); 

Вы можете создавать стили и применять эти стили конкретных элементов управления, и даже расширить тематизации двигатель, можно было бы использовать VCL стили Utils инструмент чтобы получить желаемый результат, но это не будет тривиально.

+0

Это Редактирование БД, но оно содержит суб-элементы управления и даже собственное раскрывающееся окно WS_POPUP с еще большим количеством элементов управления внутри. –

+0

Я попробовал это с помощью только элемента управления TEdit и получил ту же проблему. TStyleManager.engine равен нулю, когда я посмотрел на него в отладчике. это звучит правильно. Я думаю, что это может быть моей проблемой. Любая идея о том, как ее исправить. – mike

+0

Это всегда будет ноль, если вы не заходите в свой проект и не включаете стиль VCL. Перейдите в настройки проекта и включите стили. –

Смежные вопросы