升级Delphi后,为什么TRect的“左侧无法分配”?

时间:2012-09-10 13:17:36

标签: delphi compiler-errors delphi-7 delphi-xe2

我正在将代码从Delphi 7迁移到XE2的Graphical模块之一。 我们正在使用TRect变量,旧代码在Delphi 7中没有问题

前:

Var
  Beold : TRect
begin
  Beold.left := Beold.right;
end.

在将代码移植到新的XE2时,我们正面临着这个问题 E0264:左侧无法分配到

您能解释一下XE2 TRect和D7的变化,我们如何分配valuse

2 个答案:

答案 0 :(得分:9)

您发布的代码在快速的Delphi测试应用程序中编译并运行良好,因此它不是您真正的代码。

但是,我怀疑你所遇到的是with语句中与使用属性相关的更改。以前版本的Delphi中存在一个存在多年的错误,最近已经修复了。 IIRC,它首先在DME10的README.HTML文件的注释中提到。它已被添加到XE2中的文档中(不是作为行为更改,但记录了新行为)。文档位于here at the docwiki

(附加信息:它一定是2010年发生了变化;MarcoCantù的Delphi 2010 Handbook在第111页提到“现在使用声明保留了只读属性”,它描述了这种行为以及我在下面指出的解决方案。)

不是直接使用with语句访问类的属性,而是现在需要声明一个局部变量,并直接读取和写入整个事物(为了清楚起见,省略了错误处理 - 是的,我知道那里应该是一个try..finally块来释放位图)。

var
  R: TRect;
  Bmp: TBitmap;

begin
  Bmp := TBitmap.Create;
  Bmp.Width := 100;
  Bmp.Height := 100;
  R := Bmp.Canvas.ClipRect;
  { This block will not compile, with the `Left side cannot be assigned to` error
  with Bmp.Canvas.ClipRect do
  begin
    Left := 100;
    Right := 100;
  end;
  }
  // The next block compiles fine, because of the local variable being used instead
  R := Bmp.Canvas.ClipRect;
  with R do
  begin
    Left := 100;
    Right := 100;
  end;
  Bmp.Canvas.ClipRect := R;
  // Do other stuff with bitmap, and free it when you're done.
end.

答案 1 :(得分:0)

使用

# From https://matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
plt.show()  # This code blocks until the plot window is closed.

抛出错误:[无法分配左侧]

但是

  with (Bmp.Canvas.ClipRect) do
  begin
    Bottom := 100;
  end;

没有。

Delphi 10.3.3与早期版本一样,对括号的要求也很高。