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 nichtvoid __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 duswitch ( 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!