$O — Директива компилятора Delphi

Список директив компилятора Delphi, нужно ли указывать директивы перед именем устройства? — compiler-construction

im работает над приложением, используя delphi 7, и я просто наткнулся на это

автор кода разместил так много директив компилятора перед именем основного устройства.

может кто-нибудь сказать мне

  • Как использовать директивы перед именем элемента, делает ли это глобальным?
  • И можем ли мы создать наши собственные директивы в некоторых конкретных ситуациях?
  • где указаны директивы компилятора?
    4 3
  • 31 окт 2020 2020-10-31 11:20:41
  • PresleyDias

3 ответа

Спасибо, ребята, за совет CTRL OO, потому что я не знаю, что случилось с моим кодом, когда появились эти стандартные и определенные директивы.

  • 31 окт 2020 2020-10-31 11:20:42
  • Gilberto Da Silva Campos
  • Как использовать директивы перед именем элемента, делает ли это глобальным?

Если по глобальным значениям вы имеете в виду весь проект, ответ будет НЕТ. Каждый блок скомпилирован на нем.

  • И можем ли мы создать наши собственные директивы в некоторых конкретных ситуациях?

Они называются директивами компилятора, потому что компилятор их интерпретирует. Вы не можете создавать свои собственные директивы, если не находитесь в Embarcadero, и вы меняете компилятор.

Они определены в источниках компилятора. Они задокументированы в документации по компилятору, и вы уже нашли ссылку на решетку (вторая ссылка)

  • 31 окт 2020 2020-10-31 11:20:42
  • Cosmin Prund
  • Ключевая тема, объясняющая принципы, приведена здесь: директивы компилятора Delphi.
  • Директивы компилятора перечислены здесь: Директивы компилятора Delphi (список).

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

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

Директивы переключателей являются глобальными или локальными:

  • Глобальные директивы влияют на всю компиляцию и должны отображаться перед объявлением части программы или скомпилированного устройства.
  • Локальные директивы влияют только на часть компиляции, которая простирается от директивы до следующего появления той же директивы. Они могут появляться где угодно.

Однако рассмотрите директиву DENYPACKAGEUNIT (внимание мое):

Директива <$DENYPACKAGEUNIT ON>предотвращает создание блока Delphi, из которого он помещается в пакет.

Если эта директива имеет единую область видимости, то она просто должна присутствовать в блоке, чтобы вступить в силу.

Таким образом, это может иметь значение, где размещена директива. Суть в том, что для каждой директивы вам необходимо знать ее область действия, и для этого вы должны обратиться к документации для этой директивы.

Обратите внимание, что вам нужно всего лишь установить директивы в коде, если вы хотите изменить настройки по сравнению с настройками проекта. Разумно установить параметры в параметрах проекта и не устанавливать их в коде.

То, что, по-видимому, произошло в представленном вами коде, заключается в том, что автор набрал CTRL+O O , а среда IDE вставила различные параметры, определенные в параметрах проекта в этот момент времени.

$O — Директива компилятора Delphi

Есть ли в Delphi 7 директива компилятору по обработке исключений, регулируемых в процессе отладки галочкой Stop on Delphi Exception?

справку по директивам компилятора почитать не ?


> справку по директивам компилятора почитать не ?

зачем читать если можно спросить и заниматься своими делами. Но у меня, честно говоря, просто не было времени выяснять. А вообще я за RTFM


> зачем читать если можно спросить и заниматься своими делами

разумный подход, черт побери.


> зачем читать если можно спросить и заниматься своими делами.

Если эту логику чуть дальше развернуть, то получится, что зачем вообще работать? На этом форуме спрошу как делать это, на другом — как другое, на третьем — третье. А сам буду на диване лежать и фапать в потолок.

Что-то я не понял о чем речь?
Какая связь между директивами компилятора и поведением отладчика?

> Ega23 (15.04.2010 00:01:04) [4]

Остался один не достаток, спрашивать надо, бот бы еще без этого.

вот вы любители пофлеймить, дай только причину )))
ладно, шучу. Мануал так и не читал, потому что нет времени пока.

