Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RTTI funktioniert bei Records nur bedingt (https://www.delphipraxis.net/148800-rtti-funktioniert-bei-records-nur-bedingt.html)

s.h.a.r.k 8. Mär 2010 19:30


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:
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?

himitsu 8. Mär 2010 19:39

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.

Khabarakh 8. Mär 2010 19:54

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: http://qc.embarcadero.com/wc/qcmain.aspx?d=78110

s.h.a.r.k 8. Mär 2010 19:55

Re: RTTI funktioniert bei Records nur bedingt
 
Zitat:

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:

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? :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.

himitsu 8. Mär 2010 20:21

Re: RTTI funktioniert bei Records nur bedingt
 
Zitat:

Zitat von Khabarakh
@himi: Das war doch nur bei der alten RTTI der Fall, in der neuen ist "alles besser" :zwinker: .

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.

s.h.a.r.k 8. Mär 2010 20:27

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.

Panthrax 8. Mär 2010 21:38

Re: RTTI funktioniert bei Records nur bedingt
 
Zitat:

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)

s.h.a.r.k 8. Mär 2010 21:49

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.

Panthrax 8. Mär 2010 23:12

Re: RTTI funktioniert bei Records nur bedingt
 
Was fehlt denn noch? Einfach ein bisschen links und rechts gucken...

s.h.a.r.k 8. Mär 2010 23:13

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 10:58 Uhr.
Seite 1 von 2  1 2      

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