TAChart: Move more functionality from clients into TListener class

git-svn-id: trunk@24471 -
This commit is contained in:
ask 2010-04-06 15:11:18 +00:00
parent c08a43fead
commit 5b2e752e04
2 changed files with 40 additions and 42 deletions

View File

@ -140,15 +140,22 @@ type
property Index: Integer read GetIndex write SetIndex;
end;
TBroadcaster = class;
{ TListener }
TListener = class
private
FIsListening: Boolean;
FBroadcaster: TBroadcaster;
FOnNotify: TNotifyEvent;
FRef: PPointer;
function GetIsListening: Boolean;
public
constructor Create(ARef: PPointer; AOnNotify: TNotifyEvent);
destructor Destroy; override;
procedure Forget; virtual;
procedure Notify; virtual; abstract;
property IsListening: Boolean read FIsListening;
procedure Notify(ASender: TObject); virtual;
property IsListening: Boolean read GetIsListening;
end;
{ TBroadcaster }
@ -728,9 +735,33 @@ end;
{ TListener }
constructor TListener.Create(ARef: PPointer; AOnNotify: TNotifyEvent);
begin
FOnNotify := AOnNotify;
FRef := Aref;
end;
destructor TListener.Destroy;
begin
if IsListening then
FBroadcaster.Unsubscribe(Self);
inherited;
end;
procedure TListener.Forget;
begin
FIsListening := false;
FBroadcaster := nil;
FRef^ := nil;
end;
function TListener.GetIsListening: Boolean;
begin
Result := FBroadcaster <> nil;
end;
procedure TListener.Notify(ASender: TObject);
begin
FOnNotify(ASender)
end;
{ TBroadcaster }
@ -740,7 +771,7 @@ var
i: Integer;
begin
for i := 0 to Count - 1 do
TListener(Items[i]).Notify;
TListener(Items[i]).Notify(nil);
end;
destructor TBroadcaster.Destroy;
@ -758,7 +789,7 @@ begin
raise EListenerError.Create('Listener subscribed twice');
if IndexOf(AListener) >= 0 then
raise EListenerError.Create('Duplicate listener');
AListener.FIsListening := true;
AListener.FBroadcaster := Self;
Add(AListener);
end;
@ -768,7 +799,7 @@ var
begin
if not AListener.IsListening then
raise EListenerError.Create('Listener not subscribed');
AListener.FIsListening := false;
AListener.Forget;
i := IndexOf(AListener);
if i < 0 then
raise EListenerError.Create('Listener not found');

View File

@ -149,37 +149,6 @@ implementation
uses
Math, TAChartAxis;
type
{ TChartSeriesListener }
TChartSeriesListener = class(TListener)
private
FSeries: TChartSeries;
public
constructor Create(ASeries: TChartSeries);
procedure Forget; override;
procedure Notify; override;
end;
{ TChartSeriesListener }
constructor TChartSeriesListener.Create(ASeries: TChartSeries);
begin
FSeries := ASeries;
end;
procedure TChartSeriesListener.Forget;
begin
inherited Forget;
FSeries.FSource := nil;
end;
procedure TChartSeriesListener.Notify;
begin
FSeries.UpdateParentChart;
end;
{ TCustomChartSeries }
function TCustomChartSeries.AxisToGraphX(AX: Double): Double;
@ -376,7 +345,7 @@ const
begin
inherited Create(AOwner);
FListener := TChartSeriesListener.Create(Self);
FListener := TListener.Create(@FSource, @StyleChanged);
FBuiltinSource := TListChartSource.Create(Self);
FBuiltinSource.Name := BUILTIN_SOURCE_NAME;
FBuiltinSource.Broadcaster.Subscribe(FListener);
@ -390,11 +359,9 @@ end;
destructor TChartSeries.Destroy;
begin
if FListener.IsListening then
Source.Broadcaster.Unsubscribe(FListener);
FListener.Free;
FBuiltinSource.Free;
FMarks.Free;
FListener.Free;
inherited Destroy;
end;