![]() |
RTTI Problem
Hallo,
ich versuche gerade mein Glück mit Rtti und habe mir mit Hilfe der Hilfe diesen Code zusammengestoppelt, der jedoch leider nicht funktioniert:
Delphi-Quellcode:
Was geht nicht?
procedure TProduct.Assign(Product: IProduct);
var LContext : TRttiContext; LInstanceType : TRttiInstanceType; LType : TRttiType; LInterface : TRttiInterfaceType; Props : TArray<TRttiProperty>; Value : TValue; begin LContext := TRttiContext.Create; try LType := LContext.GetType(TProduct); LInstanceType := LType.AsInstance; LInstanceType.GetInterface(TGUID.Create('{108A3B28-575B-423F-AE2E-1D8354E3289C}'), LInterface); Props := LInterface.GetProperties; end; LInterface ist nil, also scheitert GetInterface. Das IProduct Interface besitzt jedoch die im Code angegebene GUIID und wenn ich da rein debugge wird diese GUIID scheinbar auch richtig erzeugt. Nur das Interface wird intern irgendwie nicht gefunden. Nein, RTTI Hab' ich in der betreffenden Unit nicht ausgemacht. IProduct erbt von einem anderen selbst definierten Interface, das hat aber seine eigene GUID und erbt nicht weiter (bzw. IInterface). Woran liegt das, dass das nicht gefunden wird? Das Programm benutzt zur Laufzeit schließlich erfolgreich jede Menge IProducts... |
AW: RTTI Problem
Der Aufruf LInstanceType.GetInterface versucht das gefragte Interface von LInstanceType (also einer Instanz von TRttiInstanceType) zu bekommen. GetInterface ist in TObject deklariert und hat mit RTTI überhaupt nichts zu tun.
Ich bin mir noch nicht ganz sicher was du erreichen willst, daher kann ich nicht sagen wie es richtig wäre. |
AW: RTTI Problem
Ok, was ich erreichen will ist eigentlich einfach:
- ermittle eine Liste aller Properties des IProduct Interfaces - iteriere durch die Liste - lies den jeweiligen property Wert des Product: IProduct parameters - weise diesen dem selben Property der self Instanz zu (die ist ja auch ein TProduct und somit ein IProduct) |
AW: RTTI Problem
Zitat:
![]() |
AW: RTTI Problem
Ok, wen das so ist, muss ich es halt "zu Fuß" umsetzen.
Geht auch, man muss halt nur bei jeder Erweiterung dran denken das nachzuziehen... |
AW: RTTI Problem
Edit:
War quatsch |
AW: RTTI Problem
Zitat:
|
AW: RTTI Problem
Nja, interfaces besitzen offiziell ja auch keine Property, auch wenn mehrere Compiler sowas anbieten (teilweise auch automatisch, für GetXXX- und SetXXX-Methoden).
OK, in der Interfacedeklaration kann es somit nicht drin sein, aber hätte eigentlich dennoch erwartet, dass es Delpgi dennoch in der RTTI auflistet. :shock: Bei Records, welche eventuell irgendwann mal erweitert werden, füge ich manchmal an solchen Stellen ein
Delphi-Quellcode:
(oder Hint/Error) ein.
{$IF SizeOf(TMyRecord) <> 123} {MESSAGE Warn 'guck ma'} {$IFEND}
Ist das ein eigenes Interface? Hier wäre es dann vielleicht einfacher, wenn du dir einen anderen Standard ansiehts. ( ![]() Keine Ahnung, ob man für Interfaces auch einen Record-Helper schreiben könnte, falls es nichts Eigenes ist. |
AW: RTTI Problem
Zitat:
Zitat:
|
AW: RTTI Problem
Für den Zweck könnte man auch einen Pascal-Skriptparser verwenden. Wenn man die Units mit den Interfaces im Buildprozess als Ressource anhängt, kann man die Informationen von dort ziehen. Da die gleichen Dateien auch zum Kompilieren verwendet werden, sind die Daten auch immer aktuell.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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