Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objektreferenzen unterbinden (https://www.delphipraxis.net/147638-objektreferenzen-unterbinden.html)

stiftII 12. Feb 2010 22:11


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:
aktuell, temp : TetriesPiece;
Diese mit

Delphi-Quellcode:
aktuell := TetrisPiece.Create;
temp := TetrisPiece.Create;
erzeugt.



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

Luckie 12. Feb 2010 22:14

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.

stiftII 12. Feb 2010 22:22

Re: Objektreferenzen unterbinden
 
Zitat:

Zitat von Luckie
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.

Vielen dank für die schnelle Antwort. Das macht alles Sinn! :)

Wie überschreibe ich assign ?, bzw. womit überschreibe ich assign ?

~stiftII

Luckie 12. Feb 2010 22:25

Re: Objektreferenzen unterbinden
 
Mit deinem eigenen Code zum Zuweisen der Eigenschaften.

stiftII 12. Feb 2010 22:41

Re: Objektreferenzen unterbinden
 
Klappt alles wunderbar : D

:dp:

Luckie 12. Feb 2010 22:42

Re: Objektreferenzen unterbinden
 
Dann stell doch bitte noch deinen Code hier ein für andere.

himitsu 12. Feb 2010 22:51

Re: Objektreferenzen unterbinden
 
Ansonsten ginge auch noch der gute alte Record:
Delphi-Quellcode:
TetrisPiece = record
  Piece : Array Of Tpoint;
  block: boolean;
  rotatemode: integer;
end;
und schon klappt das mit dem Zuweisen auch.


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.
> http://www.delphipraxis.net/internal...t.php?t=169966
> http://www.delphipraxis.net/internal...t.php?t=159592
> http://www.delphipraxis.net/internal...t.php?t=151373

stiftII 12. Feb 2010 23:06

Re: Objektreferenzen unterbinden
 
Hallo.

Ich nutze delphi 7.

Habs so gemacht.. gibts da was zu beanstanden ?

Delphi-Quellcode:
  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;
und das ganze dann eben wie Luckie schon gesagt hat mit Assign zuweisen.

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

Hawkeye219 12. Feb 2010 23:26

Re: Objektreferenzen unterbinden
 
Hallo,
Zitat:

Zitat von stiftII
Habs so gemacht.. gibts da was zu beanstanden ?

ja, eine Kleinigkeit: das dynamische Array musst du mit Hilfe der Copy-Funktion kopieren:

Delphi-Quellcode:
//  self.Piece := (source as tetrispiece).Piece;
  Self.Piece := Copy((source as tetrispiece).Piece);
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.

Auch bei der Verwendung der Records ist die Copy-Funktion zum Übertragen des dynamischen Arrays notwendig!

Gruß Hawkeye

stiftII 13. Feb 2010 00:13

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 09:35 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