TeeChart cannot load my custom properties using LoadChartFromStream

63 views Asked by At

LoadChartFromStream causes an exception when SaveChartToStream has saved some of my custom properties.

It crashes with "property MyCoolProperty does not exist".

type
  TMyChart = class(TChart)
  strict private
    MyCoolProperty: Integer;
  published
    property MyCoolProperty: Integer read FMyCoolProperty write FMyCoolProperty;
  end;

Chart, CopyChart: TMyChart;

MStream := TMemoryStream.Create;
try
  SaveChartToStream(Chart, MStream, False, False);
  MStream.Position := 0;
  LoadChartFromStream(TCustomChart(CopyChart), MStream);
finally
  MStream.Free;
end;

How to make LoadChartFromStream ignore properties that it cannot cope with and load properties that it can load without breaking the whole because of one small part?

1

There are 1 answers

0
Yeray On

Let me copy the reply from here, where a similar issue was addressed

Have you tried overriding DefineProperties and adding there the properties to serialize? This works fine for me here:

uses TeeStore;

type TMyBarSeries = class(TBarSeries)
  private
    procedure WriteBarName(Writer: TWriter);
    procedure ReadBarName(Reader: TReader);
    procedure WriteBarID(Writer: TWriter);
    procedure ReadBarID(Reader: TReader);

  protected
    IBarNameStored: boolean;
    IBarName: string;
    IBarID: Integer;

    procedure DefineProperties(Filer:TFiler); override;

  public
    property BarName: string read IBarName write IBarName stored IBarNameStored;
    property BarID: Integer read IBarID write IBarID default -1;
end;

procedure TMyBarSeries.DefineProperties(Filer: TFiler); 
begin
  inherited;  
  Filer.DefineProperty('BarName',ReadBarName,WriteBarName,True);  
  Filer.DefineProperty('BarID',ReadBarID,WriteBarID,True); 
end;

procedure TMyBarSeries.WriteBarName(Writer: TWriter); 
begin
  Writer.WriteIdent(BarName); 
end;

procedure TMyBarSeries.ReadBarName(Reader: TReader); 
begin
  BarName:=Reader.ReadIdent;
end;

procedure TMyBarSeries.WriteBarID(Writer: TWriter);
begin
  Writer.WriteInteger(BarID);
end;

procedure TMyBarSeries.ReadBarID(Reader: TReader);
begin
  BarID:=Reader.ReadInteger;
end;

procedure TForm1.FormCreate(Sender: TObject); 
var memStream1: TStream;
begin   
  RegisterClass(TMyBarSeries);

  Chart1.View3D:=false;   
  Chart1.Legend.Visible:=false;

  with Chart1.AddSeries(TMyBarSeries) as TMyBarSeries do
  begin
    BarID:=1;
    BarName:='MyBar #' + IntToStr(BarID);
    FillSampleValues;
    ColorEachPoint:=true;
  end;

  memStream1:=TMemoryStream.Create;
  SaveChartToStream(Chart1, memStream1);

  memStream1.Position:=0;
  LoadChartFromStream(Chart2, memStream1);

  Chart2.Top:=Chart1.Top+Chart1.Height+10;

  Memo1.Clear;
  Memo1.Lines.Add(IntToStr((Chart1[0] as TMyBarSeries).BarID));
  Memo1.Lines.Add((Chart1[0] as TMyBarSeries).BarName);

  Memo1.Lines.Add(IntToStr((Chart2[0] as TMyBarSeries).BarID));  
  Memo1.Lines.Add((Chart2[0] as TMyBarSeries).BarName);
end;