문제

델파이에서 XML로 개체를 구문 분석하려고하므로 RTTI 정보를 얻기 위해 객체의 classInfo 메소드를 호출하는 것에 대해 읽었습니다.

문제는, 이것은 분명히 tpersistent 객체에만 적용되는 것입니다. 그렇지 않으면 RTTI 정보를 생성하기 위해 컴파일러의 소스 코드에 컴파일러 지침 {$ m+}를 구체적으로 추가해야합니다.

그래서 나는 Directive를 행복하게 추가했는데, ClassInfo 호출에서 무언가를 반환하더라도 (NIL을 반환하는 데 사용됨) 이제 클래스의 속성, 필드 또는 메소드를 검색 할 수는 없습니다. 그것은 객체를 비어있는 것과 같습니다.

내가 여기서 무엇을 놓치고 있는지 아십니까? 감사!

도움이 되었습니까?

해결책

그 속성과 방법을 published 부분?

게다가, '클래식'RTTI ($ typeinfo on)는 방법이 아닌 속성에 대한 정보 만 얻을 수 있습니다. 그것들을 위해 '확장'RTTI ($ methodinfo)가 필요합니다.

확장 된 RTTI의 좋은 출발점 : 확장 된 RTTI의 David Glassborow

(이 순간에 확장 된 RTTI를 사용하는 코드를 작성하고 스택 오버 플로우를 조금 찾아보기로 결정한 사람은 누가 믿을 것입니다 :))

다른 팁

RTTI는 당신에게만 보여줄 것입니다 게시 속성 등. - 공개적인 것이 아닙니다.

Tobject와 함께 코드를 시도하고 어떤 일이 일어나는지 확인하십시오. 작동하지 않는 경우 코드를 게시하십시오 모든 사람이 심령이 아니기 때문에.

TXMLDocument 구성 요소 사용을 고려해 보셨습니까? XML을보고 XML 파일을 나타내는 멋진 Delphi 클래스의 멋진 단위를 만듭니다. 실제로 XML 파일을 읽고 쓰기 쉽습니다.

rttitype 문제는 nil 만 반환하는 경우, 이것은 아마도 한 가지 이유가 발생할 수 있습니다. 테스트에서 언제든지 수업을 인스턴스화하지 않았습니다. 컴파일러는이 클래스에 대한 참조가 없기 때문에 (전혀 인스턴스가 아니기 때문에) 정보에서 최적화 형태로 정보를 제거합니다. 아래 두 가지 예를 참조하십시오. 코드의 어느 시점에서 클래스가 인스턴스화되거나 그렇지 않은 경우 동작은 다릅니다.

다음 수업을 가정하십시오.

type
  TTest = class
  public
    procedure Test;
  end;

아래의 다음 코드는 다음과 같습니다.

var
  LContext: TRttiContext;
  LType: TRttiType;
  LTest: TTest;
begin
  LContext := TRttiContext.Create;
  for LType in LContext.GetTypes do
  begin
    if LType.IsInstance then
    begin
      WriteLn(LType.Name);
    end;
  end;
end;

지금까지 TTEST 클래스 정보는 RTTI에서 사용할 수 없습니다. 그러나 응용 프로그램 내에서 어느 시점에서 생성 할 때, 컴파일 내에서 참조가 생성 되어이 정보를 사용할 수있게합니다.

var
  LContext: TRttiContext;
  LType: TRttiType;
  LTest: TTest;
begin
  LTest := TTest.Create; //Here i´m using TTest.
                         //Could be in another part of the program

  LContext := TRttiContext.Create;
  for LType in LContext.GetTypes do
  begin
    if LType.IsInstance then
    begin
      WriteLn(LType.Name);
    end;
  end;
end;

그 시점에서 사용하는 경우 lcontext.findtype ( 'ttest'), 컴파일러가 클래스를 참조하기 때문에 NIL 리턴은 없습니다. 이것은 당신이 당신의 시험에서 가지고 있던 행동을 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top