AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Object kopieren

Ein Thema von Hobbycoder · begonnen am 28. Apr 2017 · letzter Beitrag vom 28. Apr 2017
Antwort Antwort
Seite 1 von 2  1 2      
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

Object kopieren

  Alt 28. Apr 2017, 12:37
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?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von TBx (28. Apr 2017 um 13:11 Uhr) Grund: Schreibfehler im Titel korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#2

AW: Onject kopieren

  Alt 28. Apr 2017, 12:44
Meines Wissens ist der einzig korrekte Weg die Implementierung von Assign.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#3

AW: Onject kopieren

  Alt 28. Apr 2017, 12:45
Meines Wissens ist der einzig korrekte Weg die Implementierung von Assign.

Sherlock
Doof...das macht so viel Arbeit
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Onject kopieren

  Alt 28. Apr 2017, 12:50
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
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Onject kopieren

  Alt 28. Apr 2017, 12:55
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#6

AW: Onject kopieren

  Alt 28. Apr 2017, 13:01
per RTTI:

Man kann auch die Serialisierung von TPersistent/TComponent verwenden.
TWriter, TReader und ein TMemoryStream
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Object kopieren

  Alt 28. Apr 2017, 13:28
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).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Onject kopieren

  Alt 28. Apr 2017, 13:40
Meines Wissens ist der einzig korrekte Weg die Implementierung von Assign.

Sherlock
Doof...das macht so viel Arbeit
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.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
741 Beiträge
 
#9

AW: Object kopieren

  Alt 28. Apr 2017, 13:42
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.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#10

AW: Object kopieren

  Alt 28. Apr 2017, 13:45
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 Uhr.
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