TChart - Wie kann man Kurven löschen? Dringend!

Rund um die LCL und andere Komponenten
Antworten
weber_8722
Beiträge: 26
Registriert: Mo 17. Feb 2014, 10:11

TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von weber_8722 »

Hallo,

habe darunter ein schönes Beispiel gefunden:

http://wiki.lazarus.freepascal.org/TACh ... ng_started

Es zeigt aber nur wie man mit AddXY einen Punkt in der Kurve hinzufügen kann (wenn man vorher SinSeries als Serie definiert hat).

for i:=0 to N-1 do begin
x := MIN + (MAX - MIN) * i /(N - 1);
SinSeries.AddXY(x, sin(x));
end;

Wenn ich nun die Schleife mit anderen Werten neu durchlaufe, dann werden immer mehr Punkte hinzugefügt.

Aber wie kann kann ich einfach von einem leeren Chart noch einmal starten, z.B. weil sich die Daten geändert haben.

In Delphi scheint es so etwas wie RemoveSeries und RemoveAllSeries zu geben, aber das geht mit Lazarus nicht.

Hat jemand eine Idee wie man ein Chart-"Refresh" macht? :idea:

Cia Stephan

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

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von wp_xyz »

Es gibt mehrere Möglichkeiten mit unterschiedlichen Auswirkungen

(1) Du lässt die Series bestehen, entfernst die Daten, behältst aber die Formatierung wie Farbe, Titel, etc.: Die Daten, die du per AddXY der Series hinzugefügt hast, sind in der internen ListSource der Series gespeichert - rufe einfach "SinSeries.ListSource.Clear" auf. Anschließend kannst du die Series, wie in dem Tutorial gezeigt, wieder mit neuen Daten füllen.

(2) Du entfernst komplett die Series aus dem Chart, weil du zum Beispiel den Series-Typ ändern möchtest: Zuerst "Chart1.DeleteSeries(SinSeries)" aufrufen, dann die Series zerstören: "SinSeries.Free" (oder besser: "FreeAndNil(SinSeries)"). Beachte, dass SinSeries hinterher nicht mehr existiert. Wenn du die Series wieder brauchst musst du sie neu erzeugen - vielleicht diesmal als AreaSeries? "SinSeries := TAreaSeries.Create(self)" (self bezieht sich hier auf das Formular) und "Chart1.AddSeries(SinSeries)". Und nicht vergessen, die Properites wieder zu setzen und die Daten hinzuzufügen. Und SinSeries muss als TChartSeries deklariert sein, damit der Compiler die Umwandlung der Typen akzeptiert.

weber_8722
Beiträge: 26
Registriert: Mo 17. Feb 2014, 10:11

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von weber_8722 »

Danke!!! SinSeries.Clear;

macht was ich möchte!

Nun möchte ich noch ein einfaches Copy-to-clipboard einbauen. Gibt es da etwas fertiges?

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

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von wp_xyz »

SinSeries.Clear;

Ach ja, das geht auch noch - macht dasselbe wie SinSeries.ListSource.Clear

ein einfaches Copy-to-clipboard einbauen

Chart1.CopyToClipboardBitmap;

Tipp: Fahre mit gedrückter CTRL-Taste mit der Maus über das "TChart" in der Deklaration "Chart1: TChart". Das TChart wird dann blau und unterstrichen. Wenn du jetzt auf dem TChart klickst (als CTRL-Taste gedrückt!), öffnet sich die Unit, in der TChart implementiert ist. Scrolle nach unten, bis zum "public" oder "published"-Abschnitt - da findest du alles, was diese Klasse auf der Anwendungsebenen kann.

Ansonsten ist oft ein Blick in die Dokumentation von TAChart hilfreich: http://wiki.lazarus.freepascal.org/TACh ... umentation.

weber_8722
Beiträge: 26
Registriert: Mo 17. Feb 2014, 10:11

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von weber_8722 »

Hallo,

löschen geht jetzt gut, aber hat jemand eine effektive Methode um eine Art Non-Refresh-Mode zu implementieren???

Ich möchte ähnliche Kurven im selben Diagramm einfach überlagert darstellen (z.B. 100 Monte-Carlo-Ergebnisse). Dazu könnte man zwar einfach weitere Werte mit AddXY hinzufügen, aber es gibt auch Dreckeffekte:

1. Der Speicherbedarf würde zunehmen
2. Wenn man wieder bei x=xmin anfängt, zeichnet das Tchart eine Line auch für den "Rücksprung".

Gibt es irgendwie einen Schalter, der einfach ein Reinschreiben mit "behalten der alten Kurve" erlaubt, o.ä.?

Viele Grüße
Stephan

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

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von wp_xyz »

Deine Frage verstehe ich zwar im Detail nicht, aber vielleicht meinst du folgendes:

  • Um einen Wert in einer LineSeries auszulassen, muss man "AddXY(x-der-Lücke, NaN)" einfügen (für NaN braucht man die Unit math in "uses")
  • Non-refresh: Den Code-Bereich, während dem kein Refresh ausgeführt werden soll, mit "Chart.DisableRedrawing" und "Chart.EnableRedrawing" einrahmen
  • Schalter mit Reinschreiben der alten Kurve: einfach weiter Punkte hinzufügen mit AddXY? Der Zuwachs an Speicherbedarf für 100 neue Werte ist vernachlässigbar.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von ErnstVolker »

