Taschenrechner nur pder keys



  • Kopffrau_oder_mann schrieb:

    Ja, indem man beim drueken der plustaste (VK_ADD), alle berechnungen machen kann ;)!

    ?? was meinst du jetzt damit?



  • Ich glaube mal, das Sie/Er meint, das bei deinem Code ja erst nach dem drueken der PLUSTASTE der switsch ausgeführt wird!



  • ich habe jetzt mal kurz einen taschenrechner getestet mit meinem codebeispiel..
    es funktioniert tipptopp soweit.
    ich berechne einfach bei jedem operator der eingetippt wird die rechnung vorher..
    also bei 1+5-6=
    beim - wird 1+5 berechnet und zwischengespeichert und beim = den zwischenspeicher-6



  • @ Big, bei deinem Beispiel bekomme ich einen fehler, "Überladbarer Operator erwartet"



  • ich glaube so dürfte es funktionieren:

    public:		// Anwender-Deklarationen
            char Operator;
            int a;
    
    void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    
    if (Key == RETURN)
     {
        switch(Operator)
        {
            case '+':
                a = a + StrToInt(Edit1->Text);
            break;
            case '-':
                a = a - StrToInt(Edit1->Text);
            break;
            case '/':
                a = a / StrToInt(Edit1->Text);
            break;
            case '*':
                a = a * StrToInt(Edit1->Text);
            break;
            default:
                a = StrToInt(Edit1->Text);
        }
        Operator = '+';
    
      Edit1->Clear();
      Label1->Caption=a;
     };
    
    }
    

    berichtigt mich wenn ich falsch liege!



  • Hallo

    wenn es funktioniert, ist es richtig, also einfach mal ausprobieren!
    Ich würde aber einen besseres Namen für eine so wichtige Variable wie a nehmen, z.B. Value.

    bis bald
    akari



  • Na funktioniert net...da bei VK_RETURN das "+" mit im String bleibt und er dann meckert, das +324324 kein Integerwert ist!



  • Hallo

    ich hab mal ein wenig rumgespielt. Um das so hinzukriegen, wir ihr es wollt, mußt ihr :
    - statt Edit1->OnKeyDown den Event Form1->OnShortCut nehmen
    - Form1->KeyPreview auf true stellen
    - in Form1ShortCut dies kopieren

    int NewValue;
    
      switch(Msg.CharCode)
      {
        case VK_ADD :
        case VK_SUBTRACT :
        case VK_DIVIDE :
        case VK_MULTIPLY :
        case VK_RETURN :
          NewValue = StrToIntDef(Edit1->Text, 0);
          Handled = true;
          if (NewValue == 0) return;
          switch(Operator)
          {
            case VK_ADD:
              a = a + NewValue;
              break;
            case VK_SUBTRACT:
              a = a - NewValue;
              break;
            case VK_DIVIDE:
              a = a / NewValue;
              break;
            case VK_MULTIPLY :
              a = a * NewValue;
              break;
            default:
              a = NewValue;
            };
          if (Msg.CharCode != VK_RETURN)
          {
            Operator = Msg.CharCode;
            Edit1->Clear();
            }
          Label1->Caption=a;
          break;
        };
    

    dann habt ihr einen Rechner, wie ihr es wollt. Sind noch ein paar Schwächen, aber ansonsten...

    bis bald
    akari



  • also hier mal mein beispiel von gestern abend

    void __fastcall TForm1::Berechnen()
    {
    
        switch(cRechnungsOperator)
        {
            case '+':
                dTemp = dTemp + StrToInt(Edit1->Text);
            break;
            case '-':
                dTemp = dTemp - StrToInt(Edit1->Text);
            break;
            case '/':
                dTemp = dTemp / StrToInt(Edit1->Text);
            break;
            case '*':
                dTemp = dTemp * StrToInt(Edit1->Text);
            break;
            default:
                dTemp = StrToInt(Edit1->Text);
        }
    }                  
    
    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
    {
       if (Key == '+')
       {
          Berechnen();
          cRechnungsOperator = '+';
          Edit1->Clear();
          Key = NULL;
       }
       if (Key == '-')
       {
          Berechnen();
          cRechnungsOperator = '-';
          Edit1->Clear();
          Key = NULL;
       }
       if (Key == '/')
       {
          Berechnen();
          cRechnungsOperator = '/';
          Edit1->Clear();
          Key = NULL;
       }
       if (Key == '*')
       {
          Berechnen();
          cRechnungsOperator = '*';
          Edit1->Clear();
          Key = NULL;
       }
       if (Key == 13)
       {
          Berechnen();
          Label1->Caption = AnsiString(dTemp);
          Edit1->Clear();
          Key = NULL;
          cRechnungsOperator = 0;
       }
    }
    

    falls jemand eine beschreibung braucht werde ich das noch nachholen

    [Edit] wobei natürlich

    char cRechnungsOperator;
    double dTemp;
    

    in der .h steht [/Edit]



  • ja also ich hätte schon gern eine beschreibung...=)



  • damit es auch einen möglichst hohen lehrnefekt hat, sagst du am besten was du verstehst und was nicht.. 😃



  • ok, du legst funktion an, wo dTemp der Wert in Edit1 ist, und dann ein schalter, wo je nach operator der alte mit dem neuen berechnet wird!

    Im programm wertest du Keypress aus, und übergibst den keys die jeweiligen operatoren! ODER?

    Mit Key 13 verstehe ich nicht!

    Wenn ich oben schon was falsch verstanden habe, sag es bitte!



  • ich mach mal ein beispiel.. wieder dass "1+5-6="

    wenn eine die "1" eingegeben wird passiert nichts spezieles
    kommt der erste RechnungsOperator das "+" da wird in der if schleife die funktion "berechnen()" aufgerufen.
    da noch nichts im RechnungsOperator steht und erste eine zahl eingegeben wurde(zum berechnen brauchs ja für die 4 grundoperationen immer 2 zahlen) wird default aufgerufen. d.h. der wert im edit wird zwischengespeichert in dTemp
    durch Edit1->Clear() wird der inhalt des edits gelöscht und der Wert in "Key"(das zeichen das ins Edit feld übergeben wird) wird auch gelöscht, so dass nichts mehr im edit steht.
    bei der zweiten zahl die "5" passiert wieder nichts
    beim "-" wird wieder das entsprechende if aufgerufen
    berechnet wird die erste zahl mit dem operator mit der zweitern zahl momentan im edit

    dTemp + StrToInt(Edit1->Text);
    

    und das ganze wird wieder in dTemp geschrieben.
    dann halt man "die erste zahl" gespeichert.. da immer das zwischenresultat berechnet wird und der letzte operator auch.. so kann man immer weiter rechnen ohne an ein ende zu kommen.
    beim enterschlag

    if (Key == 13)
       {
          Berechnen();
          Label1->Caption = AnsiString(dTemp);
          Edit1->Clear();
          Key = NULL;
          cRechnungsOperator = 0;
       }
    

    wird nochmals das resultat berechnet, das in einem label ausgegeben, wieder alles löschen inkl RechnungsOperator

    hoffe das war verständlich..


Anmelden zum Antworten