Windows Taschenrechner



  • Hey!

    Ich habe noch ein paar Probleme mit meinem windows-taschenrechner den ich exakt kopieren soll.
    Bis jetzt kann mein Rechner zwar rechnen und auch einen wert speichern, aber mir fehlt noch:

    -die Eingabe(Edit1) muss rechtsbündig sein ( Was in den anderen Themen zu der Rechtsbündigkeit von Edit1 steht, verstehe ich absolut nicht)
    -die Schrift meiner Buttons sind nicht rot bzw blau,
    -Mit meinem Ergbnis kann man nicht weiterrechnen...

    Vielleicht könnte mir jemand mit dem Programmieren helfen? Wäre super!
    Ich könnte auch demjenigen meine bisherige Arbeit schicken.

    Wäre echt super genial, wenn jemand mir hilft.

    Danke!!!



  • Zum Thema Text rechtsbündig steht etwas in der FAQ:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39261.html



  • Ich gehe mal davon aus, dass du den Taschenrechner in der Standardansicht nachprogrammieren sollst, ansonsten wird komplizierter.
    Da der Taschrechner die normalen Rechenregeln ignoriert (keine Punkt- vor Strichrechung) und alle Operationen sofort ausgeführt werden musst du eigentlich nur zwei Operationsmodi unterscheiden: Operationen mit einem Parameter und Operationen mit zwei Parametern.
    Operationen mit einem Parameter sind trivial, einfach den Inhalt des TEdit nach double wandeln, Operation darauf anwenden und das Ergebnis im TEdit anzeigen.
    Operationen mit zwei Parametern erfordern das Zwischenspeichern des aktuellen Wertes, das Merken der ausgewählten Operation und die Eingabe des zweiten Parameters. Der Rechenvorgang für '12 + 34 =' würde dann in etwa so aussehen:

    Eingabe: 1 -> Edit enthält "1"
    Eingabe: 2 -> Edit enthält "12"
    Eingabe: + -> "12" irgendwo merken, "+" irgendwo merken
    Eingabe: 3 -> Edit enthält "3"
    Eingabe: 4 -> Edit enthält "4"
    Eingabe: = -> alte Eingabe holen, Operation holen, Ergebnis berechnen -> Edit enthält "46"

    Das Ergebnis musst du bei jeder neuen Operation ebenfalls berechnen (zB 1+2+3), damit kannst du das letzte Ergebnis immer als ersten Parameter für jede weitere Operation benutzen.

    Die Farben und die Ausrichtung des Textes sind Chromleisten, darum solltest du dich am Schluss kümmern. Wichtig ist in erster Linie die Funktionalität.



  • Ja gut, das hab ich alles verstanden...
    Jetzt nur noch die Edit rechtsbündig machen.
    @Gustl: Den Beitrag hab ich schon gelesen aber ganz ehrlich nichts verstanden 🙂
    lg



  • Es gibt da auch "fertige" Komponenten zum Download.
    Bei dem Packet http://www.abf-dev.com/abf-components.shtml ist sowas mit dabei.
    Ansonsten bei Torry.net



  • morio27 schrieb:

    Jetzt nur noch die Edit rechtsbündig machen.

    Hab mich da jetzt schlau gemacht und ich bin entsetzt 😮. Das "nur noch rechtsbündig" ist mit der VCL so einfach nicht möglich, weil das TEdit die Modifikation der entsprechenden Window Styles nicht zulässt. Die einzige Möglichkeit ist die Benutzung einer eigenen TEdit Klasse, die man von TEdit ableiten muss:

    // Header Datei

    #ifndef RightAlignedEditH
    #define RightAlignedEditH
    
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    
    class TRightAlignedEdit : public TEdit
    {
    public:
       __fastcall TRightAlignedEdit( TComponent* Owner );
    
       void __fastcall CreateParams( TCreateParams& Params );
    };
    #endif
    

    Implementationsdatei

    #include "RightAlignedEdit.h"
    
     __fastcall TRightAlignedEdit::TRightAlignedEdit( TComponent* Owner ) : TEdit( Owner )
    {
    }
    
    void __fastcall TRightAlignedEdit::CreateParams( TCreateParams& Params )
    {
       // Parameter durch Basisklasse auswerten
       TEdit::CreateParams( Params );
    
       // ES_LEFT Style ausmaskieren
       Params.Style &= ~ES_LEFT;
    
       // ES_RIGHT Style setzen
       Params.Style |= ES_RIGHT;
    }
    

    Das Ding ist jetzt keine Komponente, sodass du die Zuweisung der Attribute selbst übernehmen musst, statt sie im Objektinspektor einstellen zu können:

    TMyForm::TMyForm( TComponent* Owner )
    {
       // Annahme: Im Header von TMyForm existiert die Deklaration
       // TRightAlignedEdit* EditInput;
       EditInput = new TRightAlignedEdit( this );
       EditInput->Parent = this;
    
       // Grösse und Position setzen
       EditInput->Left   = 16:
       EditInput->Top    = 16;
       EditInput->Width  = 120; 
       EditInput->Height = 20;
    
       // ggf. Event Handler setzen, möglicherweise weitere
       EditInput->OnChange = OnChangeInput;
    }
    

    Hehe, habe mir gerade Gustl´s Link angeguckt und beim letzten Beitrag von Jansen musste ich doch schmunzeln... wie recht er hat.



  • Danke erstmal für die Bemühungen! Hab es aber noch nicht hinbekommen.. 🙂
    Ich stell mal ein Teil meiens Quellcodes hier rein.
    Wie kann ich einstellen, dass ich von der Tastatur die Zahlen bzw die Operatoren(+,-,* und /) in die Eingabe bekomme und dann rechnen kann?
    Es gibt doch eine Funktion die heißt "OnKeyPress" oder? Ich würde das jetzt so machen, aber das funzt nicht 😃

    void __fastcall TForm1::Zahl0KeyPress(TObject *Sender, char &Key)
    {
    Num0->Eingabe="0";
    }
    

    Dann noch zum weiterrechnen meiner Zahlen. Das klappt noch nicht. Vielleicht kann mir jemand einen tipp geben? Auch hier mein Quellcode: ( BSP: 2+2=4, 4*6=0??)

    Initialisierung:

    bool Plusrechnen=false;
            bool minusrechnen=false;
            bool division=false;
            bool multiplikation=false;
            bool wurzel=false;
            bool einsdurchx=false;
            bool prozent=false;
            bool splus=false;
            double x= 0.0;
            double z= 0.0;
            double speicher=0.0;
            int anzahl_klick=0;
    
            double addition(double x1,double x2)
            {
            return x1 + x2;
            }
            double subtraktion(double x1,double x2)
            {
            return x1-x2;
            }
            double mal(double x1,double x2)
            {
            return x2*x1;
            }
            double divi(double x1,double x2)
            {
            return x1/x2;
            }
            double proz(double x1,double x2)
            {
            return (0.01*(x2*x1));
    

    //Zahl 2

    void __fastcall TForm1::Zahl2Click(TObject *Sender)
    {
    Eingabe->Text=Eingabe->Text+"2";
    x=Eingabe->Text.ToDouble();
    
    }
    

    //plus

    Plusrechnen=true;
    z=addition(z,x);
    Eingabe->Clear();
    anzahl_klick++;
    

    //ergebnis

    if(Plusrechnen==true)
    {
    z=addition(x,z);
    Eingabe->Text=FloatToStr(z);
    }
    
    else if (multiplikation==true)
    {
    z=mal(z,x);
    Eingabe->Text=FloatToStr(z);
    }
    

    //Multiplikation

    void __fastcall TForm1::MalClick(TObject *Sender)
    {
    multiplikation=true;
    if(anzahl_klick==0)
    {
    z=x;
    }
    else
    {
    z=mal(z,x);
    }
    Eingabe->Clear();
    anzahl_klick++;
    }
    

    Ich hoffe Ihr versteht das 🙂
    Danke!!!
    lg



  • Also sowas find ich persönlich immer unschön.

    bool Plusrechnen=false;
    bool minusrechnen=false;
    bool division=false;
    bool multiplikation=false;
    bool wurzel=alse;
    bool einsdurchx=false;
    bool prozent=false;
    bool splus=false;
    

    Nimm doch statt der vielen Flags einfach ein

    unsigned short Operation
    

    und gib jeder Operation eine Nummer.
    Und wenn die Operation ausgewertet werden muss machst du

    switch ( Operation )
    {
    ...
    }
    

    nur meine persönliche Meinung 😃



  • __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
       x=0;
       rechenop=0;
       kommaset=false;//Komma gesetzt ?
       neuzahl=true;//Eingabe neue Zahl
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::rechnen()
    {
       double eingabe=StrToFloat(Eingabe->Text);//Text in Eingabefeld merken
       switch(rechenop)
       {
          case 0: x=eingabe;break;// = gedrückt
          case 1: x/=eingabe;break;//Division
          case 2: x*=eingabe;break;//Multiplikation
          case 3: x-=eingabe;break;//Subtraktion
          case 4: x+=eingabe;break;//Addition
       }
       Eingabe->Text = FloatToStr(x);
       if(x==(int)x) Eingabe->Text = Eingabe->Text + ",";
       neuzahl=true;
       kommaset=false;
    }
    void __fastcall TForm1::Zahl1Click(TObject *Sender)//Alle Zahlen ClickEvents auf Zahl1Click
    {
       TButton *pressed=dynamic_cast <TButton*>(Sender);
       String zahl=pressed->Caption;
       if(neuzahl)
       {
          Eingabe->Text = zahl+",";
          neuzahl=false;
       }
       else
       {
          if(kommaset) Eingabe->Text = Eingabe->Text + zahl;
          else Eingabe->Text = Eingabe->Text.SubString(1,Eingabe->Text.Length()-1)+zahl+",";
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::KommaClick(TObject *Sender)
    {
       kommaset=true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::DivisionClick(TObject *Sender)
    {
       rechnen();
       rechenop=1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::MalClick(TObject *Sender)
    {
       rechnen();
       rechenop=2;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::MinusClick(TObject *Sender)
    {
       rechnen();
       rechenop=3;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::PlusClick(TObject *Sender)
    {
       rechnen();
       rechenop=4;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::GleichClick(TObject *Sender)
    {
       rechnen();
       rechenop=0;
    }
    


  • Hey!
    Danke für eure Antworten!
    Hab jetzt das alles auch eingebaut. Nur fehlt mir jetzt noch die Farbe der Buttons. Beim Original Windowstaschenrechner sind Sie Blau bzw. Rot.
    Bei meinem kann ich die Farbe nicht ändern.
    Wenn ich im Object Inspector unter dem Punkt "Font" die Farbe ändern will, macht er nichts..
    Kennt jemand das problem??
    lg



  • Die Farbe des Standardbuttons lässt sich nicht ändern. Entweder du bastelst die da selber was zusammen (eigene Komponente, Image als Button etc.) oder du suchst dir eine externe Buttonkomponente. In der FAQ gibt es einen Link unter "Komponenten benutzen".



  • Braunstein schrieb:

    Die Farbe des Standardbuttons lässt sich nicht ändern. ..

    Das TBitBtn ist nicht so zickig und lässt seine Fontfarbe ändern, auch im OI. Wenn es in deinem Fall nicht vorgeschrieben ist, ein TButton zu nehmen, nimm doch also dieses.

    EDIT : gilt wohl nur bei BCB 3 ( bis ?) , auf der Version BCB 2009 geht o.g. schon nicht mehr 😞

    mfg
    kpeter



  • Hallo allerseits,

    zum Thema "rechtsbündig" kann man in diesem Fall IMHO auch die Kirche im Dorf lassen und einfach ein TPanel nehmen. Dann kann man ganz prima Panel->Caption rechtsbündig anzeigen lassen... 😉

    MfG



  • Hallo morio27!
    Ich bin Anfänger in sachen c++, deswegen ist auch nachfolgender code nicht die optimale version. ich habe mir selbst diese aufgabe mit dem rechner gestellt und eine recht passable lösung (zumindest für das "rechnen" an sich) gefunden, mit der man auch weiterrechnen kann:

    float z1, z2;
    String ro;
    void __fastcall TSDIAppForm::Button2Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "7";
    }
    
    void __fastcall TSDIAppForm::Button3Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "8";        
    }
    
    void __fastcall TSDIAppForm::Button6Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "9";        
    }
    
    void __fastcall TSDIAppForm::Button4Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "4";        
    }
    
    void __fastcall TSDIAppForm::Button8Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "5";        
    }
    
    void __fastcall TSDIAppForm::Button11Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "6";        
    }
    
    void __fastcall TSDIAppForm::Button12Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "1";        
    }
    
    void __fastcall TSDIAppForm::Button5Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "2";        
    }
    
    void __fastcall TSDIAppForm::Button10Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "3";        
    }
    
    void __fastcall TSDIAppForm::Button9Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "0";
    }
    
    void __fastcall TSDIAppForm::Button13Click(TObject *Sender)
     {
      Edit1->Clear();              //Alles löschen
      Label4->Caption = "";
     }
    
    void __fastcall TSDIAppForm::Button7Click(TObject *Sender)
    {
    z1=  StrToFloat (Edit1->Text);         //Plus wurde gewählt
    ro = "+";
    Label4->Caption = "+";
    Edit1->Clear();
    }
    
    void __fastcall TSDIAppForm::Button17Click(TObject *Sender)
    {
    z2 = StrToFloat (Edit1->Text);            //rechnen
    if (ro == "+")
    Edit1->Text = z1 + z2;
    else if (ro == "-")
    Edit1->Text = z1 - z2;
    else if (ro == "*")
    Edit1->Text = z1 * z2;
    else if (ro == ":")
    Edit1->Text = z1 / z2;
    
    Label4->Caption = "";
    }
    
    void __fastcall TSDIAppForm::Button16Click(TObject *Sender)
    {
    z1=  StrToFloat (Edit1->Text);                 //Minus wurde gewählt
    ro = "-";
    Label4->Caption = "-";
    Edit1->Clear();
    }
    
    void __fastcall TSDIAppForm::Button15Click(TObject *Sender)
    {
    z1=  StrToFloat (Edit1->Text);         //Mal wurde gewählt
    ro = "*";
    Label4->Caption = "*";
    Edit1->Clear();
    }
    
    void __fastcall TSDIAppForm::Button14Click(TObject *Sender)
    {
    z1=  StrToFloat (Edit1->Text);           //Geteilt duch wurde gewählt
    ro = ":";
    Label4->Caption = ":";
    Edit1->Clear();
    }
    
    void __fastcall TSDIAppForm::Button18Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + ",";
    }
    

    Vielleicht kannst du damit was anfangen...



  • Kolumbus schrieb:

    zum Thema "rechtsbündig" kann man in diesem Fall IMHO auch die Kirche im Dorf lassen und einfach ein TPanel nehmen. Dann kann man ganz prima Panel->Caption rechtsbündig anzeigen lassen... 😉

    Und TPanel ist ganz sicher ein Eingabefeld? 🙄

    @ Chris_: Versuch's mal damit, was die ganzen Zahlenbutton's angeht:

    void __fastcall TSDIAppForm::Button3Click(TObject *Sender)
    {
      Edit1->Text = Edit1->Text + dynamic_cast<TButton*>(Sender)->Caption;
    }
    

    Und weise dann allen Zahlenbuttons diese Methode dem Ereignis OnClick zu.



  • Ok vielen dank ich versuchs mal-
    wie gesagt, bin blutiger anfänger



  • Hi,

    TEdit rechtsbündig:

    im Konstruktor vom Hauptformular setzen

    SetWindowLong( Edit1->Handle, GWL_STYLE, GetWindowLong( Edit1->Handle, GWL_STYLE ) | ES_RIGHT );
    

    mfg
    kpeter



  • Das funktioniert bei dir`? Bei mir jedenfalls nicht...



  • DocShoe schrieb:

    Das funktioniert bei dir`? Bei mir jedenfalls nicht...

    Ja, sowohl BCB 3 a.u. BCB2009

    Als Aufruf mit Button gehts auch mit einem zusätzlichen Repaint, halt neuzeichnen des Edit.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	SetWindowLong( Edit1->Handle, GWL_STYLE, GetWindowLong( Edit1->Handle, GWL_STYLE ) | ES_RIGHT );
    	Edit1->Repaint();
    }
    //---------------------------------------------------------------------------
    

    Edit: Im BCB2009 setzt man normal im OI das Alignment = taRightJustify 😉 .



  • heini schrieb:

    Kolumbus schrieb:

    zum Thema "rechtsbündig" kann man in diesem Fall IMHO auch die Kirche im Dorf lassen und einfach ein TPanel nehmen. Dann kann man ganz prima Panel->Caption rechtsbündig anzeigen lassen... 😉

    Und TPanel ist ganz sicher ein Eingabefeld? 🙄

    Du bist ja ein Experte... 😃 Die Zahlen werden beim Windows-Taschenrechner im Normalfall per Button-Click eingegeben. Ich kenne niemanden, der versucht direkt ins Display zu klicken und dann seine Aufgabe einzutippen - Nimm mal deinen Taschenrechner aus der Schublade und versuche mit einem Stift direkt ins Display zu schreiben... Merkste was? :p

    Edit: Also nochmal mein Vorschlag - einfach ein TPanel als Anzeige nehmen!


Anmelden zum Antworten