![]() |
Record schreibgeschützt weil Feld von Klasse
Zitat:
![]() 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? |
AW: Record schreibgeschützt weil Feld von Klasse
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; |
AW: Record schreibgeschützt weil Feld von Klasse
... 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; |
AW: Record schreibgeschützt weil Feld von Klasse
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
|
AW: Record schreibgeschützt weil Feld von Klasse
Früher war es nicht schlimm.
Delphi-Quellcode:
ließ sich problemlos compilieren.
o.myrecord.a := 666;
(nur der zugwiesene Wert kam halt irgendwie nie an :angle2: ) |
AW: Record schreibgeschützt weil Feld von Klasse
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; |
AW: Record schreibgeschützt weil Feld von Klasse
@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.. |
AW: Record schreibgeschützt weil Feld von Klasse
Wenn man auf ein Feld/Property/Methode des Record hinter dem Zeiger zugreift (
Delphi-Quellcode:
), dann dereferenziert Delphi das automatisch (implizit).
.igendwas
|
AW: Record schreibgeschützt weil Feld von Klasse
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:
Records sind Werte, so wie ein Integer oder ein Double. Und Werte sollten immutable sein, oder man wird schizophren.
var
a, b :TRecord; list : TList<TRecord>; begin b := list[2]; b.X := 10; a := list[2]; WriteLn(a.X); end; 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 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