Delphi:对控件进行子类化和恢复的适当时间?

Delphi:对控件进行子类化和恢复的适当时间?,delphi,themes,subclass,subclassing,Delphi,Themes,Subclass,Subclassing,开始子类化控件的正确位置/时间是什么 恢复原始窗口进程的正确时间是什么 现在,我在表单创建过程中创建子类: procedure TForm1.FormCreate(Sender: TObject); begin FOldPanel1WindowProc := Panel1.WindowProc; Panel1.WindowProc := Panel1WindowProc; end; procedure TForm1.FormDestroy(Sender: TObject); beg

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

恢复原始窗口进程的正确时间是什么

现在,我在表单创建过程中创建子类

procedure TForm1.FormCreate(Sender: TObject);
begin
   FOldPanel1WindowProc := Panel1.WindowProc;
   Panel1.WindowProc := Panel1WindowProc;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
   Panel1.WindowProc := FOldPanel1WindowProc;
end;
我在form销毁过程中恢复子类化:

procedure TForm1.FormCreate(Sender: TObject);
begin
   FOldPanel1WindowProc := Panel1.WindowProc;
   Panel1.WindowProc := Panel1WindowProc;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
   Panel1.WindowProc := FOldPanel1WindowProc;
end;
这很好,只要我不使用,哪个子类控制自己。一旦尝试将管理器也包含子类的控件子类化,就会出现非常严重的错误


我认为这是因为我不应该在创建期间启动子类,并在销毁期间恢复它。那么,在Delphi中对控件进行子类化和取消子类化的正确记录时间是多少?

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

当处理控件的
WM_DESTROY
时,管理器会还原其子类。因此,您可能也必须这样做:在新的窗口过程中观察
WM_DESTROY
,首先还原子类,然后调用旧的窗口过程(让管理员做同样的事情)


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

试着向管理员查看源代码,看看它何时进行子类化。糟糕的是,它将表单放在延迟列表上,因为底层窗口句柄不是在对象构造期间创建的(就像包装Win32控件的.NET控件)你能侵入同样的延迟列表吗?我能侵入很多东西。我希望有一个正确的做事方式,而不是尝试一些似乎不会崩溃的事情。你是对的。更多的调查表明,这是一个订购问题。现在的事件顺序:1。表单创建(我的子类)2。管理者子类3。FormDestroy(我的unsubclass)4。管理者取消类。因为我的子类发生在管理者之前,所以我需要在管理者之后取消类;或者我需要在创建表单之前创建管理器子类。您的解决方案有效。让子类处理WM_DESTROY,并在此时恢复原始子类可以修复错误。我还在TThemeManager(RegisterListener,UnregisterListener)中发现了一些未记录的方法,它们基本上为您提供了一个WindowProc钩子,就像一个子类一样。标记为答案的。