Что такое внутренняя ошибка E5912 - PullRequest
1 голос
/ 05 сентября 2011

Я задаю вопрос здесь Как создать простой XML в OmniXML , и я получаю ответ от Гэвина Уоткинсона.

Я создаю блок:

interface

uses
 OmniXML, OmniXMLProperties;

type
 TRow = class(TGpXMLData)
 public
  constructor Create(Node: IXMLNode); override;

  property Id: integer index 0 read GetXMLPropInt write SetXMLPropInt;
  property Name: WideString index 1 read GetXMLPropWide write SetXMLPropWide;
  property Surname: WideString index 2 read GetXMLPropWide write SetXMLPropWide;
  property Time: WideString index 3 read GetXMLPropWide write SetXMLPropWide;
  property Old: WideString index 4 read GetXMLPropWide write SetXMLPropWide;
  property Subject: WideString index 5 read GetXMLPropWide write SetXMLPropWide;
end;

TRows = class(TGpXMLList)
protected
  function GetRow(Value: integer): TRow;
public
  constructor Create(ParentNode: IXMLNode); reintroduce;

  function Add: TRow; reintroduce;

  property Rows[Value: integer]: TRow read GetRow; default;
end;

TRootsXml = class(TGpXmlDocList)
private
  fRows: TRows;
public
  constructor Create; reintroduce;
  destructor Destroy; override;

  property Ver: WideString index 0 read GetXMLAttrPropWide write SetXMLAttrPropWide;
  property RootFile: WideString index 1 read GetXMLAttrPropWide write SetXMLAttrPropWide;

  property Rows: TRows read fRows;
end;

implementation

constructor TRow.Create(Node: IXMLNode);
begin
  inherited;

  InitChildNodes(['id', 'name', 'surname', 'time', 'old', 'subjects'], 
                 ['', '', '', '', '', '']);
end;

constructor TRows.Create(parentNode: IXMLNode);
begin
  inherited Create(parentNode, '', 'row', TRow);
end;

function TRows.Add: TRow;
begin
  Result := TRow(inherited Add);
end;

function TRows.GetRow(Value: Integer): TRow;
begin
  Result := TRow(inherited Items[Value]);
end;

constructor TRootsXml.Create;
var
  xmlPI: IXMLProcessingInstruction;
begin
  inherited Create('Root', '', '', nil);

  xmlPI := XMLDoc.CreateProcessingInstruction('xml', 'version="1.0" encoding="utf-8"');
  XMLDoc.InsertBefore(xmlPI, node);

  InitChildNodes(['ver', 'file'], ['', '']);

  fRows := TRows.Create(node);
end; 

destructor TRootsXml.Destroy;
begin
  fRows.free;

  inherited;
end;

Когда я пытаюсь TRootsXml.ver = 'sat123'; и пытаюсь скомпилировать, я получаю эту ошибку. «Внутренняя ошибка E5912» и не компилируется ... Но я могу собрать без проблем и запустить его.

Так что же не так и что такое внутренняя ошибка E5912?

1 Ответ

6 голосов
/ 05 сентября 2011

Внутренние ошибки - это, в общем, внутренние ошибки в компиляторе или компоновщике. На этот раз похоже на компилятор. Число является просто указанием людям, которые на самом деле написали компилятор. Что это означает, не задокументировано, и это то, что на самом деле никогда не должно происходить, другими словами, это ошибка в компиляторе . Если это происходит, вы можете только догадываться, где или почему это происходит, и пытаться модифицировать ваш код, пока он не исчезнет. Это нелегко и может расстраивать, но это единственное, что вы можете сделать.

Я предполагаю, что это связано с тем, что код использует индексированные свойства с геттерами и сеттерами, определенными в классе предков. Я думаю, вы могли бы написать свои собственные методы получения и установки и вызывать унаследованные методы получения с указанным индексом. Попробуйте это:

  TRootsXml = class(TGpXmlDocList)
  private
    fRows: TRows;
    function GetVer: WideString;
    procedure SetVer(const Value: WideString);
    function GetRootFile ... etc.. 
  public
    constructor Create; reintroduce;
    destructor Destroy; override;

    property Ver: WideString read GetVer write SetVer;
    property RootFile: WideString read GetRootFile write SetRootFile;
    property Rows: TRows read fRows;
  end;

function TRootsXml.GetVer: WideString;
begin
  Result := GetXMLAttrPropWide(0);
end;

procedure TRootsXml.SetVer(const Value: WideString);
begin
  SetXMLAttrPropWide(0, Value);
end;

// etc... similar code for GetRootFile and SetRootFile, but with index 1.

Не уверен, что это работает, поскольку у меня больше не установлен Delphi 7, но, пожалуйста, попробуйте и сообщите, что случилось.

Полагаю, исходный код предназначался для использования в более высокой версии. Это не объясняет внутреннюю ошибку (как я уже сказал, это ошибки в компиляторе), но объясняет, почему он не компилируется должным образом, так как я предполагаю, что код был протестирован, но, очевидно, не в Delphi 7.

...