Page 1 of 1
Duplicate chart with custom axes
Posted: Mon Jan 29, 2018 10:52 am
by 16582575
VCL/FMX TeeChart ver 2017.22.170619, Delphi 10.2 Version 25.0.27659.1188
If there are custom axes on a chart, CloneChart does not copy them. The only way to duplicate such chart appears to be Save it to Stream and Load the stream in the new chart.
if Master is the original chart and clone is its duplicate, I get the following results:
Clone.Assign(Master):
- ss_Assign.png (33.82 KiB) Viewed 8996 times
Code: Select all
CloneChart(clone, master, self, FALSE):
- ss_Clone.png (30.57 KiB) Viewed 8994 times
When I use save to/load from stream, I get proper results. A simple project is attached. Use Edit->Copy(Assign), Edit->Copy(Clone) and Edit->Copy(Stream) to see the effects.
Roumen
Re: Duplicate chart with custom axes
Posted: Mon Jan 29, 2018 2:37 pm
by yeray
Hello,
This sounds as the very same ticket
#780, isn't it?
Re: Duplicate chart with custom axes
Posted: Mon Jan 29, 2018 4:30 pm
by 16582575
Thank you for the quick reply. I will need to use one of the suggested workarounds. Not sure why I did not find the topic.
It is disappointing that the problem was reported in 2013 and in 2018 CloneChart is not doing what it is supposed to do still...
Best regards
Roumen
Re: Duplicate chart with custom axes
Posted: Tue Jan 30, 2018 10:31 am
by yeray
Hello Roumen,
roumen wrote:It is disappointing that the problem was reported in 2013 and in 2018 CloneChart is not doing what it is supposed to do still...
You are right. I've revised the ticket
#780 and just implemented a fix for it.
Since you own the TeeChart sources - and it's pretty simple - you can implement it and (Tee)Recompile them.
At CloneChart method in Chart.pas, add this after the loop where the series are cloned:
Code: Select all
procedure CloneChart(const Dest,Origin:TCustomChart; const AOwner:TComponent; ForceManualData:Boolean);
//...
for t:=0 to Origin.SeriesCount-1 do
begin
//...
CloneChartSeries(Origin[t],AOwner,Dest);
//...
end;
// Relink Custom Axes within Destination Series
for t:=0 to Origin.SeriesCount-1 do
begin
if Origin[t].CustomVertAxis <> nil then
Dest[t].CustomVertAxis:=Dest.CustomAxes[Origin[t].CustomVertAxis.Index];
if Origin[t].CustomHorizAxis <> nil then
Dest[t].CustomHorizAxis:=Dest.CustomAxes[Origin[t].CustomHorizAxis.Index];
end;
//...
At the end of the TChartAxis.Assign method in TeEngine.pas, add this:
Code: Select all
procedure TChartAxis.Assign(Source: TPersistent);
Begin
if Source is TChartAxis then
With TChartAxis(Source) do
Begin
//...
Self.FPartnerAxis :=FPartnerAxis;
Self.FUsePartnerAxis :=FUsePartnerAxis;
end
else inherited;
end;