delphi - 如何将文件命名为不同的 VCL 和 FireMonkey 代码
问题描述
我有一个在 Delphi 7 到 10.3 上运行的 VCL 组件。我现在将它移植到 FMX。
为了避免维护两个代码库,我将在源代码中使用条件定义来分隔任何自定义 FMX 和 VCL 代码。当我编译组件以进行分发时,脚本将输出 VCL 或 FMX 源文件。
我的问题是如何使 VCL DCU 和 FMX DCU 在同一个系统上共存(对于同时拥有我的组件的 VCL 和 FMX 版本的用户),因为这两个文件夹都需要位于 Delphi 路径上。
换句话说,我的 VCL 单元被命名为:myunit1.pas、myunit2.pas 等。
以及 FMX 版本:fmx.myunit1.pas、fmx.myunit2.pas 等
(理想情况下,我会将 VCL 命名为 vcl.myunit1.pas、vcl.myunit2.pas 等。这样,组件的 VCL 版本只会看到 vcl.-.pas 文件,而 FireMonkey 只会看到 fmx.-.pas文件。不幸的是我不能这样做,因为那样它就不能在旧的 Delphi 版本上工作)。
现在,当我编译 FireMonkey 应用程序时,它会尝试使用非 fmx 前缀的源文件,而不是 fmx._.pas 文件。我需要“隐藏” vcl 源文件夹以使其编译(重新排序 Delphi 路径无济于事)。
如果有其他方法可以让 FireMonkey 避免使用 vcl 文件?
(我担心我需要编写一个脚本来给所有文件一个新名称,例如 FMXmyunit1.pas 并更新所有文件中的所有引用)。
解决方案
因为 Delphi 不提供预定义的编译器条件来区分 Firemonkey 和 VCL 框架,您可以将符号 $(FrameworkType) 添加到应用程序项目设置的条件定义列表中。这可以通过使用条件编译符号FMX
和VCL
.
典型用法示例:
uses
{$IFDEF FMX}
FMX.Forms,
{$ENDIF}
{$IFDEF VCL}
VCL.Forms,
{$ENDIF}
这适用于我自己的纯 VCL 和 FMX 项目的跨平台库,我可以将源文件直接集成到项目中。这种简单的方式,每次都会重新编译DCU。在混合项目的情况下,$(FrameworkType) 包含应用程序的初始框架。
当您交付一个包 (bpl) 时,事情会变得更加复杂。您必须为 FMX 和 VCL 提供两个版本的 bpl。如果您还提供用于调试目的的源代码,唯一的选择是完全区分 FMX 和 VCL 版本的源代码文件,只要它们具有平台相关的代码。
推荐阅读
- android - 在我的 android 应用程序中使用带有硬编码视频 ID 的 YoutubePlayer
- facebook-graph-api - Instagram Graph API - 结合使用 Business Discovery 和 Insights edge
- vhdl - 当他达到一定值时如何使计数器复位?
- javascript - 有效地覆盖特定元素的本机 appendChild
- python - Pandas 无法读取我的 csv 一个桌面,在笔记本电脑上工作正常
- python - 在函数中使用 numpy 数组中的数据
- api - WSO2 API 管理器从 2.0 迁移到 2.5
- c# - C# 如何创建更复杂的 .Any() 表达式
- xamarin - IsEnable 属性在 ListView 项目 xamarin 表单中不起作用
- ios - ReplayKit 错误:代码=-5807“录制因多任务处理和内容调整大小而中断”