TChart X-Achse & Y-Achse anpassen + Beschriftung?



  • Hallo zusammen, ich brauche eure Hilfe😢
    Beide Kurven werden zwar angezeigt, ABER die "0" Linie auf der Y Achse ist nicht dick gezeichnet 😕
    Mit:

    Chart1->BottomAxis->Increment =60 //zB.
    

    wird zwar die X-Achse in 60er Schritte angezeigt aber wenn ich zB. keinen 300 Wert habe wird die Achse auch nicht dahin verlängert 😭

    Was ich verstanden habe sind das double Werte, aber ich möchte das im Zeitformat HH:MM sehen😟
    das sollte doch dann 60 = 00:01 sein. Wie geht das?
    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include "Chart.hpp"
    #include "TeEngine.hpp"
    #include "TeeProcs.hpp"
    #include <ExtCtrls.hpp>
    #include "Series.hpp"
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-verwaltete Komponenten
    	TChart *Chart1;
    	TButton *Button1;
    	TLineSeries *Series1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Benutzer-Deklarationen
    public:		// Benutzer-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "math.h"
    #include "stdlib.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "Chart"
    #pragma link "TeEngine"
    #pragma link "TeeProcs"
    #pragma link "Series"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	TLineSeries *a = new TLineSeries(0); 
    	Chart1->AddSeries(a);
    	Chart1->BottomAxis->IsDateTime();
    	TColor value = (TColor) RGB(0x00,0x00,0xff);
    	Chart1->Series[0]->Color = value;
    	Chart1->Series[0]->AddXY(20,-10);
    	Chart1->Series[0]->AddXY(30,20);
    	Chart1->Series[0]->AddXY(40,50);
    	Chart1->Series[0]->AddXY(50,40);
    	value = (TColor) RGB(0x00,0xff,0x00);
    	Chart1->Series[1]->Color = value;
    	Chart1->Series[1]->AddXY(10,20);
    	Chart1->Series[1]->AddXY(20,30);
    	Chart1->Series[1]->AddXY(30,10);
    }
    //---------------------------------------------------------------------------
    


  • @1C0r3 sagte in TChart X-Achse & Y-Achse anpassen + Beschriftung?:

    Was ich verstanden habe sind das double Werte, aber ich möchte das im Zeitformat HH:MM sehen
    das sollte doch dann 60 = 00:01 sein. Wie geht das

    Evtl. hilft dir dies weiter, da Delphi/Lazarus und C++ Builder sehr verwandt sind.

        WriteLn(DateToStr(now) + '  ' + TimeToStr(now)); // -- > 14-4-23  22:22:23
    


  • Das sollte per Chart1.BottomAxis.DateTimeFormat := 'hh:mm' funktionieren, s.a. TChart Achsenbeschriftung Zeit.



  • Also habe zumindest jetzt schon einen Teilerfolg erzielen können😃 👍

    Chart1->Series[0]
    

    hatte ich ja über den Chart-Editor hinzugefügt.

    TLineSeries *a = new TLineSeries(0); 
    Chart1->AddSeries(a);
    

    ist ja dann effektiv:

    Chart1->Series[1]
    

    Habe folgende Funktion hinzugefügt:

    void __fastcall TForm1::ConvertTime2Double(String input,double &doubleReturn)
    {
    	TDateTime *time2Double = new TDateTime(input);
    	doubleReturn = time2Double->Val;
    	delete time2Double;
    }
    

    Habe dann die XY -Werte wie folgt hinzugefügt:

    ConvertTime2Double("00:00:00",ZeitOut);
    Chart1->Series[0]->AddXY(ZeitOut,10);
    

    Die Achsen werden automatisch skaliert beschriftet etc. aber bei

    Chart1->Series[1]
    

    stehen die double Werte in der X-Achse, somit passt etwas mit den Einstellungen nicht,
    habe die Series1 (im Editor) durch den Menüpunkt Clone dupliziert, somit gibt es auch Series2 in der Liste.
    Ergebnis war die Achse wurde richtig im Zeitformat angezeigt.

    Wie kann ich der

    Chart1->Series[1]
    

    Horizontal Axis: Bottom [checked] DateTime, setzen?
    und Formats Values: hh:mm, im Editor ist es schon klar aber per Code?



  • @1C0r3 sagte in TChart X-Achse & Y-Achse anpassen + Beschriftung?:

    > void __fastcall TForm1::ConvertTime2Double(String input,double &doubleReturn)
    > {
    > 	TDateTime *time2Double = new TDateTime(input);
    > 	doubleReturn = time2Double->Val;
    > 	delete time2Double;
    > }
    

    Holy cow!
    Warum als Member eines Formulars? Warum wird ein TDateTime Objekt auf dem Heap erzeugt und sofort wieder zerstört? Dazu braucht man nicht mal `ne Funktion, das geht direkt mit Now().Val.

    Chart1->Series[0]->AddXY( Now().Val ,10);
    
    // Edit:
    Chart1->Series[0]->AddXY( TDateTime( "12:30:45" ).Val ,10);
    
    


  • @DocShoe wenn man den aktuellen Zeitwert benötigen sollte ist die Lösung mit Now().Val bestimmt eine gute Wahl.
    Wie würde man Ansetzen wenn man zB.: "12:30:45" , "14:16:27", "22:19:59" als gegeben hat, also zufällige Zeitpunkte?
    Eventuell auch eine Idee wie man die Eigenschaften setzt für:

    Chart1->Series[1]
    

    Horizontal Axis: Bottom [checked] DateTime, setzen?
    und Formats Values: hh:mm, im Editor ist es schon klar aber per Code?



  • @1C0r3
    Beispiel ergänzt

    Die TDateTime Eigenschaft hängt nicht an der Achse, sondern an der Series, bzw. der Daten für die X-Achse:

    TLineSeries *series = new TLineSeries( Chart );
    series->XValues->DateTime = true;
    
    // Vermutung:
    Chart->BottomAxis->AxisValuesFormat = "hh:nn"; // Achtung: nn für Minuten, nicht mm
    


  • Echt Super!🙂 👍

    series->XValues->DateTime = true;
    

    hat das Problem defintiv behoben 😃
    hier nochmals das Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "math.h"
    #include "stdlib.h"
    #include "time.h"
    #include "ustring.h"
    #include "sysmac.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "Chart"
    #pragma link "TeEngine"
    #pragma link "TeeProcs"
    #pragma link "Series"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    void __fastcall TForm1::ConvertTime2Double(String input,double &doubleReturn)
    {
    	TDateTime *time2Double = new TDateTime(input);
    	doubleReturn = time2Double->Val;
    	delete time2Double;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	double ZeitOut = NULL;
    	String input = NULL;
    	TLineSeries *a = new TLineSeries(NULL);
    	a->XValues->DateTime =true;
    	Chart1->AddSeries(a);
    	TColor value = (TColor) RGB(0x00,0x63,0xff);
    	Chart1->Series[0]->Color = value;
    	Chart1->Series[0]->Pen->Width = 2;
    	ConvertTime2Double("00:00:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,10);
    	ConvertTime2Double("00:02:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,30);
    	ConvertTime2Double("00:04:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,20);
    	ConvertTime2Double("00:06:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,10);
    	ConvertTime2Double("00:08:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,50);
    	ConvertTime2Double("00:10:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,20);
    	ConvertTime2Double("00:12:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,70);
    	ConvertTime2Double("00:14:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,50);
    	ConvertTime2Double("00:00:00",ZeitOut);
    	Chart1->Series[0]->AddXY(ZeitOut,30);
    	value = (TColor) RGB(0x63,0x00,0x00);
    	Chart1->Series[1]->Color = value;
    	Chart1->Series[1]->Pen->Width = 2;
    	ConvertTime2Double("00:00:00",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,0);
    	ConvertTime2Double("00:10:00",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,20);
    	ConvertTime2Double("00:30:00",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,30);
    	ConvertTime2Double("00:50:00",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,30);
    	ConvertTime2Double("01:20:00",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,70);
    	ConvertTime2Double("02:00:00",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,30);
    	ConvertTime2Double("04:00:00",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,50);
    	ConvertTime2Double("23:59:59",ZeitOut);
    	Chart1->Series[1]->AddXY(ZeitOut,30);
    }
    //---------------------------------------------------------------------------
    

    Dankeschön für Eure Hilfe👍



  • Aua...

    Zusätzlich zu meinen vorherigen Kritikpunkten:

    double ZeitOut = NULL;
    String input = NULL;
    

    ist Quatsch. Abgesehen davon, dass man seit C++11 nullptr statt NULLbenutzen sollte, ist die Zuweisung double ZeitOut = NULL zumindest technisch in Ordnung, String input = NULL macht definitiv nicht das, was du erwartest.
    Und wieso arbeitest du bei der X-Achse mit Strings, wenn du doch TDateTime als double verwenden möchtest? Du kannst der Funktion AddXY ein TDateTime Objekt übergeben:

    Chart1->Series[0]->AddXY( TDateTime( 2023, 4, 19, 0,0,0 ), 10 ); // 19.04.2023 00:00:00
    Chart1->Series[0]->AddXY( TDateTime( 2023, 4, 19, 2,0,0 ), 30 ); // 19.04.2023 02:00:00
    

    und dir den ganzen Konvertierungsmurks komplett sparen.



  • guten Morgen zusammen!
    @DocShoe dankeschön für dein Feedback😀 👍

    Und wieso arbeitest du bei der X-Achse mit Strings, wenn du doch TDateTime als double verwenden möchtest?

    Die Zeitwerte sind als String vorgegeben. (not my choice)



  • Wie kann ich beim Starten den Checkstate von der Legende gezielt setzen, weil bei default sind alle checked🤔



  • @1C0r3
    Auch an der Series, die hat `ne Eigenschaft Visible.



  • @DocShoe , jupp ist wohl der einfachste Ansatz😃 👍

    Edit: Bitte als [SOLVED] markieren👍


Anmelden zum Antworten