1

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

前任:

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

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

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

4

2 回答 2

9

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

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

(附加信息:它一定是在 2010 年发生了变化;Marco CantùDelphi 2010 Handbook在第 111 页上将其提及为“The With Statement Now Preserves Read-Only Properties”,它描述了这种行为和我在下面指出的解决方案。)

您现在不需要使用语句直接访问类的属性,而是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.
于 2012-09-10T13:49:47.780 回答
0

事实证明,使用

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

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

然而,

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

才不是。

Delphi 10.3.3 对括号的要求与旧版本一样。

于 2020-01-07T18:59:48.807 回答