gpt4 book ai didi

delphi - 有条件地编译 FMX 或 VCL 单元

转载 作者:行者123 更新时间:2023-12-03 14:51:48 24 4
gpt4 key购买 nike

我希望在 uses 子句中拥有不同的单元列表,具体取决于 FMX 或 VCL 的编译。在下面的代码中,我尝试测试在 FMX 项目中工作的 FireMonkeyVersion (label1.Text 是“FMX”)。当我将 $IF 语句移动到 uses 子句中时,我收到一条错误消息 ([dcc32 Error] fmx_text.pas(7): E2026 Constant expression Expected)。有什么方法可以得到想要的条件编译吗?

unit fmx_text;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Types;
{$IF FireMonkeyVersion >= 16}
{$DEFINE HAS_FMX}
{$ELSE}
{$DEFINE HAS_VCL}
{$IFEND}

type

TForm2 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormCreate(Sender: TObject);
begin
label1.Text := 'Undefined';
{$IFDEF HAS_FMX}
label1.Text := 'FMX';
{$ENDIF}
{$IFDEF HAS_VCL}
label1.Text := 'VCL';
{$ENDIF}
end;

end.

最佳答案

FireMonkeyVersion 不是编译器定义的值。它是在 FMX.Types 单元中声明的命名常量。尝试使用 {$IF DECLARED(FireMonkeyVersion)},例如:

{$DEFINE HAS_VCL}
{$IF DECLARED(FireMonkeyVersion) AND (FireMonkeyVersion >= 16)}
{$UNDEF HAS_VCL}
{$DEFINE HAS_FMX}
{$IFEND}

但我没有看到检查其数值的理由。您要么有 FireMonkey,要么没有:

{$IF DECLARED(FireMonkeyVersion)}
{$DEFINE HAS_FMX}
{$ELSE}
{$DEFINE HAS_VCL}
{$IFEND}

话虽如此,请记住,可以(尽管没有官方支持)在同一个项目中将 FireMonkey 和 VCL 混合在一起。因此,您可能需要重新思考您想要通过区分框架来实现的目标。

关于delphi - 有条件地编译 FMX 或 VCL 单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12788870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com