无法为记录类型指定左侧

Jac*_*ray 4 delphi

我正在尝试将我的应用程序从Delphi 2007升级到Delphi 10 Seattle.我知道记录需要在更改之前复制到本地变量,然后再分配回来.我正在尝试相同但我仍然得到我无法分配给左侧的错误.请有人帮忙.

procedure TMydlg.WMGetMinMaxInfo(var Msg:TMessage);
var
     MinMaxInfo: TMinMaxInfo;
begin
   inherited;
   MinMaxInfo := (PMinMaxInfo(Msg.LParam)^);

   with MinMaxInfo do
   begin

      ptMinTrackSize.X := MinWidth;
      ptMinTrackSize.Y := MinHeight;
      ptMaxTrackSize.X := MinWidth;

   end;

   // Error here. Left side cannot be assigned to
   (PMinMaxInfo(Msg.LParam)^) := MinMaxInfo;
Run Code Online (Sandbox Code Playgroud)

TMinMaxInfo来自Winapi.windows

Dav*_*nan 9

发出编译器错误是因为编译器拒绝最终赋值左侧的最外层parens.从本质上讲,您的代码类似于以下内容:

type
  TMyRecord = record
  end;

procedure Foo;
var
  rec1, rec2: TMyRecord;
begin
  rec1 := rec2;   // compiles
  (rec1) := rec2; // E2064 Left side cannot be assigned to
end;
Run Code Online (Sandbox Code Playgroud)

以这种简化的方式编写它可以使问题得到非常明显的缓解.

我不确定为什么编译器拒绝这些parens.我怀疑语言的正式语法会使你的左手边无效.Serg在注释中提供了合理的解释,即(...)表达式,并且表达式无效作为赋值的左侧.我倾向于认为这是准确的.

无论如何,修复代码很简单.代替

(PMinMaxInfo(Msg.LParam)^) := MinMaxInfo;
Run Code Online (Sandbox Code Playgroud)

PMinMaxInfo(Msg.LParam)^ := MinMaxInfo;
Run Code Online (Sandbox Code Playgroud)

请注意,没有必要复制记录,修改它,然后将其复制回来.一旦LParam转换为指向记录的指针,就可以直接修改记录.

我会这样做:

procedure TMydlg.WMGetMinMaxInfo(var Msg:TMessage);
var
  pmmi: PMinMaxInfo;
begin
  inherited;
  pmmi := PMinMaxInfo(Msg.LParam);
  pmmi.ptMinTrackSize.X := MinWidth;
  pmmi.ptMinTrackSize.Y := MinHeight;
  pmmi.ptMaxTrackSize.X := MinWidth;
end;
Run Code Online (Sandbox Code Playgroud)

我省略了^指针解引用运算符,因为在这种情况下它是可选的.如果您愿意,可以写下这样的作业:

pmmi^.ptMinTrackSize.X := MinWidth;
pmmi^.ptMinTrackSize.Y := MinHeight;
pmmi^.ptMaxTrackSize.X := MinWidth;
Run Code Online (Sandbox Code Playgroud)