2012-04-29 16 views
2

私は、vclスタイルが変更されたときにフォームのハンドルが再作成されるため、作業のためにフォームのハンドルを必要とするいくつかのWinAPi関数を使用します。だから私は、これらのfunctions.Theの質問への呼び出しを更新するために、現在のVCLスタイルが変更されたときに検出する方法(変更)を必要とするVCLスタイルはCM_CUSTOMSTYLECHANGEDメッセージが送信されるTStyleManager.SetStyle方法で変更された場合How detect when a vcl style is changed?vclスタイルが変更されたときの検出方法は?

+3

フォームは、他の理由でも再作成される可能性があります。もっとフェイルセーフなアプローチのために 'CreateWindowHandle'をオーバーライドすることができます。 –

+1

RRUZは質問に答えましたが、Sertacは根本的な問題を実際に解決しました。 –

答えて

8

ですアプリケーションのすべてのフォームには、メッセージのWndProcフォームで処理され、CM_STYLECHANGEDメッセージが送信されますので、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. 
関連する問題