Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigenes Objekt kopieren (https://www.delphipraxis.net/195406-eigenes-objekt-kopieren.html)

Jakane 26. Feb 2018 11:37

Delphi-Version: 5

Eigenes Objekt kopieren
 
Hallo liebe Delphi-Helfer :)

Ich nutze für mein Projekt verschiedene selbst gebaute Objekte.
z. B.:
Code:
  TAufgabe = class(TObjekt)
  private
  public
    Projekt: TProjekt;
    Anforderung: String;
    VonMitarbeiter: TMitarbeiter;
    FuerMitarbeiter: TMitarbeiter;
    Mitarbeitergruppe: TMitarbeitergruppe;
    Hauptaufgabennummer: Integer;
    Taetigkeitstyp: TTaetigkeitstyp;
    Status: TAufgabenstatus;
    Allgemein: Boolean;
    Gesehen: Boolean;
    Prioritaet: Integer;
  end;
Gibt es eine einfache Möglichkeit so ein Objekt 1:1 zu kopieren, ohne das ich Funktionen schreiben um jeden einzelnen Wert zu übergeben?
Code:
procedure TAufgabeBearbeitenF.FormShow(Sender: TObject);
begin
  // Aufgabe laden
  AufgabeAlt := TAufgabe.LoadFromDatabase(Aufgabennummer, PV.Mitarbeiter.Nummer);
  AufgabeNeu := AufgabeAlt;
  AufgabeAlt.Version := '123';
  AufgabeNeu.Version := '456';
  ShowMessage(AufgabeAlt.Version + ' ' + AufgabeNeu.Version);
Als ShowMessage kommt so leider "456 456" raus statt "123 456"

mkinzler 26. Feb 2018 11:43

AW: Eigenes Objekt kopieren
 
Ja, über die Methode Assign.

Jakane 26. Feb 2018 11:44

AW: Eigenes Objekt kopieren
 
Diese Objekte beherschen Assign nicht.
Hatte ich schon versucht :(

Zacherl 26. Feb 2018 11:45

AW: Eigenes Objekt kopieren
 
Zitat:

Zitat von Jakane (Beitrag 1394659)
Gibt es eine einfache Möglichkeit so ein Objekt 1:1 zu kopieren, ohne das ich Funktionen schreiben um jeden einzelnen Wert zu übergeben?

Zitat:

Zitat von mkinzler (Beitrag 1394661)
Ja, über die Methode Assign.

Selbst wenn
Delphi-Quellcode:
Assign
unterstüzt wird (dafür einfach von
Delphi-Quellcode:
TPersistent
ableiten), muss man
Delphi-Quellcode:
AssignTo
trotzdem per Hand implementieren, was der TE scheinbar vermeiden möchte.

Eine sowohl performante, als auch 100% zuverlässige generische Möglichkeit habe ich bis heute auch nicht gefunden. Manchmal funktioniert das einfache Kopieren des Speichers (aber nur dann, wenn keine Strings, Objektreferenzen, etc. verwendet werden). Auch möglich wäre es die einzelnen Felder per RTTI zu kopieren. In meinem Falle war das aber auch nicht das gelbe vom Ei.

mkinzler 26. Feb 2018 11:50

AW: Eigenes Objekt kopieren
 
Zitat:

Selbst wenn Assign unterstüzt wird (dafür einfach von TPersistent ableiten), muss man AssignTo trotzdem per Hand implementieren, was der TE scheinbar vermeiden möchte.
Zitat:

Gibt es eine einfache Möglichkeit so ein Objekt 1:1 zu kopieren, ohne das ich Funktionen schreiben um jeden einzelnen Wert zu übergeben?
Es muss ja nicht jeder einzelne Wert übergeben werden. Man muss der Klasse natürliche eine individuell implementierte Methode verpassen.

Jakane 26. Feb 2018 11:51

AW: Eigenes Objekt kopieren
 
Ja, um jeden Wert manuell zu kopieren brauch ich kein Assign.
Hab dann aber unzähliche Zeilen Code ...

Code:
Wert := pcObjekt.Wert
Aufwändig...

himitsu 26. Feb 2018 11:54

AW: Eigenes Objekt kopieren
 
Published Property kann man auch per TWriter und TReader kopieren.

Aber was spricht gegen ein manuelles Überschreiben von AssignTo oder Assign? Das ist schließlich das "Standard"-Vorgehen.
(innerhalb des selben Objektes fast egal wo ... von einer Klasse in eine andere, da kommt es drauf an wer von Beiden kopieren soll)
Es ist erstmal egal, ob es manuell definiert ist ... der Vorteil ist eine "standardisierte" und zentralisierte Methode und dass das Kopieren darin nur einmal implementiert ist, anstatt überall immer jeden Wert einzeln kopieren zu müssen.

Und wenn nicht von TPersistent abgeleitet, dann hindert niemand einen, dass man sich selber eine Assign-Methode implementiert.

Der schöne Günther 26. Feb 2018 11:56

AW: Eigenes Objekt kopieren
 
Zuallererst musst du dir klar werden ob du eine flache oder tiefe Kopie erwartest. Sprich: Wenn du eine Kopie von
Delphi-Quellcode:
TAufgabe
erstellst - Ist der darin enthaltene
Delphi-Quellcode:
VonMitarbeiter
eine Referenz auf die gleiche Instanz wie im Original oder ein komplett neuer
Delphi-Quellcode:
TMitarbeiter
?
https://de.wikipedia.org/wiki/Objektkopie

Nachdem du wahrscheinlich zum Schluss kommst dass du eine flache Kopie möchtest kannst du im Internet schauen und enttäuscht feststellen dass Delphi im Standardumfang hier einem (im Gegensatz zu anderen Tools) leider keine Arbeit abnimmt.

Jakane 26. Feb 2018 12:35

AW: Eigenes Objekt kopieren
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1394668)
Nachdem du wahrscheinlich zum Schluss kommst dass du eine flache Kopie möchtest kannst du im Internet schauen und enttäuscht feststellen dass Delphi im Standardumfang hier einem (im Gegensatz zu anderen Tools) leider keine Arbeit abnimmt.

Leider irrst du dich da, ich will auch das TMitarbeiter kopiert wird.

Der schöne Günther 26. Feb 2018 12:41

AW: Eigenes Objekt kopieren
 
Hätte ich jetzt nicht erwartet, aber du weißt das natürlich besser. Also willst du eine tiefe Kopie.

Hier kann dir Delphi immerhin über Umwege etwas abnehmen indem du dein Objekt erst "serialisiert" und von dieser Serialisierung dann wieder zurück eine neue Instanz erstellst.

Das hängt nun aber auch davon ab welche Delphi-Version du benutzt, wenn ich nicht vollkommen falsch liege gibt es das erst ab der Enterprise-Version (nicht Pro). Oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 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