You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi只读属性Rect赋值Left报错但Width可赋值的原因咨询

Delphi中只读TRectF属性赋值的编译差异原因

首先看你的代码声明:

type
   TForm1 = class(TForm)
   private
     FRect: TRectF;
   public
     property Rect: TRectF read FRect; // 只读属性,仅返回FRect的值
   end;

第一个测试代码编译报错:

procedure TForm1.FormCreate(Sender: TObject);
begin
   Rect.left := 25; // 编译报错:left side cannot be assigned to
end;

第二个测试代码能正常编译:

procedure TForm1.FormCreate(Sender: TObject);
begin
   Rect.width := 25; // 编译通过
end;

核心原因

这是Delphi编译器对值类型(记录)的成员访问规则差异导致的:

  1. Rect.Left 是直接访问记录字段:
    TRectF的Left是记录的直接字段,当你访问Rect.Left时,Rect作为只读属性会返回FRect的临时副本(因为TRectF是值类型,传递/返回都是副本)。试图给这个临时副本的字段赋值时,编译器会判定这是无效操作——临时值无法作为左值被修改,修改结果也无法同步回原字段FRect,因此直接报错。

  2. Rect.Width 是调用记录的属性setter:
    TRectF的Width是一个带有setter方法的派生属性(内部通过修改Right字段实现宽度设置)。当你写Rect.Width :=25时,编译器会将其转换为对临时副本的setter方法调用:先获取Rect的临时副本,调用该副本的Width setter修改其内部字段,最后丢弃这个副本。虽然这个操作不会实际改变原字段FRect的宽度,但编译器认为这是合法的方法调用语法,因此允许编译通过。

简单来说:直接修改临时副本的字段被编译器禁止,而调用临时副本的属性方法则被允许,哪怕操作结果没有实际意义。

内容的提问来源于stack exchange,提问作者zeus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:54:15