Подтвердить что ты не робот

Delphi XE2: Существует ли предопределенное условие для идентификации VCL и FireMonkey?

В Delphi XE2 мы используем

{$ifdef Win32}
{$ifdef Win64}

чтобы определить, на какой платформе мы находимся.

Есть ли предопределенное условие, которое может идентифицировать VCL и FMX?

4b9b3361

Ответ 1

Как утверждают другие, нет условной директивы для определения, является ли ваше приложение 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;

Ответ 2

Хотя это не документировано, вы можете иметь VCL и Firemonkey в одном приложении.

Определить компилятор не существует.

Если вы строите что-то, что должно быть как VCL, так и Firemonkey, я бы рекомендовал разделить единицы.

Возможный путь:

  • MyLibrary.X.pas - Общий код, который будет использовать как VCL, так и Firemonkey.
  • MyLibrary.Vcl.X.Pas - Конкретный код Vcl
  • MyLibrary.Fmx.X.Pas - Конкретный код Fmx

Смешивание кода пользовательского интерфейса из двух разных фреймворков в одном устройстве не является хорошей идеей. Он будет связываться в другой библиотеке, когда это не понадобится.

Ответ 3

Нет директивы компилятора, поскольку технически нет такой вещи, как приложение firemonkey или приложение vcl. Только те приложения, которые используют эти технологии. Приложение может использовать fxm или vcl или оба или ни одно из них (например, консольное приложение). Это немного похоже на вопрос, является ли это SQL-приложением. Конечно, вы можете программно проверить родословную отдельных форм, чтобы увидеть, с какой структуры они наследуют. Опять же, внутри единицы, которая не имеет связанной формы, это не имеет никакого значения.

Ответ 4

Кажется, что компилятор не определен специально для VCL/FireMonkey. Вам нужно будет создать свой собственный.

Список предопределенных условных выражений можно найти в документации.

Ответ 5

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.pas.

Это не хороший чистый раскол, как предложение Роберта, но преимущество в том, что все ваши изменения происходят в одном файле, а условное определение обрабатывается автоматически, поэтому его не нужно указывать в параметрах проекта. Кто когда-либо использует вашу библиотеку, просто включает в себя соответствующее подразделение, чтобы решить, какой из них они хотят использовать. Возможно, вы, вероятно, также воспользуетесь областью определения единиц, назвав файлы Fmx.AbUnit1.pas и Vcl.AbUnit1.pas, но я думаю, что Embarcadero не поощряет это.