实现: 在窗体uFrmMain下, 包含线程ThreadA, 线程向该窗体发送消息, 窗体处理消息.
由于FMX和VCL差异很大, 以前用的SendMessage不能用了, 得另想办法, 在网上找到了一个好的方法.
如下操作:
1. uses 添加引用 FMX.Presentation.Messages.
2. 声明全局变量FMessageSender, 注意位置 如图所示:
var
FrmMain: TFrmMain;
FMessageSender: TMessageSender;
3. 在FormCreate事件编写
FMessageSender := TMessageSender.Create();
FMessageSender.Receiver:= Self;
4. 在FormDestroy事件编写
FMessageSender.DisposeOf();
5. 在窗体public部分声明
procedure DefaultHandler(var Message); override;
实现代码如下:
procedure TFrmMain.DefaultHandler(var Message);
var
msg_id, msg_value: AnsiString;
begin
inherited;
msg_id:= TDispatchMessage(Message).MsgID.ToString;;
msg_value:= TDispatchMessageWithValue<AnsiString>(Message).Value;
if msg_id= '0' then
begin
//操作1
end
else if msg_id= '1' then
begin
//操作2
end
else if msg_id= '2' then
begin
//操作3
end
else if msg_id= '3' then
begin
//操作4
end
else if msg_id= '4' then
begin
//操作5
end
else if msg_id= '5' then
begin
//操作6
end
else if msg_id= '6' then
begin
//操作7
end
else if msg_id= '7' then
begin
//操作8
end
else if msg_id= '8' then
begin
//操作9
end;
end;
6. 测试代码如下:
procedure TFrmMain.Act_ConfigExecute(Sender: TObject);
begin
FMessageSender.SendMessage(10, 'ChenWeiXin');
end;
第一个参数MsgID, 第二个参数就是传递的值. 利用好参数, 即可处理相应的信息. 比如:
FMessageSender.SendMessage(0, AnsiString('值1')); //操作1
FMessageSender.SendMessage(1, AnsiString('值2')); //操作2
FMessageSender.SendMessage(7, AnsiString('值3')); //操作3
FMessageSender.SendMessage(4, AnsiString('值4')); //操作4
FMessageSender.SendMessage(8, AnsiString('值5')); //操作5