Проблема в том что мне надо в процессе отладки какого то алгоритма, видеть экцепшены, а некая логика завязана на них, то есть если я включу их индикацию то я буду ловить в отладчике все исключения, и зря останавливаться на тех, которые я ловлю в секциях try except. Вернее я их все ловлю но, определённого типа исключения я ловлю в циклах, а других типов только единожды. Вот если бы как то включить одни типы, а выключить другие — было бы круто!


> Константин (17.04.10 13:10) [7]


> было бы круто!

все и так круто.. заходим в опции дельфи и там находим что-то типа
Debugger Options -> Language Exception

> Константин (17.04.2010 13:10:07) [7]

Мануал все таки читай. Времени для этого более чем достаточно, программировать пока не надо.

Список директив компилятора Delphi, нужно ли размещать директивы перед именем модуля?

я работаю над приложением, использующим Delphi 7 , и я только что столкнулся с этим

автор кода поместил так много директив компилятора перед именем основного модуля.

может кто-нибудь сказать мне

  1. Какая польза от наличия Директив перед именем единицы, это делает их глобальными?
  2. И можем ли мы создавать свои собственные директивы в некоторых конкретных ситуациях?
  3. где определены директивы компилятора?

2 ответа

  • Ключевая тема, объясняющая принципы, здесь: Директивы компилятора Delphi .
  • Директивы компилятора перечислены здесь: Директивы компилятора Delphi (список) .

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

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

Директивы Switch являются глобальными или локальными:

  • Глобальные директивы влияют на всю компиляцию и должны появляться перед объявлением части программы или компилируемого модуля.
  • Локальные директивы влияют только на ту часть компиляции, которая простирается от директивы до следующего появления той же директивы. Они могут появиться где угодно.

Однако рассмотрим директиву DENYPACKAGEUNIT (выделено мной):

Директива <$DENYPACKAGEUNIT ON>предотвращает помещение модуля Delphi, в котором он находится, в пакет.

Если эта директива имеет охват всей единицы, то она просто должна присутствовать в единице для вступления в силу.

Так что может иметь значение, где находится директива. Суть в том, что для каждой директивы вам необходимо знать ее область действия, и для этого вы должны обратиться к документации по этой директиве.

Обратите внимание, что вам нужно устанавливать директивы в коде, только если вы хотите изменить настройки, сделанные в настройках проекта. Вполне разумно устанавливать параметры в настройках проекта, а не устанавливать их в коде.

Похоже, что произошло в коде, который вы представляете, что автор набрал CTRL + O O, и среда IDE вставила различные параметры, определенные в настройках проекта в тот момент времени.

Директивы по версиям компилятора Delphi: <$ IFDEF VER180>— 2020

Подготовка к кодированию без барьеров. Узнайте, как преодолеть проблему с версией компилятора: компиляция кода Delphi для различных версий Delphi.

Если вы планируете писать код Delphi, который должен работать с несколькими версиями компилятора Delphi, вам необходимо знать, в каких версиях компилируется ваш код.

Предположим, вы пишете свой собственный (коммерческий) пользовательский компонент. Пользователи вашего компонента могут иметь разные версии Delphi, чем у вас.

Если они попытаются перекомпилировать код компонента (ваш код) — у них могут быть проблемы! Что если вы использовали параметры по умолчанию в ваших функциях, а у пользователя Delphi 3?

Директива компилятора: $ IfDef

Директивы компилятора — это специальные синтаксические комментарии, которые мы можем использовать для управления функциями компилятора Delphi. Компилятор Delphi имеет три типа директив: переключение директив, директивы параметров а также условные директивы, Условная компиляция позволяет нам выборочно компилировать части исходного кода в зависимости от того, какие условия установлены.

Директива компилятора $ IfDef запускает секцию условной компиляции.

Синтаксис выглядит так:

DefName представляет так называемый условный символ. Delphi определяет несколько стандартных условных символов. В приведенном выше «коде», если определено DefName, код выше $ Else компилируется.

Delphi Version Symbols

Распространенным применением директивы $ IfDef является тестирование версии компилятора Delphi.

