Сбой установки Delphi XE 10.1 JVCL

Я установил последнюю версию JCL 2016-10-10 и хочу установить последнюю версию JVCL, но я получаю некоторые сообщения об ошибках.

Как я могу это установить?

Windows 10 Home (10.0.0)

JVCL 3.50.0.0

[Создание: пакеты]

Генерация пакетов для D24

Загруженный template.dpk

Загружен template.dproj

Загруженный template.rc

[Составление: пакеты]

[Составление: JvCore240.bpl]

Embarcadero Delphi для Win32 компилятор версии 31.0

Авторское право (c) 1983,2016 Embarcadero Technologies, Inc.

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(261) Ошибка: E2361 Невозможно получить доступ к закрытому символу TMemIniFile.FSections

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(261) Предупреждение: W1023 Сравнение типов со знаком и без знака - расширение обоих операндов

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(261) Ошибка: оператор E2014 ожидается, но найдено выражение типа 'Boolean'

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(274) Ошибка: E2361 Невозможно получить доступ к закрытому символу TMemIniFile.FSections

JvCore.dpk (2356) Fatal: F2063 Не удалось скомпилировать использованный модуль 'JvAppIniStorage.pas'

1 ответ

Берлинская версия Delphi 10.1 удалила доступ частных членов через помощников класса (см. Как получить доступ к закрытым методам без помощников?). Это сообщение об ошибке, которое вы можете увидеть при доступе к TMemIniFile.FSections отказано.

Глядя на последний код для JvAppIniStorage.pas, это исправлено:

{ Optimization of TCustomIniFile.ValueExists.
  Note that this is a dirty hack, a better way would be to rewrite TMemIniFile;
  especially expose FSections. }
{$IFDEF DELPHI2009_UP}
type
  TMemIniFileAccess = class(TCustomIniFile)
  {$IFDEF RTL310_UP} // 10.1 Berlin removed the access to private fields
    {$IFDEF RTL320_UP}
      {$MESSAGE WARN 'Check that the new RTL still has FSections as the first member of TMemIniFile'}
    {$ENDIF RTL320_UP}
  private
    FSections: TStringList;
  {$ENDIF RTL310_UP}
  end;

Как сказано в комментариях к коду, это грязный хак, который работает, если FSections по-прежнему объявляется как первое поле в TCustomIniFile,

И в коде:

function TMemIniFileHelper.SectionExists(const Section: string): Boolean;
begin
  {$IFDEF RTL310_UP} // 10.1 Berlin removed the access to private fields
  Result := TMemIniFileAccess(Self).FSections.IndexOf(Section) >= 0;
  {$ELSE}
  Result := Self.FSections.IndexOf(Section) >= 0;
  {$ENDIF RTL310_UP}
end;

Убедитесь, что у вас есть последний исходный код для jvcl и перекомпилируйте. Обратите внимание, что символ RTL310_UP определяется в jedi.inc.

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