TAChart hoizontales Scrollen

Rund um die LCL und andere Komponenten
Antworten
JKnill
Beiträge: 16
Registriert: Mo 14. Mär 2011, 15:46

TAChart hoizontales Scrollen

Beitrag von JKnill »

Hallo

ich suche jetzt schon seit 2 Tagen (google, und einschlägige Foren) um heraus zu finden wie ich TAChart dazu bewegen kann horizontal zu scrollen
Ich habe mir auch die ganzen Demos schon angesehen aber vielleicht bin ich ja blind.

Also ich habe 4 verschiedene Serien in einem Chart (Spannungen) welche auf einer Zeitachse dargestellt werden.
nun kommen immer neue Daten hinzu ähnlich wie bei einem Oszilloskope soll nun eine anzahl (z.B. 1000 Messpunkte) dargesellt werden und die älteren einfach aus der anzeige links rausscrollen

Das ist doch bestimmt mit TAChart möglich?
Wie setze ich die Anzahl an Messpunkten die im Diagramm dargestellt werden (z.B. 1000 Werte) und wie veranlasse ich dann das Chart dazu die älteren Daten links rauszuscrollen ?

Wäre Toll wenn mir hier jemand weiterhelfen könnte.

LG vom Bodensee

Jürgen

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TAChart hoizontales Scrollen

Beitrag von Linkat »

Hallo JKnill,
ich weis nicht, ob das Problem direkt mit Methoden von TAChart zu lösen ist.
Ich würde so vorgehen:
- lade deine Messwerte in dynamische Felder
- kopiere nach jeder neuen Messung die letzten n-Wertepaare in Chart1LineSeries1.AddXY(xi,yi) , die dann in Chart1 dargestellt werden.

Viel Erfolg.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

JKnill
Beiträge: 16
Registriert: Mo 14. Mär 2011, 15:46

Re: TAChart hoizontales Scrollen

Beitrag von JKnill »

Hallo Linkat

Danke für die schnelle Antwort

ich habe das ohne zeitachse mit

Chart1.Extent.XMin :=Chart1.Extent.XMin + 1000 ;
Chart1.Extent.XMax:=Chart1.Extent.XMin + 10000;

das funktioniert aber leider nicht mehr sobald DateTimeIntervalChartSource verwendet wird

werde deinen vorschlag mal versuchen ( evt mit MEMDB )

LG vom Bodensee

Jürgen

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TAChart hoizontales Scrollen

Beitrag von Linkat »

Hallo Jürgen,
habe ein kleines Testprogramm geschrieben. was eine Sinuskurve durch das Chart treibt.

Code: Alles auswählen

unit OssziTestU;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, TAGraph, TASeries, Forms, Controls, Graphics,
  Dialogs, StdCtrls, Buttons, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    btStart: TButton;
    Chart1: TChart;
    Chart1LineSeries1: TLineSeries;
    Timer1: TTimer;
    procedure btStartClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }    {Test von Linkat 23.08.12}
var mwz               :Integer;          {Messwertzähler}
    t0,t              :Double;
    daX,daY           :array of Double;  {dynam. Arrays}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  BitBtn1.Caption:='&Schließen';
  btStart.Caption:='S&tart Osszi';
  timer1.Enabled:=False;
  timer1.Interval:=100;
end;
 
procedure TForm1.btStartClick(Sender: TObject);
begin
  mwz:=0;
  timer1.Enabled:=True;
  t0:=now;
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  SetLength(daX,0);
  SetLength(daY,0);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var i     :Integer;
    x,y   :Double;
begin
  inc(mwz);
  Caption:=IntToStr(mwz);
  SetLength(daX,mwz);
  SetLength(daY,mwz);
  t:=now;
  t:=t-t0;       {Zeitdifferenz von jetzt zu Beginn der Messung (in Tagen)}
  x:=t*60*60*24;  {Zeit in Sekunden}
  y:=sin(x);
  daX[mwz-1]:=x;
  daY[mwz-1]:=y;
  Chart1LineSeries1.Clear;
  for i:=mwz-50 to mwz-1 do if i>=0 then begin
    Chart1LineSeries1.AddXY(daX[i],daY[i]);
    //chart1.Extent.XMin:=daX[mwz-50];     <-  wird nicht benötigt
  end;
end;
 
end.


Gruß, Linkat
Zuletzt geändert von Linkat am Fr 24. Aug 2012, 13:37, insgesamt 1-mal geändert.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

JKnill
Beiträge: 16
Registriert: Mo 14. Mär 2011, 15:46

Re: TAChart hoizontales Scrollen

Beitrag von JKnill »

Hi Linkat

danke für den Source jetzt habe ich es kapiert

werde ich dann nächste Woche versuchen

nochmal Danke und ein schönen Wocheende

LG vom Bodensee

Jürgen

Antworten