TChart
-
Hallo,
ich bastele gerade eine Datenaufnahme, die Daten mit Hilfe des TCharts darstellt. Die Daten befinden sich in Memo-Boxen und sollen von dort aus gezeichnet werden.
Die Befehlszeile sieht so aus:
Chart1->Series[1]->AddXY(StrToInt(Memo7->Lines->Strings[i]),StrToInt(Memo3->Lines->Strings[i]),"", clRed);
Leider funktionier das ganze nicht für größere Zahlen (z.B. 32000 oder 64000). Liegts vielleicht am Int? Wo liegt also das Problem?
-
Also ein Integer geht nur von -32 768 bis +32 767. Von daher weiß ich nicht wieso er 32 000 nicht mag. Aber probier doch mal das ganze mit float zu machen.
-
Unter 32 Bit geht ein INT
int 32 -2,147,483,648 bis 2,147,483,647
-
Also ich habe es mit:
Chart1->Series[1]->AddXY(StrToFloat(Memo7->Lines->Strings[i]),StrToFloat(Memo3->Lines->Strings[i]),"", clRed);
ausprobiert. Geht leider auch nicht! Die Fehlermeldung lautet: "Exception der Klasse EAccessViolation aufgetreten. Meldung: ´Zugriffsverletzung bei Adresse 40901083 in MOdul ´tee60.bpl´. Schreiben von Adresse 00920000´.
Also der Bereich der Messwerte geht von 0 bis 65000. Klar, dass das mit Int nicht geht...aber mit StrToFloat und StrToInt64 gehts auch nicht!
-
Klar, dass das mit Int nicht geht
Warum nicht?
Was sollte an 65000 mit int nicht gehen?
-
Oder sind Kommazahlen in der Memofeldern?
Vielleicht mal genaue Auskünfte und der Hinweis auf
StrToFloatDef / StrToIntDef
der Umwandlungsfehler abfangen kann. Und wie aus der Hilfe zu ersehen erwartet die Funktion ADDXY double als Parameter
-
Hier ist mein Code:
Chart1->BottomAxis->Title->Caption = "Zeit [µs]";
Chart1->LeftAxis->Title->Caption = "Massenspektrometer";
int a = Memo3->Lines->Count;
int b = Memo7->Lines->Count;
if (a==b)
{
Chart1->Series[1]->Clear();
for(int i=0; i<a; i++)
{
double h = StrToInt64(Memo3->Lines->Strings[i]); // StrToInt(Memo3->Lines->Strings[i])
Chart1->Series[1]->AddXY(StrToInt(Memo7->Lines->Strings[i]),h,"", clRed);
}
}Zunächst werden also die Achsen beschriftet, dann die zwei Memo Boxen 3 und 7 verglichen, ob sie die gleiche Anzahl an Elementen beinhalten. Wenn dies so ist, wird der Graph gezeichnet. Das klappt bei leider bei Zahlen außerhalb des INT Bereichs nicht! ...der Debugger sagt, dass "double h" den Richtigen Wert hat. Der Fehler tritt demnach in der AddXY Funktion auf! Warum??
-
Du hast also Zahlen außerhalb von
-2147483648 bis 2147483647
???
-
Nein, maximal 16Bit also 65535. Ich hab echt keine Ahnung, warum das nicht geht! In den Memo-Fenstern, in denen nur Werte unter 1000 stehen, geht der TChart ohne Probleme!
-
Sorry ich verstehs nicht:
Was hat ein 16-Bit Int mit dem Problem zu tun?
Du hast ein 16-Bit Compiler/ Programm?
Die Funktion will double haben!
Was hast du in den Memofeldern stehen?? Ganzzahlen oder Kommawerte
-
In den Memos stehen ganze Zahheln zwischen 0 und 65500...und diese will ich grafisch darstellen! Dafür verwende ich den TChart und das klappt auch für kleine Zahlen.
-
Du hast eine Schleife die von der Anzahl der Memolines abhängt. Dann liest du mit ADDXY die Werte ins Chart ein. Woher kommt h?
-
Ursprünglich sah es so aus:
Chart1->Series[1]->AddXY(StrToInt(Memo7->Lines->Strings[i]),StrToInt(Memo3->Lines->Strings[i]),"", clRed);Der zweite Versuch sieht so aus:
double h = StrToInt64(Memo3->Lines->Strings[i]);
Chart1->Series[1]->AddXY(StrToInt(Memo7->Lines->Strings[i]),h,"", clRed);Dort wollte ich sicher sein, dass der Funktion AddXY auch der richtige Wert übergeben wird. (Zahl (0 bis 65500) vom Typ double). Durch das Einfügen eines Breakpoints konnte ich sehen, dass h den Wert aus dem Memo Fenster hat!
-
Du kannst auf jeden Fall über 32000 Werte hinzufügen:
for (int x=0; x<=330000; x++) { Series1->AddXY(x,sin(x),x,clRed); }Ist zwar ein wenig sinnfrei...
-
und floats gehen auch:
for (float x=0; x<=10; x=x+0.1) { Series1->AddXY(x,sin(x),x,clRed); }
-
Das Problem ist nicht die Anzahl der Werte, sondern der Wert selber! Ist der Wert z.B. 6 geht alles super, ist der Wert z.B. 65000, dann geht nix mehr!
-
Wenn du dir einen Button aufs Form ziehst und den Code mit dem Sinus (oben) einfügst und sin durch x^2 ersetzt, siehst du das auch Werte über 32000 kein Problem darstellen (#include <math.h> nicht vergessen). Dein Problem liegt darin, daß du auf einen Wert zugreifst der nicht "da ist. Das ist zumindest meine Vermutung oder wie Christian meinte ein . oder , falsch interpretiert wird.
Aber: es liegt nicht am Chart, daß Werte über 32000 nicht akzeptiert werden.
-
Probiers mal so:
Series[1]->AddXY(StrToInt(Memo7->Lines->Strings[i]),i,StrToInt(Memo7->Lines->Strings[i]), clRed);
-
Series[1]->AddXY(70000,i,90000, clRed);So würde ich ja die Fehlersuche beginnen
dann jeden Druchlauf durch das Memo debuggen
Werte ggf. mit Messagebox ausgeben lassen
oder in ein neues TMemo schreiben
Oder loggen
-
So, die Lösung des Problems:
Chart1->LeftAxis->Maximum = 66000;
Mit der Automatik funktion ging es einfach nicht...warum auch immer!
Danke euch für eure Mithilfe!!