powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Делфи редекларирует модули в uses
14 сообщений из 14, страница 1 из 1
Делфи редекларирует модули в uses
    #39782032
--= Eagle =--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, коллеги!

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

Код: pascal
1.
2.
3.
4.
5.
6.
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 выбаёт ошибку. Вопрос: с чем это может быть связано и как это обойти?
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782071
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй в "два этажа"

Код: pascal
1.
2.
3.
4.
5.
 {$if CompilerVersion >= 30} {$Define USES_IMAGELIST} {$IFEND}

.....

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



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

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

P.S. ещё можно попробовать для XE2 сделать специально пустой модуль-заглушку System.ImageList
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782110
--= Eagle =--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch , спасибо за идеи. Сделать в "два этажа" я пробовал (собственно потому $IFDEF, $IFNDEF и упомянул) - не получилось. Делать заглушки для юнитов для ХЕ2... Что ж, может этот хак и придётся применять. Правда, там не только System.ImageList, а куча всего разного, но это лучше, чем страдать.
Хотя если кто-то подскажет более красивое решение - будет здорово.
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782135
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) разрабатывать и собирать в одной версии среды?

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

3) использовать препроцессоры в XE2, чтобы перед сборкой строку "System.ImageList," меняли на "" ?
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782137
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--= Eagle =--
Код: pascal
1.
JvMultiConf



а что это такое, и давно ли оно появилось ?
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782146
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch...можно вообще в отдельный inc-файл вынести и его подключать ко всем юнитам.

Так, кажется, VirtualTreeView делает...
Не, там include не в секциях uses.
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782157
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--= Eagle =--Столкнулся с такой проблемой: Delphi 10.2 частенько начинает редекларировать уже задекларированные модули, если у декларированного модуля используются директивы компилятора $IF, $IFDEF, $IFNDEF.Если редекларирует модуль ImageList, значит у вас на форме лежит компонент TImageList. Как вы собрались компилировать проект не указав в uses (скрыв IFDEF'ом) модуль ImageList?
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782206
--= Eagle =--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 требуется, и добавляется он туда автоматически при сохранении проекта. А самая большая проблема, что директивы компилятора при этом напрочь игнорируются и проблема всплывает только на этапе компилирования.
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782213
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--= Eagle =--,

А если сделать вообще два блока uses - первый для XE, второй для 10ки?.. И уже их обернуть в IFDEF, причём так, чтобы IFDEFы были на отдельных строчках?
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782217
--= Eagle =--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpА если сделать вообще два блока uses - первый для XE, второй для 10ки?.. И уже их обернуть в IFDEF, причём так, чтобы IFDEFы были на отдельных строчках?Супер! Вот это сработало! При том есть нюанс: код всегда хочет добавляться в последний из USES-ов, так что для правильной работы пришлось сделать вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
{$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 ! :)
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782222
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--= Eagle =--Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2

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

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

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

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

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

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

Удачная модель ветвления для Git / Хабр - Habr
https://habr.com/ru/post/106912/
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782224
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в Delphi 2006/2007 у TFrame были совйства ClientHeight/Width и PixelPerInch, как у TForm

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

Так что - либо ветки, либо препроцессоры, которые зачищают все несовместимости всех версий, в PAS и DFM, перед каждым коммитом/релизом.
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782479
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--= Eagle =--Уже используется, вот только при чём тут он? Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2 и DX только из-за того, что в DX нужно несколько несуществующих в ХЕ2 модулей в uses добавить?
Все проще - не коммитить эти левые добавления в uses. Я так спасаюсь, когда среда корежит весь uses в файле проекта. Как дополнительное решение - pre-commit хук на сборку проекта, чтобы давала отлуп при несобираемом коде.
--= Eagle =--Это, конечно, вариант, но где-то на том же уровне, что и хак с пустыми юнитами для ХЕ2

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

Еще вариант - не пихать imagelist как компонент, а создавать в рантайме.
...
Рейтинг: 0 / 0
Делфи редекларирует модули в uses
    #39782592
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2,

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

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

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

---------

Кстати, а разве в JediVCL нет клона ImgList со своими свистоперделками?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Делфи редекларирует модули в uses
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]