![]() |
Objektreferenzen unterbinden
Hallo, ich hoffe ihr könnt mir helfen.
Ich habe folgende Klasse erstellt:
Delphi-Quellcode:
TetrisPiece = class
Piece : Array Of Tpoint; block: boolean; rotatemode: integer; end; Damit folgende Variablen.
Delphi-Quellcode:
Diese mit
aktuell, temp : TetriesPiece;
Delphi-Quellcode:
erzeugt.
aktuell := TetrisPiece.Create;
temp := TetrisPiece.Create; Nun werden beide "Variablen" gefüllt. An einer stelle weise ich aktuell := temp; zu, da ich möchte, dass in aktuell die werte von temp stehen. Temp soll dann neue werte bekommen. Mein Problem ist, dass ich mit der anweisung(dick) die beiden Variablen irgendwie verbinde. Also sie haben beide dauerhaft dieselben Werte. Wie kann ich das unterbinden, sodass ich die Werte übertrage aber keine Objektreferenz erzeuge ?. ____ Grüße aus dem Norden, stiftII |
Re: Objektreferenzen unterbinden
Objekte sind Zeiger. Du weißt also aktuell den Zeiger von temp zu. Damit zeigen beide auf den gleichen Speicherbereich. Du musst akteull entweder manuell die Werte von temp zuweisen. Oder die Klasse von TPersistant ableiten und die Methode assign überschreiben.
|
Re: Objektreferenzen unterbinden
Zitat:
Wie überschreibe ich assign ?, bzw. womit überschreibe ich assign ? ~stiftII |
Re: Objektreferenzen unterbinden
Mit deinem eigenen Code zum Zuweisen der Eigenschaften.
|
Re: Objektreferenzen unterbinden
Klappt alles wunderbar : D
:dp: |
Re: Objektreferenzen unterbinden
Dann stell doch bitte noch deinen Code hier ein für andere.
|
Re: Objektreferenzen unterbinden
Ansonsten ginge auch noch der gute alte Record:
Delphi-Quellcode:
und schon klappt das mit dem Zuweisen auch.
TetrisPiece = record
Piece : Array Of Tpoint; block: boolean; rotatemode: integer; end; Welche Delphi-Version nutzt du denn? Ab Delphi 2006 (Turbo Delphi) kann kann Records ja auch Funktionen und Operatoren verpassen ... damit lassen sich die tollsten Dinge veranstalten. > ![]() > ![]() > ![]() |
Re: Objektreferenzen unterbinden
Hallo.
Ich nutze delphi 7. Habs so gemacht.. gibts da was zu beanstanden ?
Delphi-Quellcode:
und das ganze dann eben wie Luckie schon gesagt hat mit Assign zuweisen.
TetrisPiece = class(TPersistent)
private Piece : Array Of Tpoint; block: boolean; rotatemode: integer; procedure Assign(Source: TPersistent); override; end; .... procedure Tetrispiece.Assign(Source: TPersistent); begin if (source is TetrisPiece) then begin self.Piece := (source as tetrispiece).Piece; self.block := (source as tetrispiece).block; self.rotatemode := (source as tetrispiece).rotatemode; end else inherited; end;
Delphi-Quellcode:
aktuell.assign(temp);
Hey, das mit den records ist natürlich auch klasse : D. In meinem Fall vllt sogar angebracht. Danke nochmal für die Hilfe. ~stift II |
Re: Objektreferenzen unterbinden
Hallo,
Zitat:
Delphi-Quellcode:
Machst du das nicht, zeigen beide Referenzen auf ein Array. Jede Änderung in einem Array verändert dann auch die Werte des anderen Arrays. Diese Verbindung wird erst durch eine Längenänderung eines der beiden Arrays aufgehoben. Durch die Copy-Funktion werden direkt unabhängige Variablen angelegt.
// self.Piece := (source as tetrispiece).Piece;
Self.Piece := Copy((source as tetrispiece).Piece); Auch bei der Verwendung der Records ist die Copy-Funktion zum Übertragen des dynamischen Arrays notwendig! Gruß Hawkeye |
Re: Objektreferenzen unterbinden
Wow, das hätte übel enden können, haha :D
Vielen Dank für den Hinweis!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz