![]() |
RTTI funktioniert bei Records nur bedingt
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:
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:
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;
Delphi-Quellcode:
Und hier die Ausgabe:
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;
Code:
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?
Is Record
RInteger found Field: FValue |
Re: RTTI funktioniert bei Records nur bedingt
Bei den Klassen werden vorallem RTTI-Infos zu den Published-Properties und -Methoden ausgegeben ... zum Rest gibt es kaum Informationen und wenn, dann hängt es oftmals von bestimmten Bedingungen ab.
Public-Sachen werden per Standard nicht aufgelistet, es sei denn die Klasse oder ein Vorfahre wurde entsprechend erstellt (wie z.B. bei TCollection). Ich denke mal, dieses wird bei Records ähnlich sein. |
Re: RTTI funktioniert bei Records nur bedingt
@himi: Das war doch nur bei der alten RTTI der Fall, in der neuen ist "alles besser" :zwinker: .
@s.h.a.r.k: ![]() |
Re: RTTI funktioniert bei Records nur bedingt
Zitat:
Zitat:
[edit] Wo zum T***** war die rote Box? :gruebel: Danke, werde es gleich mal anschauen! [edit2] wow, das liest sich ja echt super... Wie kann man sowas einfach mal vergessen?! :gruebel: Mir scheint aber allgemein, dass die RTTI-Unterstützung für Records nur sehr spährlich ist. |
Re: RTTI funktioniert bei Records nur bedingt
Zitat:
jetzt gibt es tausende unbekannte Compilerschalter, welche standardmäßig alle an sind. |
Re: RTTI funktioniert bei Records nur bedingt
Jo, da magst du schon recht haben, aber ich finde das Paket in der Zwischenzeit sehr praktisch. Wobei ich da doch gerne deine Kritikpunkt aufgreifen und eine bessere Hilfe bzgl. Compilerschalter fordern würde. Eine sinnvolle Dokumentation wäre hier sehr hilfreich, auch mit Angabe, was in der EXE landet etc. Ich finde hierzu immer nur sehr weniger Informationen und meist in Posts in der DP, aber ohne Quellen.
|
Re: RTTI funktioniert bei Records nur bedingt
Zitat:
![]() |
Re: RTTI funktioniert bei Records nur bedingt
Danke dir :thumb: Mir ging es dabei aber eher um eine *umfassende* Doku, die es imho nicht so wirklich gibt.
|
Re: RTTI funktioniert bei Records nur bedingt
Was fehlt denn noch? Einfach ein bisschen links und rechts gucken...
|
Re: RTTI funktioniert bei Records nur bedingt
Eine Auflistung von ALLEN Direktiven und eine entsprechend (gute) Beschreibung. Und das dann auch noch in der Delphi Hilfe :zwinker: Ich brauche im Moment eigentlich nicht mehr, aber wünschenswert ists zumindest. Naja, genug OT.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz