Announcement

Collapse
No announcement yet.

vertikale Achse vom TDBChart nicht zoomen; dringend

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • vertikale Achse vom TDBChart nicht zoomen; dringend

    Ich habe ein Problem mit einem TDBChart. Beim Zoomen soll die vertikale Achse nicht berücksichtigt werden. Es soll nur die horizontale Achse gezoomt werden.

  • #2
    Hi Martin!<br>

    Die einzige Möglichkeit die ich kenne ist ZoomRect zu verwenden.<br>
    OnZoom Ereigniss abfangen und mit ZoomRect das neue Rechteck <br>
    festlegen. Dabei die Vertikale Achse immer mit dem selben Wert <br>
    definieren.Vorher die Höhe der Achse abfragen, da die angaben <br>
    in Pixeln verlangt werden.<br>

    Gruß Fre

    Comment


    • #3
      Danke erstmal für den Tipp! Kannst du mir dabei evtl. noch etwas weiterhelfen? Ich habe der Komponente noch nicht alles so gut verstanden. Ich hab noch nicht so recht ne Ahnung, wie ich die Höhe auslesen soll. Kannst du mir evtl. da noch nen Tipp geben. Ich würde die Hilfe von C++ Builder so verstehen, dass man die Höhe über:

      DBChart1->LeftAxis->Maximum

      bzw.

      DBChart1->LeftAxis->Minimum

      ermitteln kann. liege ich da halbwegs richtig? Oder kannst du mir nen kompletten Text dazu liefern? Wäre echt nett von dir. Danke schonmal im Vorraus.

      Ciao Marti

      Comment


      • #4
        Hi Martin!<br>
        Minimum und Maximum ist fast richtig.<br>
        Da ich CB4 verwende habe ich mit der Chart-Componente einen<br>
        Haufen Ärger. In der Hilfe sind Functionen beschrieben, die es<br>
        gar nicht gibt, die man aber gebrauchen könnte.<br>
        Beispiel Höhe Vertikale Achse: <br>
        // !!! ChartRect ist nicht identisch mit Height & Width
        int hoeheMax = Chart1->ChartRect.bottom-Chart1->ChartRect.top;<br>
        int hoeheMin = Chart1->ChartRect.top;<br>
        Beispiel Breite Horizontale Achse: <br>
        int breiteMax = Chart1->ChartRect.right-Chart1->ChartRect.left;<br>
        int breiteMin = Chart1->ChartRect.left;<br>
        // jeztz ändern oder nicht !<br>
        // aufpassen, der Ursprung liegt oben links<br>
        Chart1->ZoomRect( breiteMin, hoeheMin, breiteMax, hoeheMax );<br>

        viel Spaß<br>
        Fre

        Comment


        • #5
          Danke für den Quelltext. Soweit schaut die Sache schon ganz gut aus.

          Also hoeheMin und hoeheMax funktionieren schon ganz gut, doch ein kleines Problem habe ich noch. Ich habe keinen Schimmer davon, wie ich die Koordinaten der Maus bekommen soll. Ich hab daran gedach mir die Werte der Maus beim Klick und bei OnZoom zu holen, aber ich denke dass ist zu aufwendig. Meine erfahrung lehrt mich, dass es da noch einen anderen Weg geben muss. Ich hab bis jetzt aber leider nichts brauchbares in der Hilfe gefunden. Hast du dazu noch eine Idee oder nen Tipp, wo man mal nachschauen oder Nachfragen kann?

          Ciao! Marti

          Comment


          • #6
            Hi Martin!<br>

            Hilfe kommt! // Ansonsten in der TChart - Hilfe suchen<br>
            Du hast mehrere Möglichkeiten : <br>
            void __fastcall TFCamDaten::Chart1MouseUp(TObject *Sender,
            TMouseButton Button, TShiftState Shift, int X, int Y)
            void __fastcall TFCamDaten::Chart1MouseMove(TObject *Sender,
            TShiftState Shift, int X, int Y)
            void __fastcall TFCamDaten::Chart1ClickSeries(TCustomChart *Sender,
            TChartSeries *Series, int ValueIndex, TMouseButton Button,
            TShiftState Shift, int X, int Y)
            void __fastcall TFCamDaten::Chart1ClickBackground(TCustomChart *Sender,
            TMouseButton Button, TShiftState Shift, int X, int Y)
            <br>
            Nach diesen Beispielen findest Du den Rest in der Hilfe oder<br>
            kannst ihn Dir denken.<br>

            Gruß Fre

            Comment


            • #7
              Danke für deine Hilfe hab die ganze Sache jetzt folgendermaßen gelöst:

              void __fastcall TForm1:BChart1MouseDown(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y)
              {
              if (Button == mbLeft)
              {
              XM1 = X;
              }
              }

              void __fastcall TForm1:BChart1MouseUp(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y)
              {
              if (Button == mbLeft)
              {
              DBChart1->LeftAxis->Automatic = false;
              XM2 = X;
              if (XM1 > XM2)
              {
              int buf = XM2;
              XM2 = XM1;
              XM1 = buf;
              }
              int hoeheMax = DBChart1->ChartRect.bottom;
              int hoeheMin = DBChart1->ChartRect.top;
              int breiteMin = XM1;
              int breiteMax = XM2;
              DBChart1->ZoomRect( Rect(breiteMin, hoeheMin, breiteMax, hoeheMax) );
              }
              }

              Ich habe jetzt nur ein Problem! Wenn das Rechteck, dass mit der Maus gezogen wird, nach rechts gezogen wurde, dann wird die horizontale Achse trotzdem gezoomt. wird das Rechteck nach links gezogen, dann funktioniert die ganze Geschichte einwandfrei. Fällt dir dazu noch was ein?

              Ciao und Danke für deine Hilfe!

              Marti

              Comment


              • #8
                Hi Martin! <br>

                Na klar fällt mir was ein.<br>
                Setze AllowZoom auf false( damit übernimmst Du die Zoomerei )<br>
                Dann MouseMove und MouseKeyDown über ein Flag abfragen und <br>
                mit ZoomRect selber um einen bestimmten Wert zoomen.<br>
                Mache ich auch so, da so viele Bugs drinne sind, kriegst die<br>
                Motten(In TChart).<br>
                Das Flag solltest Du global definieren und ++ und -- setzen.<br>

                Gruß Fre

                Comment


                • #9
                  OK, klingt gut! Aber wie mach ich dass mit dem Flag. Bin in Sachen C++ leider nicht so bewandert. Kannst du mir nen Beispiel dafür geben?

                  mfg Marti

                  Comment


                  • #10
                    joi,Joi Martin!<br>
                    <br>
                    In der .H Datei bei public(kann man auch von außen steuern)<br>
                    oder privat(ist besser) int isZomm; definieren.<br>
                    Bei FormCreate isZoom = 0; initialisieren.<br>
                    Wenn MouseKeyDown, dann isZoom++; <br>
                    In MouseMove abfragen ob Mausetaste gedrückt und isZoom, dann<br>
                    isZoom++.<br>
                    static int xPos;<br>
                    xPos = X;
                    if( Shift.Contains(ssLeft) && isZoom )<br>
                    {<br>

                    // Umwandeln der X-Y-Werte in Pixel für ZoomRect
                    int x = (Chart1)oder Series1->XScreenToValue( X );<br>
                    int y = (Chart1)oder Series1->YScreenToValue( Y );<br>
                    ...<br>
                    Wenn die Maus nach links bewegt wird, dann isZoom--;
                    if( X < xPos ) <br>
                    isZoom--;<br>
                    else<br>
                    isZoom++;<br>
                    }<br>
                    In MouseKeyUp(Maustaste wieder losgelassen)<br>
                    if( isZoom > 1 ) // nur wenn beim drücken der Maustaste diese auch<br>
                    // bewegt wurde<br>
                    ZoomRect(...)<br>
                    if( isZoom < 0 )<br>
                    ZoomRect(....) // wieder zurück mit der Vergrößerung<br>
                    oder mit UnZoom() gleich Vergrößerung auf Null<br>
                    Am Ende von MouseKeyUp isZoom auf Null setzen nicht vergessen<br>
                    sonst endlos.<br>
                    isZoom = 0;<br>
                    Oder Du baust einen Zoom/UnZomm-Button mit ein, und bei jedem <br>
                    drücken wirst Du bis zum Limit größer.(Vielleicht am besten) <br>

                    Ich hoffe das reicht Dir.<br>

                    Gruß Fre

                    Comment


                    • #11
                      Es hat gereicht. Jetzt funktionierts echt gut! War echt nett von dir.

                      Danke

                      mfg. Marti

                      Comment

                      Working...
                      X