有条件地编译 FMX 或 VCL 单元

问题描述 投票:0回答:1

我希望在

uses
子句中拥有不同的单位列表,具体取决于 FMX 或 VCL 的编译。在下面的代码中,我尝试测试
FireMonkeyVersion
是否在 FMX 项目中工作(
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.
delphi firemonkey delphi-xe2 vcl
1个回答
12
投票

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 混合在一起。 因此,您可能需要重新思考您想要通过区分框架来实现的目标。

© www.soinside.com 2019 - 2024. All rights reserved.