Технологии модульного програмирования
В настоящий момент я встретил некоторую проблему с использованием модулей большой вложенности. Связано это с тем, что по какой то причине компилятор запрещает мне ссылать на исходники моих модулей в интерфейсной части другова модуля.
На сколько я понял, ему нужно, что модуль объявляемый в интерфейсной части был уже откомпилирован и находился в каталоге остальных стандартных модулей. Это крайне неудобно.
К примеру, я пишу в отдельном модуле класс динамического списка (массив списочной стрктуры), но для универсальности я не хочу определять тип элементов этого массива в том же модуле, а хочу сослаться на другой модуль, который будет присутствовать в каждом моем приложении и при том в каждом уникален-в нем будут описываться типы данных используемые мною во всем приложении.
Я думаю вы согласитесь со мной, что объявлять выражением uses модуль с типами в модуле с классом массива-списка нужно в интерфейсной части, куда же еще?
Ан нет.
Variant'ы не предлагать. Меня на данный момент интересуют только модули. Технология модульного программирования играют очень большую роль в нашем нелегком деле и я хочу знать о ней все.
Заранее благодарен.
может у тебя просто циклический uses?..... чё компилятор-то говорит?
[Fatal error] ListUnit_v1_1.pas(5) File not found 'DateTypes.dcu'
"
unit ListUnit_v1_1;
interface
Uses DateTypes in 'C:\Program Files\Borland\Delphi7\Projects\MyUnits\DateTypes.pas'
const
EXPOSURE=2;
Type
TListInfo = cardinal;
...
"
Большей глупости быть не может.
Не надо вообще пути указывать, а если и указывать, то только относительные. Кроме того посмотри в свойствах проекта - там можно указать директории в которых компилер будет искать модули и куда будет сохранять объектные файлы.
Я например сохраняю все модули проекта в папке sources а компилированные dcu или dcil сохраняю в папку obj - очень полезно. И не засоряешь папки разыми файлами.
Во-вторых абсолютный путь я вклеил на скоруую руку чтоб в пост закинуть и я не вижу причины почему его нельзя использовать?-это в третьих.
Обычно указываю относительный НО ТОЛЬКО ДЛЯ КРАТКОСТИ! Не имел понятия о их разнице.
Чем относительный путь отличается от абсолютного принципиально?
Вообще удивительно, ты так говоришь, будто принципиальную разницу между абсолютным и относительным путем знают все и о ней трубят на каждом заголовке форумов и в каждой книге. Я лично еще не разу не встречал.
Расскажи побольше о компилированых и некомпилированых модулях.
Точнее о разнице в приподнесении их компилятору.
PS Настройки нашел, спасибо.
Если ты возмёшь свои исходники и попробуешь скомпилировать на моей машине - у тебя ничего не выйдет. У меня нет диска C: и все пути начинаются с G: Кроме того, если ты на своей машине переместишь каталоги, то опятьже не всегда ведь у тебя файло там будет лежать?
Решение - использование относительных путей. Относительными они называются потому как отсчитываются от каталога, в котором лежит файл проекта.
Ещё один минус. Использование конструкции вида
Код:
uses MyUnit in '.\sources\MyUnit.pas';
нежелательно тем, что Делфи таким образом помечает модули, которые являются ЧАСТЬЮ проекта - они будут отображаться в дереве проекта в ProjectManager.
Чтобы сказать компилятору, где искать требуемые модули нужно открыть Project -> Options -> Directories/Conditionals -> Search Path
В этом поле можно написать пути (разделённые точкой с запятой ; без кавычек) по которым компилер будет искать модули,если они не окажутся в папке с проектом.
Если ты возмёшь свои исходники и попробуешь скомпилировать на моей машине - у тебя ничего не выйдет. У меня нет диска C: и все пути начинаются с G: Кроме того, если ты на своей машине переместишь каталоги, то опятьже не всегда ведь у тебя файло там будет лежать?
Решение - использование относительных путей. Относительными они называются потому как отсчитываются от каталога, в котором лежит файл проекта.
[/QUOTE]
-Для меня бесполезная информация. Все это я знал. Я имел в виду разницу относительного и абсолютного путей для компилятора. Ты в прошлом посте так раскретиковал мое использование абс. бути, что я аш решил, что в этом и ключ всех моих неприятностей с компилером. Теперь я вижу что компилятору все едино. Обычно я использую именно относительный путь, а то, что я на своем посте выложил скопировано на скорую руку из файлового мэнэджера.
Про выражение Uses с указанием пути остались неясности. Ну стал модуль частью проекта и отображаться будет в ProjectManager. Что из этого следует?
Становления модуля частью проекта можно достигнуть так же Shift+F11, не так ли? Я знаю, что после этого добавленный модуль можно выбрать для использования другим модулем (в исполняемой части) из списка "File-Uses->unit..." (Alt+F11), но в чем логика-не ясно. Я ведь могу и напрямую в модуле воткнуть выражение юзес на любой модуль и без "добавленя его в проект".
Иначе говоря, общая картина механизма а так же логика его использования для меня совершенно расплывчата и я не могу задать корректно вопрос.
Расскажи побольше, пожалуйста.
А так же про разницу компилированых и не компилированых модулей, о чем спрашивал в прошлом посте.
Для начала, зачем мне вообще использовать и ссылаться на компилированые модули? Ну в смысле, я знаю, что при отлаживании пошагово, процедуры описаные в компилированом модуле пропускаются как одно целое действие, а не рассматриваются как набор действий, если ты меня понимаешь. Но в чем разница, которая могла бы изменить мое отношение к компилированым и некомпилированым модулям?
Код:
Uses DateTypes in 'C:\Program Files\Borland\Delphi7\Projects\MyUnits\DateTypes.p as'
-------------------------
а теперь по части ошибки......
File not found 'DateTypes.dcu'
подобные ошибки компилер выдаёт когда не может найти модуль (pas/dcu).... ему впинципе наплевать, чё ты ему даш.... если pas ему дашь - один фиг при компиляции он его в dcu скомпилит..... ))
по части путей....
если ты указываешь абс путь..... и файла там не оказалось - fatal error... и потом пути можно прописывать для юнитов только в dpr если мне память не изменяет.... для pas используются только имена модулей....
как компилер ищет модули
для начала эта умная штука просматривает пути проекта (папку проекта, Project options-Search path).... потом свои пути (Environment options-Library path, Browsing path)... если не находит - Fatal error
Значит нет смысла хранить компилированые модули, тем более весят они побольше, чем исходник, а за скорость компиляции и угрозу переделки моего модуля левым лицом я тоже не переживаю.
"если ты указываешь абс путь..... и файла там не оказалось - fatal error"-файл был, поверь на слово, а вот то, что путь нльзя писать в pas-файлах -- новость, но логика не ясна. Тогда как это относится как ""File->Uses unit..." (Alt+F11)" о которой я писал в прошлом посте?
Свой прошлый пост по прежнему не считаю вполне отвеченым.
ЗЫ: Ты заходишь в форум в пять утра? Ты сумасшедший!
модуль + путь добавляются в dpr файл.... эта тема по большей части относится к файлам проекта (формам и модулям, которые относятся исключительно к данному проекту)..... если ты добавишь сюда (в dpr...) модули + путь, где они лежат, тогда этот путь совершенно не обязательно добавлять в BrowsePath.... то есть если ты явно указал где модуль находица - компилятор его оттуда и возьмёт (при указании имени модуля в остальных файлх проекта)....
>файл был, поверь на слово
возможно прав не хватает или мож скрытый или ещё чего... попробуй этот файл запихнуть в папку с проектом..... если найдёт - глюк с указанием пути, если не найдёт - проблемы с доступом к файлу....
ps: это для тебя 5 утра..... :)