2012-03-13 3 views
3

현황 : 이전 델파이 버전 델파이 XE2에 도입 Rtti.TVirtualInterface을 가져백 포트 RTTI.TRttiIndexedProperty의 델파이 XE에

성공적인 독립적 인 노력에

  • 빈센트 Parrett에 의해 각각 만들어졌다 Delphi.Mocks.VirtualInterface 단위 (Delphi Mocks)
  • 스테판 글 리엔 케 DSharp.Core.VirtualInterface.pas 단위 (DSharp)
  • ,

인정 :

  • TRttiIndexedProperty는 TRttiMember로부터 유도된다.
  • TRttiType 및 TRttiInstanceType은 TRttiIndexedProperty에 종속됩니다.
  • Rtti.pas는 TypInfo.pas에 따라 달라집니다.

질문 :

어느 날 누군가가 가능 델파이 XE에 TRttiIndexedProperty을 가져올 수 있도록 것이라는 희망이 있습니까?

+2

무엇이 질문은 클린 룸 구현과해야 할 않습니다 출력은 다음과 같이 될 수 있을까? –

+0

@Rob 이제 대답입니다. –

+0

@Rob Kennedy : 헤더를 수정했습니다. – menjaraz

답변

6

TRttiIndexedProperty는 인덱싱 된 속성에 대한 RTTI 데이터를 쓰는 컴파일러, Delphi XE2 컴파일러에서만 수행하는 기능을 사용하므로 이전 Delphi 버전으로 역 이식 될 수 없습니다. 거기에없는 것을 읽을 수는 없습니다.

유일한 가능성은이 데이터를 직접 작성하는 것입니다. 따라서 모든 코드를 실행하고 모든 인덱싱 된 속성에 필요한 유형 정보를 생성하는 파서를 작성해야합니다. 파서가 컴파일러가 아니기 때문에 인덱스 된 속성을 쓰고 읽는 작은 도우미 함수를 작성해야합니다.

TMyClass = class 
private 
    ... 
public 
    property MyArray[Index: Integer]: TMyObject read GetMyArray write SetMyArray; 

    // autogenerated code 
    class procedure RegisterIndexedPropertyInfos(Registry: TMyRttiIndexedPropertyRegistry); static; 
end; 

// autogenerated code 
class procedure TMyClass.RegisterIndexedPropertyInfos(Registry: TMyRttiIndexedPropertyRegistry): TMyRttiIndexedProperty; 
begin 
    Registry.Register('MyArray', [TMyRttiIndex.Create('Index', TypeInfo(Integer))], TypeInfo(TMyObject), @TMyClass.GetMyArray, @TMyClass.SetMyArray); 
end; 

// When using RichRTTI you can omit this line and use the the RttiContext to find RegisterIndexedPropertyInfos 
RegisterIndexedPropertyClass(TMyClass, @TMyClass.RegisterIndexedPropertyInfos);