I’m curious to know why Delphi treats record type properties as read only:
TRec = record A : integer; B : string; end; TForm1 = class(TForm) private FRec : TRec; public procedure DoSomething(ARec: TRec); property Rec : TRec read FRec write FRec; end;
If I try to assign a value to any of the members of Rec property, I’ll get ‘Left side cannot be assigned to’ error:
procedure TForm1.DoSomething(ARec: TRec); begin Rec.A := ARec.A; end;
while doing the same with the underlying field is allowed:
procedure TForm1.DoSomething(ARec: TRec); begin FRec.A := ARec.A; end;
Is there any explanation for that behavior?
Since ‘Rec’ is a property, the compiler treats it a little differently because it has to first evaluate the ‘read’ of the property decl. Consider this, which is semantically equivalent to your example:
If you look at it like this, you can see that the first reference to ‘Rec’ (before the dot ‘.’), has to call GetRec, which will create a temporary local copy of Rec. These temporaries are by design ‘read-only.’ This is what you’re running into.
Another thing you can do here is to break out the individual fields of the record as properties on the containing class:
This will allow you to directly assign through the property to the field of that embedded record in the class instance.