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
Antwort Antwort
Seite 1 von 2  1 2      
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, 20: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 20:39
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 20:54
@himi: Das war doch nur bei der alten RTTI der Fall, in der neuen ist "alles besser" .

@s.h.a.r.k: http://qc.embarcadero.com/wc/qcmain.aspx?d=78110
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Re: RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 20:55
Zitat von himitsu:
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.
An den Direktiven habe ich bisher noch nichts gedreht; bei den Klassen funktioniert ja auch alles wunderbar.

Zitat von himitsu:
Public-Sachen werden per Standard nicht aufgelistet, es sei denn die Klasse oder ein Vorfahre wurde entsprechend erstellt (wie z.B. bei TCollection).
Wie meinst du das? Ich will ja an die Properties und diese sind im public-Teil. Bei den Klassen ist dies ohne Probleme möglich. Aber selbst die private-Methode SetValue() wird nicht ausgegeben.

[edit] Wo zum T***** war die rote Box?

Danke, werde es gleich mal anschauen!

[edit2] wow, das liest sich ja echt super... Wie kann man sowas einfach mal vergessen?! Mir scheint aber allgemein, dass die RTTI-Unterstützung für Records nur sehr spährlich ist.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

Re: RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 21:21
Zitat von Khabarakh:
@himi: Das war doch nur bei der alten RTTI der Fall, in der neuen ist "alles besser" .
so schlimm war das ja eigentlich nicht, denn so konnte man erstens ein bissl mitentscheiden welche RTTI-Infos in der EXE landen und zweitens landete so nicht gleich jeder unnötige "Scheiß" in der EXE.

jetzt gibt es tausende unbekannte Compilerschalter, welche standardmäßig alle an sind.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Re: RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 21:27
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#7

Re: RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 22:38
Zitat von s.h.a.r.k:
(...) Ich finde hierzu immer nur sehr wenige Informationen und meist in Beiträgen in der DP, aber ohne Quellen.
Das können wir ändern, das ist gar nicht sooo schwer zu finden: http://docwiki.embarcadero.com/RADSt...ktive_(Delphi)
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Re: RTTI funktioniert bei Records nur bedingt

  Alt 8. Mär 2010, 22:49
Danke dir Mir ging es dabei aber eher um eine *umfassende* Doku, die es imho nicht so wirklich gibt.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#9

Re: RTTI funktioniert bei Records nur bedingt

  Alt 9. Mär 2010, 00:12
Was fehlt denn noch? Einfach ein bisschen links und rechts gucken...
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Re: RTTI funktioniert bei Records nur bedingt

  Alt 9. Mär 2010, 00:13
Eine Auflistung von ALLEN Direktiven und eine entsprechend (gute) Beschreibung. Und das dann auch noch in der Delphi Hilfe Ich brauche im Moment eigentlich nicht mehr, aber wünschenswert ists zumindest. Naja, genug OT.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:40 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