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

Rund um die LCL und andere Komponenten

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

Beitragvon weber_8722 » 17. Mär 2014, 22:22 TChart - Wie kann man Kurven löschen? Dringend!

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
weber_8722
 
Beiträge: 24
Registriert: 17. Feb 2014, 11:11

Beitragvon wp_xyz » 17. Mär 2014, 22:42 Re: TChart - Wie kann man Kurven löschen? Dringend!

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.
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon weber_8722 » 17. Mär 2014, 22:46 Re: TChart - Wie kann man Kurven löschen? Dringend!

Danke!!! SinSeries.Clear;

macht was ich möchte!

Nun möchte ich noch ein einfaches Copy-to-clipboard einbauen. Gibt es da etwas fertiges?
weber_8722
 
Beiträge: 24
Registriert: 17. Feb 2014, 11:11

Beitragvon wp_xyz » 17. Mär 2014, 22:53 Re: TChart - Wie kann man Kurven löschen? Dringend!

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.
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon weber_8722 » 25. Mär 2014, 09:36 Re: TChart - Wie kann man Kurven löschen? Dringend!

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
weber_8722
 
Beiträge: 24
Registriert: 17. Feb 2014, 11:11

Beitragvon wp_xyz » 25. Mär 2014, 10:10 Re: TChart - Wie kann man Kurven löschen? Dringend!

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.
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon ErnstVolker » 6. Mär 2019, 09:26 Re: TChart - Wie kann man Kurven löschen? Dringend!

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
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 11:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon fliegermichl » 6. Mär 2019, 09:40 Re: TChart - Wie kann man Kurven löschen? Dringend!

Das liegt daran, daß das eine Property und keine einfache Variable ist.
FreeAndNil kann nur auf einfachen Variablen angewendet werden.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 367
Registriert: 9. Jun 2011, 09:42

Beitragvon wp_xyz » 6. Mär 2019, 18:02 Re: TChart - Wie kann man Kurven löschen? Dringend!

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.
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon ErnstVolker » 6. Mär 2019, 20:22 Re: TChart - Wie kann man Kurven löschen? Dringend!

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?
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 11:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 6. Mär 2019, 20:55 Re: TChart - Wie kann man Kurven löschen? Dringend!

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
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon ErnstVolker » 6. Mär 2019, 21:21 Re: TChart - Wie kann man Kurven löschen? Dringend!

Hier das Bild der Debuggermeldung (Anhang).
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 11:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 6. Mär 2019, 22:59 Re: TChart - Wie kann man Kurven löschen? Dringend!

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.
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried