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