Как назвать файлы для дифференцированного кода VCL и FireMonkey - PullRequest
2 голосов
/ 26 сентября 2019

У меня есть компонент VCL, который работает на Delphi 7 до 10.3.Я сейчас портирую его на FMX.

Чтобы не поддерживать две кодовые базы, я буду использовать условные определения в своем источнике для разделения любого пользовательского кода FMX и VCL.Когда я компилирую компонент для распространения, сценарий будет выводить исходные файлы VCL или FMX.

Моя проблема заключается в том, чтобы заставить DCU VCL и DCU FMX сосуществовать в одной системе (для пользователей, у которых есть обаверсии VCL и FMX моего компонента), поскольку обе папки должны находиться по пути Delphi.

Другими словами, мои модули VCL называются: myunit1.pas, myunit2.pas и т. д.

И версии FMX: fmx.myunit1.pas, fmx.myunit2.pas и т. Д.

(В идеале я бы назвал VCL vcl.myunit1.pas, vcl.myunit2.pas и т. Д.Таким образом, версия компонента VCL будет видеть только файлы vcl .-. pas, а FireMonkey - только файлы fmx .-. pas. К сожалению, я не могу этого сделать, потому что тогда он не будет работать на более старых версиях Delphi).

Теперь, когда я компилирую приложение FireMonkey, оно пытается использовать исходные файлы без префикса fmx, вместо файлов fmx ._. Pas.Мне нужно «спрятать» исходную папку vcl, чтобы она скомпилировалась (не помогает переупорядочение путей Delphi).

Если есть другой способ заставить FireMonkey избегать использования файлов vcl?

(Боюсь, мне нужно будет написать скрипт, чтобы дать всем файлам новое имя, например, FMXmyunit1.pas, и обновить все ссылки во всех файлах).

1 Ответ

2 голосов
/ 27 сентября 2019

Поскольку в Delphi нет предопределенных условных выражений компилятора, позволяющих различать Firemonkey и среду VCL, вы можете добавить символ $ (FrameworkType) в список условных определений параметров проекта приложения.Это позволяет дифференцировать каркас в вашей библиотеке с помощью условных символов компиляции FMX и VCL.

Пример типичного использования:

uses
  {$IFDEF FMX}
  FMX.Forms,
  {$ENDIF}
  {$IFDEF VCL}
  VCL.Forms,
  {$ENDIF}

Это работает в моей собственной кроссплатформенной библиотеке для чистых проектов VCL и FMX, где я позволяю интегрировать исходные файлы непосредственно в проект.Таким простым способом DCU будет перекомпилироваться каждый раз.В случае смешанных проектов $ (FrameworkType) содержит начальную платформу приложения.

Когда вы доставляете пакет (bpl), все становится более сложным.Вы должны предоставить две версии вашего bpl для FMX и VCL.Если вы также предоставляете исходный код для целей отладки, единственный вариант - полностью дифференцировать файлы исходного кода для версий FMX и VCL, если они имеют платформо-зависимый код.

...