Delphi XE2 では、
{$ifdef Win32}
{$ifdef Win64}
私たちがどのプラットフォームにいるのかを特定するために。
VCL と FMX を識別する定義済みの条件はありますか?
Delphi XE2 では、
{$ifdef Win32}
{$ifdef Win64}
私たちがどのプラットフォームにいるのかを特定するために。
VCL と FMX を識別する定義済みの条件はありますか?
文書化されていませんが、同じアプリケーションで VCL と Firemonkey を使用できます。
コンパイラ定義はありません。
VCL と Firemonkey の両方が必要なものを構築している場合は、ユニットを分離することをお勧めします。
可能な方法:
同じユニットで 2 つの異なるフレームワークの UI コードを混在させることはお勧めできません。不要な場合は他のライブラリにリンクします。
他の人が言うように、アプリケーションが VCL か FireMonkey かを判断するための条件付きディレクティブはありません。アプリが FireMonkey なのか VCL なのかを判断する最も信頼できる方法は、条件付きディレクティブではなく関数を使用することだと思います。
何かのようなもの
Uses
Rtti;
function IsVCLApp:Boolean;
begin
Result:= CompareText(TRttiContext.Create.GetType(TApplication.ClassInfo).QualifiedName,'Vcl.Forms.TApplication')=0;
end;
function IsFireMonkeyApp:Boolean;
begin
Result:= CompareText(TRttiContext.Create.GetType(TApplication.ClassInfo).QualifiedName,'FMX.Forms.TApplication')=0;
end;
技術的には、firemonkey アプリケーションや vcl アプリケーションなどは存在しないため、コンパイラ ディレクティブはありません。これらの技術を利用するアプリケーションのみ。アプリケーションは、fxm または vcl、または両方を使用することも、どちらも使用しないこともできます (例: コンソール アプリ)。これは、SQL アプリケーションかどうかを尋ねるのと少し似ています。もちろん、個々のフォームの祖先をプログラムでチェックして、どのフレームワークから継承されているかを確認できます。繰り返しになりますが、関連付けられたフォームを持たないユニット内では、これは意味がありません。
VCL/FireMonkey 専用のコンパイラ定義はないようです。自分で作成する必要があります。
事前定義された条件のリストは、ドキュメントにあります。
Abbrevia は、この種の分割を使用して VCL と CLX の両方をサポートします。
QAbUnit1.pas:
{$DEFINE UsingCLX}
unit QAbUnit1;
{$I AbUnit1.pas}
AbUnit1.pas:
{$IFNDEF UsingCLX}
{$DEFINE UsingVCL}
unit AbUnit1;
{$ENDIF}
type
...
TMyWidget = class({$IFDEF UsingVCL}TWinControl{$ENDIF}
{$IFDEF UsingCLX}TWidgetControl{$ENDIF})
...
end;
end.
FireMonkey のサポートを追加するには、次のようなファイルを追加します。
FmxAbUnit1.pas:
{$DEFINE UsingFMX}
unit FmxAbUnit1;
{$I AbUnit1.pas}
{$ENDIF}
次に、AbUnit1.pa に必要な条件付きの変更を加えます。
Robert の提案のようなきれいな分割ではありませんが、すべての編集が 1 つのファイルで行われ、条件付き定義が自動的に処理されるため、プロジェクト オプションに表示する必要がないという利点があります。ライブラリを使用する人は、適切なユニットを含めて、使用するユニットを決定するだけです。Fmx.AbUnit1.pas
ファイルに andという名前を付けることで、おそらくユニットスコープも利用できますが、Vcl.AbUnit1.pas
エンバカデロはそれを思いとどまらせていると思います.