В следующем списке указаны символы, которые необходимо проверить при условной компиляции для конкретной версии компилятора Delphi:

  • УСЛОВНОЕ ОБОЗНАЧЕНИЕ — Компиляционная версия
  • VER80 — Delphi 1
  • VER90 — Delphi 2
  • VER100 — Delphi 3
  • VER120 — Delphi 4
  • VER130 — Delphi 5
  • VER140 — Delphi 6
  • VER150 — Delphi 7
  • VER160 — Delphi 8
  • VER170 — Delphi 2005
  • VER180 — Delphi 2006
  • VER180 — Delphi 2007
  • VER185 — Delphi 2007
  • VER200 — Delphi 2009
  • VER210 — Delphi 2010
  • VER220 — Delphi XE
  • VER230 — Delphi XE2
  • WIN32 — Указывает, что операционной средой является Win32 API.
  • LINUX — Указывает, что операционной средой является Linux
  • MSWindows — Указывает, что операционной средой является MS Windows / li]
  • ПРИСТАВКА — Указывает, что приложение компилируется как консольное приложение.

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

Примечание: символ VER185, например, используется для обозначения компилятора Delphi 2007 или более ранней версии.

Использование символов «VER»

Обычно (и желательно) для каждой новой версии Delphi добавлять несколько новых подпрограмм RTL к языку.

Например, функция IncludeTrailingBackslash, представленная в Delphi 5, добавляет «» в конец строки, если ее там еще нет. В проекте Delphi MP3 я использовал эту функцию, и несколько читателей пожаловались, что не могут скомпилировать проект — у них есть какая-то версия Delphi до Delphi 5.

Одним из способов решения этой проблемы является создание собственной версии этой подпрограммы — функции AddLastBackSlash.

Если проект должен быть скомпилирован на Delphi 5, вызывается IncludeTrailingBackslash. Если используются некоторые из предыдущих версий Delphi, мы моделируем функцию IncludeTrailingBackslash.

Это может выглядеть примерно так:

функция AddLastBackSlash (ул: строка) : строка; начать Результат: = IncludeTrailingBackslash (str); если Copy (str, Length (str), 1) = «» затем Результат: = ул еще Результат: = str + «»; конец;

При вызове функции AddLastBackSlash Delphi выясняет, какая часть функции должна использоваться, а другая часть просто пропускается.

Delphi 2008?

Delphi 2007 использует VER180 для обеспечения неразрывной совместимости с Delphi 2006, а затем добавляет VER185 для разработки, которая по каким-либо причинам должна быть нацелена на Delphi 2007.

Примечание. Каждый раз, когда интерфейс модуля изменяет код, использующий этот модуль, его необходимо перекомпилировать.Delphi 2007 — выпуск без прерываний, означающий, что файлы DCU из Delphi 2006 будут работать как есть.

Директивы Компилятора-Версии Delphi

у меня есть единица, которую я написал в Delphi 7 некоторое время назад, и только что получил удовольствие (боль) от преобразования в Delphi XE (Unicode).

устройство отлично работает после некоторых проблем, теперь я пытаюсь сделать это устройство совместимым с различными версиями Delphi, если мне когда-либо понадобится переключить IDE обратно на Delphi 7 при обновлении другого кода.

У меня есть только Delphi 7 и Delphi XE, но из того, что я собираю код, написанный на Delphi 1 в Delphi 2007, будет компилироваться, но код из Delphi 2009 и выше будет Unicode.

. Во всяком случае, в блоке я разделяю не-unicode и unicode следующим образом:

Как изменить директиву компилятора, чтобы правила применялись к нескольким версиям? Например что-то вроде:

это будет охватывать все версии Delphi, если я распространю источник или .блок УЗК.

2 ответов

интересно, Самый простой подход в этом случае-переключить поведение на UNICODE условное. Это условие определяется тогда и только тогда, когда вы используете версию Delphi в Юникоде, т. е. в Delphi 2009 и более поздних версиях. Большим преимуществом этого является то, что это будущее-вам не нужно обновлять код каждый раз, когда выходит новый Делфи. Более того, условный переключатель будет гораздо более читаемым, поскольку он будет четко выражать намерение.

Delphi документация имеет отличный темы список всех предопределенных условий. Полный список условий версии также связан оттуда.

$Align — директива компилятора

Posted by key under Delphi

Определяет, были ли данные выровнены или упакованы

