好的,这是我的实现。我没有使用 TMessagingSystem,因为它似乎只是增加了复杂性(至少对于我的情况而言)。到目前为止它工作正常,但如果有人有改进建议,我会很乐意改进它。
我查看了Uwe Raabe 的解决方案,但我想让它在我正在转换为 FMX 的大型代码库中更直接、更容易实现。
使用下面的解决方案,我可以简单地将所有 PostMessage() 替换为 gMessageHandler.PostMessage(删除 win 句柄参数),并将表单中的消息函数添加到 tMainForm.MessageCallBack。
我创建了一个小单元,我可以在任何需要 PostMessage 函数的地方包含它。那些地方不需要知道表格:
unit MessageHandler
interface
tAllOSMessage = procedure(aMessageID, aData1, aData2: integer) of object;
tAllOSMessageHandler = class
private
fOnMessage : tAllOSMessage;
public
constructor Create(aMessageCallBack: tAllOSMessage);
procedure PostMessage(aMessageID, aData1, aData2: integer; aSourceThread: TThread = nil);
end;
var
gMessageHandler: tAllOSMessageHandler;
implementation
constructor tAllOSMessageHandler.Create(aMessageCallBack: tAllOSMessage);
begin
fOnMessage := aMessageCallBack;
end;
procedure tAllOSMessageHandler.PostMessage(aMessageID, aData1, aData2: integer; aSourceThread: TThread);
begin
if aSourceThread=nil then
aSourceThread := TThread.CurrentThread;
aSourceThread.Queue(nil, procedure
begin
if Assigned(fOnMessage) then
fOnMessage(aMessageID, aData1, aData2);
end );
end;
end.
然后我将这些行添加到主窗体单元:
//Added to main form:
tMainForm = class(TForm)
...
procedure MessageCallBack(aMessageID, aData1, aData2: integer);
//Added to MainFormCreate
gMessageHandler := tAllOSMessageHandler.Create(MessageCallBack);
//Added to MainFormDestroy
FreeAndNil(gMessageHandler)
procedure tMainForm.MessageCallBack(aMessageID, aData1, aData2: integer);
begin
case aMessageID of
MyMessage1 : MyFunction1(aData1,aData2);
...
end;
end;