这个问题已经有人问过了,但我仍然找不到好的方法。
我制作了一个组件,它只是在 TForm
上绘制一些内容。基本上,它与 FMX 或 VCL 的代码完全相同,但在 FMX 上它使用 FMX.Forms
,在 VCL 上它使用 Vcl.Forms
。
如何使我的组件与这两个框架兼容?理想情况下,我不想拆分单元(例如,一个
FMX.myunit.pas
和一个VCL.myUnit.pas
)。如何让我的组件仅针对
VCL 项目
或仅针对FMX 项目
<两个项目
的strong>或?如何在我的
.dpr
/.dproj
中说我的项目使用了 VCL 或 FMX 框架?一个项目可以同时使用VCL和FMX框架吗?对于 FMX 组件,为什么我需要先调用
RegisterComponents('myGroup', [TMyControl]);
,然后调用RegisterFmxClasses([TMyControl]);
(在我见过的所有样本中都是这样)。
最佳答案
I just made a component who simply draw some stuff on a TForm.
UI 控件根本不应该在窗体上绘制。它应该在 Canvas
上绘制VCL/FMX 框架提供给它的信息,例如在覆盖的 Paint()
中方法。
How to make my component compatible with both framework? Ideally I don't want to split the unit (one FMX.myunit.pas and one VCL.myUnit.pas for exemple)
您不需要在自己的单元中使用单元范围,除非您跨包共享单元并希望区分它们。
如果您不为每个框架制作单独的单元,那么您将需要 IFDEF
使用特定于框架的编码时需要的单元。
如果您编写纯粹与框架无关的代码,则单个包可以用于两个框架。但如果您需要编写特定于框架的代码(即,由于 UI 代码等),那么您将需要为每个框架制作单独的包。
对于组件本身,如果您采用 IFDEF 路线,那么如果可能的话,请尝试从两个框架中都存在的基类派生您的组件。
对于非可视组件,派生自TComponent
,它在两个框架中的行为完全相同。
对于视觉控件,派生自TControl
或根据需要的后代。请注意,每个框架实现视觉控件的方式有所不同,因此您可能需要 IFDEF
相应地您的实现代码,或者为每个框架使用单独的单元。
How to make my component appear in the tools palette only for VCL project or only for FMX project or for both projects ?
包可以与特定框架具有亲和性(请参阅下文)。
如果它指定了一个特定的框架,那么这是它出现的唯一框架。如果没有指定框架,则两个框架都可用。
当你注册一个UI控件时,你应该调用 GroupDescendentsWith()
将您的控件分组到 TControl
的类(class)组,例如:
RegisterComponents('My Control', [TMyControl]);
GroupDescendentsWith(TMyControl, TControl);
不要完全限定 TControl
的单元范围,无论是在这次通话中,还是在您的 uses
中条款。仅使用Controls
单位并让编译器在 FMX.Controls.TControl
之间进行选择或Vcl.Controls.TControl
取决于 TControl
的版本是否可用取决于您的包正在编译的框架。
How in my dpr/dproj can I say that my project use VCL or FMX framework?
在 .dproj
,在第一个<PropertyGroup>
,有一个<FrameworkType>
可用元素(如果缺少则添加),可以设置为 VCL
, FMX
,或None
.
Can a project use both Framework, VCL and FMX?
不是官方,没有。但是,有一些非官方方法(即第三方解决方案)可以做到这一点。我不建议在包内执行此操作,而仅在应用程序内执行此操作。
For fmx components, why I need to do
RegisterComponents('myGroup', [TMyControl]);
followed byRegisterFmxClasses([TMyControl]);
(It's look like this in all sample I saw).
真正做的就是分组 TMyControl
到TFmxObject
类组,仅当 FMX 框架处于事件状态时才可用。它只是另一个用于过滤 IDE 中组件显示的组。将 UI 控件分组到 TControl
类(class)小组完成同样的事情。
关于delphi - 如何制作一个同时支持FMX和VCL的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69281293/