AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi RTTI funktioniert bei Records nur bedingt
Thema durchsuchen
Ansicht
Themen-Optionen

RTTI funktioniert bei Records nur bedingt

Ein Thema von s.h.a.r.k · begonnen am 8. Mär 2010 · letzter Beitrag vom 9. Mär 2010
 
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 19:30
Hallo zusammen,

ich habe gerade eine recht lustige, wenn auch ernüchternde Entdeckung gemacht. Records sind ja recht nett in der Zwischenzeit. Sie unterstützen Konstruktoren, Methoden und Properties. Nun habe ich hier mal so ein Exemplar:
Delphi-Quellcode:
RInteger = record
private
  FValue : Variant;
  procedure SetValue(const AVar: Variant);
public
  const VarType = varInteger;
  property Value : Variant read FValue write SetValue;
  function IsNull(): Boolean;
end;
Nachdem RTTI ja auch ganz nett ist, habe ich mir mal eine Demo zu Testzwecken geschrieben, dir mir die Methoden und Properties aus dem Record ausgeben soll. Hier der Code:
Delphi-Quellcode:
var
  context : TRttiContext;
  typeInfo : TRttiType;
  prop : TRttiProperty;
  field : TRttiField;
  attr : TCustomAttribute;
  met : TRttiMethod;
begin
  context := TRttiContext.Create();
  try
    typeInfo := context.GetType(System.TypeInfo(RInteger));

    // Record?
    if (typeInfo.IsRecord) then
      Memo1.Lines.Add('Is Record');

    // RInteger?
    if (typeInfo.Handle = System.TypeInfo(RInteger)) then
      Memo1.Lines.Add('RInteger found');

    // Methoden auslesen, mit Parameteranzahl
    for met in typeInfo.GetMethods do
      Memo1.Lines.Add('Methods: ' + met.Name + '(' + IntToStr(Length(met.GetParameters)) + ')');

    // Properties auslesen
    for prop in typeInfo.GetProperties
      do Memo1.Lines.Add('Property: ' + prop.Name);

    // Felder auslesen
    for field in typeInfo.GetFields do
      Memo1.Lines.Add('Field: ' + field.Name);

    // Attribute auslesen
    for attr in typeInfo.GetAttributes do
      Memo1.Lines.Add('Attribute: ' + attr.ClassName);

  finally
    context.Free;
  end;
end;
Und hier die Ausgabe:
Code:
Is Record
RInteger found
Field: FValue
Aber irgendwas stimmt doch nicht? Es werden keine Properties ausgegeben, sondern nur das eine Feld. Aber warum? Selbst wenn ich typeInfo.AsRecord mache und damit alle Get-Methoden aufrufe, bekomme ich das gleiche Ergebnis. Stimmt irgendwas nicht an meiner Programmierung, oder habe ich da ein RTTI-Problem, welches ich nicht kenne/sehe?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz