Delphi "E2064 Левая сторона не может быть назначена" ошибка появилась при обновлении проекта с 2009 года до XE - PullRequest
4 голосов
/ 30 марта 2011

Я прочитал этот вопрос, в котором обсуждается та же проблема , в любом случае я смог сделать это в Delphi 2009, и это было невозможно, когда я обновился до XE.

Я привожу здесь простой фиктивный пример: он компилируется в 2009 году и дает E2064 для XE ... Почему? Можно ли настроить 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.

Ответы [ 2 ]

12 голосов
/ 30 марта 2011

Компилятор D2010 более строг, чем предыдущие версии.В предыдущих версиях компилятор не жаловался, но часто результаты были не такими, как вы ожидаете, так как он действовал на временную переменную, поэтому ваши изменения исчезнут к концу метода.

ответы на вопрос, на который вы ссылаетесь, дают более четкие объяснения и предоставляют решения (или обходные пути), из которых можно выбирать.

0 голосов
/ 24 марта 2017

ОК, ОК, извините, я не должен был делать нетехнический контент ...

Теперь мы можем изменить код следующим образом, и он отлично работает:

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;
...