Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Object kopieren (https://www.delphipraxis.net/192545-object-kopieren.html)

Hobbycoder 28. Apr 2017 11:37


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 http://www.delphipraxis.net/758952-post18.html
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?

Sherlock 28. Apr 2017 11:44

AW: Onject kopieren
 
Meines Wissens ist der einzig korrekte Weg die Implementierung von Assign.

Sherlock

Hobbycoder 28. Apr 2017 11:45

AW: Onject kopieren
 
Zitat:

Zitat von Sherlock (Beitrag 1369380)
Meines Wissens ist der einzig korrekte Weg die Implementierung von Assign.

Sherlock

Doof...das macht so viel Arbeit :twisted:

Poelser 28. Apr 2017 11:50

AW: Onject kopieren
 
Moin,

ich dupliziere mit Hilfe der Unit TypInfo:
Delphi-Quellcode:
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;
Nicht zu vergessen: Das geht nicht mit TObject, du musst von TPersistent erben. Diese Prozedur erstellt auch kein Objekt, das muss vorher schon bestehen.

HTH, Poelser

Der schöne Günther 28. Apr 2017 11:55

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:

himitsu 28. Apr 2017 12:01

AW: Onject kopieren
 
per RTTI:

Man kann auch die Serialisierung von TPersistent/TComponent verwenden.
TWriter, TReader und ein TMemoryStream

Union 28. Apr 2017 12:28

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).

Aviator 28. Apr 2017 12:40

AW: Onject kopieren
 
Zitat:

Zitat von Hobbycoder (Beitrag 1369381)
Zitat:

Zitat von Sherlock (Beitrag 1369380)
Meines Wissens ist der einzig korrekte Weg die Implementierung von Assign.

Sherlock

Doof...das macht so viel Arbeit :twisted:

Wenn das wirklich so viel Arbeit macht, dann solltest du dir evtl. auch Gedanken darüber machen, deinen Code etwas zu refactorn. Mache aus deinem großen Object mehrere sinnvoll zueinandergehörende kleinere Objects. Da ist dann zwar trotzdem einmal die Arbeit fällig für jedes Object eine Assign() Methode zu schreiben, aber der Gesamtüberblick wird dadurch wesentlich besser. Ich vermute ja mal, dass wir hier nicht nur von 20 Properties reden. Weil das wäre eine Anzahl für die es nicht so aufwendig wäre, eine Assign Methode zu schreiben.

Olli73 28. Apr 2017 12:42

AW: Object kopieren
 
Zitat:

Zitat von Union (Beitrag 1369386)
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).

Mit RTTI kann man doch auch direkt auf die Felder zugreifen? (Habe damit keine praktische Erfahrung, aber habe es so verstanden.)

himitsu 28. Apr 2017 12:45

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 22:23 Uhr.
Seite 1 von 2  1 2      

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