![]() |
AW: Daten zwischen Klassen übertragen (mit RTTI?)
Geht es hiermit?
Delphi-Quellcode:
Mein Originalcode sieht etwas anders aus, daher kann es sein, dass es nicht auf Anhieb funktioniert.
uses System.Rtti;
... procedure TDeineKlasse.AssignProps(Source: TObject); var ctxSrc: TRttiContext; ctxDest: TRttiContext; rtSrc: TRttiType; rtDest: TRttiType; propSrc: TRttiProperty; propDest: TRttiProperty; begin ctxSrc := TRttiContext.Create; try ctxDest := TRttiContext.Create; try rtSrc := ctxSrc.GetType(Source.ClassType); rtDest := ctxDest.GetType(ClassType); for propSrc in rtSrc.GetProperties do begin propDest := rtDest.GetProperty(propSrc.Name); if Assigned(propDest) and (propDest.PropertyType = propSrc.PropertyType) then if propDest.IsWritable then propDest.SetValue(self, propSrc.GetValue(Source)); end; finally ctxDest.Free; end; finally ctxSrc.Free; end; end; |
AW: Daten zwischen Klassen übertragen (mit RTTI?)
Super, dass funktioniert! :thumb:
Code:
Könnte man anstatt auf die Properties auf dem gleichen Weg auch auf die (privaten) Variablen zugreifen?
MyClass1.AssignProps(myClass2);
|
AW: Daten zwischen Klassen übertragen (mit RTTI?)
Ganz ehrlich: keine Ahnung. Du könntest es aber mal mit GetFields etc. versuchen.
|
AW: Daten zwischen Klassen übertragen (mit RTTI?)
Urgs, bitte nicht über RTTI, die blind einfach alles rüberschaufelt. Damit handelt man sich bloß Probleme ein.
Leite die Klasse wie bereits erwähnt von TPersistent ab und benutz das bewährte Verfahren mit Assign/AssignTo. |
AW: Daten zwischen Klassen übertragen (mit RTTI?)
Alternativ könnte man es auch über einen Record abdecken:
Delphi-Quellcode:
TMyRec = record
Data1: String; Data2: Integer; end; TMyClass1 = class public Data: TMyRec; constructor Create; property Data1: String read Data.Data1 write Data.Data1; property Data2: Integer read Data.Data2 write Data.Data2; end; TMyClass2 = class(TMyClass1) end;
Delphi-Quellcode:
Mit diesem Record kann man dann jede Klasse ausstatten, die diese Eigenschaften haben soll.
..
myC1 := TMyClass1.Create; myC2 := TMyClass2.Create; try myC1.Data1 := 'myC1'; myC2.Data := myC1.Data; //damit wird der Record kopiert myC1.Data1 := 'was anderes'; finally myC2.Free; nyC1.Free; end; |
AW: Daten zwischen Klassen übertragen (mit RTTI?)
Hallo,
Zitat:
Zitat:
Delphi-Quellcode:
ruft
TPersistent.Assign(Source: TPersistent)
Delphi-Quellcode:
auf. Und die Implementierung von AssignTo in TPersistent wirft eine Exception.
Source.AssignTo(Self)
Zitat:
Delphi-Quellcode:
Und AssignTo überschreibt man, wenn man in der Zielklasse keine Änderung vornehmen kann oder in der Zielklasse die Quellklasse nicht zur Verfügung hat.
type
TMyClass1 = class(TPersistent) public Nr : Integer; NachName : string; Vorname : string; Telnr : string; procedure Assign(Source: TPersistent); override; end; TMyClass2=Class(TMyClass1) public PLZ : string; FremdNr : Integer; procedure Assign(Source: TPersistent); override; end; implementation { TMyClass1 } procedure TMyClass1.Assign(Source: TPersistent); begin if Source is TMyClass1 then Nr := TMyClass1(Sender).Nr; NachName:= TMyClass1(Sender).NachName; Vorname := TMyClass1(Sender).Vorname; Telnr := TMyClass1(Sender).Telnr; end else inherited; end; { TMyClass2 } procedure TMyClass2.Assign(Source: TPersistent); begin if Source is TMyClass2 then inherited; PLZ := TmyClass2(Sender).PLZ; FremdNr := TmyClass2(Sender).FremdNr; end else inherited; end; einbeliebigername. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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