Описание:

С $Align On (по умолчанию), сложные типы данных, такие как записи, хранят свои элементы, выровненные по 2, 4 или 8-байтовой границе, соответственно типу данных. Например, поле типа Word будет выровнено по 4-байтовой границе.

С $Align On, значением по умолчанию, вы можете перекрыть эти настройки с помощью опции packed для сложных типов данных.

Выравнивание обеспечивает оптимальную скорость доступа.

$Align Off указывает Delphi игнорировать выравнивание, и таким образом пакует данные.

Пример кода:

// Declare a packed record
TPackedRecord = Packed Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
end;

// Set alignment off

// Declare an unpacked record
// This will get treated as if packed was on
TUnPackedRecord = Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
end;

var
alignedRec : TAlignedRecord;
packedRec : TPackedRecord;
unPackedRec : TUnPackedRecord;

begin
ShowMessage(‘Aligned record size = ‘+IntToStr(SizeOf(alignedRec)));
ShowMessage(‘Packed record size = ‘+IntToStr(SizeOf(packedRec)));
ShowMessage(‘UnPacked record size = ‘+IntToStr(SizeOf(unPackedRec)));
end;

Условная компиляция в Delphi

Условная компиляция в Delphi, по сути, очень полезная и удобная возможность, которая позволяет Delphi компилировать или не компилировать код в зависимости от определенных символов условной компиляции. Говоря более простым языком (возможно и не совсем корректно), условная компиляция позволяет убрать или, наоборот, добавить часть кода исполняемого файла. Так или иначе, любой Delphi разработчик встречается с символами условной компиляции как минимум один раз за время работы над проектом.

Далее я рассмотрю различные примеры использования условной компиляции, которые могут Вам пригодиться в дальнейшей работе.

Для начала, рассмотрим очень простой код, который вы можете повторить в Delphi за несколько секунд:

Теперь нажмите F9 и проверьте, что написано в отладчике в «Events»:

Разберемся с тем, что мы только что написали.

$IFDEF — это директива компилятора;

DEBUG — условное определение или символ условной компиляции. Символ обязательно должен начинаться с буквы за которой может следовать любое количество букв, цифр и знаков подчеркивания, однако использоваться будут лишь первые 255 символов.

Процедура отправляет строку в отладчик для отображения.

Завершает условную компиляцию, инициированную последней директивой <$IFxxx>(почему не <$IFDEF>— смотрим далее).

Таким образом, используя директивы и мы указали компилятору дословно следующее: если где-либо по ходу компиляции был встречено условное определение DEBUG, то надо выполнить OutputDebugString.

Где определено условное определение DEBUG? Конкретно в этом случае, символ DEBUG можно найти, если зайти в настройки проекта: Project -> Options ->Delphi Compiler :

Здесь же можно определить и свои собственные символы. Давайте, например, добавим свой символ условной компиляции TEST. Для этого открываем диалоговое окно редактирования символов условной компиляции (жмем кнопку «…» в строке «Conditional defines») и заносим наш символ в список:

Теперь изменим наш код, приведенный в начале статьи, чтобы он работал с нашим символом условной компиляции:

Теперь можете снова запустить приложения в режиме отладки и посмотреть, что в Events появится строка «TEST IS ON».

Сейчас мы с вами рассмотрели самый простой способ использования условной компиляции в Delphi — использование директив и , а также определение собственного символа условной компиляции через свойства проекта. Вместе с этим, определить (включить) свой символ условной компиляции можно и в коде программы. Для этого используется директива компилятора . Воспользуемся этой директивой:

Соответственно, если есть директива определения нового символа, то должна быть и директива, которая отключает символы условной компиляции — она называется . Можете написать, например, вот такой код:

и убедиться, что символ DEBUG выключен, а в окне Events не появится строка «debug is on».

Двигаемся далее. Что делать, если нам необходимо вывести строку не когда символ включен, а именно тогда, когда он выключен? Здесь, опять же, есть варианты. Короткий вариант — воспользоваться директивой противоположной — она называется и код между и выполняется, если символ выключен:

Второй вариант — использование директивы , если в зависимости от состояния символа условной компиляции вам надо выполнять различные участки кода:

