如何访问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;
我的后代 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;