从2009升级到XE时,Delphi出现“E2064左侧无法赋值”的错误。

4

我读到了这个问题,其中讨论了相同的问题。无论如何,我能够在 Delphi 2009 中做到这一点,在升级到 XE 后就不可能了。

我在这里粘贴一个简单虚拟的示例:这可以编译 2009 并在 XE 上给出 E2064...为什么?有没有可能设置 XE 的行为方式像 2009 一样?还是应该采用一种解决方法?

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TTestRecord = record
    FirstItem  : Integer;
    SecondItem  : Integer;
  end;
  TForm2 = class(TForm)
    procedure AssignValues;
  private
    FTestRecord :TTestRecord;
  public
    property TestRecord : TTestRecord read FTestRecord write FTestRecord;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.AssignValues;
begin
with TestRecord do
     begin
       FirstItem := 14; // this gives error in XE but not in 2009
       SecondItem := 15;
     end;
end;

end.

这是我讨厌WITH语句的完美例子。:-) 即使在2009年构建时,它也会做一些奇怪的事情,你会很难在调试器中查看值。 - Warren P
2个回答

12

D2010编译器比之前的版本更加严格。在以前的版本中,编译器不会抱怨,但通常结果可能不如您所期望,因为它是在临时变量上操作的,所以您的更改将在方法结束时消失。

您链接到的问题的答案提供了更好的解释,并提供了解决方案(或解决方法)供选择。


9
换句话说,感谢XE编译器不再让你自己犯错。 +1。 - Cosmin Prund
是的,很可能。添加这个属性是最近的更改,没有经过测试。 - UnDiUdin
如果您想直接修改字段,请将属性设置为PTestRecord = ^TTestRecord类型,并使用返回该指针的Get函数和执行FTestRecord:= aValue^的Set函数。 - Thorsten Engler

-1

好的,好的,对不起,我不应该写非技术性内容...

现在,我们可以按照以下方式修改代码,它就可以正常工作了:

type
  PTestRecord = ^TTestRecord;
  TTestRecord = record
    FirstItem: Integer;
    SecondItem: Integer;
  end;

  TForm2 = class(TForm)
  private
    { Private declarations }
    FTestRecord: TTestRecord;
    procedure AssignValues;
  public
    { Public declarations }
    property TestRecord: TTestRecord read FTestRecord write FTestRecord;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.AssignValues;
begin
  with PTestRecord(@TestRecord)^ do
  begin
    FirstItem := 14; // it works fine.
    SecondItem := 15;
  end;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接