Files
MycLib/Src/Myc.Signals.FMX.pas
T
2025-06-24 18:32:32 +02:00

77 lines
2.2 KiB
ObjectPascal

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.