TAChart: Do not crash after removing a referenced chart source.

git-svn-id: trunk@20158 -
This commit is contained in:
ask 2009-05-24 07:17:39 +00:00
parent 39ae87f65f
commit 28d862e408
2 changed files with 20 additions and 7 deletions

View File

@ -353,6 +353,7 @@ type
FSeries: TChartSeries;
public
constructor Create(ASeries: TChartSeries);
procedure Forget; override;
procedure Notify; override;
end;
@ -363,6 +364,12 @@ begin
FSeries := ASeries;
end;
procedure TChartSeriesListener.Forget;
begin
inherited Forget;
FSeries.FSource := nil;
end;
procedure TChartSeriesListener.Notify;
begin
FSeries.UpdateParentChart;
@ -713,13 +720,11 @@ end;
procedure TLineSeries.SetXValue(AIndex: Integer; AValue: Double);
begin
ListSource.SetXValue(AIndex, AValue);
UpdateParentChart;
end;
procedure TLineSeries.SetYValue(AIndex: Integer; AValue: Double);
begin
ListSource.SetXValue(AIndex, AValue);
UpdateParentChart;
ListSource.SetYValue(AIndex, AValue);
end;
function TLineSeries.GetXImgValue(AIndex: Integer): Integer;

View File

@ -24,8 +24,9 @@ type
private
FIsListening: Boolean;
public
procedure Forget; virtual;
procedure Notify; virtual; abstract;
property IsListening: Boolean read FIsListening write FIsListening;
property IsListening: Boolean read FIsListening;
end;
{ TCustomChartSource }
@ -193,7 +194,7 @@ var
i: Integer;
begin
for i := 0 to High(FListeners) do
FListeners[i].IsListening := false;
FListeners[i].Forget;
FListeners := nil;
inherited Destroy;
end;
@ -252,7 +253,7 @@ begin
raise EListenerError.Create('Listener subscribed twice');
if FindListener(AListener) >= 0 then
raise EListenerError.Create('Duplicate listener');
AListener.IsListening := true;
AListener.FIsListening := true;
SetLength(FListeners, Length(FListeners) + 1);
FListeners[High(FListeners)] := AListener;
end;
@ -263,7 +264,7 @@ var
begin
if not AListener.IsListening then
raise EListenerError.Create('Listener not subscribed');
AListener.IsListening := false;
AListener.FIsListening := false;
j := FindListener(AListener);
if j < 0 then
raise EListenerError.Create('Listener not found');
@ -676,5 +677,12 @@ begin
Notify;
end;
{ TListener }
procedure TListener.Forget;
begin
FIsListening := false;
end;
end.