Всегда ли неявный импорт - это плохо в пакетах Delphi?

Пытаясь переставить мои пакеты для набора компонентов-потомков TFrame, я считаю необходимым выделить некоторые из моих потомков утилиты TFrame отдельно от диалоговых форм, которые их используют, в основном потому, что первые зарегистрированы в палитре как настоящие компоненты, и это, кажется, иногда сбивает среду IDE с точки зрения диалоговых форм, которые их используют. Диалоговые формы, в свою очередь, вызываются невизуальными компонентами, которые являются частью третьего пакета. Это, пока, похоже, делает большую часть жалобы, связанные с зависимостями, / путаница исчезают. (Однако я еще не выхожу из игры).

При компиляции пакета с диалоговыми формами (которые вызывают кадры) я получаю предупреждение «Модуль 'MyFrames' неявно импортирован в пакет 'MyDialogForms'»

Учитывая, что это отображается как предупреждение компилятора, у меня давно сложилось впечатление, что «неявный импорт» модуля, как правило, не очень хорошо. Есть ли конкретные случаи, когда это не так? т.е. где неявный импорт модуля - это нормально, и / или подходящая практика? ... и если да, то каковы эти конкретные случаи?


person Jamo    schedule 01.08.2009    source источник


Ответы (2)


Вот в чем проблема:

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

Код каждого компилируемого модуля должен быть в пакете. Компилятор начнет работу со всеми модулями, которые вы объявите в разделе содержит, но любые другие модули, используемые этими модулями, также должны быть скомпилированы, чтобы они были доступны, если только эти модули не содержатся в другом пакете. который указан в разделе требуется. Эти дополнения являются «импортированными неявно» единицами. Проблема в том, что они импортированы неявно, а не явно указаны в разделе содержит, где они будут удобно отображаться в диспетчере проектов справа. Это означает, что вы можете не заметить, что ваше устройство находится в пакете, и в конечном итоге положить его в другой. Затем, когда вы пытаетесь запустить свою программу и загрузить пакеты, все ломается. Поэтому компилятор и предупреждает вас об этом.

Это предупреждение, а не ошибка по какой-то причине. Пока вы понимаете, как работает система, использование неявного импорта технически безопасно. Просто помните, что эти единицы попадают в пакет вне зависимости от того, объявляете вы их или нет. Но опять же, поскольку они попадают туда независимо от того, объявляете вы их или нет, вероятно, проще просто официально добавить их и избавить себя от хлопот.

person Mason Wheeler    schedule 01.08.2009
comment
(обратите внимание, что в пакете не означает в BPL. См. $ weakpackageunit;) - person Marco van de Voort; 01.08.2009
comment
Мейсон - СПАСИБО! Это наиболее убедительный и лаконичный концептуальный обзор, который я читал с тех пор, как начались мои саги о пакетах. - person Jamo; 03.08.2009
comment
Как Delphi обрабатывает повторяющиеся ссылки на базовые модули, такие как SysUtils, Forms и т. Д., В пакетах? Похоже, это вызовет ту же проблему. - person Jamo; 03.08.2009
comment
Поместив их в их собственные пакеты (такие как vcl и rtl), и тогда ваш пакет потребует их. - person Mason Wheeler; 03.08.2009
comment
К - в этом есть смысл. Я все еще бегаю по кругу с изобилием непостижимых ошибок (только сейчас ошибка снова открывает проблему ____. Drf), но ваше объяснение здесь очень полезно. Еще раз спасибо. - person Jamo; 04.08.2009
comment
Маон, я наконец решил эту проблему, в основном благодаря вашей вступительной фразе. У вас может быть только одна копия модуля в вашей программе, диаграмма моих отношений класса / модуля / пакета и поиск всех неявно импортированных предупреждение. СПАСИБО за советы и концептуальные объяснения здесь. Я определенно пометил ваш ответ как принятый. : ) Еще раз спасибо! - person Jamo; 16.09.2009
comment
У меня была эта проблема, когда путь поиска указывал на отсутствующий блок. Исправлена ​​ошибка, добавив пакет, содержащий модуль, в раздел необходимых пакетов, который выдавал мне предупреждение о неявно импортированном модуле. - person mcdon; 06.06.2016

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

Я считаю, что лучший способ - это иметь папку для каждого пакета, и эта папка содержит все файлы для пакета. Если я вижу предупреждение «неявный импорт», я либо добавляю требуемый пакет, либо добавляю модуль в пакет. Таким образом, все блоки указаны в пакете, который их содержит, и все они находятся в одной папке. Я никогда не добавляю папки в путь поиска, потому что каждый проект знает обо всех своих файлах напрямую.

Структуру действительно не так уж сложно поддерживать, и она защищает вас от проблем, когда разные модули содержат разные версии файла.

person Cobus Kruger    schedule 01.08.2009
comment
Это звучит как серьезная рекомендация - я могу попробовать! Спасибо за ответ, Кобус. Очень признателен. - person Jamo; 03.08.2009