Соответственно, нет необходимости далее повторять этот же участок кода с использованием — работать будет, но прямо противоположно.

Также следует обратить внимание на то, что все условные символы оцениваются в Delphi, когда вы выполняете Build проекта. Справка Delphi рекомендует для надежности пользоваться командой Project -> Build All Projects, чтобы быть уверенным, что все символы условной компиляции определены верно.

В Delphi также определен набор символов условной компиляции, которые вы можете использовать при работе над своим проектом.

Например, символ условной компиляции VER330 определен для Delphi 10.3 Rio и с его помощью можно определить какой код должен или не должен выполняться, в случае, если версия компилятора Delphi — 33. Например, воспользуемся фичей Delphi 10.3 Rio под названием Inline Variable Declaration:

Сразу может возникнуть вопрос: как сделать так, чтобы приведенный выше код сработал не только в Delphi 10.3 Rio, но и в последующих версиях?
Это можно сделать воспользовавшись, например, такой конструкцией:

Здесь мы уже воспользовались директивой с помощью которой проверили значение константы CompilerVersion, которая находится в модуле System.

Здесь же стоит обратить внимание и на окончание блока — мы использовали директиву , как того требовала Delphi до версии Delphi XE4:

  • для директивы $IFDEF должна быть определена директива $ENDIF
  • для директивы $IF должна быть определена директива $IFEND

В XE4 нам разрешили использовать для закрытия блоков <$IF>, и . Однако, если у вас возникают проблемы при использовании связки и , то вы можете использовать специальную директиву , чтобы потребовать использовать для именно <$IFEND>:

Теперь, если в коде выше использовать директиву $ENDIF, то получим сообщение об ошибке:

Директиву , кстати, можно использовать и с другими константами проекта, например, так:

Так как наша константа Version содержит значение 2, то выполнится участок кода расположенный после . Можете сменить значение константы Version на 1, чтобы убедиться, что выполнится участок кода, где определена переменная s.

Как я сказал выше, в Delphi есть целый набор предопределенных символов условной компиляции. Ознакомиться со всеми этими символами вы можете на этой странице справки по Delphi.

  1. Использование условной компиляции позволяет нам выполнять тот или иной код, в зависимости от того, какие константы и символы условной компиляции определены или не определены в проекте.
  2. Используя предопредленные символы условной компиляции можно указывать Delphi какой код необходимо выполнить, например, если программа собирается под Android, или, если поддерживается архитектура x64 и т.д.
  3. Директива $IF может использоваться с различными константами, в том числе и определенными самим разработчиком.

При подготовке статьи использовалась следующая информация официальной справки по Delphi:

Вопрос по warnings, delphi &#8211 Идентификаторы для директивы компилятора $ WARN Delphi

Delphi имеет директиву компилятора $ WARN, которая позволяет выборочно включать или отключать определенные предупреждения. Файл справки Delphi 2009 описывает синтаксис:

Но это только перечисляет идентификаторы для 6 предупреждений.

Я хотел бы иметь полный список всех идентификаторов предупреждений. В частности, я хочу знать идентификаторы для неявных предупреждений о приведении строк W1057 и W1058 в Delphi 2009.

Мне удалось угадать один для неявных приведений Ansi-> Unicode (W1057):

Погуглив для этого нашел меня другой:

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

что DCCStrs.pas перечисляет идентификаторы, используемые компилятором Delphi. Мне не пришло в голову искать источник, поскольку Delphi не включает источник в свой компилятор.

Я извлек идентификаторы для подсказок и предупреждений из этого файла:

осматривая код, кажется, что все константы предупреждения компилятора перечислены в: CodeGear \ RAD Studio \ 6.0 \ sources \ toolsapi \ DCCStrs.pas

Ищите «Implicit_String_Cast_Loss», и вы увидите константу sIMPLICIT_STRING_CAST_LOSS = ‘DCC_IMPLICIT_STRING_CAST_LOSS’;

Я бы предположил, что остальные строки DCC_xxx с соответствующими определениями X_true / _false / _error — это то, что вам нужно.

Онлайн-помощь не очень хороша с Delphi 7.

На сегодняшний день полный список идентификаторов и их номеров предупреждений компилятора перечислены в документации по адресу:

