2017-09-25 91 views
1

我总是写非视觉组件;他们的创作非常简单,而且在VCL和FMX下他们的工作同样出色。到目前为止这么好,但现在我面临一个问题。带有Canvas的Delphi可视化组件

我用来从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中,我是否必须编写另一个从另一个类继承的组件?

正如我所说,这是我第一次用可视化组件写作,所以我希望有人给我看看正确的方法!

+0

完全可以从TComponent开车。根本没有理由不能实现方法在画布上绘制组件。当然,这种设计可能是错误的。也许你需要一个视觉控制。也许你在问错误的事情。 –

+1

是的,VCL和FMX没有任何相互之间的兼容性 - 而不是写在一起工作的单一控制。这基本上就像试图从一辆半卡车将柴油发动机安装到小型柴油机中。 –

+0

作为一个开始,你可以看一些预先写好的东西,比如我在这个问题中的代码:https://stackoverflow.com/questions/31767346/capturing-signature-very-sketchy-on-touch-screen研究它并实施你自己的事情。 –

回答

2

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

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

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

+0

这实际上并没有工作!我添加TControl作为父类而不是TComponent,但我仍然无法使用上面可以看到的过程访问TCanvas ...如果从TControl继承,然后添加了FMX.Graphics(它有TCanvas)就足够了吗? –

+0

你不需要从任何类派生特别是实现一个接受画布作为参数的函数。 –

+0

@DavidHeffernan我刚刚得到它。我决定像往常一样从TComponent派生,然后在用例子句中添加我需要的内容,例如FMX.Graphics(对于TCanvas)。它工作到目前为止,我想我已经明白该怎么做! –