Real-Time Chart.

Hi,

I have created an application that monitors the CPU usage of a specific application.  I would like to represent that data in a chart/graph in real-time.

What I'm looking for is a line chart that starts on the right hand side and moves across the screen.  Previous points would disappear off the left hand side of the chart as the chart fills up and new points are added to the right hand side (similar to what happens in Resource Monitor).

Is this possible with FNC Chart?  Or maybe with the VCL Chart?

Thanks.

= Steve

Hi,


this is possible. You can dynamically "feed" an array of points to the chart with the OnGetNumberOfPoints and the OnGetPoint events in TMS FNC Chart
Thanks Pieter,

Do you have a demo or example?

Thanks.

= Steve

This is a complete code sample that demonstrates this (FMX)




unit Unit83;


interface


uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TMSFNCChart;


type
  TForm83 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    c: TTMSFNCChart;
    FPointArray: array of Double;
  public
    { Public declarations }
    procedure DoTimer(Sender: TObject);
    procedure DoGetNumberOfPoints(Sender: TObject; ASerie: TTMSFNCChartSerie; var ANumberOfPoints: Integer);
    procedure DoGetPoint(Sender: TObject; ASerie: TTMSFNCChartSerie; AIndex: Integer; var APoint: TTMSFNCChartPointVirtual);
  end;


var
  Form83: TForm83;


implementation


{$R *.fmx}


procedure TForm83.DoGetNumberOfPoints(Sender: TObject;
  ASerie: TTMSFNCChartSerie; var ANumberOfPoints: Integer);
begin
  ANumberOfPoints := Length(FPointArray);
end;


procedure TForm83.DoGetPoint(Sender: TObject; ASerie: TTMSFNCChartSerie;
  AIndex: Integer; var APoint: TTMSFNCChartPointVirtual);
begin
  if (AIndex >= 0) and (AIndex <= Length(FPointArray) - 1) then
    APoint.YValue := FPointArray[AIndex];
end;


procedure TForm83.DoTimer(Sender: TObject);
begin
  c.BeginUpdate;
  SetLength(FPointArray, Length(FPointArray) + 1);
  FPointArray[Length(FPointArray) - 1] := Random(1000);
  if Length(FPointArray) >= c.Series[0].MaxX then
  begin
    c.Series[0].MinX := c.Series[0].MinX + 1;
    c.Series[0].MaxX := c.Series[0].MaxX + 1;
  end;


  c.EndUpdate;
end;


procedure TForm83.FormCreate(Sender: TObject);
var
  t: TTimer;
begin
  c := TTMSFNCChart.Create(Self);
  c.Parent := Self;
  c.OnGetNumberOfPoints := DoGetNumberOfPoints;
  c.OnGetPoint := DoGetPoint;
  c.Series.Add;




  t := TTimer.Create(Self);
  t.OnTimer := DoTimer;
  t.Interval := 1000;
  t.Enabled := True;
end;


end.

That's fantastic!  Thank you very much Pieter.

= Steve

Good afternoon Pieter,
i tried to run your example on Delphi 11 with last fncchart release (2.6.1.5) but, when i run the demo, i get this error "Range check error" in DoGetPoint.

I need to fill a chart in realtime ... and this example is a very good starting point.

Thank you for attention.

Bestr regards
Daniele

You might want to add checks to make sure the AIndex doesn't fall outside the length of the array

Thank's Pieter ..