gpt4 book ai didi

delphi - 无法为记录类型分配左侧

转载 作者:行者123 更新时间:2023-12-03 15:24:54 25 4
gpt4 key购买 nike

我正在尝试将我的应用程序从 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;

TMinMaxInfo 来自 Winapi.windows

最佳答案

由于编译器拒绝最终赋值左侧的最外层括号,因此会发出编译器错误。本质上,您的代码类似于以下内容:

type
TMyRecord = record
end;

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

以这种简化的方式编写它可以使问题变得非常明显。

我不确定为什么编译器拒绝这些括号。我怀疑该语言的正式语法使您的左侧无效。 Serg 在注释中提供了一个合理的解释,即 (...) 是一个表达式,而表达式作为赋值的左侧是无效的。我倾向于相信这是准确的。

无论如何,修复代码很简单。而不是

(PMinMaxInfo(Msg.LParam)^) := MinMaxInfo;

PMinMaxInfo(Msg.LParam)^ := MinMaxInfo;
<小时/>

请注意,无需复制记录、修改记录,然后再复制回来。将 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;

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

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

关于delphi - 无法为记录类型分配左侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33075234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com