Является ли «неявно импортированный» всегда плохо в пакетах Delphi? - PullRequest
19 голосов
/ 01 августа 2009

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

При компиляции пакета с диалоговыми формами (которые вызывают Frames), я получаю предупреждение "Единица 'MyFrames', неявно импортированная в пакет 'MyDialogForms'"

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

Ответы [ 2 ]

30 голосов
/ 01 августа 2009

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

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

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

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

10 голосов
/ 01 августа 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...