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;
その行動には何か説明があるのでしょうか?
ベストアンサー1
「Rec」はプロパティなので、コンパイラは最初にプロパティ宣言の「read」を評価する必要があるため、少し異なる方法で処理します。意味的にはあなたの例と同等であるこれを考慮してください:
...
property Rec: TRec read GetRec write FRec;
...
このように見ると、「Rec」への最初の参照 (ドット「.」の前) は GetRec を呼び出す必要があり、これによって Rec の一時的なローカル コピーが作成されます。これらの一時ファイルは設計上「読み取り専用」です。これが、実行中の状況です。
ここで実行できるもう 1 つのことは、レコードの個々のフィールドを、それを含むクラスのプロパティとして分離することです。
...
property RecField: Integer read FRec.A write FRec.A;
...
これにより、クラス インスタンス内の埋め込みレコードのフィールドにプロパティを介して直接割り当てることができます。