2017-08-28 20 views
7

Tôi vừa nhận thấy rằng một trong rất (rất) điều khiển tùy chỉnh cũ của chúng tôi (không phải do tôi tạo) có handler WM_SIZE bài này (tôi đã sử dụng một TPanel vào đây để demo):Điều gì xảy ra khi trình xử lý tin nhắn không gọi được kế thừa?

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

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

Các inherited không phải là được gọi là. các DoSomethingWhenResized tạo ra một bitmap gradient được lưu trữ được sử dụng trong quá trình sơn của điều khiển.

Every thing "ngoại hình" và hoạt động tốt, nhưng tôi chỉ tự hỏi, nếu bất cứ điều gì có thể đi sai bởi không gọi handler inherited đầu tiên?

+0

Tùy thuộc. Điều duy nhất xảy ra là mã của tổ tiên của trình xử lý tin nhắn này không được gọi. Nếu bạn tự xử lý thư, bạn không cần phải gọi 'thừa kế'. – Victoria

Trả lời

8

Đương nhiên, nếu bạn không gọi inherited thì bạn sẽ mất hành vi được thực hiện trong điều khiển tổ tiên. Cho dù đây có phải là một vấn đề cho bạn hay không thì đó là điều duy nhất bạn có thể quyết định. Nguồn VCL cho bạn biết chính xác những gì tổ tiên đang làm. Trong ví dụ của bạn tổ tiên đầu tiên lên chuỗi để xử lý WM_SIZETWinControl mà thực hiện điều này:

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; 

đây WMSize cuộc gọi inherited, nhưng có (hiện tại) không có đối tượng tổ tiên trên TWinControl mà thực hiện điều này, vì vậy ở trên là gì bạn đang bỏ lỡ bằng cách không gọi số inherited. Nếu DoSomethingWhenResized của bạn quản lý giới hạn kiểm soát, kích thước và căn chỉnh thành phần của điều khiển con (hoặc nếu bạn không cần nó để làm điều này) thì bạn ổn. Tuy nhiên, nếu bạn thấy rằng việc kiểm soát không xử lý những điều này đúng cách thì bạn có thể nghi ngờ rằng DoSomethingWHenResized đã bỏ lỡ một hoặc nhiều trách nhiệm trong việc thực hiện nó.

Các vấn đề liên quan