2017-08-28 8 views
7

私は(私が作成されていない)私たちの非常に(非常に)古いカスタムコントロールのいずれかが(私はデモのために、ここでTPanelを使用)このWM_SIZEメッセージハンドラを持っていることに気づいた:メッセージハンドラが継承を呼び出さない場合はどうなりますか?

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

に依存します。唯一起こるのは、このメッセージハンドラの先祖のコードが呼び出されないということです。あなたが自分でメッセージを扱うなら、 '継承された 'を呼び出す必要はありません。 – 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が子コントロールのコントロール境界、サイジング、コンポーネントの整列を管理している場合(またはこれを行う必要がない場合)は、問題ありません。しかし、コントロールがこれらのことを適切に処理していないことが分かった場合は、DoSomethingWHenResizedがその実装でこれらの責任の1つ以上を見逃している可能性があります。

関連する問題