2.1.1. Условная компиляция¶
2.1.1.1. Условная компиляция (Первичная реализаци)¶
2.1.1.1.1. Основные положения¶
Условная компиляция текста паскаль операций необходима при написании кода, рассчитанного для выполнения в различных окружниях, или различных версиях окружений.
Синтаксически анализатор должен поддерживать следующие выражения:
{$IFDEF MY_DEFINE}
{$ENDIF}
{$IFDEF MY_DEFINE}
{$ELSE}
{$ENDIF}
{$IFNDEF MY_DEFINE}
{$ENDIF}
{$IFNDEF MY_DEFINE}
{$ELSE}
{$ENDIF}
{$IF MY_DEFINE}
{$ENDIF}
// Если MY_DEFINE отсутствует, услове равно FALSE.
// Если MY_DEFINE = null, услове равно FALSE.
// Если MY_DEFINE = False (строка) или 0, услове равно FALSE.
// Если MY_DEFINE = True (строка) или 1, услове равно TRUE.
// Если MY_DEFINE = {Иное значение}, предкомпиляци выдаёт ошибку
{$IF MY_DEFINE > 2.0.0.1}
{$ENDIF}
{$IF MY_DEFINE > 2.0.0.1}
{$ELSE}
{$ENDIF}
Условия предкомпиляции могут быть вложенными.
- Директивы компиляции указываются глобально, при старте приложения.
- Каждая директива компиляции является парой ключ-значение. Директива может иметь значение null, что равносильно отсутсвию значения.
- Разработчик предметной области не может управлять значениями директив в процессе выполнения приложения.
- Предполагается, что в список директив компиляциии будет настраиваться для модулей предметной области и загружаться из БД при старте приложения.
2.1.1.1.2. Правила именования директив¶
- Имена директив регистроНЕзависимы
- Имена могут содержать алфавитные символы, числа, символ ‘_’
- Имена не могут содержать пробелов
- Имя должно начинаться с алфавитного символа
2.1.1.1.3. Правила сравнения значений директив¶
Директива может иметь следующие типы значений:
- Нет зачения
- Число дробное или целое: 1000 , 200.5 , 0.5
- Строка: ‘Любаястрока’
- № версии: a , a.b.c.d , где a,b,c.d целые числа. Формат ввода: a.[b].[c[.[d]]]
Возможны следующие условия сравнения: < , >, = , <>, >=, <= Директива не имеющая значения, приравнивается к отсутствующей. Выражения типа {$IF MY_DEFINE > 2.0.0.1} вычисляются по следующим правилам:
- MY_DEFINE не существует. (MY_DEFINE > 2.0.0.1) == False
- MY_DEFINE существует и равно Null. (MY_DEFINE > 2.0.0.1) == False
- MY_DEFINE существует и равно 1.0.2. (MY_DEFINE > 2.0.0.1) == False
- MY_DEFINE существует и равно 4.0.2. (MY_DEFINE > 2.0.0.1) == True
2.1.1.1.4. Правила сравнения номеров версий¶
При вычислении выражений типа {$IF DesktopVer > 5.4.10.3680} учитывается сквозная нумерация сборок. Версия клиента и номер сборки сравниваются отдельно. Итоговый результат расчитывается как ‘(результат сравнения версии) И (результат сравнения номера сборки)’
То есть:
- Версия клиента больше, номер сборки больше (5.5.0.9680 > 4.30.68.3680) == True
- Версия клиента больше, номер сборки меньше (5.5.0.3680 > 4.30.68.9680) == False
- Версия клиента меньше, номер сборки меньше (4.30.68.3680 < 5.5.0.9680) == True
- Версия клиента меньше, номер сборки больше (4.30.68.9680 < 5.5.0.3680) == False
Changed in version 5.5: Добавлен учёт сквозной нумерации сборок.
Attention
Для совместимости со старыми клиентами, не учитывающими сквозную нумерацию сборок, проверку номера сборки необходимо отдельно вкладывать в проверку номера версии
{$IF DesktopVer > 5.4.10}
{$IF BuildVer > 3680}
...
{$ENDIF}
{$ENDIF}
2.1.1.1.4.1. Маска версий в сравнении¶
- Если какие-то индексы в номере версии не важны для сравнения, их можно пропустить.
- На месте пропуска не должно быть пробелов или иных символов, в противном случае клиент покажет сообщение об ошибке.
- Если пропущенные индексы находятся в конце номера версии, точки-разделители также можно опустить, а если где-то в середине - их необходимо указать для обозначения позиций индексов в номере версии.
То есть:
- (5.5 = 5..5) == True
- (5.5.0.9680 > 5…3680) == True
- (5…9680 > 4.30) == True
- (5.5 = 4) == False
2.1.1.1.5. Системные директивы¶
При старте приложения в окружение регистриует следующие директивы
- Web - не имеет значения. Регистрируется при запуске Web-окружения
- WebVer - Версия web-окружения. Регистрируется при запуске Web-окружения
- Desktop - не имеет значения. Регистрируется при запуске desktop-окружения
- DesktopVer - Версия desktop-окружения. Регистрируется при запуске desktop-окружения
2.1.1.1.6. Примеры¶
- Проверка версии десктопного приложения.
<pascal> {$IF DesktopVer <= 4..} ShowMessage( 4 ); {$ELSE} ShowMessage( 5 ); {$ENDIF} </pascal>
2.1.1.1.7. Используемые определения¶
- Desktop Приложение
- DesktopVer - версия приложения, тип данных - версия
- DesktopBuild - номер сборки приложения, тип данных - целое. Тоже значение что и в 4-й позиции версии (DesktopVer)