Delphi:正确的时间来进行子类化和恢复控制?

时间:2009-11-18 16:16:15

标签: delphi themes subclass subclassing

开始对控件进行子类化的正确位置/时间是什么?

恢复原始窗口proc的适当时间是什么?

现在我在表单创建

中进行子类化
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中对控件进行子类化和取消子类化的正确记录时间是什么?

1 个答案:

答案 0 :(得分:3)

从您的问题中不清楚,但我假设您在尝试恢复表单的OnDestroy事件处理程序中的旧窗口过程时会收到错误。

在处理控件的WM_DESTROY时,ThemeManager会恢复其子类化。因此,您可能必须这样做:在新窗口过程中注意WM_DESTROY并首先恢复子类,然后调用旧窗口过程(并让ThemeManager执行相同的操作)。

我没有对此进行测试,但我认为它应该可行。