TChart zur Laufzeit mit Daten füllen



  • Ich habe ein TCHart und möchte zur Programmlaufzeit aktuelle Daten anzeigen. Wie kann ich nur eine begrenzte Anzahl anzeigen, zB. nur lie letzten 100 Werte?

    Beispielhaft erzeuge ich die Werte über einen Timer mit Zufallswerten (rand()):

    TLineSeries* graph; //ist als private Member der TForm1 deklariert
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	graph = new TLineSeries(Chart1);
    	Chart1->AddSeries(graph);
    	graph->XValues->DateTime = true;
    	graph->Pointer->Visible = true;
    	graph->Pointer->Size = 1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	graph->AddXY(Now(), rand(), "", clTeeColor);
    }
    

    In meinem Beispiel werden aktuelle Daten immer angefügt. Ich möchte, dass nur die letzten 100 Werte angezeigt werden.



  • Hallo,

    Entweder löschst du die Werte vorne wieder weg oder du änderst das Minimum der X-Achse.
    Du könntest dir auch einen Container schaffen der nur 100 Werte speichern kann (circular buffer). Sowas gibt es leider nicht in der Standardlib. Von so einem Container aus könnte man die Objekte immer vollständig in die Serie schreiben.
    Oder du speicherst alle Daten in einem vector zwischen und fügst dann von dort immmer die 100 aktuellsten Werte in deine Serie.
    oder...



  • Ich bevorzuge die Variante mit der Änderung des Minimums. Mit absoluten Werten ist das kein Problem:

    int x = 1;
    const int anzahlMessungen = 100;
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    		graph->AddXY(x, rand(), "", clTeeColor);
    		if (x > anzahlMessungen)
    			Chart1->BottomAxis->Minimum = Chart1->BottomAxis->Maximum - anzahlMessungen;
    		x++;
    
    }
    

    Da ich aber mit TDateTime-Werten in der x-Achse arbeite ist es nicht ganz so einfach. Gibt es einen Index in der x-Achse auf den ich zugreifen kann?



  • Es gibt sogar ein TChart-Hilfe, in der man lesen kann.
    Solltest du mal versuchen.



  • die TChart-Hilfe ist nicht besonders gut. Dort gibt es meist eine extrem kurze Beschreibung (oft nur ein Satz) und gar keine Beispiele. Das wäre dann wie die Suche nach der Nadel im Heuhaufen.



  • Ich kann ja hier das Minimum nicht nicht so angeben da ein TDateTime erwartet wird.

    Chart1->BottomAxis->Minimum = Chart1->BottomAxis->Maximum - numOfMeas;
    

    Aus der Hilfe werd ich da auch nicht schlau. Da muss es doch von TChart eine Möglichkeit geben, nur eine begrenzte Anzahl von Werten in der Achse anzuzeigen unabhängig vom Datentyp der Werte.



  • Maximum und Minimum sind bei dir natürlich Zeitpunkte. Direkt 100 Werte bekommst du damit nicht hin. Du kannst aber ein Zeitfenster erzeugen.
    Du könntest vielleicht sowas machen:

    graph->AddXY(Now(), rand(), "", clTeeColor);
    double minval = graph->XValues[graph->XValues->Count - 100];
    Chart1->BottomAxis->Minimum = minval;
    

    Damit holst du dir den Wert 100 Elemente von hinten und setzt den auf das Minimum.



  • vielen Dank, so hat es funktioniert. Nur "Items" hat noch gefehlt. Hier mal mein COde dazu:

    const int numOfMeas = 100;
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	Chart1->BottomAxis->AutomaticMinimum = true;
    	graph->AddXY(Now(), rand(), "", clTeeColor);
    
    	if (graph->XValues->Count > numOfMeas) {
    	    Chart1->BottomAxis->AutomaticMinimum = false;
    	    Chart1->BottomAxis->Minimum = graph->XValues->Items[graph->XValues->Count - numOfMeas];
        }
    }
    

    Nun möchte ich eine Trackbar unter der x-Achse plazieren mit deren Hilfe man in der Zeit zurückscrollen kann


Anmelden zum Antworten