77 lines
2.2 KiB
ObjectPascal
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.
|