Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Botschaft verschicken unter Firemonkdey (https://www.delphipraxis.net/216713-botschaft-verschicken-unter-firemonkdey.html)

Hobbycoder 15. Feb 2025 12:41

Botschaft verschicken unter Firemonkdey
 
Unter VCL nutze ich öfter postMessage um zum Beispiel nach Threadende irgendeine Aktion anzustoßen.
Delphi-Quellcode:
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
Wie macht man das unter Firemonkey? Vor allem unter Berücksichtigung, dass die FMX-App später auch auf Android oder IOS laufen soll.

Harry Stahl 15. Feb 2025 13:18

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.

Uwe Raabe 15. Feb 2025 13:44

AW: Botschaft verschicken unter Firemonkdey
 
Man muss hier allerdings beachten, dass
Delphi-Quellcode:
TMessageManager.SendMessage
synchron abgearbeitet wird, ähnlich wie das SendMessage der Windows API. Ein Ersatz für das WinApi PostMessage müsste das erst noch entsprechend umsetzen.

Hobbycoder 15. Feb 2025 14:20

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: firemonkey-message-handling-using-tmessagemanager-and-tthread-queue gefunden.

jaenicke 15. Feb 2025 14:22

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.

Harry Stahl 15. Feb 2025 14:36

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;

himitsu 15. Feb 2025 14:38

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