TAChart Punkte updaten, wie funktioniert SetYList???

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

TAChart Punkte updaten, wie funktioniert SetYList???

Beitrag von laz847 »

Hallo zusammen,

ich habe ne kurze Frage, ich nutze den TAChart mit Box&Whiskers und komme an einer Stelle nicht weiter, ich setze die Punkte mit

Code: Alles auswählen

y[0]:=low;
y[1]:=close;
y[2]:=median;
y[3]:=open;
y[4]:=high;
bdn.ListSource.AddXYList(t,y) 
Das funktioniert einwandfrei, die Bars werden korrekt gezeichnet. Ich möchte nun bereits gezeichnete Punkte updaten, dazu nimmt man ja normalerweise ListSource.SetYList??? Wenn ich wie beim Erstellen Y mit neuen Werten übergebe, kommt da nur Mist bei raus.

Code: Alles auswählen

u := bdn.ListSource.Count-1;
y[0]:=l;
y[1]:=c;
y[2]:=m;
y[3]:=o;
y[4]:=h;
bdn.ListSource.SetYValue(u,l);
bdn.ListSource.SetYList(u,y);
Ich habe jetzt schon stundenlang rumprobiert wie die richtige Kombi sein könnte und auch aus dem Orginalsource https://github.com/alrieckert/lazarus/b ... ources.pas kann ich es nicht ersehen, einmal wird Y[0] verwendet, dann beim SetYList funktioniert das irgendwie anders? Ich hoffe das weiß jemand, man findet kaum etwas über diese Komponente :( ???

Vielen lieben Dank!

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: TAChart Punkte updaten, wie funktioniert SetYList???

Beitrag von wp_xyz »

man findet kaum etwas über diese Komponente
Na, da hast du aber nicht richtig gesucht:
http://wiki.lazarus.freepascal.org/TACh ... umentation
http://wiki.lazarus.freepascal.org/TAChart_User_Guide
http://wiki.lazarus.freepascal.org/TAChart_Demos
http://wiki.lazarus.freepascal.org/TACh ... ng_started
http://wiki.lazarus.freepascal.org/TACh ... _BarSeries
usw.

Zu deiner Frage: Das Problem ist, dass die Standard-Anwendung nur einen y-Wert pro x hat. Für solche Fälle wie deinen kam dann die YList dazu. Das ist ein Array, also beginnt der Index der YList mit 0. Es gibt aber noch den erwähnten "eigentlichen" y-Wert. Insgesamt hat man also 1 + Length(YList) y-Werte - diese Anzahl ist YCount. (siehe http://wiki.lazarus.freepascal.org/TACh ... ed_sources).

Bei Box-Whisker hat man 5 y-Werte: y[0] = Lower whisker, y[1] = Lower box bound, y[2] = Medium line, y[3] = Upper box bound, y[4] = Upper whisker (siehe auch http://wiki.lazarus.freepascal.org/TACh ... ers_series).

y[0] ist das, was ich als "eigentlichen" y-Werte bezeichnet habe, also der Wert, den man bei einer LineSeries mit AddXY festlegt. Er wird durch SetYValue geändert. y[1] bis y[4] sind in der YList gespeichert - sie kannst du mit SetYList verändern (wo sie aber über die Indices 0..3 angesprochen werden...).

Konkret heißt das dann, mit deinen Bezeichnern:

Code: Alles auswählen

 
  u := bdn.ListSource.Count-1;
  y[0]:=l;
  y[1]:=c;
  y[2]:=m;
  y[3]:=o;
  y[4]:=h;
  bdn.ListSource.SetYValue(u, y[0]);
  bdn.ListSource.SetYList(u, [ y[1], y[2], y[3], y[4] ] );
{ 
  oder natürlich auch kürzer:
 
  bdn.ListSource.SetYValue(u, l);
  bdn.ListSource.SetYList(u, [c, m, o, h]);
}
 

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: TAChart Punkte updaten, wie funktioniert SetYList???

Beitrag von laz847 »

Huhu :D

Vielen lieben Dank für die ausführliche Erklärung, ich hab mich blöd ausgedrückt, über die Komponente ist etwas zu finden aber nicht über SetYList() und auch wie YList geht war eigentlich klar, das ADDXY ging ja :D ... Leider lag mein Fehler an einer anderen Stelle. Ich habs dann versucht anders zu lösen, mit Delete(index) + neu zeichen, dabei fiel mir mir soeben auf, dass mein Problem im INDEX lag, nicht beim SetYList. Sehr ärgerlich, ich hätte noch ewig suchen können, wenn man natürlich den falschen Index bearbeitet, kommt da nur Mist bei raus.

Der Fehler entstand, weil ich 2 Datenreihen verwende, einmal für fallende Kerzen (rot) und steigende (grün), da ich die wechselweise zeichne stimmte natürlich der Index auf bdn.ListSource.Count / bup.ListSource.Count nicht mit der aktuellen Position überein :oops: ...

Falls es jemanden interessiert, wer damit nen coolen Chart zeichnen will, einfach bei neuen Bars alle berechnen und bei Änderungen der aktuellen Kerze nur die letzten 2, damit konnte ich jetzt einen Livestream hinbekommen. Bin echt überrascht von der Performance des TAChart, ich halte den Chart bei um die 1-10ms aktuell :D

Vielen lieben Dank :?

Antworten