AGB  ·  Datenschutz  ·  Impressum  







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

Record schreibgeschützt weil Feld von Klasse

Ein Thema von Jonas Shinaniganz · begonnen am 22. Nov 2012 · letzter Beitrag vom 23. Nov 2012
Antwort Antwort
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#1

Record schreibgeschützt weil Feld von Klasse

  Alt 22. Nov 2012, 15:08
Zitat:
In Delphi 2010 und höher wird der Fehler E2064 auch vom Compiler ausgegeben, wenn Sie versuchen, einen Wert an einen Member eines Records zuzuweisen, der von einer schreibgeschützten Eigenschaft bereitgestellt wird. Betrachten Sie den folgenden Record-Typ:

TCustomer = record Age: Integer; Name: String; end;
Dieser Record wird von einer schreibgeschützten Eigenschaft in der folgenden Klasse bereitgestellt:

TExposing = class ... CurrentCustomer: TCustomer read SomeInternalField; ... end;
Die Zuweisung eines Wertes an die Eigenschaft CurrentCustomer oder an einen Member des von der Eigenschaft CurrentCustomer bereitgestellten Records führt zur Ausgabe des Fehlers E2064 durch den Compiler.
Von „http://docwiki.embarcadero.com/RADSt...Delphi)“
Kategorie: RAD Studio – Referenz

Was kann ich machen?

Muss doch möglich sein, einen Wert von außen zuzuweisen?

Delphi-Quellcode:
Tmyrecord = record
  a : integer;
  b : integer;
end;

myclass = class
private
  Fmyrecord : Tmyrecord;
public
  property myrecord : Tmyrecord read Fmyrecord write Fmyrecord ;
end;

Wirklich nur mit Pointern???... Wenn ja wie ist die Konvention?
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 22. Nov 2012, 15:15
Nein, Delphi hat endlich ordnungsgemäß diese Fehlermeldung. (war früher leider anders)

Du kannst nur den "kompletten" Record deinem Property zuweisen.


Wenn nicht, dann würde (eventuell über einen Getter) der Record ausgelesen, dadurch eine Kopie des Records angelegt und dann nur in der Kopie das Feld geändert.
(danach wird nämlich der Record nicht wieder an den "Setter" übergeben und zurückgeschrieben.

Du brauchst also eine Klasse (entweder statt des Records, oder als Wrapper dahin) oder du schreibst eben den ganzen Record zurück.

Delphi-Quellcode:
temp := o.myrecord;
temp.a := 666;
o.myrecord := temp;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#3

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 22. Nov 2012, 15:23
... oder du gibst die Record-Member (zumindest die häufig genutzten) als eigene Properties an:

Delphi-Quellcode:
Tmyrecord = record
  a : integer;
  b : integer;
end;

myclass = class
private
  Fmyrecord : Tmyrecord;
public
  property myrecord : Tmyrecord read Fmyrecord write Fmyrecord ;
  property myrecordA : Integer read Fmyrecord.a write Fmyrecord.a;
  property myrecordB : Integer read Fmyrecord.b write Fmyrecord.b;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#4

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 22. Nov 2012, 15:31
Okay alles klar, glücklicherweise passt es in meinem Fall ganz gut, einfach einen ganzen Record zu übergeben. Das muss ja früher schlimm gewesen sein. =) danke
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 22. Nov 2012, 15:50
Früher war es nicht schlimm.

o.myrecord.a := 666; ließ sich problemlos compilieren.
(nur der zugwiesene Wert kam halt irgendwie nie an )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#6

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 23. Nov 2012, 17:04
Da gibt es immer noch die bösen Pointer...
Delphi-Quellcode:
PMyRecord = ^TMyRecord
TMyRecord = record
  a : integer;
  b : integer;
end;

TMyClass = class(TObject)
private
  FMyRecord : TMyRecord;
  function GetMyRecord: PMyRecord;
public
  property MyRecord : PMyRecord read GetMyRecord;
end;

function TMyClass.GetMyRecord: PMyRecord;
begin
  Result := @FMyRecord;
end;

MyClass.MyRecord.a := 1;
MyClass.MyRecord.b := 2;
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#7

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 23. Nov 2012, 17:29
@Blup
Schöne Lösung, nur beim Auslesen fummel ich wieder mit dem Häkchen^ rum - oder hab ich was übersehen?
[Edit] ..okay, jetzt hab ich's verstanden... Glaub ich..
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 (23. Nov 2012 um 17:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 23. Nov 2012, 17:43
Wenn man auf ein Feld/Property/Methode des Record hinter dem Zeiger zugreift (.igendwas ), dann dereferenziert Delphi das automatisch (implizit).
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Record schreibgeschützt weil Feld von Klasse

  Alt 23. Nov 2012, 17:59
Records sind Werte, und IMO sollten Werte immutable sein.
Denn es gibt einfach (gerade in Delphi) zu viele, die überhaupt nicht wissen, was der eigene Code tatsächlich ausdrückt.
Records stellen gerne solche Fallen.
Und du bist da ganz offensichtlich reingetappt, als du versucht hast den Rückgabewert der Property zu ändern, in der Hoffnung den Wert, der hinter der Property steckt, zu ändern.

Wenn du dort etwas hast, was auch weitergereicht werden kann, dann sollte es eine Klasse sein.
Eigentlich sollten alle mutable Records Klassen oder Zeiger sein (Wobei Klassen eine schönere Syntax für Zeiger auf Records sind)

Da Records bei der Zuweisung kopiert werden, würden Änderungen nur in der einen Kopie wirksam sein:
Delphi-Quellcode:
var
  a, b :TRecord;
  list : TList<TRecord>;
begin
  b := list[2];
  b.X := 10;

  a := list[2];
  WriteLn(a.X);
end;
Records sind Werte, so wie ein Integer oder ein Double. Und Werte sollten immutable sein, oder man wird schizophren.
Wer Records nutzt weil er zu faul ist, den Speicher von Klassen zu verwalten, wird früher oder später über das oben erklärte Problem (Aliasing) stolpern.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  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 09:34 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