TBoldPassthroughSubscriber¶
TBoldPassthroughSubscriber is the most commonly used concrete subscriber. It delegates received events to a callback method, making it easy to react to Bold events without creating custom subscriber classes.
Class Hierarchy¶
classDiagram
TBoldSubscriber <|-- TBoldPassthroughSubscriber
TBoldPassthroughSubscriber <|-- TBoldExtendedPassthroughSubscriber
TBoldPassthroughSubscriber : +Create(AReceiveFunc)
TBoldPassthroughSubscriber : +ReceiveFunc
TBoldExtendedPassthroughSubscriber : +CreateWithExtendedReceive()
TBoldExtendedPassthroughSubscriber : +CreateWithReceiveAndAnswer()
click TBoldSubscriber href "../TBoldSubscriber/" "TBoldSubscriber documentation"
Class Definition¶
TBoldEventHandler = procedure(Originator: TObject;
OriginalEvent: TBoldEvent;
RequestedEvent: TBoldRequestedEvent) of object;
TBoldPassthroughSubscriber = class(TBoldSubscriber)
public
constructor Create(AReceiveFunc: TBoldEventHandler);
property ReceiveFunc: TBoldEventHandler read/write;
end;
// Extended version for events with arguments and queries
TBoldExtendedPassthroughSubscriber = class(TBoldPassthroughSubscriber)
public
constructor CreateWithExtendedReceive(
AExtendedReceiveFunc: TBoldExtendedEventHandler);
constructor CreateWithReceiveAndAnswer(
AReceiveFunc: TBoldEventHandler;
AAnswerFunc: TBoldQueryHandler);
end;
Working with TBoldPassthroughSubscriber¶
Basic Event Handling¶
type
TMyForm = class(TForm)
private
fSubscriber: TBoldPassthroughSubscriber;
procedure HandleEvent(Originator: TObject;
OriginalEvent: TBoldEvent;
RequestedEvent: TBoldRequestedEvent);
end;
procedure TMyForm.FormCreate(Sender: TObject);
begin
// Create subscriber with callback
fSubscriber := TBoldPassthroughSubscriber.Create(HandleEvent);
// Subscribe to value changes on a specific object
Customer.M_Name.DefaultSubscribe(fSubscriber);
end;
procedure TMyForm.HandleEvent(Originator: TObject;
OriginalEvent: TBoldEvent;
RequestedEvent: TBoldRequestedEvent);
begin
// React to the change
UpdateDisplay;
end;
procedure TMyForm.FormDestroy(Sender: TObject);
begin
fSubscriber.Free; // automatically cancels subscriptions
end;
Subscribing to Multiple Events¶
// Subscribe to specific small events using a set
Customer.AddSmallSubscription(fSubscriber,
[beValueChanged, beObjectDeleted],
beValueChanged); // RequestedEvent for routing
Extended Events with Arguments¶
fExtSubscriber := TBoldExtendedPassthroughSubscriber.CreateWithExtendedReceive(
HandleExtendedEvent);
procedure TMyForm.HandleExtendedEvent(Originator: TObject;
OriginalEvent: TBoldEvent;
RequestedEvent: TBoldRequestedEvent;
const Args: array of const);
begin
// Args contain additional event data
end;
Query Handling (Veto Pattern)¶
fQuerySubscriber := TBoldExtendedPassthroughSubscriber.CreateWithReceiveAndAnswer(
HandleEvent, HandleQuery);
function TMyForm.HandleQuery(Originator: TObject;
OriginalEvent: TBoldEvent;
RequestedEvent: TBoldRequestedEvent;
const Args: array of const;
Subscriber: TBoldSubscriber): Boolean;
begin
// Return False to veto the operation
Result := CanPerformOperation;
end;
Subscribable Base Classes¶
Most Bold objects inherit from a subscribable base class that embeds a TBoldPublisher:
| Base Class | Inherits From | Used By |
|---|---|---|
TBoldSubscribableObject |
TBoldFlaggedObject |
Domain elements, members |
TBoldSubscribableComponent |
TComponent |
Handles, UI components |
TBoldSubscribablePersistent |
TPersistent |
Persistent settings |
These all expose the same convenience methods:
AddSubscription(Subscriber, Event, RequestedEvent);
AddSmallSubscription(Subscriber, EventSet, RequestedEvent);
SendEvent(Event);
See Also¶
- TBoldSubscriber - Abstract base
- TBoldPublisher - The sender side
- TBoldAbstractDeriver - Derivation subscriber
- Subscriptions - Concept overview