Yes, I can confirm now that there is no exception... Strange!
Anyway, to convince you that the series is really removed I wrote two short procedures, one adds a series, and the other one removes all series. Both procedures ask the chart for the current series count, and they also seek the form for series owned. Both methods return the same number. In addition you can compile this with the heaptrace option set - there is no memory leak when the program ends:
procedure TForm1.Button1Click(Sender: TObject); // Add a series
var
ser: TChartSeries;
i, n: Integer;
begin
ser := TLineSeries.Create(self);
TLineSeries(ser).SeriesColor := rgb(random(256), random(256), random(256));
for i:=0 to 10 do ser.AddXY(i, random);
Chart1.AddSeries(ser);
n := 0;
for i:=0 to ComponentCount-1 do begin
if Components[i] is TChartSeries then inc(n);
end;
ShowMessage(
Format('The chart reports %d series.'#13'The form owns %d series.', [
Chart1.SeriesCount, n]));
end;
procedure TForm1.Button2Click(Sender: TObject); // remove all series
var
i: Integer;
n: Integer;
begin
Chart1.ClearSeries;
n := 0;
for i:=0 to ComponentCount-1 do begin
if Components[i] is TChartSeries then inc(n);
end;
ShowMessage(Format('The chart reports %d series.'#13'The form owns %d series.', [
Chart1.SeriesCount, n]));
end;
BTW, when creating series (or any other components) at runtime I normally do not set their "Name" property to avoid that duplicate name issue. For accessing these components, I use their variable name instead (like "ser" in above example).