Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Делфи редекларирует модули в uses  [new]
--= Eagle =--
Member

Откуда: Житомир, Украина
Сообщений: 18
Приветствую, коллеги!

Столкнулся с такой проблемой: Delphi 10.2 частенько начинает редекларировать уже задекларированные модули, если у декларированного модуля используются директивы компилятора $IF, $IFDEF, $IFNDEF. При том происходит это не во всех проектах, только в каких-то довольно "тяжёлых", которые компилируются под разными версиями Делфы. Зато с завидной регулярностью. Что-то типа вот так:

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, MemDS,
  VirtualTable, Vcl.Menus, Vcl.ComCtrls, Vcl.ImgList, Vcl.Grids, Vcl.DBGrids,
  {$if CompilerVersion >= 30}System.ImageList, {$IFEND}
  Vcl.StdCtrls, JvMultiConf, System.ImageList;

System.ImageList автоматически добавляется Delphi 10, но в XE2, под которым проект также собирается, его нет. После сохранения кода в Delphi 10 с присутствующим под директивой компилятора System.ImageList, он всё равно добавляется повторно и при сборке DCC выбаёт ошибку. Вопрос: с чем это может быть связано и как это обойти?
4 мар 19, 15:15    [21824506]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Arioch
Member

Откуда:
Сообщений: 10807
попробуй в "два этажа"

 {$if CompilerVersion >= 30} {$Define USES_IMAGELIST} {$IFEND}

.....

 {$ifDef USES_IMAGELIST >= 30}System.ImageList, {$EndIf}


1-й шаг можно вообще в отдельный inc-файл вынести и его подключать ко всем юнитам.

Так, кажется, VirtualTreeView делает. Впрочем, это библитека и там никакой "формы" нет. М.б. если бы была форма - то тоже добавлялся бы.

P.S. ещё можно попробовать для XE2 сделать специально пустой модуль-заглушку System.ImageList
4 мар 19, 15:57    [21824573]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
--= Eagle =--
Member

Откуда: Житомир, Украина
Сообщений: 18
Arioch, спасибо за идеи. Сделать в "два этажа" я пробовал (собственно потому $IFDEF, $IFNDEF и упомянул) - не получилось. Делать заглушки для юнитов для ХЕ2... Что ж, может этот хак и придётся применять. Правда, там не только System.ImageList, а куча всего разного, но это лучше, чем страдать.
Хотя если кто-то подскажет более красивое решение - будет здорово.
4 мар 19, 16:37    [21824620]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Arioch
Member

Откуда:
Сообщений: 10807
1) разрабатывать и собирать в одной версии среды?

2) использовать системы контроля версия (git, mercurial, etc) ?

3) использовать препроцессоры в XE2, чтобы перед сборкой строку "System.ImageList," меняли на "" ?
4 мар 19, 17:12    [21824656]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Arioch
Member

Откуда:
Сообщений: 10807
--= Eagle =--
JvMultiConf


а что это такое, и давно ли оно появилось ?
4 мар 19, 17:13    [21824659]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Arioch
...можно вообще в отдельный inc-файл вынести и его подключать ко всем юнитам.

Так, кажется, VirtualTreeView делает...

