我正在将代码从 Delphi 7 迁移到图形模块之一的 XE2。我们正在使用TRect
变量,旧代码在 Delphi 7 中运行没有问题
前任:
Var
Beold : TRect
begin
Beold.left := Beold.right;
end.
在将代码移植到新 XE2 时,我们面临 E0264 问题:无法将左侧分配给
您能否解释一下 XE2 TRect 和 D7 的变化是什么,我们如何分配值
我正在将代码从 Delphi 7 迁移到图形模块之一的 XE2。我们正在使用TRect
变量,旧代码在 Delphi 7 中运行没有问题
前任:
Var
Beold : TRect
begin
Beold.left := Beold.right;
end.
在将代码移植到新 XE2 时,我们面临 E0264 问题:无法将左侧分配给
您能否解释一下 XE2 TRect 和 D7 的变化是什么,我们如何分配值
您发布的代码在快速 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.
事实证明,使用
with (Bmp.Canvas.ClipRect) do
begin
Bottom := 100;
end;
抛出错误:[无法分配左侧]
然而,
with Bmp.Canvas.ClipRect do
begin
Bottom := 100;
end;
才不是。
Delphi 10.3.3 对括号的要求与旧版本一样。