Компиляция 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