TChart: Anzahl der zu erstellenden Series zur Laufzeit festlegen
-
ich hab ein Programm dass vom User die Anzahl der Messungen abfragt. Dann sollen entsprechend viele Series in einem Chart angezeigt werden. Die Anzahl ist also vorher nicht bekannt. Ein Array funktioniert so also nicht:
void __fastcall TfrmMain::btnStartClick(TObject *Sender) //Startbutton { TColor cSeries[]={clBlack,clRed,clLime}; //meine Farben const int anzahlGraphen = txtNumOfMeas->Value; // --> das funktioniert natürlich nicht TLineSeries* mySeries[anzahlGraphen]; for (int i=0; i<anzahlGraphen; i++) { TLineSeries* mySeries[i] = new TLineSeries(Chart2); Chart2->AddSeries(mySeries[i]); } for (int i=0; i<txtNumOfMeas->Value; i++) { messen(); //Methode die Daten aufnnimmt for (unsigned int k=0; k<messgeraet->messwerte.size(); k++) { mySeries[i]->AddXY(messgeraet->messwerteX[k], messgeraet->messwerteY[k],"",clLime); mySeries[i]->SeriesColor = cSeries[0]; } }
-
Nimm einen
std::vector
und leg darin die Series ab. Andererseits kannst du auch alle Series vom Chart verwalten lassen, dann kommst du ganz ohne Zusatzvariablen aus. DasTChart
hat bietet die Methoden/EigenschaftenSeriesCount
undSeriesList
an, mit denen du die Anzahl der Series bestimmen und auf jede Series zugreifen kannst.
-
ich habe den Vektor als private in der Form definiert:
vector<TLineSeries*> vSeries1; vector<TLineSeries*> vSeries2; vector<TLineSeries*> vSeries3; vector<TLineSeries*> vSeries4;
und erzeuge die Serie zur Laufzeit durch einen Button:
void __fastcall TfrmMain::btnStartClick(TObject *Sender) { const int anzahlGraphen = (txtNumOfMeas1->Value + txtNumOfMeas2->Value + txtNumOfMeas3->Value); //Series in Charts anlegen: for (int i=0; i<anzahlGraphen; i++) { vSeries1.push_back(new TLineSeries(Chart2)); vSeries11[i]->ParentChart = Chart2; vSeries2.push_back(new TLineSeries(Chart4)); vSeries2[i]->ParentChart = Chart4; vSeries3.push_back(new TLineSeries(Chart3)); vSeries3[i]->ParentChart = Chart3; vSeries4.push_back(new TLineSeries(Chart5)); vSeries4[i]->ParentChart = Chart5; } }
Kann man das so machen?
-
Klar kannst du das so machen.
Warum willst du eigentlich die Serien noch separat in den vector packen? Jedes Chart verwaltet doch sowieso seine eigene Serienliste.
-
wie arbeite ich konkret mit der SeriesList bzw. wie leg ich damit zur Laufzeit neue Series an? Leider ist die Hilfe dazu nur sehr mager.
-
Hier ein Beispiel:
Chart1->RemoveAllSeries(); //vorher alle Series löschen //Eine Linien Serie anlegen TLineSeries *Serie = new TLineSeries(Chart1); //gewünschte Eigenschaften setzen Serie->Title = "Der Titel"; ... //Serie dem Chart hinzufügen Chart1->AddSeries(Serie);
-
Hallo,
Das hier:
//Serie dem Chart hinzufügen Chart1->AddSeries(Serie);
ist übrigens äquivalent zu
//Serie dem Chart hinzufügen Serie->ParentChart = Chart1;
-
vielen Dank
-
ich möchte in einer Schleife zuerst eine vorgegebene Anzahl an Series anlegen (Anzahl erst während der Laufzeit bekannt).
for (int i=0; i<anzahlCharts; i++) { serie = new TLineSeries(Chart1); Chart1->AddSeries(serie); }
Die Series füll ich erst später an anderer Stelle mit Daten. Der Zugriff erfolgt dann mit:
for (int i=0; i<Chart1->SeriesCount(); i++) Chart1->Series[i]->AddXY(....);
-
Ja.
Hast du dazu auch eine Frage oder wolltest du nur wissen ob das so geht?
-
keine Frage mehr. Programm funzt so
-
Ich hab nochmal eine Frage zum deleten der series-Objekte:
Hier nochmal der Ablauf.
Als private im Header der Form deklariert:
TLineSeries* serie1; TLineSeries* serie2;
Das Programm wird über einen Button gestartet.
void __fastcall TfrmMain::btnStartClick(TObject *Sender) { const int anzahlCharts = Edit1->Text.ToInt(); if (anzahlGraphen > 0) { for (int i=0; i<anzahlCharts; i++) { Chart1->RemoveAllSeries(); Chart2->RemoveAllSeries(); //Series in Charts anlegen: for (int i=0; i<anzahlGraphen; i++) { serie1 = new TLineSeries(Chart1); serie2 = new TLineSeries(Chart2); Chart1->AddSeries(serie1); Chart2->AddSeries(serie2); } measure(); //hier wird gemessen und Werte in series geschrieben delete serie1; delete serie2; } } }
Muss hier nur einmal deletet werden so wie dargestellt? Oder muss nicht deletet werden und TChart macht das automatisch?
-
Hallo,
Da du bei der Erstellung der Serie den Chart als Owner angegeben hast werden die Serien auch deleted wenn der Chart selbst deleted wird (meist am Programmende).
Wenn du die Serien selbst löschen willst, solltest du da als Owner 0 angeben. Denke auch daran, die Series erst vom Chart zu trennen (RemoveSeries oder Series->ParentChart = 0) bevor du sie löschst.