Chart not updating on VCL form after modify the DataSource dynamically

TeeChart VCL for Borland/CodeGear/Embarcadero RAD Studio, Delphi and C++ Builder.
Post Reply
P.Ferenc
Newbie
Newbie
Posts: 1
Joined: Fri Feb 19, 2021 12:00 am

Chart not updating on VCL form after modify the DataSource dynamically

Post by P.Ferenc » Tue Apr 25, 2023 5:22 pm

Hi,
I would like to ask for help from people who use TeeChart (pro version, but I think have not different in standard verion)...
I use the following code to modify the Series values for the Chart (linked to database table field), but after running this code the Chart does not update on VCL form...
(Delphi 11.3 + Teechart Pro 2022.34 on windows 11 x64)

What am I missing or doing incorrectly?

Code: Select all

    DataSource := DM.DataSourceTest;
    DataSet := DataSource.DataSet;
    FieldName := Series1.YValues.ValueSource;
    DataSet.First;
    while not DataSet.Eof do begin
      FieldValue := DataSet.FieldByName(FieldName).AsInteger;
      if FieldValue > 100 then begin
        FieldValue := FieldValue - random(10);
        DataSet.Edit;
        DataSet.FieldByName(FieldName).AsInteger := FieldValue;
        DataSet.Post;
      end;
      DataSet.Next;
    end;
    Series1.CheckDatasource;
    dbChartTest.Invalidate;
    dbChartTest.Refresh;
    Application.ProcessMessages;
Thank you!

Yeray
Site Admin
Site Admin
Posts: 9622
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Chart not updating on VCL form after modify the DataSource dynamically

Post by Yeray » Tue May 09, 2023 12:16 pm

Hello,

This is a simple example of a TDBChart with a TLineSeries linked to a TFDMemTable updating values with a TTimer.
It seems to work fine for me here just calling CheckDataSource everytime the table is modified.

Code: Select all

var FDMemTable: TFDMemTable;
    Chart: TDBChart;
    Series: TLineSeries;
    Timer: TTimer;

procedure TForm1.FormCreate(Sender: TObject);
var val: Double;
    i: Integer;
begin
  FDMemTable:=TFDMemTable.Create(Self);
  FDMemTable.FieldDefs.Add('Price', ftInteger);
  FDMemTable.CreateDataSet;
  FDMemTable.Open;

  val:=1000+Random(500);
  for i:=0 to 10 do
  begin
    FDMemTable.AppendRecord([val]);
    val:=val+Round(Random(10)-4.5);
  end;

  Chart:=TDBChart.Create(Self);
  Chart.Parent:=Self;
  Chart.Align:=alClient;
  Chart.View3D:=False;
  Chart.Legend.Hide;

  Series:=TLineSeries(Chart.AddSeries(TLineSeries));
  Series.DataSource:=FDMemTable;
  Series.YValues.ValueSource:='Price';

  Timer:=TTimer.Create(Self);
  Timer.Interval:=1000;
  Timer.OnTimer:=TimerTick;
  Timer.Enabled:=True;
end;

procedure TForm1.TimerTick(Sender: TObject);
var val: Double;
begin
  val:=Series.YValues.Last+Round(Random(10)-4.5);
  FDMemTable.AppendRecord([val]);

  Series.CheckDataSource;
end;
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Post Reply