如何访问继承的TImage继承的Canvas?

时间:2017-02-18 09:26:17

标签: delphi inheritance delphi-7

我的后代TMyImage = class(ExtCtrls.TImage)需要访问TImage继承的Canvas(TGraphicControl祖先)

e.g。

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;

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

1 个答案:

答案 0 :(得分:4)

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

type
  THackGraphicControl = class(TGraphicControl) end;

LCanvas := THackGraphicControl(Self).Canvas;