Компиляция Delphi для конкретной версии, связанная с графикой и модулями AnsiStrings

У меня есть один модуль, который я хочу скомпилировать под любой версией Delphi, скажем, Delphi 2006.

Он имеет следующий код, который имеет проблемы с компиляцией:

uses
  graphics; // for previous versions can not be compiled on Delphi XE

uses
  vcl.graphics; // compiled on Delphi XE but can not compile on previous version

А функции StrLen, StrCopy выдают предупреждение "устарело. Перемещено в AnsiString".

Вопрос: как все это уладить? Из какой версии компилятора графика становится vcl.graphics, а StrLen перемещается в AnsiStrings? Чтобы создать следующий код:

uses
  {$if CompilerVersion < ??}graphics{$ifelse}vcl.graphics{$ifend};

2 ответа

Graphics блок был переименован в Vcl.Graphics в XE2, когда впервые были введены имена областей применения.

Что нового в Delphi и C++Builder XE2

Важное новое требование: имена областей применения для VCL-FMX-RTL

Важное замечание: в блоках VCL-FMX-RTL теперь используется соглашение о присвоении имен с точечным префиксом, например System.Types а также Vcl.Styles, Если у вас есть код, который использует квалифицированные идентификаторы (такие как Types.IStream), изменения кода могут потребоваться для компиляции.

Вам не нужно использовать {$IF} оператор для написания кросс-версии кода VCL. Ваш uses пункт может продолжать использовать Graphics Название устройства само по себе:

uses
  Graphics;

Просто убедитесь, что Vcl включен в список имен областей модуля в параметрах проекта проектов XE2+ (что должно быть по умолчанию).

Это задокументировано (на самом деле, документация даже использует Graphics блок в качестве примера):

Параметры проекта Delphi Compiler | Delphi Compiler

Задает имена областей действия (префиксы) для точечных пространств имен Delphi, чтобы позволить вам использовать частично определенные имена в вашем коде и в вашем uses пункт или #include,

Есть два способа добавить имя области модуля для модуля Delphi:

  • Укажите полностью единичное имя в предложении использования. Например:

    uses Vcl.Graphics;
    
  • Добавьте название области действия устройства (Vcl) в поле Имена областей применения модуля. Тогда название области применения Vcl автоматически применяется к именам модулей, которые принадлежат к этой области видимости, и вы можете просто указать:

    uses Graphics; 
    

Всплывающая кнопка с многоточием открывает диалоговое окно для выбора и добавления имен областей применения, как описано в диалоговых окнах "Общие элементы на страницах параметров проекта" и " Упорядоченный список".

Если вы решите использовать {$IF} оператор, правильный синтаксис:

uses
  {$IF RTLVersion >= 23}Vcl.{$IFEND}Graphics;

Или же:

uses
  {$IF RTLVersion >= 23}Vcl.Graphics{$ELSE}Graphics{$IFEND};

Для PAnsiChar версии SysUtils.StrLen() а также SysUtils.StrCopy(), они устарели и переехали в System.AnsiStrings блок в XE4 (RTLVersion=25.0). Например:

uses
  ...
  {$IF RTLVersion >= 25}, AnsiStrings{$IFEND}
  ;

var
  Src, Dest: PAnsiChar;
  Len: Integer;
begin
  Src := ...;
  Len := {$IF RTLVersion >= 25}AnsiStrings.{$IFEND}StrLen(Src);
  GetMem(Dest, Len * SizeOf(AnsiChar));
  {$IF RTLVersion >= 25}AnsiStrings.{$IFEND}StrCopy(Dest, Src);
  ...
end;

Наконец, обратите внимание, что {$IF} был введен в Delphi 6, поэтому, если вам нужно поддерживать Delphi 5 или более раннюю версию, вам нужно обернуть {$IF} заявления в {$IFDEF CONDITIONALEXPRESSIONS} блок.

Вы также можете использовать псевдонимы юнитов для настройки... это способ, совместимый с путешествием во времени в будущее, если он вам действительно нужен, но для настройки каждого юнита потребуется много работы, например:

Пример псевдонима юнита, совместимый с путешествием во времени к посту в будущем:VCL.Graphics=Graphics

Другие вопросы по тегам