Хорошо, вот моя реализация. Я не использовал TMessagingSystem, так как он, кажется, просто добавляет сложности (по крайней мере, для моей ситуации). Пока это работает, но если у кого-то есть предложения по улучшению, я буду рад улучшить его.
Я просмотрел решение Уве Раабе но я хотел сделать его более простым и легким для реализации в большой кодовой базе, которую я конвертирую в FMX. С приведенным ниже решением я могу просто заменить все PostMessage() на gMessageHandler.PostMessage (удалив аргумент дескриптора выигрыша) и добавить функции сообщений в форму в 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;
person
Hans
schedule
30.10.2014
TThread.Queue
и замыкания. Оба работают на любой платформе. uweraabe.de/Blog/2011/01 /30/ - person Sir Rufo   schedule 03.10.2014TThread.Synchronize()
иTThread.Queue()
были нарушены в каждой версии FireMonkey до XE7. См. QC #123579 для получения подробной информации и обходного пути. - person Remy Lebeau   schedule 03.10.2014