If you just need to signal that something happened, TQTXEvent is sufficient. If you need to pass custom data with your event, you should use TQTXCustomEvent. TQTXCustomEvent has a Detail: variant property. This allows you to package any data (a string, an integer, or even a JObject) with your event.


// Firing the event with data

var

 MyData: variant;

 MyEvent: TQTXCustomEvent;

begin

 MyData := TVariant.CreateObject();

 MyData['UserName'] := 'Nadia';

 MyData['Score'] := 1500;


 // Create the event, passing MyData to the 'Detail' parameter

 MyEvent := TQTXCustomEvent.Create('OnMyDataUpdate', [eoBubbles], MyData);

 MyEvent.Dispatch(Self.EventTarget);

 MyEvent.Free;

end;


// Listening for the event

MyWidget.AddDelegate('OnMyDataUpdate',

 procedure(Sender: TQTXDelegate; Event: JEvent)

 var

   EventData: variant;

 begin

   // Cast to JCustomEvent to access the 'detail' property

   EventData := JCustomEvent(Event).detail;

   WriteLn('User: ' + EventData['UserName']); // User: Nadia

 end

);