Выдержка:

Идентификатор в директиве $ WARN может иметь любое из следующих значений:

Директива $ WARN теперь имеет третью опцию ERROR в дополнение к ON и OFF. Таким образом, вы можете иметь:

Компилятор в Delphi

Рассмотрим режим работы компилятора, который задается в окне страницы Compiler диалогового окна опций Project Options.

Code generation (директивы компиляции кода)

Директива

Описание

alignment

Индикатор Компиляция с оптимизацией.
Заставляет компилятор генерироватьстек для всех процедур и функций.
Генерирует код, проверяющийналичие ошибок деления,

свойственным ранним версиям

Pentium.

Выравнивание элементов структурпо границам заданного числа битов

1 – вкл, 8 – выкл директиве

Runtime errors (директивы ошибок времени исполнения)

Директива

Описание

Checking

Индикатор Проверка допустимых значенийИндексов массивов и строк.
Проверка ошибок ввода/выводапосле каждой операции

ввода/вывода.

Проверка переполнения прицелочисленных операциях.

Syntax options (директивы синтаксиса)

Директива

Описание

Var-Strings

Boolean Eval

Syntax

Operator

Parameters

Typed Constans

Индикатор Проверка параметров типа строк;если установлен Open Parameters,

то данная опция не действует.

Вычисление всех элементовбулева выражения.
Использование функций как процедур
Проверка типа оператора,возвращаемого операцией @
Разрешение параметров процедур ифункций в виде открытых строк.
Сборка мусора строк. При включенномString эквивалентен AnsiString, при

выключенном – ShortString.

Разрешение присваиваниятипизированным константам.

Debugging (директивы отладки)

Директива

Описание

Information

Symbols

Индикатор Размещение отладочной информации вв объектных файлах модулей .dcu
Генерация информации о локальныхсимволах.
Генерация информации о ссылкахна объявления идентификаторов,

необходимой для работы

Code Browsr.

Включает в код директивы проверкиутверждений.
Разрешает использовать отладочнуюинформацию компонентов VCL.

Индикатор Default устанавливает выбранный набор опций как набор по умолчанию для следующих проектов.

. компилятор Delphi Delphi Compiler w компилятор delphi делфи компилятор

Список директив компилятора Delphi, нужно ли размещать директивы перед именем модуля?

я работаю над приложением, использующим Delphi 7 , и я только что столкнулся с этим

автор кода поместил так много директив компилятора перед именем основного модуля.

может кто-нибудь сказать мне

  1. Какая польза от наличия Директив перед именем единицы, это делает их глобальными?
  2. И можем ли мы создавать свои собственные директивы в некоторых конкретных ситуациях?
  3. где определены директивы компилятора?

2 ответа

  • Ключевая тема, объясняющая принципы, здесь: Директивы компилятора Delphi .
  • Директивы компилятора перечислены здесь: Директивы компилятора Delphi (список) .

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

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

Директивы Switch являются глобальными или локальными:

  • Глобальные директивы влияют на всю компиляцию и должны появляться перед объявлением части программы или компилируемого модуля.
  • Локальные директивы влияют только на ту часть компиляции, которая простирается от директивы до следующего появления той же директивы. Они могут появиться где угодно.

Однако рассмотрим директиву DENYPACKAGEUNIT (выделено мной):

Директива <$DENYPACKAGEUNIT ON>предотвращает помещение модуля Delphi, в котором он находится, в пакет.

Если эта директива имеет охват всей единицы, то она просто должна присутствовать в единице для вступления в силу.

Так что может иметь значение, где находится директива. Суть в том, что для каждой директивы вам необходимо знать ее область действия, и для этого вы должны обратиться к документации по этой директиве.

Обратите внимание, что вам нужно устанавливать директивы в коде, только если вы хотите изменить настройки, сделанные в настройках проекта. Вполне разумно устанавливать параметры в настройках проекта, а не устанавливать их в коде.

Похоже, что произошло в коде, который вы представляете, что автор набрал CTRL + O O, и среда IDE вставила различные параметры, определенные в настройках проекта в тот момент времени.

Илон Маск рекомендует:  ReplaceDate - Процедура Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL