![]() |
Object kopieren
Hi,
ich möchte eine Kopie eines relative aufwendigen Objectes erstellen. Sicherlich könnte ich das über entsprechende Assign-Methoden machen, aber vielleicht geht es ja auch einfacher. Über SuFu habe ich dieses gefunden ![]() Allerding wird dort als Klasse TcomponentChild angegeben. Soweit ich in der Hilfe gelesen habe können so Objecte die von TComponent abgeleitet sind, einfach kopiert werden. Meine Objecte sind aber von TObject abgeleitet. Könnte sowas nicht auch bei TObject funktionieren? Der Beitrag ist ja auch 2008. Vielleicht haben ja die neueren Delphiversionen sowas an Bord? |
AW: Onject kopieren
Meines Wissens ist der einzig korrekte Weg die Implementierung von Assign.
Sherlock |
AW: Onject kopieren
Zitat:
|
AW: Onject kopieren
Moin,
ich dupliziere mit Hilfe der Unit TypInfo:
Delphi-Quellcode:
Nicht zu vergessen: Das geht nicht mit TObject, du musst von TPersistent erben. Diese Prozedur erstellt auch kein Objekt, das muss vorher schon bestehen.
class procedure TObjHelper.CopyObject(Source, Destination: TPersistent);
var TypInfo: PTypeInfo; PropList: TPropList; PropCount, i: integer; Value: variant; begin assert(assigned(Source), 'Source ist NIL'); assert(assigned(Destination), 'Destination ist NIL'); TypInfo := Source.ClassInfo; PropCount := GetPropList(TypInfo, tkAny, @PropList); for i := 0 to PropCount - 1 do begin Value := GetPropValue(Source, string(PropList[i].Name)); SetPropValue(Destination, string(PropList[i].Name), Value); end; end; HTH, Poelser |
AW: Onject kopieren
Um einen Ersatz für das zu schaffen was sich z.B. als clone() in Java oder MemberwiseClone() in .NET für "Shallow Copies" etabliert hat könnte man in Delphi mit der RTTI etwas basteln.
Gibt bestimmt etwas von irgendeinem Fan schon fertig, in der Standard Delphi-Library kenne ich bis heute nichts. Aber wenn ich so etwas in Delphi brauche mache ich das eigentlich auch immer von Hand. Nicht vergessen die Unit-Tests dafür bei jeder Änderung anzupassen :wink: |
AW: Onject kopieren
per RTTI:
Man kann auch die Serialisierung von TPersistent/TComponent verwenden. TWriter, TReader und ein TMemoryStream |
AW: Object kopieren
Dabei ist auch immer die Frage, ob Seiteneffekte erwünscht sind. Wird z.B. über RTTI eine Property gesetzt, die einen Setter hat, so wird dieser auch ausgeführt (natürlich genauso der Getter des Quellobjekts). Sauberer ist auf jeden Fall eine TPersistent-Ableitung mit Assign() und AssignTo. In Sonderfällen kann jedoch auch ein byteweises Kopieren sinnvoller sein (eben um Seiteneffekte zu verhindern).
|
AW: Onject kopieren
Zitat:
|
AW: Object kopieren
Zitat:
|
AW: Object kopieren
Ja, je nach Einstellung, kann man bis hin zu Provate auf Felder, Property und Methoden zugreifen.
Die alte RTTI kennt nur Pubished . Und TReader/TWriter speichert davon nur die Property und die vom Entwickler definierten "virtuellen" Property. (siehe die Property Top und Left bei den NonVisual-Components ala TTimer) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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 by Thomas Breitkreuz