AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Referenz auf Recordtyp, wie TClass für Klassen
Thema durchsuchen
Ansicht
Themen-Optionen

Referenz auf Recordtyp, wie TClass für Klassen

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

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

Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 08:33
Hallo zusammen,

ich habe im Moment das Problem, dass ich via RTTI eine Property setzen will, welche in Record ist. Nun sollte ich ja nach Möglichkeit wissen, um welchen Record es sich denn überhaupt handelt. Es gibt bei mir drei Stück: RString, RInteger und RFloat. Hier vorab ein wenig Code:
Delphi-Quellcode:
var
  context : TRttiContext;
  typeInfo : TRttiType;
  prop : TRttiProperty;
  recordName : String
begin
  context := TRttiContext.Create();
  typeInfo := context.GetType(obj.ClassType);

  prop := typeInfo.GetProperty('RecordVar');
  recordName := prop.PropertyType.Name); // Liefert z.B. 'RString'

  if (recordName = 'RString') then
    ShowMessage('Juhu')
  else
    ShowMessage('Nicht gut.');
end;
Wie ihr seht ist es ja an sich nicht so schwer an den Name des Records in Form eines Strings zu gelangen und darauf zu reagieren. Was passiert aber, wenn ich RString in RUnicodeString abändere? Dann kommt auf einmal nicht mehr "Juhu" als Meldung, sondern "Nicht gut.". Bei Klassen ist das ja an sich kein Problem, da man hier nicht mit den Namen der Klassen, also als String, sondern mit TClass hantieren würde. Via Refactoring wären Änderungen auch auch schnell passiert.

Aber wie soll man dieses Problem denn sinnvoll mit Records lösen? Ich habe bisher nur die Variante über den String gefunden, welche aber nicht wirklich zufriedenstellend ist! Gibt es ein ähnliches Konstrukt wie TClass für Klassen, nur halt für Records?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  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

Re: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 10:52
Habe gerade einen, imho unschönen, Workaround gefunden:
Delphi-Quellcode:
RString = record
private
  FValue : Variant;
  procedure SetValue(const AVar: Variant),
public
  const RecordName = 'RString'; // Name des Records; muss immer manuel angepasst werden :-/
  const VarType = varString;
  property Value : Variant read FValue write SetValue;
end;

// ---------------------------------
// Wenn ich das nun irgendwo verwende:
var
  context : TRttiContext;
  typeInfo : TRttiType;
  prop : TRttiProperty;
  recordName : String
begin
  context := TRttiContext.Create();
  typeInfo := context.GetType(obj.ClassType);

  prop := typeInfo.GetProperty('RecordVar');
  recordName := prop.PropertyType.Name); // Liefert z.B. 'RString'

  if (recordName = RString.RecordName) then // Hier nun die Prüfung auf den passenden String
    ShowMessage('Juhu')
  else
    ShowMessage('Nicht gut.');
end;
Wenn ich nun RString ändern sollte, so bringt der Compiler einen Fehler, an der Stelle, an der ich dann RString.RecordName verwende. Das ist schon mal etwas besser, da ich dann den String nur einmal ändern muss. Aber so richtig zufrieden bin ich damit immer noch nicht.
»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
Online

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

Re: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 11:10
Wenn ich das so richtig seh, bekonnst du hierbei nicht mehr Infos, als mit der "alten" RTTI ... es ist nur etwas "einfacher".

Delphi-Quellcode:
TTypeInfo = record
  Kind: TTypeKind;
  Name: ShortString;
  {TypeData: TTypeData}
end;

TPropInfo = packed record
  PropType: PPTypeInfo;
  GetProc: Pointer;
  SetProc: Pointer;
  StoredProc: Pointer;
  Index: Integer;
  Default: Longint;
  NameIndex: SmallInt;
  Name: ShortString; // << das dürfte dein prop.PropertyType.Name sein
                      // [edit] nee, isses wohl doch nicht :gruebel:
end;
.Name liefert den Namen des Property

.PropType^.Name liefert den Namen des Types.
.PropType^.Kind müßte tkRecord sein
und eventuell kommst du über das (versteckte) .PropType^.TypeData an weitere Informationen zum Aufbau des Records ran.
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
 
#4

Re: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 11:25
Der Aufbau ist nicht das Problem, ich wollte vielmehr folgendes machen, was aber bisher nicht klappt
Delphi-Quellcode:
RString = record
  { blub }
end;

// ---------------
var
  context : TRttiContext;
  typeInfo : TRttiType;
  prop : TRttiProperty;
  recordName : String
begin
  context := TRttiContext.Create();
  typeInfo := context.GetType(obj.ClassType);

  prop := typeInfo.GetProperty('RecordVar');

  if (prop.GetType() = RString) then // GetType wäre die gewünschte Methode, die den Record-Typen liefert
  begin
    { ... }
  end;
end;
Ich hoffe, damit ist klar, was ich meine.
»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
Online

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

Re: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 11:29
Nja, verstanden hatte ich es schon, aber sowas hab ich noch nicht gesehn, also welches den deiekten Type zurückliefert.
(wie gesagt, vielleicht hilft ja TTypeData etwas weiter )
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: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 11:40
Hm, mal schauen, wie weit ich noch komme. Ich wollte halt keinerlei Objekte verwenden und bei Records bleiben, da mir das etwas umkomplizierter erscheint, zumal eigentlich eh nur Daten im Record gehalten werden und keinerlei großartige Logik nötig 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 Stevie
Stevie

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

Re: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 12:06
if (prop.PropertyType.Handle = System.TypeInfo(RString)) then
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 12:10
also echt mal ... hinter Handle haben die sowas echt gut versteckt
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
 
#9

Re: Referenz auf Recordtyp, wie TClass für Klassen

  Alt 8. Mär 2010, 12:11
Zitat von Stevie:
if (prop.PropertyType.Handle = System.TypeInfo(RString)) then
Klappt wunderbar
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  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 09:45 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