8

usesFMXまたは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.
4

1 に答える 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を同じプロジェクトに混在させることは(公式にはサポートされていませんが)可能であることに注意してください。したがって、フレームワークを差別化することによって達成しようとしていることは何でも再考する必要があるかもしれません。

于 2012-10-08T20:53:23.780 に答える