Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zwei Objekte einer Klasse werden beide geändert (https://www.delphipraxis.net/178440-zwei-objekte-einer-klasse-werden-beide-geaendert.html)

Ykcim 8. Jan 2014 16:32

Zwei Objekte einer Klasse werden beide geändert
 
Hallo Zusammen,

ich habe zwei Objekte, die beide von der gleichen Klasse abstammen. Wenn ich jetzt von einem Objekt eine Variable ändere, dann ändert sich diese Variable auch in dem anderen Objekt.

Hintergrund:

Ich habe das Objekt Norm: TNorm
Ich habe das Objekt Norm_Neu: TNorm

Die Daten werden aus der Datenbank in das Objekt Norm und in das Objekt Norm_Neu geladen. Wenn jetzt Daten geändert werden, dann sollen die in den Variablen des Objektes Norm_Neu geändert werden. Wenn gespeichert wird, vergleiche ich die Variablen von Norm und Norm_Neu und mache für die geänderten Variablen das Update-Statement für die Query und protokolliere auch die Änderung.

Problem wie gerade schon beschrieben, wenn die Daten in Norm_Neu durch eine Änderung in der Maske geändert werden
Delphi-Quellcode:
Norm_Neu.Norm_Titel:=Edit_Norm_Titel.Text;
, dann ändert sich nicht nur der Wert der jeweiligen Variable in dem Objekt Norm_Neu, sondern auch in dem Objekt Norm.

Ich hoffe das ist verständlich.

Hat jemand eine Idee, was ich da falsch mache?

Vielen Dank
Patrick

stahli 8. Jan 2014 16:37

AW: Zwei Objekte einer Klasse werden beide geändert
 
Wenn Du folgendes machst:
A := TObject.Create;
B := TObject.Create;
hast Du zwei Objekte (also zwei verschiedene Speicherbereiche).

Wenn Du folgendes machst;
A := TObject.Create;
B := A;
hast Du zwei Variablen, die auf das gleiche Objekt zeigen.

Hilft Dir das? Ansonsten zeige mal etwas Quelltext...

Ykcim 8. Jan 2014 16:46

AW: Zwei Objekte einer Klasse werden beide geändert
 
Hallo, dass hilft mir viellecht wirklich schon weiter.

Ich create zwar beide Objekte einzeln,

Delphi-Quellcode:
initialization
  Norm := TNorm.Create;
  Norm_Neu:= TNorm.Create;
aber ich habe in der Load-Prozedure
Delphi-Quellcode:
Norm_Neu:=Norm;

stehen, weil ich dachte, dass ich auf diese Weise die Daten der Variablen am einfachsten von einem Objekt in das andere kopieren könnte. Aber das scheint dann wahrscheinlich der Fehler zu sein.

Muss ich, um die ganzen Variablen von einem Objekt in das andere zu bekommen das wirklich eins nach dem anderen rüberschaufeln?

Vielen Dank
Patrick

DeddyH 8. Jan 2014 16:50

AW: Zwei Objekte einer Klasse werden beide geändert
 
Prinzipiell schon. Ab TPersistent gibt es 2 Methoden (Assign und AssignTo), die Du dazu überschreiben kannst. Trotzdem musst Du darin dann sagen, was vom Quell- ins Zielobjekt übernommen werden soll. Du musst natürlich nicht zwingend von TPersistent ableiten, sondern kannst Dir auch etwas ähnliches selbst basteln.

Aviator 8. Jan 2014 16:51

AW: Zwei Objekte einer Klasse werden beide geändert
 
Mit dieser Zeile
Delphi-Quellcode:
Norm_Neu:=Norm;
erzeugst du dir Speicherlecks, da deine Objekt-Referenz auf die Variable Norm überschrieben wird. Bau in deiner DPR-Datei mal die Zeile
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := True;
ein. Somit siehst du, welche Klassen beim Beenden deines Programms nicht sauber wieder freigegeben wurden.

Klaus01 8. Jan 2014 16:56

AW: Zwei Objekte einer Klasse werden beide geändert
 
Hallo,

wie werden denn die Daten in den beiden Form angezeigt, durch Datensensitive Controls.
Dann könnte es sein, das Norm_neu die Datenbank updated und Norm diese dann auch anzeigt.

Grüße
Klaus

Ykcim 8. Jan 2014 17:35

AW: Zwei Objekte einer Klasse werden beide geändert
 
Ich habe jetzt das Problem unschön gelöst, indem ich die Load-Anweisung für beide Objekte durchlaufen lasse.

Da es sich nicht um Forms handelt, sondern nur um Objekte, werden an der Stelle noch keine Daten auf DB geändert.

Mit dieser Vorgehensweise läuft es jetzt erst einmal.

Vielen Dank für die Hilfe

Patrick

stahli 8. Jan 2014 17:38

AW: Zwei Objekte einer Klasse werden beide geändert
 
Zitat:

Zitat von Aviator (Beitrag 1242726)
Mit dieser Zeile
Delphi-Quellcode:
Norm_Neu:=Norm;
erzeugst du dir Speicherlecks, da deine Objekt-Referenz auf die Variable Norm überschrieben wird. Bau in deiner DPR-Datei mal die Zeile
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := True;
ein. Somit siehst du, welche Klassen beim Beenden deines Programms nicht sauber wieder freigegeben wurden.

Ich will es mal noch etwas Anfänger-like beschreiben ;-)

