【问题标题】:Delphi visual component with Canvas带有 Canvas 的 Delphi 可视化组件
【发布时间】:2017-09-25 16:04:35
【问题描述】:

我一直在写非视觉组件;它们的创建非常简单,并且它们在 VCL 和 FMX 下同样有效。到目前为止一切顺利,但现在我遇到了问题。

我以前从TComponent 继承,但现在我不能了,因为我的组件名为TRedistPreview 确实需要这样的过程:

procedure drawPreview(area: TCanvas);

此过程必须在某处绘制一些东西(形状、线条和颜色),例如在TRectangle 中。我在网上看到TComponent没有绘图能力,所以我应该继承其他东西。我找到了TWinControl(但那是仅限 VCL)和 TCustomControl(也仅限 VCL)。

你能告诉我我应该继承什么来获得画布吗?我的意思是,我想替换:

TRedistPreview = class(TComponent)
end;

与:

TRedistPreview = class(TSomeClassThatHasCanvas)
end;

我可以调用procedure drawPreview(area: TCanvas); 并在表面上绘图(如TRectangle)。

我正在使用 Canvas 寻找层次结构中可能最低的类。


由于这个组件在 Windows 和 Android 下对我非常有用,我正在寻找一个 Firemonkey 实现。根据我的研究,我发现我可以继承 TRectangle,它位于 FMX.Objects 内部,但我不知道这是否是正确的选择。

我该怎么办?

另外,如果我需要这个组件在 VCL 中,我是否必须编写另一个从另一个类继承的组件?

正如我所说,这是我第一次编写可视化组件,所以我希望有人告诉我正确的方法!

【问题讨论】:

  • 从 TComponent 驱动绝对没问题。完全没有理由不能实现在画布上绘制组件的方法。当然,这种设计可能是错误的。也许你需要一个视觉控制。也许你要求错了。
  • 是的,VCL 和 FMX 不以任何方式相互兼容 - 不是在编写一个适用于两者的单一控件的意义上。这基本上就像试图将柴油发动机从半卡车安装到迷你库珀中。
  • 作为一个快速的开始,你可以看看一些预先写好的东西,比如我在这个问题中的代码:stackoverflow.com/questions/31767346/… 研究它并实现你自己的东西。
  • 其实我的那个控制继承自TShape

标签: delphi firemonkey


【解决方案1】:

在 VCL 中,第一个支持画布的类是 TCustomcontrol,它是 TWinControl 的后代。 http://docwiki.embarcadero.com/Libraries/Seattle/en/Vcl.Controls.TCustomControl

在 FMX 中,允许绘制例程的基类是 TControl。

但请记住,在 FireMonkey 中渲染视觉组件与在 VCL 中有很大不同。因此,如果您考虑在 FMX 中重用 VCL 代码,反之亦然,恐怕这是不可能的。

【讨论】:

  • 这实际上不起作用!我已将 TControl 添加为父类而不是 TComponent,但我仍然无法使用您在上面看到的过程访问 TCanvas...如果从 TControl 继承然后我添加了 FMX.Graphics(具有 TCanvas)就足够了吗?跨度>
  • 您不需要特别从任何类派生来实现接受画布作为参数的函数。
  • @DavidHeffernan 我刚刚明白了。我决定像往常一样从 TComponent 派生,然后在 uses 子句中添加我需要的内容,例如 FMX.Graphics(用于 TCanvas)。到目前为止它正在工作,我想我已经明白该怎么做了!
  • 您将拥有一个非可视组件,它可以根据需要将自己绘制到画布上。这是否有用我无法判断。
  • @Emma David 的意思是您可以创建一个TComponent,其中包含绘制到画布的代码。但这在很大程度上取决于您实际尝试做的事情。这样的组件不是很常见。您可能实际上正在寻找的是创建一个自定义控件,它在自己的可视画布上的UI 中自行绘制。在这种情况下,您不能简单地从 TComponent 后代中这样做 - 您至少需要继承 TControl
猜你喜欢
  • 2013-01-24
  • 2011-05-23
  • 2011-03-20
  • 2016-11-25
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多