2017-08-28 64 views
7

我剛纔注意到,我們很(非常)舊自定義控件(不是由我創建)中的一個具有此WM_SIZE消息處理程序(我用了一個TPanel這裏演示):當消息處理程序不調用繼承時會發生什麼?

TPanel = class(ExtCtrls.TPanel) 
private 
    procedure WMSize(var Message: TWMSize); message WM_SIZE; 
end; 

procedure TPanel.WMSize(var Message: TWMSize); 
begin 
    DoSomethingWhenResized; 
end; 

inherited不被稱爲。 DoSomethingWhenResized創建一個緩存的漸變位圖,用於控件的繪製過程。

每一件事情「看起來」和表現很好,但我只是想知道什麼事情都可能先調用inherited處理程序出問題通過

+0

取決於。發生的唯一情況是不會調用此消息處理程序的祖先代碼。如果你自己處理消息,則不需要調用'inherited'。 – Victoria

回答

8

當然,如果你不叫inherited那麼你就失去了在祖先控件中實現的行爲。對於你來說這是否是一個問題只有你可以決定。 VCL資源向您顯示了這些祖先正在做什麼。在您的例子始祖,以處理WM_SIZE鏈條TWinControl它做到這一點:

procedure TWinControl.WMSize(var Message: TWMSize); 
var 
    LList: TList; 
begin 
    UpdateBounds; 
    UpdateExplicitBounds; 
    inherited; 

    LList := nil; 
    if (Parent <> nil) and (Parent.FAlignControlList <> nil) then 
    LList := Parent.FAlignControlList 
    else if FAlignControlList <> nil then 
    LList := FAlignControlList; 

    if LList <> nil then 
    begin 
    if LList.IndexOf(Self) = -1 then 
     LList.Add(Self); 
    end 
    else 
    begin 
    Realign; 
    if not (csLoading in ComponentState) then 
     Resize; 
    end; 
end; 

這裏WMSize電話inherited,但也有(目前)以上TWinControl實現這個沒有祖先的對象,所以上面是什麼你沒有打電話給inherited。如果您的管理控制範圍,大小和子控件的組件對齊(或者如果你不需要它來做到這一點),那麼你很好。但是,如果您發現控件沒有正確處理這些事情,那麼您可能會懷疑DoSomethingWHenResized在實現中錯過了其中的一個或多個責任。

相關問題