|
|
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
Приветствую, коллеги! Столкнулся с такой проблемой: Delphi 10.2 частенько начинает редекларировать уже задекларированные модули, если у декларированного модуля используются директивы компилятора $IF, $IFDEF, $IFNDEF. При том происходит это не во всех проектах, только в каких-то довольно "тяжёлых", которые компилируются под разными версиями Делфы. Зато с завидной регулярностью. Что-то типа вот так: Код: pascal 1. 2. 3. 4. 5. 6. System.ImageList автоматически добавляется Delphi 10, но в XE2, под которым проект также собирается, его нет. После сохранения кода в Delphi 10 с присутствующим под директивой компилятора System.ImageList, он всё равно добавляется повторно и при сборке DCC выбаёт ошибку. Вопрос: с чем это может быть связано и как это обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 15:15 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
попробуй в "два этажа" Код: pascal 1. 2. 3. 4. 5. 1-й шаг можно вообще в отдельный inc-файл вынести и его подключать ко всем юнитам. Так, кажется, VirtualTreeView делает. Впрочем, это библитека и там никакой "формы" нет. М.б. если бы была форма - то тоже добавлялся бы. P.S. ещё можно попробовать для XE2 сделать специально пустой модуль-заглушку System.ImageList ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 15:57 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
Arioch , спасибо за идеи. Сделать в "два этажа" я пробовал (собственно потому $IFDEF, $IFNDEF и упомянул) - не получилось. Делать заглушки для юнитов для ХЕ2... Что ж, может этот хак и придётся применять. Правда, там не только System.ImageList, а куча всего разного, но это лучше, чем страдать. Хотя если кто-то подскажет более красивое решение - будет здорово. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 16:37 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
1) разрабатывать и собирать в одной версии среды? 2) использовать системы контроля версия (git, mercurial, etc) ? 3) использовать препроцессоры в XE2, чтобы перед сборкой строку "System.ImageList," меняли на "" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 17:12 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
--= Eagle =-- Код: pascal 1. а что это такое, и давно ли оно появилось ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 17:13 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
Arioch...можно вообще в отдельный inc-файл вынести и его подключать ко всем юнитам. Так, кажется, VirtualTreeView делает... Не, там include не в секциях uses. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 17:24 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
--= Eagle =--Столкнулся с такой проблемой: Delphi 10.2 частенько начинает редекларировать уже задекларированные модули, если у декларированного модуля используются директивы компилятора $IF, $IFDEF, $IFNDEF.Если редекларирует модуль ImageList, значит у вас на форме лежит компонент TImageList. Как вы собрались компилировать проект не указав в uses (скрыв IFDEF'ом) модуль ImageList? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 17:35 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
Arioch1) разрабатывать и собирать в одной версии среды?Если бы так и было, разве у меня возникла бы эта проблема? Arioch2) использовать системы контроля версия (git, mercurial, etc) ?Уже используется, вот только при чём тут он? Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2 и DX только из-за того, что в DX нужно несколько несуществующих в ХЕ2 модулей в uses добавить? Arioch3) использовать препроцессоры в XE2, чтобы перед сборкой строку "System.ImageList," меняли на "" ?Это, конечно, вариант, но где-то на том же уровне, что и хак с пустыми юнитами для ХЕ2 Ariochа что это такое, и давно ли оно появилось ? JvMultiConf это мой пакет расширения функционала для JvFormStorage _Vasilisk_[Если редекларирует модуль ImageList, значит у вас на форме лежит компонент TImageList. Как вы собрались компилировать проект не указав в uses (скрыв IFDEF'ом) модуль ImageList?Есть такое дело, лежит ImageList. Только вот в ХЕ2 для работы ImageList достаточно наличия одного только Vcl.ImgList, а вот в DX теперь ещё и System.ImageList требуется, и добавляется он туда автоматически при сохранении проекта. А самая большая проблема, что директивы компилятора при этом напрочь игнорируются и проблема всплывает только на этапе компилирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 18:55 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
--= Eagle =--, А если сделать вообще два блока uses - первый для XE, второй для 10ки?.. И уже их обернуть в IFDEF, причём так, чтобы IFDEFы были на отдельных строчках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 19:05 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
alekcvpА если сделать вообще два блока uses - первый для XE, второй для 10ки?.. И уже их обернуть в IFDEF, причём так, чтобы IFDEFы были на отдельных строчках?Супер! Вот это сработало! При том есть нюанс: код всегда хочет добавляться в последний из USES-ов, так что для правильной работы пришлось сделать вот так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. в противном случае {$if CompilerVersion >= 30} всё равно дописывает System.ImageList во вторую секцию. Да, если само ключевое слово uses не помещать в директиву - ситуация повторится как в самом начале, после всех директив компилятора будут редекларирован(ы) юнит(ы) Delphi 10. Итого - вопрос решён, всем спасибо за участие, отдельное большое спасибо alekcvp ! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 19:31 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
--= Eagle =--Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2 а что такое "распараллелить" ? вообще это называется "ветка разработки". и вполне нормально иметь несколько веток. ветка для сборки релиза, ветка для сборки отладочной внутренней версии, ветка с защитой и ветка без защиты и т.д. И для XE2 можно иметь отдельную ветку, ну или наоборот, для 10.3. --= Eagle =--что и хак с пустыми юнитами для ХЕ2 Кстати, и этот хак тоже прекрасно ложится именно на СКВ. В 10.3-ветке этих файлов просто нет вообще. А в XE2-ветке она есть. Удачная модель ветвления для Git / Хабр - Habr https://habr.com/ru/post/106912/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 19:48 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
Кстати, в Delphi 2006/2007 у TFrame были совйства ClientHeight/Width и PixelPerInch, как у TForm При попытке одни и те же формы с фреймами в одной и той же папке исходников разрабатывать одновременно в D2006 и DXE2 - обеспечены постоянные ошибки "таких свойств не бывает" и массовые изменения в DFM-файлах после каждого переключения на другую среду. Ну и соответвенно "шум в изменениях" в СКВ. Так что - либо ветки, либо препроцессоры, которые зачищают все несовместимости всех версий, в PAS и DFM, перед каждым коммитом/релизом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2019, 19:58 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
--= Eagle =--Уже используется, вот только при чём тут он? Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2 и DX только из-за того, что в DX нужно несколько несуществующих в ХЕ2 модулей в uses добавить? Все проще - не коммитить эти левые добавления в uses. Я так спасаюсь, когда среда корежит весь uses в файле проекта. Как дополнительное решение - pre-commit хук на сборку проекта, чтобы давала отлуп при несобираемом коде. --= Eagle =--Это, конечно, вариант, но где-то на том же уровне, что и хак с пустыми юнитами для ХЕ2 Нормальное решение. Главное - что в репо всё будет чисто. Что ж поделать, если среда самовольничает и до сих пор (аж со времен D7!) не умеет работать с $if в режиме кода. Еще вариант - не пихать imagelist как компонент, а создавать в рантайме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2019, 13:38 |
|
||
|
Делфи редекларирует модули в uses
|
|||
|---|---|---|---|
|
#18+
Василий 2, Есть ещё вариант - создать и установить в среду СВОЙ СОБСТВЕННЫЙ TImgList который будет отличаться от стандартного только тем, что ты его в СВОЁМ собственном модуле объявил и в среде зарегистрировал. А уже этот свой прокси-модуль будет USES что надо. --------- Кстати, а разве в JediVCL нет клона ImgList со своими свистоперделками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2019, 16:25 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39782032&tid=2039728]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
193ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 539ms |

| 0 / 0 |
