有一個TFrame
子類,如下所示:覆蓋的setEnabled與處理信息CM_ENABLEDCHANGED
TCustomHistoryFrame = class(TFrame)
tbMainFunction: TToolBar;
// there's more, of course, but that is irrelevant to the question
end;
我注意到,當我把這個框架的Enabled
財產False
,其組成tbMainFunction
不會得到(視覺)已禁用。
我的第一個想法是重寫虛方法TControl.SetEnabled
。看看它的實現,我發現當實際值不同時,它會執行控制消息CM_ENABLEDCHANGED
。
我不知道如何在框架的Enabled
狀態應用於該工具欄的正確途徑。
會是什麼做的常見方式?由於這個問題主要是基於意見的,請讓我重新修改它:
對於覆蓋SetEnabled
或處理CM_ENABLEDCHANGED
有什麼優缺點?
的事情,我認爲自己的:
- 覆蓋
SetEnabled
:- 我將不得不重新檢查,新值是否與舊值不同。這將是一個冗餘。 (這對性能沒有顯著影響,但 - 叫我的頭髮分路器 - 氣味給我。)
- 處理
CM_ENABLEDCHANGED
:- 如何維持遺傳代碼此消息?有此消息(至少)在
TControl
和TWinControl
實現。如果我在我的課TCustomHistoryFrame
中處理消息,他們仍會被執行嗎?
- 如何維持遺傳代碼此消息?有此消息(至少)在
是否幀具有一個窗口句柄?還是隻是將其控件注入其父項?在這種情況下,您可能會將整個區域包裝在面板中並禁用該區域。 –
@DavidHeffernan我不太清楚,我是否理解正確。每個'TWinControl'後裔(如'TFrame')獲取'TWinControl.CreateWindowHandle'窗口句柄。另一方面,框架當然是一種可視化組件包裝。如果我把所有東西(特別是'tbMainFunction')放在'TPanel'上,那麼我是不是有同樣的問題來禁用它? –
我不確定'TFrame'是否被窗口化了。 –