Guten Morgen,

ich hänge mich mal mit meiner Frage an den Beitrag, weil ich das Löschen einer Serie und FreeAndNil hier gefunden habe. Ich nutze eine Schaltfläche zum löschen einer Series im TChart.

Code: Alles auswählen

procedure TFrm_GUI.btn_KurveLoeschenClick(Sender: TObject);
begin
  Frm_WZ.Chart1.DeleteSeries(Frm_WZ.Chart1.Series[lbx_ChartLeg.ItemIndex]);
  FreeAndNil(Frm_WZ.Chart1.Series[lbx_ChartLeg.ItemIndex]);
end;


"FreeAndNil" führt beim Compilieren zu der Meldung: Error: Can't take the address of constant expressions und die eckige sowie die runde "Klammer Zu" sind mit einer roten Wellenlinie unterlegt.

Einerseits verständlich: Wie soll FreeAndNil die Serie identifizieren wenn sie gelöscht wurde. Aber wenn ich die Befehszeilen rumdrehe kommt dieselbe Meldung.

Was mache ich da falsch?

Vielen Dank und viele Grüße

Volker

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von fliegermichl »

Das liegt daran, daß das eine Property und keine einfache Variable ist.
FreeAndNil kann nur auf einfachen Variablen angewendet werden.

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

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:

Code: Alles auswählen

procedure TFrm_GUI.btn_KurveLoeschenClick(Sender: TObject);
begin
  Frm_WZ.Chart1.DeleteSeries(Frm_WZ.Chart1.Series[lbx_ChartLeg.ItemIndex]);
  FreeAndNil(Frm_WZ.Chart1.Series[lbx_ChartLeg.ItemIndex]);
end;

"FreeAndNil" führt beim Compilieren zu der Meldung: Error: Can't take the address of constant expressions und die eckige sowie die runde "Klammer Zu" sind mit einer roten Wellenlinie unterlegt.

Einerseits verständlich: Wie soll FreeAndNil die Serie identifizieren wenn sie gelöscht wurde. Aber wenn ich die Befehszeilen rumdrehe kommt dieselbe Meldung.

Zusätzlich zu dem, was fliegermichl schon geschrieben hat: Ein einfaches Chart.Series[index].Free reicht. Damit wird die Series automatisch aus der Series-Liste des Chart gelöscht und zerstört. Das Listenelement muss nicht auf nil gesetzt werden, da es ja nicht mehr existiert.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von ErnstVolker »

D.h. den Befehl "DeleteSeries" braucht man nicht, wenn man Series[index].Free verwendet?

Denn wenn ich zuerst DeleteSeries und dann Series[index].free ausführe werden bei z.B. vier Kurven im Diagramm gleich zwei weggehauen und dann kommt ein "EListError" des Debuggers, dass ein ListIndex (3) out of Bounds ist.

In Datei: 'include\winapi.inc' Zeile 1049

Schlußfolgere ich richtig, dass zum Löschen einer Kurve aus dem Chart anstelle DeleteSeries auch Series[index].Free verwendet werden kann?

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

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:D.h. den Befehl "DeleteSeries" braucht man nicht, wenn man Series[index].Free verwendet?
Ja

ErnstVolker hat geschrieben:Denn wenn ich zuerst DeleteSeries und dann Series[index].free ausführe werden bei z.B. vier Kurven im Diagramm gleich zwei weggehauen und dann kommt ein "EListError" des Debuggers, dass ein ListIndex (3) out of Bounds ist.
DeleteSeries entfernt die Series aus dem Chart; sie bleibt jedoch weiterhin bestehen, d.h. sie könnte später wieder per AddSeries hinzugefügt werden, z.B. um eine Series von Index-Position 0 ans Ende zu befördern (wobei man dieses auch durch Setzen von Series.Index erreichen kann).
Chart.Series[Index].Free macht dasselbe, zerstört aber gleichzeitig die Series zusätzlich.

ErnstVolker hat geschrieben:In Datei: 'include\winapi.inc' Zeile 1049
Verstehe ich nicht...

ErnstVolker hat geschrieben:Schlußfolgere ich richtig, dass zum Löschen einer Kurve aus dem Chart anstelle DeleteSeries auch Series[index].Free verwendet werden kann?
Ja - siehe oben

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von ErnstVolker »

Hier das Bild der Debuggermeldung (Anhang).
Dateianhänge
Debuggermeldung.png

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

Re: TChart - Wie kann man Kurven löschen? Dringend!

Beitrag von wp_xyz »

Wenn dein Chart 4 Series enhält, und du entfernst den 4. (also: Index 3) per Chart.DeleteSeries oder Series.Free, dann erhältst du den "Index out of bounds"-Fehler, wenn du auf Series[3] zugreifst. Das hat nichts mit TAChart zu tun.

Antworten