TChart: Nur einen Teil der Skalierung beschriften



  • Hallo und Danke für das Interesse am meinem Problem!
    Ich habe eine TChart-Komponente mit TLineSeries und TGanttSeries. Hier ist der code für die Erstellung der Werte:

    int iStartPos = 0;
        int iEndPos = 0;
        GanttSeries1->Clear();
    
        bool bProduktion = false;
        int iZufallswert = 0;
        for(int i=1; i<28; i++)
        {
            bProduktion = !bProduktion;
            if(bProduktion)
            {
                iZufallswert = rand() % 500 +1;
                iEndPos = GanttSeries1->AddGanttColor(EncodeDate(2011,1,i),EncodeDate(2011,1,i+1),580,"Start", clGreen);
                GanttSeries1->NextTask->Value[iStartPos] = iEndPos;   // Zwei parallel-balken mit einander verbinden
            }
            else
            {
                iZufallswert = 0;
                iStartPos = GanttSeries1->AddGanttColor(EncodeDate(2011,1,i),EncodeDate(2011,1,i+1),520,"Stopp", clRed);
                GanttSeries1->NextTask->Value[iEndPos] = iStartPos;   // Zwei parallel-balken mit einander verbinden
            }
            LineSeries1->AddXY(EncodeDate( 2011,1,i ),iZufallswert,(TColor)clTeeColor);
            LineSeries1->AddXY(EncodeDate( 2011,1,i+1 ),iZufallswert,(TColor)clTeeColor);
        }
        Chart1->LeftAxis->SetMinMax(0,600);
    

    Nun zu eigentlichen Problem: Die linke Y-Achse gegenüber der LineSeries1 sollte in 100-Schritten skaliert/beschriftet werden und gegenüber den GanntSeries1 mit dem Wert Start oder Stop. Ist das mit der Komponente TChart überhaupt möglich? Wenn ja bitte um einen Tipp...

    Danke schön!



  • du könntest entweder:
    a) eine der beiden Kurven auf die RightAxis legen oder
    b) die Beschriftung für Start/Stop per Hand auf das Canvas des TChart zeichnen



  • Soll es so aussehen?
    http://666kb.com/i/bq82rjfob2lddeuzo.jpg

    Hier ist eine 2. linke Achse (CustomAxis) dem Gant zugeordnet.
    Die Axe von der LineSeries wurde begrenzt.

    Gruß myerscola



  • Hi myerscola! Genau so sollte es aussehen! Ich weiß aber nicht wie man eine zweite linke Achse dem Gant zuordnen kann. Könntest du mir bitte kurz die Arbeitsschritte auflisten die man dafür machen muss? Oder irgendwie das Projekt veröffentlichen?



  • Im Charteditor findest Du unter Registrierkarte 'Axis' die Achsen auf der linken Seite, darunter ein kleines '+' damit kannst Du eine Customaxis hinzufügen. Diese ist dann automatisch linke Achse ansonsten wählst Du 'other Side'.
    Dann gehst Du in die Serie selbst unter 'General' und ordnest die CustomAxis der Serie vertikal zu.

    Gruß myerscola



  • So wie es aussieht habe ich eine andere Version des TeeCharts (Standard 4.04), d.h. bei mir ist kein + in dem Chart-Designer auf der Registerseite-Achsen zu finden. Ich habe jetzt versucht das manuell anzulegen, jedoch sieht mein Ergebnis nicht so aus wie dein Screenshot 😢

    LeftAxisGantt = new TChartAxis(Chart1);
        LeftAxisGantt->Automatic = true;
        LeftAxisGantt->SetMinMax(500,600);
        GanttSeries1->CustomVertAxis = LeftAxisGantt;
        GanttSeries1->VertAxis = aCustomVertAxis;
    
        LeftAxisLines = new TChartAxis(Chart1);
        LeftAxisLines->Automatic = true;
        LeftAxisLines->SetMinMax(0,400);
        LineSeries1->CustomVertAxis = LeftAxisLines;
        LineSeries1->VertAxis = aCustomVertAxis;
    
        int iStartPos = 0;
        int iEndPos = 0;
        bool bProduktion = false;
        int iZufallswert = 0;
        for(int i=1; i<28; i++)
        {
            bProduktion = !bProduktion;
            if(bProduktion)
            {
                iZufallswert = rand() % 500 +1;
                iEndPos = GanttSeries1->AddGanttColor(EncodeDate(2011,1,i),EncodeDate(2011,1,i+1),580,"Start", clGreen);
                GanttSeries1->NextTask->Value[iStartPos] = iEndPos;   // Zwei parallel-balken mit einander verbinden
            }
            else
            {
                iZufallswert = 0;
                iStartPos = GanttSeries1->AddGanttColor(EncodeDate(2011,1,i),EncodeDate(2011,1,i+1),520,"Stopp", clRed);
                GanttSeries1->NextTask->Value[iEndPos] = iStartPos;   // Zwei parallel-balken mit einander verbinden
            }
            LineSeries1->AddXY(EncodeDate( 2011,1,i ),iZufallswert,(TColor)clTeeColor);
            LineSeries1->AddXY(EncodeDate( 2011,1,i+1 ),iZufallswert,(TColor)clTeeColor);
        }
    

    Kannst du vielleicht erkennen was ich hier falsch mache?



  • So mit dieser Einstellung wird die Darstellung fast richtig abgebildet.

    LeftAxisGantt = new TChartAxis(Chart1);
        LeftAxisGantt->Increment = 100;
        LeftAxisGantt->Automatic = false;
        LeftAxisGantt->SetMinMax(0,700);
        GanttSeries1->CustomVertAxis = LeftAxisGantt;
        GanttSeries1->VertAxis = aCustomVertAxis;
    
        LeftAxisLines = new TChartAxis(Chart1);
        LeftAxisLines->Increment = 100;
        LeftAxisLines->Automatic = false;
        LeftAxisLines->SetMinMax(0,700);
        LineSeries1->CustomVertAxis = LeftAxisLines;
        LineSeries1->VertAxis = aCustomVertAxis;
    

    Was noch nicht funktioniert ist die Begrenzung der Achsen-Beschriftung. Es wäre schön wenn die LeftAxisLines nur im Bereich 0 - 500 die Beschriftung der Ticks/Skalierung machen würde. Hat bereits jemand so eine Begrenzung gemacht und kann mir einen Tipp geben?



  • Ich habe 7.07 pro und würde jetzt mal vermuten das es bei Dir überhaupt nicht geht. Zumindest wenn es in Designtime nicht möglich ist dürfte das auch in Runtime nicht möglich sein, ich schaue es mir später aber noch einmal an.

    Gruß myerscola



  • Das ist auch meine Vermutung, dass in meiner Version 4.04 die Funktionalität nicht vorhanden sei. Ich habe mir noch mal die Ereignisse der TChart-Komponente angeschaut und bin auf das Ereignis OnGetAxisLabel gestoßen.
    So konnte ich das Problem in meinem Fall umgehen:

    void __fastcall TForm1::Chart1GetAxisLabel(TChartAxis *Sender,
          TChartSeries *Series, int ValueIndex, AnsiString &LabelText)
    {
        AnsiString asValidLabels = "0,100,200,300,400,500,Start,Stopp";
        if(!LabelText.Pos(".") && !asValidLabels.Pos(LabelText) )
        {
            LabelText = "";
        }
    }
    

    Damit kann ich erst mal weiter leben 😋
    Vielen Dank an ALLE beteiligte! Das ist wirklich ein tolles Forum.



  • Warum setzt du dann nicht einfach das Maximum auf 500?



  • Hi Braunstein,
    ich habe das schon mal ausprobiert gehabt:
    Zur Designzeit sehe ich die Auswirkung zwar jedoch zur Laufzeit nicht.
    Auch so funktioniert das nicht:

    LeftAxisGantt->Maximum = 700;
    LeftAxisLines->Maximum = 500;
    


  • und wenn du danach ein Chart1->Replot() machst? das sollte das Chart zum neuzeichnen zwingen.



  • In der Version des TeeCharts die ich habe ist noch keine Methode Replot() vorhanden! Eine andere Methode Repaint() hat keine Auswirkung auf das Aussehen des Charts.



  • Dann weiß ich leider auch nicht weiter. Ich habe eine 8er Version und kan das demzufolge auch nicht testen.


Anmelden zum Antworten