我的后代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;
但我想知道是否有一个不依赖于版本的解决方案。
答案 0 :(得分:4)
您可以使用与现有技术类似的技术,但访问Canvas
属性而不是FCanvas
字段。 Canvas
属性受到保护,这意味着它在技术上是控件界面的一部分,因此您不必担心它在将来的版本中会发生变化。 (它可能仍会改变,但这不是你应该担心的事情。)
type
THackGraphicControl = class(TGraphicControl) end;
LCanvas := THackGraphicControl(Self).Canvas;