2017-02-18 86 views
2

我的後裔TMyImage = class(ExtCtrls.TImage)需要訪問TImage繼承畫布如何訪問繼承的TImage的繼承畫布?

例如(在TGraphicControl始祖)

procedure TMyImage.Paint; 
var 
    LCanvas: TCanvas; 
begin 
    // need "inherited inherited Canvas" 
    LCanvas := inherited (inherited Canvas); // of the TGraphicControl 

    inherited; 
end; 

上面不會顯然編譯。
這是可以做到沒有黑客TGraphicControl和使用私人會員FCanvas

這工作:

type 
    THackGraphicControl = class(TControl) 
    private 
    FCanvas: TCanvas; 
    end; 

procedure TMyImage.Paint; 
var 
    LCanvas: TCanvas; 
begin   
    // need "inherited inherited Canvas" 
    LCanvas := THackGraphicControl(Self).FCanvas; 
    with LCanvas do 
    begin 
    Brush.Bitmap := FAlphaPattern; 
    FillRect(ClientRect); 
    Brush.Bitmap := nil; 
    end; 
    inherited; 
end; 

但我在想,如果有不會是版本依賴的解決方案。

回答

4

您可以使用類似於您已有的技術,但訪問Canvas屬性而不是FCanvas字段。 Canvas屬性受保護,這意味着它在技術上屬於控件界面的一部分,所以您不應該擔心它在未來版本中發生變化。 (它可能還會改變,但這不是你應該擔心的。)

type 
    THackGraphicControl = class(TGraphicControl) end; 

LCanvas := THackGraphicControl(Self).Canvas;