Сбой установки 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.