여기 내 구현이 있습니다. TMessagingSystem을 사용하지 않았기 때문에 (적어도 제 상황에서는) 복잡성이 추가되는 것처럼 보입니다. 지금까지는 작동하지만 개선을위한 제안이있는 사람은 기꺼이 개선 할 것입니다.
나는 해결책을 Uwe Raabe으로 바라 보았으나 나는 FMX로 변환하는 큰 코드베이스에서 구현하기가 더 쉽고 간단하게 만들고 싶었다. 아래의 솔루션을 사용하면 모든 PostMessage()를 gMessageHandler.PostMessage (win handle 인수 제거)로 대체하고 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;
사용'TThread.Queue'와 클로저를. 둘 다 모든 플랫폼에서 작동합니다. http://www.uweraabe.de/Blog/2011/01/30/synchronize-and-queue-with-parameters/ –
'TThread.Synchronize()'와'TThread.Queue()'가 * XE7 이전의 모든 FireMonkey 버전. 자세한 내용 및 해결 방법은 [QC# 123579] (http://qc.embarcadero.com/wc/qcmain.aspx?d=123579)를 참조하십시오. –