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 dasEvtl. 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üpunktClone
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 einTDateTime
Objekt auf dem Heap erzeugt und sofort wieder zerstört? Dazu braucht man nicht mal `ne Funktion, das geht direkt mitNow().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änztDie
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
stattNULL
benutzen sollte, ist die Zuweisungdouble 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 FunktionAddXY
einTDateTime
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 FeedbackUnd 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 EigenschaftVisible
.
-
@DocShoe , jupp ist wohl der einfachste Ansatz
Edit: Bitte als [SOLVED] markieren