AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objektreferenzen unterbinden

Ein Thema von stiftII · begonnen am 12. Feb 2010 · letzter Beitrag vom 13. Feb 2010
Antwort Antwort
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#1

Objektreferenzen unterbinden

  Alt 12. Feb 2010, 23:11
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Objektreferenzen unterbinden

  Alt 12. Feb 2010, 23:14
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#3

Re: Objektreferenzen unterbinden

  Alt 12. Feb 2010, 23:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Objektreferenzen unterbinden

  Alt 12. Feb 2010, 23:25
Mit deinem eigenen Code zum Zuweisen der Eigenschaften.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#5

Re: Objektreferenzen unterbinden

  Alt 12. Feb 2010, 23:41
Klappt alles wunderbar : D

  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Objektreferenzen unterbinden

  Alt 12. Feb 2010, 23:42
Dann stell doch bitte noch deinen Code hier ein für andere.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Objektreferenzen unterbinden

  Alt 12. Feb 2010, 23:51
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
$2B or not $2B
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#8

Re: Objektreferenzen unterbinden

  Alt 13. Feb 2010, 00:06
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.

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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Objektreferenzen unterbinden

  Alt 13. Feb 2010, 00:26
Hallo,
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
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#10

Re: Objektreferenzen unterbinden

  Alt 13. Feb 2010, 01:13
Wow, das hätte übel enden können, haha

Vielen Dank für den Hinweis!!
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:22 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