Delphi - 将记录作为 Window 消息发送
Delphi - Sending Records as Window Messages
Delphi 东京 - 我想通过 Windows 消息在表单之间发送记录结构。具体来说,我有一个 "display running status" 类型的 window。当我的应用程序中的其他地方发生行为时,我需要发送 "update the status window" 类型的消息。我找到了一个通过 windows 消息传递记录的示例(但仅在同一进程中),但在使其工作时遇到了问题。具体来说,在接收方,我在编译 windows 消息处理程序代码时遇到了问题。我有一个 'Incompatible Type' 错误,但我不知道如何进行类型转换以使其正常工作。以下是适用的代码片段。
在一个 globals.pas 单元中,所有表单都可以访问。
// Define my message
const WM_BATCHDISPLAY_MESSAGE = WM_USER + [=12=]01;
...
// Define the record which is basically the message payload
type
TWMUCommand = record
Min: Integer;
Max: Integer;
Avg: Integer;
bOverBudget: Boolean;
Param1: Integer;
Param2: String;
end;
...
// define a global variable
PWMUCommand : ^TWMUCommand;
现在发送消息。这目前只是一个按钮,以便测试。
procedure TMainForm.BitBtn1Click(Sender: TObject);
var
msg_prm: ^TWMUCommand;
begin
New(msg_prm);
msg_prm.Min := 5;
msg_prm.Max := 10;
msg_prm.Avg := 7;
msg_prm.bOverBudget := True;
msg_prm.Param1 := 0;
msg_prm.Param2 := 'some string';
PostMessage(Handle, WM_BATCHDISPLAY_MESSAGE, 0, Integer(msg_prm));
end;
在接收表单上,也就是我的状态表单...声明我的消息侦听器
procedure MessageHandler(var Msg: TMessage); message WM_BATCHDISPLAY_MESSAGE;
现在定义消息处理程序。
procedure TBatchForm.MessageHandler(var Msg: TMessage);
var
msg_prm: ^TWMUCommand;
begin
try
// Next line fails with Incompatible types
msg_prm := ^TWMUCommand(Msg.LParam);
ShowMessage(Format('min: %d; max: %d; avg: %d; ovrbdgt: %s; p1: %d; p2: %s',
[msg_prm.Min, msg_prm.Max, msg_prm.Avg, BoolToStr(msg_prm.bOverBudget, True),
msg_prm.Param1, msg_prm.Param2]));
finally
Dispose(msg_prm);
end;
end;
如何将 Msg.LParam 转换回记录结构?
首先,为记录声明指针类型更容易:
type
PWMUCommand = ^TWMUCommand;
TWMUCommand = record
...
end;
然后在发送消息的方法中,声明指针为PWMUCommand
。
您的 Integer
强制转换采用 32 位代码。最好转换为该参数的真实类型,即 LPARAM
.
PostMessage(..., LPARAM(msg_prm));
在接收消息的函数中,使用指针类型声明局部变量:
var
msg_prm: PWMUCommand;
像这样投射:
msg_prm := PWMUCommand(Msg.LParam);
请注意,当您调用 PostMessage
时,您应该检查 return 值以防失败。如果失败,那么你需要处理内存。
if not PostMessage(..., LPARAM(msg_prm)) then
begin
Dispose(msg_prm);
// handle error
end;
最后,我想您已经知道,这种方法只有在发送方和接收方处于同一进程中时才有效。
Delphi 东京 - 我想通过 Windows 消息在表单之间发送记录结构。具体来说,我有一个 "display running status" 类型的 window。当我的应用程序中的其他地方发生行为时,我需要发送 "update the status window" 类型的消息。我找到了一个通过 windows 消息传递记录的示例(但仅在同一进程中),但在使其工作时遇到了问题。具体来说,在接收方,我在编译 windows 消息处理程序代码时遇到了问题。我有一个 'Incompatible Type' 错误,但我不知道如何进行类型转换以使其正常工作。以下是适用的代码片段。
在一个 globals.pas 单元中,所有表单都可以访问。
// Define my message
const WM_BATCHDISPLAY_MESSAGE = WM_USER + [=12=]01;
...
// Define the record which is basically the message payload
type
TWMUCommand = record
Min: Integer;
Max: Integer;
Avg: Integer;
bOverBudget: Boolean;
Param1: Integer;
Param2: String;
end;
...
// define a global variable
PWMUCommand : ^TWMUCommand;
现在发送消息。这目前只是一个按钮,以便测试。
procedure TMainForm.BitBtn1Click(Sender: TObject);
var
msg_prm: ^TWMUCommand;
begin
New(msg_prm);
msg_prm.Min := 5;
msg_prm.Max := 10;
msg_prm.Avg := 7;
msg_prm.bOverBudget := True;
msg_prm.Param1 := 0;
msg_prm.Param2 := 'some string';
PostMessage(Handle, WM_BATCHDISPLAY_MESSAGE, 0, Integer(msg_prm));
end;
在接收表单上,也就是我的状态表单...声明我的消息侦听器
procedure MessageHandler(var Msg: TMessage); message WM_BATCHDISPLAY_MESSAGE;
现在定义消息处理程序。
procedure TBatchForm.MessageHandler(var Msg: TMessage);
var
msg_prm: ^TWMUCommand;
begin
try
// Next line fails with Incompatible types
msg_prm := ^TWMUCommand(Msg.LParam);
ShowMessage(Format('min: %d; max: %d; avg: %d; ovrbdgt: %s; p1: %d; p2: %s',
[msg_prm.Min, msg_prm.Max, msg_prm.Avg, BoolToStr(msg_prm.bOverBudget, True),
msg_prm.Param1, msg_prm.Param2]));
finally
Dispose(msg_prm);
end;
end;
如何将 Msg.LParam 转换回记录结构?
首先,为记录声明指针类型更容易:
type
PWMUCommand = ^TWMUCommand;
TWMUCommand = record
...
end;
然后在发送消息的方法中,声明指针为PWMUCommand
。
您的 Integer
强制转换采用 32 位代码。最好转换为该参数的真实类型,即 LPARAM
.
PostMessage(..., LPARAM(msg_prm));
在接收消息的函数中,使用指针类型声明局部变量:
var
msg_prm: PWMUCommand;
像这样投射:
msg_prm := PWMUCommand(Msg.LParam);
请注意,当您调用 PostMessage
时,您应该检查 return 值以防失败。如果失败,那么你需要处理内存。
if not PostMessage(..., LPARAM(msg_prm)) then
begin
Dispose(msg_prm);
// handle error
end;
最后,我想您已经知道,这种方法只有在发送方和接收方处于同一进程中时才有效。