Announcement

Collapse
No announcement yet.

TUpDown für floats

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

  • TUpDown für floats

    Hallo zusammen,

    hat jemand eine Komponente die wie das TUpDown funktioniert nur mit floats? Muss man das wirklich selber machen?

    Gruß Yves

  • #2
    Hallo, Yves!

    So recht kann ich mir die <u>allgemeine</u> Umsetzung nicht vorstellen.

    TUpDown funktioniert ja über die Idee der Positionierung auf der Basis eines Inkrements, das beim Klicken die aktuelle TUpDown->Position (Zähler) entsprechend verändert.

    Welches Inkrement würde für eine Gleitpunktzahl sinnvoll anzusetzen sein? Den Wertebereich von <b>float</b> auf <b>int</b> zu transformieren, führt wohl zu inakzeptablen Schrittweiten.

    Ansonsten könnte die Möglichkeit untersucht werden, ob durch Veränderung der Aufgabensellung es genügt, z.B. durch die TUpDown->Position eben nur die in etwa relative Stelle im tatsäschlichen Wertebereich zu beschreiben und dadurch.

    Vielleicht ist mir aber auch nicht das Einsatzgebiet einer "Float-TUpDown-Komponente" hinreichend deutlich. Vielleicht läßt sich ein Beispiel skizieren.

    Gruß

    Comment


    • #3
      Könnte mir vorstellen, dass man vorgibt welche Stelle (bsp. die 5.) man per Up/Down bedienen will
      Christian

      Comment


      • #4
        Teste mal <b>TAdvSpinEdit</b> von http://www.tmssoftware.com/<p>
        Schöne Grüße, Mario Noac
        Schöne Grüße, Mario

        Comment


        • #5
          Hallo Uwe,<BR>
          in meinem Beispiel geht es darum einen z.B. einen pH-Sollwert einzugeben und ich würde gerne 2 Nachkommastellen angeben. <BR>
          Das inkrement ist bei Tupdown auch eine eigenschaft und könnte von mir entsprechend gewählt werden. Sicherlich geht eher um fixpunkt als um float. <BR>
          Ich könnte mir auch vorstellen, daß man einfach nur einen Teilerfaktor angibt und die Position Ganzzahlig bleibt, nur die Anzeige im Editfeld den Wert in Float anzeigt.<BR>
          Im prinzip ist das mein aktueller Workaround aber ich kämpfe damit wie/wann ich die Eingabe im Editfeld überprüfe. Denn mir scheint OnExit wird nicht ausgelöst wenn ich im Editfeld geschrieben habe und dann auf den TUpdownClick.

          Gruß Yve

          Comment


          • #6
            OnChange
            Christian

            Comment


            • #7
              Hallo Christian,<br>
              OnChange war der erste Ansatz, <br>
              da hatte ich aber recht viel ärger mit convertierungsfehler während der eingabe "5," mag das programm erst mal nicht und hat noch keine Ahnung daß da mehr kommt.
              <br>
              Gruß Yve

              Comment


              • #8
                Danke, Yves,

                für deine Darstellung der Aufgabenstellung, obwohl ich nicht sicher bin, ob ich die volle Prolemstellung erkennen kann.

                Gehe ich von der Aufgabenstellung aus, die Christian andeutete, in der es darum geht, eine Gleitzahl um einen bestimmten Dezimalteil (5.Nachkommastelle = 0.00001) zu verändern, so sollte die Lösung über die TUpDown-Komponente für den durch den TUpDown->Position bestimmten Wertebereich möglich sein.

                Hier der Ansatz des Versuchs der Umsetzung:
                <a http="http://www.markt-daten.de/images/forum/cb/TUpDownFloat.jpg"><img src="http://www.markt-daten.de/images/forum/cb/TUpDownFloat.jpg"></img></a>
                <a http="http://www.markt-daten.de/images/forum/cb/TUpDownFloat.jpg">Bild</a>
                (läßt sich hier im Forum ein Bild einfügen?)
                <hr><font size=1><pre>//-- Unit1.hpp ------------------
                #ifndef Unit1H
                #define Unit1H
                #include <Classes.hpp>
                #include <Controls.hpp>
                #include <StdCtrls.hpp>
                #include <Forms.hpp>
                #include <ComCtrls.hpp>
                class TForm1 : public TForm
                {
                __published: // IDE-managed Components
                TEdit *Edit1;
                TUpDown *UpDown1;
                TComboBox *cbTeil;
                TLabel *Label2;
                TMemo *Memo1;
                void __fastcall Edit1Change(TObject *Sender);
                void __fastcall cbTeilChange(TObject *Sender);
                void __fastcall UpDown1Click(TObject *Sender, TUDBtnType Button);
                private: // User declarations
                public: // User declarations
                float fPosition;
                float fIncrement;
                float fMax;
                float fMin;
                __fastcall TForm1(TComponent* Owner);
                };
                //--------------------------------------
                extern PACKAGE TForm1 *Form1;
                //--------------------------------------
                #endif
                //-- Unit1.cpp -------------------------
                #include <vcl.h>
                #pragma hdrstop
                #include "Unit1.h"
                //--------------------------------------#pragma package(smart_init)
                #pragma resource "*.dfm"
                TForm1 *Form1;
                //--------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
                : TForm(Owner)
                {
                fIncrement = float(1.0);
                fPosition = 0;
                }
                //--------------------------
                void __fastcall TForm1::Edit1Change(TObject *Sender)
                {
                float newValue = atof(Edit1->Text.c_str());
                int iPosition = newValue / fIncrement;
                if (iPosition != UpDown1->Position)
                UpDown1->Position = int(newValue/fIncrement);
                }
                //-----------------------------------
                void __fastcall TForm1::cbTeilChange(TObject *Sender)
                {
                int sel = cbTeil->ItemIndex, ipos=0;
                switch (sel)
                {
                case 0: ipos = 1; break;
                case 1: ipos = 2; break;
                case 2: ipos = 3; break;
                case 3: ipos = 4; break;
                case 4: ipos = 5; break;
                case 5: ipos = 10; break;
                case 6: ipos = 20; break;
                case 7: ipos = 25; break;
                case 8: ipos = 50; break;
                case 9: ipos = 100; break;
                }
                if (ipos)
                {
                fIncrement = double(1)/ipos;
                UpDown1->Position = fPosition/fIncrement;
                Label2->Caption = FormatFloat("fIncrement = 0.00 ",fIncrement);
                }
                }
                //-----------------------
                void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
                {
                fPosition = fIncrement * UpDown1->Position;
                AnsiString Msg= UpDown1->Position;
                Msg += " * " + FormatFloat("0.00", fIncrement) + " = " + FormatFloat("0.00",fPosition);
                Memo1->Lines->Add(Msg);
                Edit1->Text = FormatFloat("0.00", fPosition);
                }
                //--------------------------</pre></font><hr>

                Ob damit Teile deiner Aufgabenstellung getroffen sind, weiß ich nicht genau, doch für mich, als Lernenden, wars eine Übung.

                Gruß

                Comment


                • #9
                  Nachtrag: Bildadresse

                  http://www.markt-daten.de/images/forum/cb/TUpDownFloat.jp

                  Comment


                  • #10
                    Yves,

                    dein am 15.02.04 11:23 geschildertes Problem fürte bei dem von mir dargestellten Code zur Abänderung in der Methode <b>Edit1Chance</b>:

                    Der erste Teil verändert das Komma zum Punkt (je nach Ländereinstellung erforderlich)

                    Anschliessend ist der Wert für <b>fPosition</b> neu zu setzen, der über das Increment <b>fIncrement</b> auch den Wert von <b>TUpDown->Position</b> bestimmt.

                    Erste Test zeigten gewünschte Ergebnisse. Die Grenze, die mit TUpDown->Max gegeben sind, sind allerdings zu bedenken. Doch für dein vorgesehenes Anwendungsgebiet - pH-Werte mit zwei Nachkommstellengenauigkeit - dürfte da keine Hemmnis enstehen.

                    <pre>void __fastcall TForm1::Edit1Change(TObject *Sender)
                    {
                    int len = Edit1->Text.Length();
                    if (len)
                    {
                    char *Txt = new char[len+1];
                    strcpy(Txt,Edit1->Text.c_str());
                    char *ptrTxt = Txt;

                    for (int i=0; i<len; i++, ptrTxt++)
                    {
                    if ( *ptrTxt == ',' )
                    {
                    *ptrTxt = '.';
                    i=len;
                    }
                    }
                    fPosition = atof(Txt);
                    int iPosition = fPosition / fIncrement;

                    if (iPosition != UpDown1->Position)
                    {
                    UpDown1->Position = int(fPosition/fIncrement);
                    }
                    delete [] Txt;
                    }
                    }</pre>

                    Gruß

                    Comment


                    • #11
                      Hallo zusammen ,<br>
                      Vielen Dank an alle, insbesondere an Uwe für die Ausführliche Beschreibung.
                      <br>
                      Ich habs am Laufen wie gewünscht.
                      <br>
                      Gruß Yve

                      Comment

                      Working...
                      X