Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Exception bei TChart Objekt (https://www.delphipraxis.net/62698-exception-bei-tchart-objekt.html)

Phane01 8. Feb 2006 11:35


Exception bei TChart Objekt
 
Hallo zusammen,
ich habe ein Problem mit dem TChart Objekt in Delphi. Ich habe mir ein Objekt erstellt, welches vom TChart Objet abgeleitet ist

TmyChart = class(TChart)
private

public

end

Im constructor meines Objektes, rufe ich über inherited Crete() den Constructor des Original TChart Objektes auf.

Ich generiere zur Laufzeit dynamisch n TmyChart Objekte und natürlich eine Serie zu jedem Chart.
In diese werden dann die Werte (x Zeit wert; y normaler Integer) hinzugefügt
k_ChartArray[i].Series[0].AddXY(time, a_user,'',clBlack);
Das hinzufügen der Werte klappt wunderbar. Wenn ich mir jetzt jedoch die Diagramme anzeigen lasse, bekomme ich eine für bestimmte Wertepaare eine Exception. Im Normalfall sind die y-Werte zwischen 0 und 100, das klappt perfekt. Für einige Charts sind die y-Werte jedoch > 10000. Dann bekomme ich sofort bei der Anzeige eine Exception.
Folgende Eigenschaften setzte ich beim Erzeugen des Chart Objektes.

newChart.LeftAxis.AutomaticMaximum := true;
newChart.LeftAxis.AutomaticMinimum := true;
newChart.LeftAxis.AxisValuesFormat := '#,##0.###';
newChart.LeftAxis.StartPosition := 0;
newChart.LeftAxis.EndPosition := 100;
newChart.LeftAxis.PositionPercent := 0;

Hat irgendwer eine Anung woran das liegen könnte.

Danke Stephan

Phane01 9. Feb 2006 09:33

Re: Exception bei TChart Objekt
 
Hat keiner eine Idee???

marabu 9. Feb 2006 09:58

Re: Exception bei TChart Objekt
 
Herzlich willkommen in der Delphi-PRAXiS, Stephan.

In deinen Beschreibungen ist der Fehler nicht zu entdecken - vielleicht im Code? Hast du die fatalen Werte einmal isoliert?

Freundliche Grüße vom marabu

Phane01 9. Feb 2006 10:05

Re: Exception bei TChart Objekt
 
Hallo,

ich habe die Werte mal in ein LogFile geschrieben und danach in ein statische TChart element eingefügt. D.h. auf eine Form ein Chart Objekt gezogen und dann Werte hinzu. Das funktioniert perfekt. Das Chart Objekt skaliert sich von selber und zeigt die Werte korrekt an.
Mir scheint ich habe irgendwas beim dynamischen erstellen des Chart Objektes vergessen??? Wie schaut's mit den Events zu dem Objekt aus?
Diese sind bei mir alle nil, wenn ich den Chart dynamisch erzeuge. Benötige ich vielleicht eines dieser Events???

Stephan

marabu 9. Feb 2006 10:12

Re: Exception bei TChart Objekt
 
Mit den Events hat das sicher nichts zu tun. Wen gibst du als Owner für die vielen Chart-Objekte an? Wann setzt du die parent property? Kannst du die Werte zur Verfügung stellen mit denen sich der Fehler nachvollziehen lässt? Welche Version der Chart-Komponente verwendest du?

marabu

Phane01 9. Feb 2006 10:25

Re: Exception bei TChart Objekt
 
Ich verwende die Version TeeChart Standard Vers. 4.04.

Das erzeugen der Objekte geschieht folgendermaßen.
// neues Chart Objekt
newChart := TmyChart.Create(ScrollBox1);
// Parent zu Objekt
newChart.Parent := ScrollBox1;

Die Werte die in den entsprechenden Chart eingetragen werden sollen, sind der Form:
x-Value y-Value

09.02.2006 11:22:06 93300
09.02.2006 11:22:16 93300
09.02.2006 11:22:26 93400
09.02.2006 11:22:36 93300

also eigentlich nix besonderes.
Was mich irritiert ist, das Werte kleiner als 1000 ohne Probleme in dem Chart angezeigt werden.
Eine Sache habe ich noch festgestellt. Ich verwende in dem Diagramm ein Raster auf beide Achsen. Bei großen Werten sieht es so aus, als wenn das Raster über die Zeichenfläche des Diagramms hinaus gezeichnet wird.

Stephan

Phane01 9. Feb 2006 10:58

Re: Exception bei TChart Objekt
 
Die Werte die in den entsprechenden Chart eingetragen werden sollen, sind der Form:
x-Value; y-Value

09.02.2006 11:22:06; 93300
09.02.2006 11:22:16; 93300
09.02.2006 11:22:26; 93400
09.02.2006 11:22:36; 93300

Stephan

marabu 9. Feb 2006 11:33

Re: Exception bei TChart Objekt
 
Ich habe mit dynamisch erstellten Komponenten (chart, lineSeries) und deinen Werten getestet und kein Problem beobachten können.

Delphi-Quellcode:
procedure TTestForm.FormCreate(Sender: TObject);
var
  chart: TChart;
  ls: TLineSeries;
begin
  chart := TChart.Create(self);
  chart.Parent := ScrollBox;
  ls := TLineSeries.Create(chart);
  chart.AddSeries(ls);
  ls.AddXY(now + 10 * OneSecond, 93300);
  ls.AddXY(now + 20 * OneSecond, 93300);
  ls.AddXY(now + 30 * OneSecond, 93400);
  ls.AddXY(now + 40 * OneSecond, 93300);
end;
Wie kann ich dir noch helfen?

marabu

Phane01 9. Feb 2006 11:54

Re: Exception bei TChart Objekt
 
Kannst Du das ganze nochmal mit einer TFastLineSeries probieren.

Danke Stephan

marabu 9. Feb 2006 12:19

Re: Exception bei TChart Objekt
 
Auch mit einer FastLineSeries kann ich die Testdaten anzeigen. Die Randbedingungen sind natürlich verschieden. Ich arbeite mit einer synthetischen Minimalanwendung, verwende die Original-Komponente ohne deine Erweiterungen und die Testdatenmenge ist nicht repräsentativ. Du solltest versuchen das Problem in einem Testprojekt zu isolieren. Kommst du dem Fehler damit noch nicht auf die Spur, dann kannst du dieses Projekt hier einstellen und die Chance auf erfolgreiche Hilfe wächst.

marabu

Phane01 9. Feb 2006 13:00

Re: Exception bei TChart Objekt
 
Alles klar. Habe mir das Projekt mal nachgebaut und es funktioniert auch bei mir. Muss mich halt jetzt mal durch mein coding hangeln und schauen ob ich den Fehler ausfindig machen kann.
Vielen Dank trotzdem erstmal.

Stephan

Phane01 9. Feb 2006 14:42

Re: Exception bei TChart Objekt
 
Hallo,
ich habe einen Weg wie auch du das Problem nachvollziehen kannst. Es geht nämlich nicht wenn man einen Timer einbaut und kontinuierlich Werte zum chart hinzufügen will.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
self.Timer1.Enabled := false;
newChart.SeriesList.Series[0].AddXY(now, 93400);
self.Timer1.Enabled := true;
end;

Einfach newChart als globale Variable definieren und einen Timer einbauen. Schon kracht es bei größeren Werten.

Stephan

marabu 9. Feb 2006 21:31

Re: Exception bei TChart Objekt
 
Hallo Stephan,

ich habe ein wenig mit der Chart-Komponente gespielt. Das Problem ist nicht die dynamische Erzeugung der Komponenten oder zu große Y-Werte. Auch mit einem Timer (Interval 100 msec) gab es keine Probleme - aber Probleme gab es schon. Ich erhielt Zugriffsfehler, als ich den ersten Punkt mit AddXY(now, Random(100000)) in eine leere FastLineSeries eintragen wollte, die folgenden Daten wurden klaglos angenommen. Ich habe dann verschiedenes ausprobiert - fest skalierte Achsen etc. - der Zugriffsfehler blieb. Ich habe dann Delphi neu gestartet und seitdem kann ich den Fehler nicht mehr reproduzieren. Ich habe den Timer über 20 Minuten (sliding window) Werte eintragen lassen - keine Probleme. Auch das Sammeln über einen längeren Zeitraum funktioniert. Ich glaube nicht, dass ich dem Problem mit vertretbarem Aufwand auf die Spur kommen werde.

Gute Nacht

marabu

Phane01 10. Feb 2006 07:28

Re: Exception bei TChart Objekt
 
Hallo,

also ich habe gestern Abend noch eine erste Lösung (wenn auch noch nicht wirklich befriedigend) gefunden. Wenn man als ersten Wert in die FastLineSeries mit
newChart.SeriesList.Series[0].AddXY(now, 0);
einen Wert hinzufügt und dann beliebig große Werte hinzufügt funktioniert es wohl.
Ich muss mal schauen ob ich noch eine bessere Lösung finde. Anscheinend benötigt das Chart Objekt einen ersten Wert in einem bestimmten Wertebereich und kann erst dann autom. skalieren???
Naja werde mal schauen ob es noch einen anderen Weg gibt.

Stephan


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz