2016-10-10 11 views
0

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

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

Windows 10 Home (10.0.0)

JVCL 3.50.0.0

[Generating: Packages]

Generating packages for D24

Loaded template.dpk

Loaded template.dproj

Loaded template.rc

[Compiling: Packages]

[Compiling: JvCore240.bpl]

Embarcadero Delphi for Win32 compiler version 31.0

Copyright (c) 1983,2016 Embarcadero Technologies, Inc.

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(261) Error: E2361 Cannot access private symbol TMemIniFile.FSections

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(261) Warning: W1023 Comparing signed and unsigned types - widened both operands

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(261) Error: E2014 Statement expected, but expression of type 'Boolean' found

E:\DelphiComp\XE10.1\JVCL3-2016-10-10\run\JvAppIniStorage.pas(274) Error: E2361 Cannot access private symbol TMemIniFile.FSections

JvCore.dpk(2356) Fatal: F2063 Could not compile used unit 'JvAppIniStorage.pas'

+1

Вы говорите, что пытаетесь установить последнюю версию, но это не так. Этот вопрос был зафиксирован еще в апреле. Это такая распространенная ошибка. Убедитесь, что вы знаете, как использовать VCS и получить последнюю версию. –

ответ

1

Delphi 10,1 Berlin версия удаляется доступ частных членов через класс помощников (см How to access private methods without helpers?). Это сообщение об ошибке, которое вы можете видеть, когда доступ к 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.

+0

Это действительно отвратительный взлом, не так ли? –

+0

@DavidHeffernan, возможно, с точки зрения oop, но прагматичный программист использует любой вариант. –

+0

Привет, Давид, Спасибо за ваши комментарии. Но я не могу этого сделать. –