![]() |
Botschaft verschicken unter Firemonkdey
Unter VCL nutze ich öfter postMessage um zum Beispiel nach Threadende irgendeine Aktion anzustoßen.
Delphi-Quellcode:
Wie macht man das unter Firemonkey? Vor allem unter Berücksichtigung, dass die FMX-App später auch auf Android oder IOS laufen soll.
const
WM_TUWAS = WM_USER + 1000; type TMyForm=class(TForm) . . private procedure TuWas(var msg: TMessage); message WM_TUWAS; procedure ThreadFertig(Sender: TObject); end; procedure TMyForm.ThreadFertig(Sender: TObject); begin postmessage(self.handle, WM_TUWAS, 0, 0); end |
AW: Botschaft verschicken unter Firemonkdey
Das kannst Du mit dem TMessageManager (Unit System.Threading einbinden) machen.
Senden, z.B. so:
Delphi-Quellcode:
TMessageManager.DefaultManager.SendMessage(NIL, TMessage<UnicodeString>.create('DeineNachrichtHier'));
In den units, wo die Nachricht empfangen werden soll, verwendest Du das hier:
Delphi-Quellcode:
TMessageManager.DefaultManager.SubscribeToMessage(TMessage<UnicodeString>, HandleManagerMessage);
Statt HandelManagerMessage, kannst Du auch direkt an dieser Stelle eine anonyme Procedure verwenden. Hier sieht es dann so aus:
Delphi-Quellcode:
procedure TF_ViewMain.HandleManagerMessage (const sender: TObject; const M: TMessage);
begin var s := (M as TMessage<UnicodeString>).Value; if s = 'DeineNachrichtHier' then begin ... end; end; Das unsubscribe am Ende nicht vergessen.
Delphi-Quellcode:
TMessageManager.DefaultManager.Unsubscribe(TMessage<UnicodeString>, HandleManagerMessage);
Notgedrungen Eigenwerbung, aber evtl. hilfreich, in meinem FireMonkey-Buch ("Cross-Platform Development mit Delphi 10.2 & FireMonkey" bei Amazon, Kapitel 9 "Senden und Empfangen von Botschaften mit dem TMessageManager" erfährst Du über ca. 8 Seiten mehr davon, incl. einiger Beispiele. |
AW: Botschaft verschicken unter Firemonkdey
Man muss hier allerdings beachten, dass
Delphi-Quellcode:
synchron abgearbeitet wird, ähnlich wie das SendMessage der Windows API. Ein Ersatz für das WinApi PostMessage müsste das erst noch entsprechend umsetzen.
TMessageManager.SendMessage
|
AW: Botschaft verschicken unter Firemonkdey
Danke, das hilft mir schon mal weiter. Damit muss ich mich jetzt erstmal etwas auseinandersetzen.
Zwischendurch hatte ich das hier: ![]() |
AW: Botschaft verschicken unter Firemonkdey
Warum nicht einfach per Ereignis, das du über TThread.Queue oder TThread.Synchronize auslöst? Das funktioniert auch unter Android usw.
|
AW: Botschaft verschicken unter Firemonkdey
Wenn es asynchron sein soll, könnte man eine einfache Hilfsfunktion verwenden:
Delphi-Quellcode:
procedure PostMyMessageAsync(Sender: TObject; AMessage: TMessageBase);
begin TThread.ForceQueue(nil, procedure begin TMessageManager.DefaultManager.SendMessage(Sender, AMessage); end ); end; |
AW: Botschaft verschicken unter Firemonkdey
Jo, PostMessage/SendMessage sind ja Windows-API.
Die Mobilen arbeiten dagegen mit Events. In der VCL muß man auch nicht direkt die WinAPI nutzen, sondern kann auch Form.Perform ... hätte gedacht, dass Emba sowas auch im FMX, bzw. direkt in der TForm integriert hätte, damit man nicht suchen muß, aber neeeeeee :freak: Also, wie schon genannt, TMessageManager oder eben notfalls des ThreadQueue. In der VCL nutze ich aber auch öfters TThread.ForceQueue, anstatt Messages. (weil einfacher) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz