我很好奇,为什么Delphi将记录类型属性视为只读:
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;
如果我尝试为Rec属性的任何成员分配一个值,我会得到“左侧无法分配给”错误:
procedure TForm1.DoSomething(ARec: TRec); begin Rec.A := ARec.A; end;
同时对底层字段进行同样的操作:
procedure TForm1.DoSomething(ARec: TRec); begin FRec.A := ARec.A; end;
有没有解释这个行为?
问候
解决方法
由于“Rec”是一个属性,因此编译器会稍微不同,因为它必须首先评估属性decl的“读取”。考虑这一点,这在语义上等同于你的例子:
... property Rec: TRec read GetRec write FRec; ...
如果你这样看,你可以看到第一个引用“Rec”(在点“之前”)的引用,必须调用GetRec,这将创建一个Rec的临时本地副本。这些临时性设计是“只读”的。这就是你所遇到的。
您可以在此处执行的另一件事是将记录的各个字段作为包含类的属性进行分解:
... property RecField: Integer read FRec.A write FRec.A; ...
这将允许您通过属性直接分配到该类实例中该嵌入式记录的字段。