RTTI på objekter i Delphi

stemmer
2

Jeg prøver å analysere objekter til XML i Delphi, så jeg leste om å kalle objektets ClassInfo metode for å få sin RTTI info.

Saken er, dette tilsynelatende bare fungerer for TPersistent stedene. Ellers må jeg spesielt legge en kompilator direktiv {$ M +} til kildekoden for kompilatoren å generere RTTI info.

Så jeg lykkelig lagt direktivet, bare for å oppdage at selv om det kom tilbake noe fra ClassInfo samtalen (det pleide å returnere null), nå kan jeg ikke hente klassen egenskaper, felt eller metoder fra den. Det er som det opprettet objektet tom.

Noen anelse om hva jeg mangler her? Takk!

Publisert på 03/10/2008 klokken 17:16
kilden bruker
På andre språk...                            


4 svar

stemmer
3

RTTI vil bare vise deg publiserte egenskaper, osv. - ikke bare offentlige seg.

Prøv koden din med en TObject og se hva som skjer - hvis det ikke fungerer, legge inn koden din fordi ikke alle er synsk.

Svarte 03/10/2008 kl. 17:22
kilden bruker

stemmer
7

Visste du sette disse egenskapene og metodene i publisheddelen?

Bortsett fra det, 'klassisk' RTTI ($ TYPEINFO ON) vil bare få deg informasjon om egenskaper, ikke på metoder. Du trenger 'utvidet' RTTI ($ METHODINFO ON) for dem.

Godt utgangspunkt for utvidet RTTI: David Glassborow på lengre RTTI

(Hvem skulle tro at nettopp dette øyeblikk jeg ferdig med å skrive noen kode som bruker utvidet RTTI og bestemte seg for å surfe på Stack Overflow litt :))

Svarte 03/10/2008 kl. 17:25
kilden bruker

stemmer
3

Har du vurdert å bruke TXMLDocument komponent? Det vil se på XML, og deretter lage en fin enhet av Delphi klasser som representerer XML-filen - gjør det veldig, veldig lett å lese og skrive XML-filer.

Svarte 04/10/2008 kl. 03:27
kilden bruker

stemmer
0

Som for RttiType problem tilbake bare null, sannsynligvis skjer dette for en grunn: i test, gjorde du ikke instantiate klassen når som helst. Kompilatoren, fordi det aldri har en referanse til denne klassen (fordi det er ikke et eksempel i det hele tatt), fjernes den via den informasjon som en form for optimalisering. Se de to eksemplene nedenfor. Oppførselen er annerledes når du har klassen startes på et tidspunkt i koden din eller ikke.

Anta at følgende klasse:

type
  TTest = class
  public
    procedure Test;
  end;

og følgende koden under:

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;

så langt, er tTest klasse informasjonen ikke er tilgjengelig for bruk av RTTI. Men når vi skaper på enkelte punkt, i programmet, deretter en referanse er opprettet for det innen kompilere, noe som gjør denne informasjonen tilgjengelig:

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;

På dette punktet, hvis du bruker LContext.FindType ( 'tTest') , vil det ikke være en null avkastning, fordi kompilatoren holdt referanse til klassen. Dette forklarer oppførselen du hadde i testene.

Svarte 16/09/2017 kl. 11:12
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more