2009-11-18 61 views
1

开始继承控件的正确位置/时间是什么?德尔福:适当的时间来继承和恢复控件?

什么是恢复原始窗口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中的控件进行子类化和取消子类化?

+0

尝试在源代码中查找ThemeManager以查看它何时执行子类化。 – 2009-11-18 17:28:16

+0

糟糕的是,它将表单放在延迟列表中,因为基础窗口句柄不是在对象构造过程中创建的(就像使用.NET控件包装Win32控件一样) – 2009-11-18 18:21:51

+0

您是否可以入侵相同的延迟列表? – 2009-11-18 19:22:46

回答

3

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

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

我还没有测试过,但我认为它应该可以工作。

+0

你说得对。更多的调查显示它*是一个排序问题。现在的事件顺序:1. FormCreate(我的sublcass)2. ThemeManager子类3. FormDestroy(我的unsubclass)4. ThemeManager unsubclass。由于我的子类发生在ThemeManager之前我需要unsubclass;或者我需要在FormCreate之前创建ThemeManager子类。 – 2009-11-20 12:39:46

+0

您的解决方案工作。让子类处理WM_DESTROY,并在此时恢复原始子类修复错误。 我还在TThemeManager(RegisterListener,UnregisterListener)中发现了一些未公开的方法,它们基本上给你一个WindowProc钩子 - 就像一个子类一样。 标记为答案。 – 2009-11-23 16:17:18