TChart Beispiel



  • Ich bin vor Freude fast vom Stuhl gefallen 🙂



  • Hallo @all,

    und noch eine Frage zu TChart:

    Weiß jemand, wie man es in TChart einrichtet oder programmiert, dass stellenweise keine durchgezogenen Linien gemacht werden.

    z.B ich habe die Werte 1,2,3,4,5,6,7,8,9 (Beispielwerte jetzt)

    Der Grapfh soll z.B von 1-4 eine durchgezogene Linie zeichnen.
    5 aussparen, (aber vielleicht einen Punkt hinmachen)
    und dann wieder von 6-9 eine durchgezogene Linie.

    Vielleicht weiß es hier ja jemand. Danke für die Antworten vorab.

    LG Eliza



  • Das geht so:

    AnsiString Beschriftung_X_Achse = "irgendwas";
    
    Chart1->Series[0]->AddNull(Beschriftung_X_Achse);
    


  • Hallo sonic,

    ich verstehe es ehrlich gesaagt nicht ganz.
    jezt bezogen auf mein Beipiel, wie würde das aussehen?

    LG
    Eliza



  • Chart1->Series[0]->AddXY(0,1,"",clTeeColor);
    Chart1->Series[0]->AddXY(1,2,"",clTeeColor);
    Chart1->Series[0]->AddXY(2,3,"",clTeeColor);
    Chart1->Series[0]->AddXY(3,4,"",clTeeColor);
    Chart1->Series[0]->AddNull("");
    Chart1->Series[0]->AddXY(5,5,"",clTeeColor);
    Chart1->Series[0]->AddXY(6,6,"",clTeeColor);
    Chart1->Series[0]->AddXY(7,7,"",clTeeColor);
    Chart1->Series[0]->AddXY(8,8,"",clTeeColor);
    Chart1->Series[0]->AddXY(9,9,"",clTeeColor);
    


  • sonic_1233 schrieb:

    ...

    Zu Ostern postest du das für ihn als Schleife 😃



  • Schleifen kosten bei mir Aufpreis 🕶



  • Hallo,

    nochmal zum (nicht)-Verbinden von Graphen

    ich habe folgenden Code

    Chart1->Series[0]->AddXY(j,StrToFloat(mlk1.mMi[j]),"",clTeeColor);
                if (mlk1.mMilch[j]==0)
                {
    
                 Chart1->Series[0]->AddNull("");
                }
    

    in der Struktur mlk1 kann irgendwo eine 0 vorkommen.
    Diese soll nicht mit dem vorhergehenden und mit dem nachkommenden Wert verbunden werden. Also ein unterbrochener Graph
    Wenn zb. die Werte im mkl1 um die O etwa so aussehen 5,0,8
    soll zwischen 5 und 8 keine Verbindungslinie gezeichnet werden.

    bis jetzt, wie mein Code ist, zeichnet er von 5 bis O eine Linie aber dann von O bis 8 keine mehr (5 und 8 sind nur Beispielwerte)

    Weiß jemand wie ich mein Problem lösen?

    LG
    Eliza



  • Wenn du das genau so stehen hast, dann fügst du den Wert mlk1.mMi[j] ja zweimal hinzu, wenn er 0 ist.
    einmal
    Chart1->Series[0]->AddXY(j,StrToFloat(mlk1.mMi[j]),"",clTeeColor);
    und wenn er 0 ist nochmal
    Chart1->Series[0]->AddNull("");
    Wäre doch eher:

    if (mlk1.mMilch[j]==0)
    {
        Chart1->Series[0]->AddNull("");
    }
    else
    {
        Chart1->Series[0]->AddXY(j,StrToFloat(mlk1.mMi[j]),"",clTeeColor);
    }
    

    EDIT: ist da jetzt eigentlich nen String oder ne Zahl in mlk1.mMilch[j]?
    Dann müsste das if ja auf "" oder "0" oder was auch immer testen und nicht 0.

    mfg
    xXx



  • evtl. auch das

    if (mlk1.mMilch[j]==0)
    {
        Chart1->Series[0]->AddXY(j,0,"",clNone);
    }
    else
    {
        Chart1->Series[0]->AddXY(j,StrToFloat(mlk1.mMi[j]),"",clTeeColor);
    }
    

    So kann man auch ungeordnete Werte eingeben.



  • Danke für eure Hilfe, jetzt passts!

    LG Eliza



  • Hallo,

    weiß jemand wie man bei verschiedenen Serien jeweils die Achsen "flexibel" anpassen kann?

    Also z.B bei Series[0] Achsen in Prozentangabe und Kommazahlen
    Bei Series[1] Achsen Ganzahlig/Absolutwerte.

    Bei Series[2] eventuell wieder anders.

    LG
    Eliza



  • da das Chart nur 2 Achsen (Rechte und Linke für Y oder Oben und Unten für 😵 hat, kannst du auch nur 2 verschiedene Skalierungen verwenden. Du kannst also z.B. eine Series mit Prozentangaben auf die linke Y-Achse legen und eine mit Absolutwerten auf die rechte Y-Achse. Die Einstellungen lassen sich relativ einfach zur Entwurfszeit einstellen (Doppelklick auf das TChart) oder halt zur Laufzeit per Zuweisung der entsprechenden Eigenschaften, z.B:

    //Zuweisung der Series zur rechten oder linken Y-Achse
    Series1->VertAxis = aLeftAxis;
    Series2->VertAxis = aRightAxis;
    
    //Prozentangaben für die rechte Y-Achse
    Chart1->RightAxis->LabelStyle = talValue;
    Chart1->RightAxis->AxisValuesFormat = "  #,##0 % ";
    


  • Hallo Linea,

    ich bin nicht sicher ob das die Lösung ist die ich suche.
    Ich will für jede einzelne Series (ich habe 5) ein anderes AchsenFormat.
    Ich denke deine Lösung legt für alle Series ein Achsenformat fest.

    Ich hoffe du verstehst was ich meine.

    LG
    Eliza



  • dann mußt du für jede Series ein neues Diagramm machen, denn wie gesagt: es gehen nur maximal 2 verschiedene Achsenformate pro Diagramm



  • Danke Linnea,

    kannst du mir noch sagen, wie man an einer Kurvenhöhepunt ein Maximum schreibt, oder eine Zahl?

    LG
    Eliza



  • Hallo,

    Das Chart hat auch ein Canvas welches du über die gleichnamige Eigenschaft bekommst. Dies ist bei TChart vom Typ TCanvas3D welches massenhaft Funktionen zum Zeichnen bietet. Für dich interessant ist da TextOut welche einen Text auf dem Chart ausgeben kann. etwa so:

    TCanvas3D* canvas = chart->Canvas;
    canvas->TextOut(xpos, ypos, "Text");
    


  • Hallo,

    mein Code sieht jetzt so aus:

    if (mlk1.mZellzahl[j]>600)
      {
          TCanvas3D* canvas = Chart1->Canvas;
          canvas->TextOut(j, StrToFloat(mlk1.mZellzahl[j]), "Maximum");
      }
    

    Er zeigt aber Maximum nicht an, fehlt das noch irgendetwas?

    LG
    Eliza



  • xpos und ypos sind die Koordinaten des Canvas. Das hat nichts mit den Werten deiner Serie zu tun. Nimm da einfach mal 100 oder so als Wert.
    Außerdem muss diese Zeile in den OnAfterDraw-Event des Charts eingebaut werden damit beim Neuzeichnen nicht alles wiede überzeichnet wird.



  • Hallo,

    xpos und ypos sind die Koordinaten des Canvas. Das hat nichts mit den Werten deiner Serie zu tun. Nimm da einfach mal 100 oder so als Wert.

    Aber es soll doch genau an der Stelle stehen wo das Maximum ist, dafür brauche ich doch die x,y-Werte der Serie?


Anmelden zum Antworten