AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

D2010 RTTI besitzt ein object scope ?

Offene Frage von "Stevie"
Ein Thema von skydiablo · begonnen am 10. Jun 2010 · letzter Beitrag vom 11. Jun 2010
Antwort Antwort
skydiablo

Registriert seit: 15. Mär 2004
Ort: Wismar
17 Beiträge
 
#1

D2010 RTTI besitzt ein object scope ?

  Alt 10. Jun 2010, 21:59
Delphi-Version: 2010
hi @ all...

ich bin derzeit am rumschrauben mit delphi 2010 und den neuen RTTI "klassen" (in anfürungszeichen, da mir das mit pseudo record als object getarnt bekannt ist)... nun meine eigentlich frage:

ich hab mir hier mal eine function gebaut die mir ein bestimmtes attribut auslesen soll:

Delphi-Quellcode:
function getAttribute(ctx : TRttiContext; obj : TObject; attributeClass : TClass) : TBasicAttribute;
var
// ctx: TRttiContext;
  t : TRttiType;
  p : TRttiProperty;
  a : TCustomAttribute;
begin
  result := nil;
// ctx := TRttiContext.Create;
  try
    t := ctx.GetType(obj.ClassType);
    for p in t.GetProperties do
      for a in p.GetAttributes do
        if a is attributeClass then
        begin
          result := a AS TBasicAttribute;
          exit;
        end;
  finally
// ctx.Free;
  end;
end;
in dieser schon etwas angepassten variante übergebe ich ein bereits bestehendes TRttiContext "object" mit. diese function gibt mir nun also ein TBasicAttribute bzw davon abgeleitetes attribut zurück. dieses object hat eine property, setze ich da nun ein value und rufe dann die function "getAttribute" wieder auf, hat das gleiche attribut vom gleichen object wieder den default wert ? gibt es denn keine möglichkeit attributen einen wert nachträglich zu setzen und dieses veränderten wert nachträglich wieder ab zu fragen ? es ist mir auch bewusst, dass hier die attribute auf die klasse bezieht und nicht auf das object selst, aber gibt es eine möglichkeit atribute an objecte zu binden ?

hoffe meine ausführung ist ansatzweise nachvollziehbar ? würde mich über eine antwort freuen...

greez & thx, sky...
  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
 
#2

AW: D2010 RTTI besitzt ein object scope ?

  Alt 10. Jun 2010, 22:07
Attribute sind nur an eine Klasse gebunden, nicht an ein Objekt.

Und nein, soweit ich weiß, kannst du zur Lautzeit nicht an den Attributen herumschrauben.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (10. Jun 2010 um 22:15 Uhr)
  Mit Zitat antworten Zitat
skydiablo

Registriert seit: 15. Mär 2004
Ort: Wismar
17 Beiträge
 
#3

AW: D2010 RTTI besitzt ein object scope ?

  Alt 10. Jun 2010, 22:37
soweit ich weiß, kannst du zur Lautzeit nicht an den Attributen herumschrauben.
also man kann durchaus attribute wie ganz normale klassen/objecte benutzen... zB könnte man ein validator so hinterlegen. aber egal, nicht das thema hier. das einzige was ich nun in der richtung gefunden habe ist, wenn man vielleicht das "TRttiType" object und die eigentliche klasse/object mit einander verknüpft, und bei weiteren RTTI abfragen immer dieses "TRttiType" object nutzen würde, so bleiben die änderungen in den propertys der attribute erhalten... ob das nun im sinne des erfinders ist, wäre jetzt noch fraglich...

greez & thx, sky...
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: D2010 RTTI besitzt ein object scope ?

  Alt 11. Jun 2010, 08:06
also man kann durchaus attribute wie ganz normale klassen/objecte benutzen... zB könnte man ein validator so hinterlegen. aber egal, nicht das thema hier. das einzige was ich nun in der richtung gefunden habe ist, wenn man vielleicht das "TRttiType" object und die eigentliche klasse/object mit einander verknüpft, und bei weiteren RTTI abfragen immer dieses "TRttiType" object nutzen würde, so bleiben die änderungen in den propertys der attribute erhalten... ob das nun im sinne des erfinders ist, wäre jetzt noch fraglich...
Dein Problem ist, dass du bei jedem Aufruf von getAttribute ein neues TRttiType Objekt erstellst, bei welchem auch wieder die Attribute Objekte erstellt werden. Würdest du hierbei eine Art Cache aufbauen, wo du alle jemals abgefragten TRttiType Objekte vorhälst und zuerst dort nachschaust, dann würden auch deine Attribute Objekte am leben bleiben.

Außerdem eine Warnung, was die Benutzung von TRttiContext mit Caching von Rtti-Objekten angeht. Benutz dafür eine globale Variable und gib ihn nicht als Parameter in Funktionen, ansonsten fliegt dir nämlich das Ding um die Ohren.

Delphi-Quellcode:
var
  TypeCache: TList<TRttiType>;
  ctx: TRttiContext;

function getAttribute(obj: TObject; attributeClass: TClass): TBasicAttribute;
var
  t: TRttiType;
  p: TRttiProperty;
  a: TCustomAttribute;
begin
  result := nil;
  try
    t := nil;
    for t in TypeCache do
    begin
      if t.ClassName = obj.ClassName then
      begin
        Break;
      end;
    end;
    if not Assigned(t) then
    begin
      t := ctx.GetType(obj.ClassType);
      TypeCache.Add(t);
    end;
    for p in t.GetProperties do
      for a in p.GetAttributes do
        if a is attributeClass then
        begin
          result := a as TBasicAttribute;
          exit;
        end;
  finally
  end;
end;

...

initialization
  if not Assigned(TypeCache) then
  begin
    TypeCache := TList<TRttiType>.Create;
  end;

finalization
  if Assigned(TypeCache) then
  begin
    TypeCache.Free;
  end;

end.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (11. Jun 2010 um 08:50 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:29 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