OnKeyPress-Problem



  • Hallo
    ich hab ein problem mit meinem programm zum wandeln von zahlen. dass programm soll zahlen zwischen Binär, Hexadezimal, Dezimal und Octal wandeln. Dies soll aber geschehen sobald mann irgend eine der zahlen verändert.
    Das Problem was ich jetzt habe ist, das sobald ich das zweite mal BackSpace in einem Editfeld drücke das Programm mir angibt das dies keine gültige taste ist. ich habe den fehler schon lokalisieren können. Jedoch verstehe ich nicht warum er auftritt. ich hoffe ich habe das Problem verständlich dargestellt und ich binn für jede Hilfe dankbar. Hire ist der code:

    void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
    {
       if( (48<=Key && Key<=57) || (97<=Key && Key<=102) || Key==*"\b" || Key==*"r")
       {
          if(Key==*"\b")
          {
             BackSpace(&bufferHex,Edit3);
             Edit3KeyPress(NULL,*"r"); //hier wird anstadt r ein \0 übergeben
                                       //dadurch wird beim durchlauf der funktion
                                       //die Fehlermeldung ausgegeben.
             Key=*"\b";
          }
          else
          {
             char Buffer[50];
             if(Key!=*"r")
                bufferHex+=Key;
             if(Edit3->SelLength!=0)
                bufferHex.erase(Edit3->SelStart,Edit3->SelLength);
             double l=(double)bufferHex.length()-1,Ergebnis=0;
             for(int i=0;l>=0;l--)
             {
                if(bufferHex[i]==*"0" && l==0)
                   i++;
                else
                {
                   double digit;
                   switch (bufferHex[i])
                   {
                      case 'a': digit=10.0;  break;
                      case 'b': digit=11.0;  break;
                      case 'c': digit=12.0;  break;
                      case 'd': digit=13.0;  break;
                      case 'e': digit=14.0;  break;
                      case 'f': digit=15.0;  break;
                      default : digit=(double)StrToInt(bufferHex[i]); break;
                   }
                   Ergebnis = Ergebnis + (digit * pow(16.0,l));
                   i++;
                }
             }
             Edit1->Text=IntToStr((int)Ergebnis);
             bufferDez=Edit1->Text.c_str();
             itoa(Edit1->Text.ToInt(),Buffer,2);
             Edit2->Text=Buffer;
             bufferBin=Buffer;
             itoa(Edit1->Text.ToInt(),Buffer,8);
             Edit4->Text=Buffer;
             bufferOct=Buffer;
             if(Key==*"r")
                Key=*"";
          }
       }
       else
       {
          Application->MessageBox("Bitte geben sie nur die folgenden Zahlen bzw.\n\
    Buchstaben ein: 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f !",NULL, MB_OK);
          Key=NULL;
       }
    }
    

    [ Dieser Beitrag wurde am 22.06.2003 um 19:43 Uhr von Klopfer editiert. ]

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!

    [ Dieser Beitrag wurde am 22.06.2003 um 20:33 Uhr von Jansen editiert. ]

    [ Dieser Beitrag wurde am 22.06.2003 um 21:35 Uhr von Klopfer editiert. ]



  • Hallo,

    wenn du

    Edit3KeyPress(NULL,*"r");

    mit "r" aufrufst, wird ein String übergeben und der wird in C mit \0 terminiert.
    Versuch es mal mit:
    Edit3KeyPress(NULL,'\r');

    Sollte funktionieren.

    Gruß Mikel



  • Ok danke das funktioniert.
    aber ich hätte da noch eine frage. weiss jemand wie ich abfangen kann ob jemand etwas in einem edit eingefügt hat? denn ich möcht auch das sobald etwas eingefügt wird die werte aktualisiert werden.

    danke



  • OnChange???



  • nein das dürfte mit dem on change ereignis nicht klappen, da ich ja auch die zahlen sofort aktualisieren muss und damit alle anderen on change ereignisse aufgerufen würden. Und zu guter letzt würde das zu nem EStackOverflow führen.
    aber trozdem danke



  • Hallo,

    ohne mich jetzt in deinen Code vertiefen zu wollen, aber wenn du auf die Änderung innerhalb eines Editfeldes reagieren willst musst du über OnChange gehen.
    Wenn du jetzt noch unterscheiden willst ob es eine Usereingabe oder eine "Programmeingabe" war, nun ich würde die Eigenschaft Tag der Editfelder dazu missbrauchen den ObChange im zweiten Fall zu sperren.

    Gruß Mikel 😉



  • verwende statt \b \r lieber die virtuellen tastencodes! VK_BACK, VK_RETURN, usw.


Anmelden zum Antworten