Mit Norm_Neu:=Norm überträgst Du lediglich den ZEIGER auf die Speicherstelle wo sich die Objektdaten befinden.
Wenn Du später beide Objektvariablen auflöst wird der Speicher von Norm wieder freigegeben und kann wieder neu benutzt werden.
Der reservierte Speicherplatz für Norm_Neu wird aber nicht mehr freigegeben und es bleibt beim (bzw. bis zum) Programmende blockierter Speicherplatz zurück. Das stört zwar andere Programme nicht, weist aber auf einen Fehler oder zumindest Unsauberkeit im eigenen Programm hin.


Zitat:

Zitat von Ykcim (Beitrag 1242743)
Ich habe jetzt das Problem unschön gelöst, indem ich die Load-Anweisung für beide Objekte durchlaufen lasse.

Da es sich nicht um Forms handelt, sondern nur um Objekte, werden an der Stelle noch keine Daten auf DB geändert.

Mit dieser Vorgehensweise läuft es jetzt erst einmal.

Vielen Dank für die Hilfe

Patrick

Was meinst Du genau? Wenn es läuft ist es schon mal gut, aber vielleicht geht es noch einfacher/besser/sicherer?

Ykcim 9. Jan 2014 08:12

AW: Zwei Objekte einer Klasse werden beide geändert
 
Ich habe in der Klasse eine Procedure erstellt, in der die Load-Anweisung für beide Objekt nacheinander durchgeführt wird. Jetzt rufe ich überall, wo ich die Daten geladen werdem müssen, diese neue Procedure auf. Ich finde die Lösung nicht so schön, weil ich dadurch das gleiche SQL-Statement auf der Datenbank direkt hintereinander ausführe, nur um die gleichen Daten in zwei unterschiedlichen Objekten verfügbar zu haben.

Was ich mir überlegen könnte, dass ich das SQL-Statement und die Verteilung der Daten in die Variablen des Objektes von einaner trenne. Dann könnte ich die Query nur einmal ausführen und die Daten dannach separat in beide Objekte befüllen...

Muss ich mal noch drüber nachdenken.

Vielen Dank
Patrick

Blup 9. Jan 2014 08:56

AW: Zwei Objekte einer Klasse werden beide geändert
 
Zitat:

Zitat von Ykcim (Beitrag 1242719)
Die Daten werden aus der Datenbank in das Objekt Norm und in das Objekt Norm_Neu geladen. Wenn jetzt Daten geändert werden, dann sollen die in den Variablen des Objektes Norm_Neu geändert werden. Wenn gespeichert wird, vergleiche ich die Variablen von Norm und Norm_Neu und mache für die geänderten Variablen das Update-Statement für die Query und protokolliere auch die Änderung.

Es scheint mir sinnvoller das Objekt immer vollständig zu speichern, wenn es den Status "Geändert" hat. Das vereinfacht die Anwendungsentwicklung doch erheblich. Jeweils ein After-Update/Insert/Delete-Trigger in der Datenbank kann feststellen und protokollieren, welche Änderungen dabei tatsächlich aufgetreten sind. Damit lassen sich auch alle Änderungen erfassen, die mehrere Datensätze betreffen.


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