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. Das TChart hat bietet die Methoden/Eigenschaften SeriesCount und SeriesList 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.


Anmelden zum Antworten