Имплицитно импортираните винаги ли са нещо лошо в Delphi пакетите?

Опитвайки се да пренаредя пакетите си за набор от TFrame-descendent компоненти, смятам, че е необходимо да разбийте някои от моите наследници на помощната програма TFrame отделно от диалоговите форми, които ги използват, главно защото първите са регистрирани в палитрата като истински компоненти и това изглежда понякога обърква IDE по отношение на диалоговите форми, които ги използват. Диалоговите форми от своя страна се извикват от невизуални компоненти, които са част от трети пакет. Това, засега, изглежда прави по-голямата част от оплакванията, свързани със зависимостта / объркванията изчезват. (все още не съм излязъл обаче).

Когато компилирам пакета с диалоговите форми (които извикват Frames), получавам предупреждение „Единица „MyFrames“ имплицитно импортирана в пакет „MyDialogForms““

Като се има предвид, че се показва като предупреждение на компилатора, отдавна съм останал с впечатлението, че "имплицитно импортиране" на единица като цяло не е добро нещо. Има ли конкретни случаи, когато това не е така? т.е. когато имплицитното импортиране на единица е ОК и/или подходяща практика?... и ако е така, какви са тези конкретни случаи?


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


Отговори (2)


Ето какъв е проблемът:

Можете да имате само едно копие на единица във вашата програма. Ако се опитате да заредите една и съща единица два пъти чрез пакети, това ще предизвика изключение и пакетът няма да се зареди втория път. Начинът да избегнете това е да структурирате вашите пакети така, че нито една единица да не се използва в повече от един от тях.

Кодът на всяка единица, която компилирате, трябва да бъде в пакета. Компилаторът ще започне с всички единици, които декларирате в секцията contains, но всички други единици, използвани от тези единици, също трябва да бъдат компилирани, за да бъдат достъпни, освен ако тези единици не се съдържат в друг пакет който е посочен под изисквания. Тези екстри са "имплицитно внесените" единици. Проблемът е, че те се импортират имплицитно, а не изрично посочени в секцията съдържа, където удобно ще се показват в мениджъра на проекти вдясно. Това означава, че може да не забележите, че вашето устройство е в пакет и в крайна сметка да го поставите в друг. След това, когато се опитате да стартирате програмата си и да заредите пакетите, нещата се повреждат. Ето защо компилаторът ви предупреждава за това.

Това е предупреждение, а не грешка, с причина. Докато разбирате как работи системата, технически е безопасно да използвате имплицитно импортиране. Само не забравяйте, че тези единици завършват в пакета, независимо дали ги декларирате или не. Но след това отново, тъй като те свършват там, независимо дали ги декларирате или не, вероятно е по-лесно просто да ги добавите официално и да си спестите неприятностите.

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
K - това има смисъл. Все още се въртя в кръг с изобилие от неразгадаеми грешки (току-що отново проблемът с грешка при отваряне на ____.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