1

コントロールのサブクラス化を開始する正しい場所/時間は何ですか?

元のウィンドウプロシージャを復元する適切なタイミングは何ですか?

現在、フォームの作成中にサブクラス化しています:

procedure TForm1.FormCreate(Sender: TObject);
begin
   FOldPanel1WindowProc := Panel1.WindowProc;
   Panel1.WindowProc := Panel1WindowProc;
end;

そして私はフォームの破壊中にサブクラスを復元​​します:

procedure TForm1.FormDestroy(Sender: TObject);
begin
   Panel1.WindowProc := FOldPanel1WindowProc;
end;

これは、コントロール自体をサブクラス化するThemeManagerを使用しない限り、正常に機能します。ThemeManagerもサブクラス化するコントロールをサブクラス化しようとするとすぐに、非常に厄介なエラーが発生します。

作成中にサブクラスを開始して、破棄中に復元するべきではないためだと思います。では、Delphiでコントロールをサブクラス化およびサブクラス化解除するための適切に文書化された時間はどれくらいですか?

4

1 に答える 1

3

あなたの質問からは明らかではありませんが、フォームのOnDestroyイベントハンドラーで古いウィンドウプロシージャを復元しようとすると、エラーが発生すると思います。

ThemeManagerWM_DESTROYは、コントロールの処理時にサブクラス化を元に戻します。したがって、おそらく同じことを行う必要がありWM_DESTROYます。新しいウィンドウプロシージャを監視し、最初にサブクラス化を元に戻してから、古いウィンドウプロシージャを呼び出します(ThemeManagerに同じことをさせます)。

私はこれをテストしていませんが、うまくいくはずだと思います。

于 2009-11-19T11:33:31.837 に答える