2009-11-18 71 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