Остановите Delphi, автоматически добавляя единицы неправильно

Я обновляю наши проекты с XE7 до XE8. В настоящее время им все еще нужно будет работать с XE7, поэтому требуется несколько условий. Например, ImageList изменил единицы измерения, поэтому Vcl.ImgList - это Syste.ImageList в XE8. Чтобы заставить его работать на обеих версиях Delphi, выражение использования выглядит примерно так:

uses
  System.SysUtils, System.Classes, Vcl.Controls
  {$IF CompilerVersion >= 29.0}
  ,System.ImageList
  {$else}
  ,Vcl.ImgList
  {$endif}

  ,cxGraphics;

Иногда это работает нормально. Однако довольно часто Delphi автоматически повторно добавляет модуль System.Imagelist, даже если он уже есть, хотя и в условном

uses
  System.SysUtils, System.Classes, Vcl.Controls
  {$IF CompilerVersion >= 29.0}
  ,System.ImageList
  {$else}
  ,Vcl.ImgList
  {$endif}

  ,cxGraphics, System.ImageList;

Когда это компилируется, XE8 жалуется.

[dcc32 Error] dmImagesU.pas(13): E2004 Identifier redeclared: 'System.ImageList'

а) Почему Delphi добавляет модуль? б) Кто-нибудь знает обходной путь?

1 ответ

Решение

"Парсер", который отвечает за добавление модулей к использованию в этом случае, не учитывает должным образом директивы компилятора (эта проблема уже возникла с введением System.Actions.pas).

Я обычно создаю фиктивный модуль для более старых версий Delphi, поэтому мне не нужно вводить какие-либо директивы в использование.

Так что в вашем случае просто создайте пустой System.ImageList.pas и поместите это где-нибудь <= XE7 находит это.

Другие вопросы по тегам