Можно ли отключить E2064 в Delphi XE4?

У меня есть следующий пример кода в тестовом проекте DUnitX, который не компилируется. Область действия этого примера кода идентична коду, который компилируется без ошибок в очень большом проекте форм VCL. Оба проекта используют Delphi XE4, но когда я ссылаюсь на исходный файл, который успешно компилируется в проекте VCL в моем проекте модульного тестирования DUnitX, происходит сбой с тем же E2064 левая сторона не может быть назначена этот код выдает:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

type
  TTestRec = record
    A: string;
  end;

const
  AConstArray : array [0..1] of TTestRec = ( (A: '1'), (A: '2') );

procedure E2064Test;
begin
  {$J+}
  {$WRITEABLECONST ON}
  AConstArray[0].A := '3'; // error here
  AConstArray[1].A := '4'; // error here
  {$WRITEABLECONST OFF}
  {$J-}
end;

begin
end.

Есть ли переключатель компилятора или какой-то другой странный путь/настройка, который мне нужно указать, чтобы этот код скомпилировался для моего тестового проекта DUnitX в XE4?


person John Kaster    schedule 19.06.2014    source источник
comment
Просто любопытно, поскольку вы записываете данные в массив, почему бы не объявить массив как var вместо const?   -  person Remy Lebeau    schedule 20.06.2014
comment
Эээ, $WRITEABLECONST и $J — это одно и то же.   -  person David Heffernan    schedule 20.06.2014
comment
Да, Дэвид. Спасибо, что убедились :)   -  person John Kaster    schedule 21.06.2014


Ответы (2)


Вы можете использовать {$J+}. Это компилируется для меня.

type
  TTestRec = record
    A: string;
  end;

const
  {$J+}
  AConstArray : array [0..1] of TTestRec = ( (A: '1'), (A: '2') );
  {$J-}

procedure E2064Test;
begin
  AConstArray[0].A := '3'; // error here
  AConstArray[1].A := '4'; // error here
end;
person Graymatter    schedule 19.06.2014
comment
Спасибо за ссылку и очень быстрый ответ. Я не мог найти правильные термины для googlebing. К сожалению, в моем проекте DUnitX он все еще не компилируется. Я пробовал как {$J+}, так и {$WRITEABLECONST ON}. Я создам одно консольное приложение и посмотрю, будет ли оно вести себя по-другому. Опять я в XE4 - person John Kaster; 20.06.2014
comment
Я не могу заставить это скомпилировать в XE4. Я обновляю свой вопрос, чтобы иметь полностью автономный код в качестве консольного проекта. - person John Kaster; 20.06.2014
comment
@JohnKaster Я использую XE4. У меня была директива не в том месте. Сначала я установил параметры проекта, которые заставили его работать. Приведенный выше код теперь должен работать. - person Graymatter; 20.06.2014
comment
Хе. Я вижу, вы нашли тот же ответ, что и я (должно быть, мы печатали одновременно). Засчитывая вам победу. Спасибо! - person John Kaster; 20.06.2014

С помощью Graymatter я нашел место для установки переключателя.

Установите флажок под:

Project options | Delphi compiler | Compiling | Syntax | Assignable types constants

Обновление: как указывает серое вещество, переключатели компилятора, если они используются, должны быть там, где символ объявлен, а не доступен.

person John Kaster    schedule 20.06.2014
comment
Их не игнорируют. Они должны быть вокруг константы, а не кода, обращающегося к константе, поскольку это связано с тем, как определяется объект. - person Graymatter; 20.06.2014
comment
Попался. Однако, когда переключатель включен, они вообще не должны быть там. - person John Kaster; 20.06.2014
comment
Я также не понимаю, почему вы хотите использовать записываемые типизированные константы. Это анахронизм 20 века. Предполагается, что вы больше не будете использовать этот переключатель. - person David Heffernan; 20.06.2014