如何访问inherited或inherited Canvas的Image?

How to access inherited of inherited Canvas of TImage?

我的后代 TMyImage = class(ExtCtrls.TImage) 需要访问 TImage 继承的 Canvas(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;

但我想知道是否有不依赖于版本的解决方案。

您可以使用与现有技术类似的技术,但访问 Canvas 属性 而不是 FCanvas 字段。 Canvas 属性 是受保护的,这意味着它在技术上是控件界面的一部分,因此您不必担心它会在未来的版本中发生变化。 (它可能仍然会改变,但这不是你应该担心的事情。)

type
  THackGraphicControl = class(TGraphicControl) end;

LCanvas := THackGraphicControl(Self).Canvas;