为何在升级Delphi后获得TRect的“左侧无法分配给?”

问题描述 投票:1回答:2

我正在将代码从Delphi 7迁移到图形模块之一的XE2。我们正在使用TRect变量,旧代码在Delphi 7中正常运行

例如:

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

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

您能解释一下XE2 TRect和D7中的变化是什么,如何分配值

delphi compiler-errors delphi-7 delphi-xe2
2个回答
9
投票

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

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

((附加信息:它必须在2010年进行了更改; MarcoCantù的Delphi 2010 Handbook在第111页上将其称为“ With语句现在保留了只读属性”,它描述了此行为以及我在下面指出的解决方案。)] >

而不是使用with语句直接访问类的属性,现在您需要声明一个局部变量,然后直接读取和写入整个内容(为清楚起见,省略了错误处理-是的,我知道应该有一个试试..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.

0
投票

结果,使用

© www.soinside.com 2019 - 2024. All rights reserved.