RSS
RepaintやInvalidataやUpdateを複合コンポーネントにかけるとコントロールが消えることへの対策

中村氏著の神本、Delphiコンポーネント設計&開発完全開発の18章~に掲載されているTWizardコンポーネントの解説を元に独自のコンポーネントを開発していたんですが、TWizardに直接Invalidataをかけて再描画するようなことをするとTWizardPageに乗っているウインドウハンドルを持ったコンポーネント全てが塗りつぶされて消えてしまいます。TWizardPageに直接再描画をすれば問題ないんですが、今回はTWizardにあたる部分に独自描画を入れていたので再描画のときにハマってしまいました。

で、いろいろ試した結果TWizardのウインドウスタイルにWS_CLIPCHILDRENを加えることで消えなくなるようです。

  TWizardEx = class(TCustomControl)
protected   procedure CreateParams(var Params: TCreateParams); override;   ...  procedure TWizardEx.CreateParams(var Params: TCreateParams);
 begin
 inherited;   Params.Style := Params.Style or WS_CLIPCHILDREN;
end;