unit Myc.Signals.FMX; interface uses System.Classes, System.SysUtils, System.Messaging, Myc.Signals; type TMsgProc = reference to procedure(const Sender: TObject; const M: TMessage); TComponentValidation = class(TComponent) private FReceived: TFlag; FProc: TMsgProc; FSubscription: TMessageSubscriptionId; FMsgClass: TClass; procedure DoMsg(const Sender: TObject; const M: TMessage); public constructor Create(AOwner: TComponent; const AMsgClass: TClass; const ASignal: TSignal; const AProc: TMsgProc); reintroduce; destructor Destroy; override; end; TComponentValidationHelper = class helper for TComponent procedure AddMsgHandler(const MsgClass: TClass; const Signal: TSignal; const Proc: TMsgProc); procedure AddIdleHandler(const Signal: TSignal; const Proc: TProc); end; implementation uses {$IFDEF FRAMEWORK_FMX} FMX.Types {$ELSE} VCL.Types // to be checked {$IFEND} ; { TComponentValidation } constructor TComponentValidation.Create(AOwner: TComponent; const AMsgClass: TClass; const ASignal: TSignal; const AProc: TMsgProc); begin inherited Create(AOwner); FMsgClass := AMsgClass; FProc := AProc; FReceived := TFlag.CreateObserver(ASignal); FSubscription := TMessageManager.DefaultManager.SubscribeToMessage(FMsgClass, DoMsg); end; destructor TComponentValidation.Destroy; begin TMessageManager.DefaultManager.Unsubscribe(FMsgClass, FSubscription); inherited; end; procedure TComponentValidation.DoMsg(const Sender: TObject; const M: TMessage); begin if FReceived.Reset then FProc(Sender, M); end; procedure TComponentValidationHelper.AddIdleHandler(const Signal: TSignal; const Proc: TProc); begin var capProc := Proc; AddMsgHandler(TIdleMessage, Signal, procedure(const Sender: TObject; const M: TMessage) begin capProc(); end); end; procedure TComponentValidationHelper.AddMsgHandler(const MsgClass: TClass; const Signal: TSignal; const Proc: TMsgProc); begin TComponentValidation.Create(Self, MsgClass, Signal, Proc); end; end.