我的后代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;

08-04 19:13