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

Столкнулся с такой проблемой: 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
04.03.2019, 15:57
    #39782071
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Делфи редекларирует модули в uses
попробуй в "два этажа"

Код: 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
04.03.2019, 16:37
    #39782110
--= Eagle =--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Делфи редекларирует модули в uses
Arioch , спасибо за идеи. Сделать в "два этажа" я пробовал (собственно потому $IFDEF, $IFNDEF и упомянул) - не получилось. Делать заглушки для юнитов для ХЕ2... Что ж, может этот хак и придётся применять. Правда, там не только System.ImageList, а куча всего разного, но это лучше, чем страдать.
Хотя если кто-то подскажет более красивое решение - будет здорово.
...
Рейтинг: 0 / 0
04.03.2019, 17:12
    #39782135
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Делфи редекларирует модули в uses
1) разрабатывать и собирать в одной версии среды?

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

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



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

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

А если сделать вообще два блока uses - первый для XE, второй для 10ки?.. И уже их обернуть в IFDEF, причём так, чтобы IFDEFы были на отдельных строчках?
...
Рейтинг: 0 / 0
04.03.2019, 19:31
    #39782217
--= Eagle =--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Делфи редекларирует модули в uses
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
04.03.2019, 19:48
    #39782222
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Делфи редекларирует модули в uses
--= Eagle =--Или вы предлагаете распараллелить код из нескольких тысяч строк для ХЕ2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

---------

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


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