在Delphi中针对记录类型属性,“左侧无法分配”的问题(Left side cannot be assigned to” for record type properties in Delphi),有Toon Krijthe提供的一个答案,展示了如何通过声明记录的属性来完成对记录属性字段的赋值。为了更方便地参考,这里是Toon Krijthe发布的代码片段。
type
TRec = record
private
FA : integer;
FB : string;
procedure SetA(const Value: Integer);
procedure SetB(const Value: string);
public
property A: Integer read FA write SetA;
property B: string read FB write SetB;
end;
procedure TRec.SetA(const Value: Integer);
begin
FA := Value;
end;
procedure TRec.SetB(const Value: string);
begin
FB := Value;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FRec : TRec;
public
property Rec : TRec read FRec write FRec;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Rec.A := 21;
Rec.B := 'Hi';
end;
在vcldeveloper的原始代码中,如果记录中没有setter,则很明显为什么会引发“无法分配给左侧”错误。同样,如果像上面的代码一样为属性TRec.A定义了一个setter,那么对于赋值
Rec.A := 21;
不会引发错误也是很清楚的。我不理解的是,为什么赋值
Rec.A := 21;
将值21分配给TForm1
的FRec.FA
字段。我原本以为该值将被分配给FRec
的一个局部临时副本的FA
字段,而不是FRec.FA
本身。请问有人能解释一下这里发生了什么吗?
Rec
属性的处理方式,没有涉及到扩展第二个A
属性。但我的陈述仍然是正确的,因为Rec.A := 21
和FRec.A := 21
编译方式相同。它们都被转换为FRec.SetA(21)
。我会详细说明这一点。很抱歉让你感到困惑。 - David Heffernan