我正在尝试将我的应用程序从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
发出编译器错误是因为编译器拒绝最终赋值左侧的最外层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)
| 归档时间: |
|
| 查看次数: |
571 次 |
| 最近记录: |