delphi - 如何制作一个同时支持FMX和VCL的组件

标签 delphi firemonkey vcl

这个问题已经有人问过了,但我仍然找不到好的方法。

我制作了一个组件,它只是在 TForm 上绘制一些内容。基本上,它与 FMX 或 VCL 的代码完全相同,但在 FMX 上它使用 FMX.Forms,在 VCL 上它使用 Vcl.Forms

  1. 如何使我的组件与这两个框架兼容?理想情况下,我不想拆分单元(例如,一个 FMX.myunit.pas 和一个 VCL.myUnit.pas)。

  2. 如何让我的组件仅针对 VCL 项目 仅针对 FMX 项目 <两个项目的strong>或?

  3. 如何在我的 .dpr/.dproj 中说我的项目使用了 VCL 或 FMX 框架?一个项目可以同时使用VCL和FMX框架吗?

  4. 对于 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 by RegisterFmxClasses([TMyControl]); (It's look like this in all sample I saw).

真正做的就是分组 TMyControlTFmxObject类组,仅当 FMX 框架处于事件状态时才可用。它只是另一个用于过滤 IDE 中组件显示的组。将 UI 控件分组到 TControl类(class)小组完成同样的事情。

关于delphi - 如何制作一个同时支持FMX和VCL的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69281293/

相关文章:

delphi - 使用 TWebBrowser 登录网络

c# - 在 C# 中使用在 Delphi 7 中编译的 DLL

delphi - Delphi XE6可以为Windows Phone编译吗?

varnish - 如何在 Varnish vcl 中转义双引号

delphi - ShortCut 什么时候触发?

delphi - 如果我有多个冷却带,如何移除冷却杆上的所有 Handlebars ?

android - 在线程内释放对象时出错

delphi - Raudus 与 ExtPascal : Delphi web developement alternatives that use ExtJS

android - 如何在 Firemonkey 移动应用程序中获取电话的联系人列表?

delphi - Delphi中的不规则形状