В Delphi XE2 мы используем
{$ifdef Win32}
{$ifdef Win64}
чтобы определить, на какой платформе мы находимся.
Есть ли предопределенное условие, которое может идентифицировать VCL и FMX?
В Delphi XE2 мы используем
{$ifdef Win32}
{$ifdef Win64}
чтобы определить, на какой платформе мы находимся.
Есть ли предопределенное условие, которое может идентифицировать VCL и FMX?
Как утверждают другие, нет условной директивы для определения, является ли ваше приложение 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;
Хотя это не документировано, вы можете иметь VCL и Firemonkey в одном приложении.
Определить компилятор не существует.
Если вы строите что-то, что должно быть как VCL, так и Firemonkey, я бы рекомендовал разделить единицы.
Возможный путь:
Смешивание кода пользовательского интерфейса из двух разных фреймворков в одном устройстве не является хорошей идеей. Он будет связываться в другой библиотеке, когда это не понадобится.
Нет директивы компилятора, поскольку технически нет такой вещи, как приложение 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.pas.
Это не хороший чистый раскол, как предложение Роберта, но преимущество в том, что все ваши изменения происходят в одном файле, а условное определение обрабатывается автоматически, поэтому его не нужно указывать в параметрах проекта. Кто когда-либо использует вашу библиотеку, просто включает в себя соответствующее подразделение, чтобы решить, какой из них они хотят использовать. Возможно, вы, вероятно, также воспользуетесь областью определения единиц, назвав файлы Fmx.AbUnit1.pas
и Vcl.AbUnit1.pas
, но я думаю, что Embarcadero не поощряет это.