Chart data logic separation

This commit is contained in:
Michael Schimmel
2025-07-13 10:04:47 +02:00
parent 956c47ba36
commit e75cb2ecb3
7 changed files with 402 additions and 318 deletions
+47 -1
View File
@@ -66,7 +66,7 @@ type
private
FProc: TProc;
protected
function ProcessData(const Value: T): Boolean; override;
function ProcessData(const Value: T): Boolean; override; final;
public
constructor Create(const AProc: TProc);
end;
@@ -81,6 +81,27 @@ type
constructor Create(const Controller: IInterface; const AProc: TProc);
end;
IMycConverter<S, T> = interface(IMycProcessor<S>)
function GetSender: IMycDataProvider<T>;
property Sender: IMycDataProvider<T> read GetSender;
end;
TMycConverter<S, T> = class abstract(TMycProcessor<S>, IMycConverter<S, T>)
private
FSender: TMycDataProvider<T>;
function GetSender: IMycDataProvider<T>;
protected
function ProcessData(const Value: S): Boolean; override; abstract;
// Broadcasts the given data to all linked processors.
procedure Broadcast(const Value: T);
public
constructor Create;
destructor Destroy; override;
property Sender: IMycDataProvider<T> read GetSender;
end;
// An immutable time-ordered series of data points.
// The most recent element has the logical index 0.
IDataSeries<T> = interface
@@ -508,4 +529,29 @@ begin
end;
end;
{ TMycConverter<S, T> }
constructor TMycConverter<S, T>.Create;
begin
inherited Create;
FSender := TMycDataProvider<T>.Create(Self);
end;
destructor TMycConverter<S, T>.Destroy;
begin
FSender.Free;
inherited Destroy;
end;
procedure TMycConverter<S, T>.Broadcast(const Value: T);
begin
var cValue := Value;
FSender.Notify(function(const Processor: IMycProcessor<T>): Boolean begin Result := Processor.ProcessData(cValue) end);
end;
function TMycConverter<S, T>.GetSender: IMycDataProvider<T>;
begin
Result := FSender;
end;
end.