Не, там include не в секциях uses.
4 мар 19, 17:24    [21824668]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10852
--= Eagle =--
Столкнулся с такой проблемой: Delphi 10.2 частенько начинает редекларировать уже задекларированные модули, если у декларированного модуля используются директивы компилятора $IF, $IFDEF, $IFNDEF.
Если редекларирует модуль ImageList, значит у вас на форме лежит компонент TImageList. Как вы собрались компилировать проект не указав в uses (скрыв IFDEF'ом) модуль ImageList?
4 мар 19, 17:35    [21824683]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
--= Eagle =--
Member

Откуда: Житомир, Украина
Сообщений: 18
Arioch
1) разрабатывать и собирать в одной версии среды?
Если бы так и было, разве у меня возникла бы эта проблема?
Arioch
2) использовать системы контроля версия (git, mercurial, etc) ?
Уже используется, вот только при чём тут он? Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2 и DX только из-за того, что в DX нужно несколько несуществующих в ХЕ2 модулей в uses добавить?
Arioch
3) использовать препроцессоры в XE2, чтобы перед сборкой строку "System.ImageList," меняли на "" ?
Это, конечно, вариант, но где-то на том же уровне, что и хак с пустыми юнитами для ХЕ2
Arioch
а что это такое, и давно ли оно появилось ?
JvMultiConf это мой пакет расширения функционала для JvFormStorage
_Vasilisk_
[Если редекларирует модуль ImageList, значит у вас на форме лежит компонент TImageList. Как вы собрались компилировать проект не указав в uses (скрыв IFDEF'ом) модуль ImageList?
Есть такое дело, лежит ImageList. Только вот в ХЕ2 для работы ImageList достаточно наличия одного только Vcl.ImgList, а вот в DX теперь ещё и System.ImageList требуется, и добавляется он туда автоматически при сохранении проекта. А самая большая проблема, что директивы компилятора при этом напрочь игнорируются и проблема всплывает только на этапе компилирования.
4 мар 19, 18:55    [21824761]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
alekcvp
Member

Откуда:
Сообщений: 1340
--= Eagle =--,

А если сделать вообще два блока uses - первый для XE, второй для 10ки?.. И уже их обернуть в IFDEF, причём так, чтобы IFDEFы были на отдельных строчках?
4 мар 19, 19:05    [21824771]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
--= Eagle =--
Member

Откуда: Житомир, Украина
Сообщений: 18
alekcvp
А если сделать вообще два блока uses - первый для XE, второй для 10ки?.. И уже их обернуть в IFDEF, причём так, чтобы IFDEFы были на отдельных строчках?
Супер! Вот это сработало! При том есть нюанс: код всегда хочет добавляться в последний из USES-ов, так что для правильной работы пришлось сделать вот так:
{$LEGACYIFEND ON}
{$if CompilerVersion < 30}
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, MemDS,
  VirtualTable, Vcl.Menus, Vcl.ComCtrls, Vcl.ImgList, Vcl.Grids, Vcl.DBGrids,
  Vcl.StdCtrls, JvMultiConf;
{$else}
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, MemDS,
  VirtualTable, Vcl.Menus, Vcl.ComCtrls, Vcl.ImgList, Vcl.Grids, Vcl.DBGrids,
  Vcl.StdCtrls, JvMultiConf, System.ImageList;
{$ifend}
в противном случае {$if CompilerVersion >= 30} всё равно дописывает System.ImageList во вторую секцию.
Да, если само ключевое слово uses не помещать в директиву - ситуация повторится как в самом начале, после всех директив компилятора будут редекларирован(ы) юнит(ы) Delphi 10.

Итого - вопрос решён, всем спасибо за участие, отдельное большое спасибо alekcvp! :)
4 мар 19, 19:31    [21824781]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Arioch
Member

Откуда:
Сообщений: 10807
--= Eagle =--
Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2


а что такое "распараллелить" ?

вообще это называется "ветка разработки".

и вполне нормально иметь несколько веток.

ветка для сборки релиза, ветка для сборки отладочной внутренней версии, ветка с защитой и ветка без защиты и т.д.
И для XE2 можно иметь отдельную ветку, ну или наоборот, для 10.3.

--= Eagle =--
что и хак с пустыми юнитами для ХЕ2


Кстати, и этот хак тоже прекрасно ложится именно на СКВ.
В 10.3-ветке этих файлов просто нет вообще. А в XE2-ветке она есть.

Удачная модель ветвления для Git / Хабр - Habr
https://habr.com/ru/post/106912/
4 мар 19, 19:48    [21824792]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Кстати, в Delphi 2006/2007 у TFrame были совйства ClientHeight/Width и PixelPerInch, как у TForm

При попытке одни и те же формы с фреймами в одной и той же папке исходников разрабатывать одновременно в D2006 и DXE2 - обеспечены постоянные ошибки "таких свойств не бывает" и массовые изменения в DFM-файлах после каждого переключения на другую среду. Ну и соответвенно "шум в изменениях" в СКВ.

Так что - либо ветки, либо препроцессоры, которые зачищают все несовместимости всех версий, в PAS и DFM, перед каждым коммитом/релизом.
4 мар 19, 19:58    [21824801]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Василий 2
Member

Откуда:
Сообщений: 532
--= Eagle =--
Уже используется, вот только при чём тут он? Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2 и DX только из-за того, что в DX нужно несколько несуществующих в ХЕ2 модулей в uses добавить?

Все проще - не коммитить эти левые добавления в uses. Я так спасаюсь, когда среда корежит весь uses в файле проекта. Как дополнительное решение - pre-commit хук на сборку проекта, чтобы давала отлуп при несобираемом коде.
--= Eagle =--
Это, конечно, вариант, но где-то на том же уровне, что и хак с пустыми юнитами для ХЕ2

Нормальное решение. Главное - что в репо всё будет чисто. Что ж поделать, если среда самовольничает и до сих пор (аж со времен D7!) не умеет работать с $if в режиме кода.

Еще вариант - не пихать imagelist как компонент, а создавать в рантайме.
5 мар 19, 13:38    [21825336]     Ответить | Цитировать Сообщить модератору
 Re: Делфи редекларирует модули в uses  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Василий 2,

Есть ещё вариант - создать и установить в среду СВОЙ СОБСТВЕННЫЙ TImgList

который будет отличаться от стандартного только тем, что ты его в СВОЁМ собственном модуле объявил и в среде зарегистрировал.

А уже этот свой прокси-модуль будет USES что надо.

---------

Кстати, а разве в JediVCL нет клона ImgList со своими свистоперделками?
5 мар 19, 16:25    [21825551]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить