AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zwei Objekte einer Klasse werden beide geändert

Zwei Objekte einer Klasse werden beide geändert

Ein Thema von Ykcim · begonnen am 8. Jan 2014 · letzter Beitrag vom 9. Jan 2014
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#1

Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 17:32
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 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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 17:37
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...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 17:46
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
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 17:50
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 17:51
Mit dieser Zeile 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 ReportMemoryLeaksOnShutdown := True; ein. Somit siehst du, welche Klassen beim Beenden deines Programms nicht sauber wieder freigegeben wurden.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.752 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 17:56
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
Klaus
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 18:35
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 8. Jan 2014, 18:38
Mit dieser Zeile 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 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.


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?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 9. Jan 2014, 09:12
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
Patrick
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Zwei Objekte einer Klasse werden beide geändert

  Alt 9. Jan 2014, 09:56
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:43 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