【问题标题】:How to pass TForm and TPanel to a function?如何将 TForm 和 TPanel 传递给函数?
【发布时间】:2018-02-16 13:16:53
【问题描述】:

我有这两个功能

procedure GradiantFill(Control: TCustomControlEx; ColorTop, ColorBtm: TColor); overload;
procedure GradiantFill(Control: TForm; ColorTop, ColorBtm: TColor); overload;

这两个函数都需要访问画布,所以为了访问 TPanel 的画布,我声明:

TYPE
  TCustomControlEx= class(TCustomControl)    { Control that exposes the Canvas property. It can be used to access TPanel's canvas property for example }
   public
      property Canvas;
   end;

我想将这两个函数合并为一个函数,这样我就可以将 TForm 和 TPanel 都传递给它。喜欢:

procedure GradiantFill(Control: TWinControl?; ColorTop, ColorBtm: TColor); 

如何在 Delphi 中实现这一点?
问题是 TPanel 和 TForm 的共同祖先是 TWinControl 但它没有 Canvas 属性。

【问题讨论】:

  • 真的需要将控件传递到您的渐变填充过程中吗?也许 Bounds、Canvas 和你的两种颜色就足够了? procedure GradiantFill(const Bounds: TRect; ACanvas: TCanvas; ColorTop, ColorBtm: TColor);
  • 是的 - 直接通过画布。

标签: delphi canvas delphi-xe7


【解决方案1】:

你可以使用这样的东西

procedure GradiantFill(Control: TWinControl; ColorTop, ColorBtm: TColor);
var
  Canvas: TCanvas;
begin
  if Control is TCustomControl then
    Canvas:=TCustomControlEx(Control).Canvas
  else if Control is TForm then
    Canvas:=TForm(Control).Canvas
  else
    exit;

  ... 
end;

或将 Canvas 作为参数而不是 Control 传递

procedure GradiantFill(Canvas: TCanvas; ColorTop, ColorBtm: TColor);

【讨论】:

  • 它有效。谢谢。对我来说怎么不是很明显? - PS:TCustomForm 可能比 TForm 更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2016-12-11
  • 2016-12-25
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多