2012-04-29 2 views
2

Я использую несколько функций WinAPi, которым нужна Handle формы для работы, из-за которой дескриптор формы воссоздается при изменении стилей vcl, многие из вызовов этих функций перестают работать. Так что я нужен способ, чтобы определить, когда текущий стиль VCL изменен (изменен), чтобы обновить вызовы этого functions.The вопрос How detect when a vcl style is changed?Как определить, когда изменяется стиль vcl?

+3

Форма может быть воссоздана по другим причинам. Для более надежного подхода вы можете переопределить 'CreateWindowHandle'. –

+1

Пока РРУЗ ответил на вопрос, Сертак фактически решил основную проблему. –

ответ

8

Когда стиль VCL изменяется с помощью TStyleManager.SetStyle метода CM_CUSTOMSTYLECHANGED сообщения отправляются ко всем формам приложения, то этот messgae обрабатывается в методе WndProc формы, а затем отправляется сообщение CM_STYLECHANGED, чтобы сообщить, какой стиль vcl был изменен, поэтому вы можете прослушать сообщение CM_STYLECHANGED, чтобы определить, когда стиль vcl изменилось.

Попробуйте этот образец кода.

type 
    TForm17 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; 
    public 
    { Public declarations } 
    end; 

var 
    Form17: TForm17; 

implementation 

uses 
Vcl.Themes; 

{$R *.dfm} 

procedure TForm17.Button1Click(Sender: TObject); 
begin 
    TStyleManager.SetStyle('Carbon'); 
end; 

procedure TForm17.CMStyleChanged(var Message: TMessage); 
begin 
    ShowMessage('The vcl style has changed'); 
end; 

end.