![]() |
Referenz auf Recordtyp, wie TClass für Klassen
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:
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.
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; 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? |
Re: Referenz auf Recordtyp, wie TClass für Klassen
Habe gerade einen, imho unschönen, Workaround gefunden:
Delphi-Quellcode:
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.
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; |
Re: Referenz auf Recordtyp, wie TClass für Klassen
Wenn ich das so richtig seh, bekonnst du hierbei nicht mehr Infos, als mit der "alten" RTTI ... es ist nur etwas "einfacher".
Delphi-Quellcode:
.Name liefert den Namen des Property
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; .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. |
Re: Referenz auf Recordtyp, wie TClass für Klassen
Der Aufbau ist nicht das Problem, ich wollte vielmehr folgendes machen, was aber bisher nicht klappt :?
Delphi-Quellcode:
Ich hoffe, damit ist klar, was ich meine.
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; |
Re: Referenz auf Recordtyp, wie TClass für Klassen
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 :stupid: ) |
Re: Referenz auf Recordtyp, wie TClass für Klassen
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.
|
Re: Referenz auf Recordtyp, wie TClass für Klassen
Delphi-Quellcode:
if (prop.PropertyType.Handle = System.TypeInfo(RString)) then
|
Re: Referenz auf Recordtyp, wie TClass für Klassen
also echt mal ... hinter Handle haben die sowas echt gut versteckt :shock:
|
Re: Referenz auf Recordtyp, wie TClass für Klassen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 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