AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Botschaft verschicken unter Firemonkdey

Ein Thema von Hobbycoder · begonnen am 15. Feb 2025 · letzter Beitrag vom 15. Feb 2025
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
990 Beiträge
 
#1

Botschaft verschicken unter Firemonkdey

  Alt 15. Feb 2025, 12:41
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.540 Beiträge
 
Delphi 12 Athens
 
#2

AW: Botschaft verschicken unter Firemonkdey

  Alt 15. Feb 2025, 13:18
Das kannst Du mit dem TMessageManager (Unit System.Threading einbinden) machen.

Senden, z.B. so:

TMessageManager.DefaultManager.SendMessage(NIL, TMessage<UnicodeString>.create('DeineNachrichtHier'));

In den units, wo die Nachricht empfangen werden soll, verwendest Du das hier:

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 = 'DeineNachrichtHierthen begin
     ...
  end;
end;

Das unsubscribe am Ende nicht vergessen.


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.

Geändert von Harry Stahl (15. Feb 2025 um 13:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.571 Beiträge
 
Delphi 12 Athens
 
#3

AW: Botschaft verschicken unter Firemonkdey

  Alt 15. Feb 2025, 13:44
Man muss hier allerdings beachten, dass 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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
990 Beiträge
 
#4

AW: Botschaft verschicken unter Firemonkdey

  Alt 15. Feb 2025, 14:20
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.784 Beiträge
 
Delphi 12 Athens
 
#5

AW: Botschaft verschicken unter Firemonkdey

  Alt 15. Feb 2025, 14:22
Warum nicht einfach per Ereignis, das du über TThread.Queue oder TThread.Synchronize auslöst? Das funktioniert auch unter Android usw.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.540 Beiträge
 
Delphi 12 Athens
 
#6

AW: Botschaft verschicken unter Firemonkdey

  Alt 15. Feb 2025, 14:36
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.277 Beiträge
 
Delphi 12 Athens
 
#7

AW: Botschaft verschicken unter Firemonkdey

  Alt 15. Feb 2025, 14:38
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

Also, wie schon genannt, TMessageManager oder eben notfalls des ThreadQueue.


In der VCL nutze ich aber auch öfters TThread.ForceQueue, anstatt Messages. (weil einfacher)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Feb 2025 um 14:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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