Nur Zahlen bei einem Edit eingeben



  • Hallo,

    danke das ihr mir geholfen habt 😃

    Kann ich das irgendwie machen, dass man nur Zahlen in ein Edit eingeben kann?
    Bei Buchstaben soll eine Fehlermeldung kommen!

    bis jetzt is es so:

    zb.:

    wert3=StrToFloatDef(Edit4->Text,0);
    

    Bitte um Hilfe 😃



  • Schau' Dir mal TMaskEdit an.



  • Hallo,
    klicke auf dein Edit Feld und dann geh in den Objektinspektor und anschließend auf die Funktion OnKeyPress.
    Nun schreisbt du folgendes:

    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
    {
     if(!isdigit(Key)/*only allow Numbers*/&& Key!='\b'/*And Backslash*/)
      {
       Key=NULL;
       MessageBeep(0);
       ShowMessage("Deine Nachricht");
      }
    }
    

    Mfg. Sven



  • oder so:

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

    grüssle 🙂



  • Chakuza schrieb:

    Hallo,
    klicke auf dein Edit Feld und dann geh in den Objektinspektor und anschließend auf die Funktion OnKeyPress.
    Nun schreisbt du folgendes:

    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
    {
     if(!isdigit(Key)/*only allow Numbers*/&& Key!='\b'/*And Backslash*/)
      {
       Key=NULL;
       MessageBeep(0);
       ShowMessage("Deine Nachricht");
      }
    }
    

    Mfg. Sven

    Funktioniert, aber er zeigt die message nicht an. ma kann nichts weiter machen, bis man enter drückt, aber man sieht die message nicht.
    hab auch mit messagebox versucht. trotzdem nichts.
    was hab ich falsch gemacht?



  • Kann ich nicht nachvollziehen, hab copy und paste gemacht und es hat wunderbar funktioniert.
    Kopier mal dein Quellcode hier rein, dass man mal ein Blick drüber werfen kann.

    Mfg. Sven



  • den quellcode, den du oben geschrieben hast ist wörtlich (na gut außer "deine Nachricht") in meinem Programm drin!

    man hört ja, den sound der messg, aber nicht sehen tun.

    wenn ich ein neues programm strate, nur mit der funct., dann funkt es.



  • es funkt, wenn ich borderstyle auf normal stelle. hatte ihn auf stay on top. kann man ihn nicht trotzdem auf sty on top haben und das diese funktion funkt?!



  • wie geht das , wenn man nur Buchstaben erlauben will?



  • if ( isdigit(Key) ) //Laesst keine Zahlen zu
    Key = NULL;

    Ein wenig Eigeniniative bitte!



  • Liest du eigentlich die Antworten auf deine Fragen auch?

    Smitty schrieb:

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

    Das ist das Mittel der Wahl, falls du die Eingabe auf Nummern beschränken willst.



  • les ich auch. das da oben funkt nicht, aber ich will ja buchstaben haben. Nummern funktioniert.



  • Hallo

    Für Buchstaben gibt es nach meiner Nachforschung nach kein spezielles Flag. Dann must du den von Chakuza erwähnten KeyPress-Event benutzen, um eben statt isdigit auf alle Buchstaben zu überprüfen

    if ((('a' < Key ) && (Key < 'z')) || (('A' < Key) && (Key < 'Z')))
    

    bis bald
    akari



  • danke, werd mal testen.



  • Hey, ich hab hierzu auch ein kleines Problemchen, ich weiß zwar nicht, ob es noch hierher passt, aber ich probiers einfach mal. (Hat wohl wiederum einmal mehr mit Übergabe von Klassen oder so zu tun...) Aber so gibt es wenigstens den Bezug zum Problem und es ist leichter verständlich, hoffe ich.

    Ich bin nach dem angegebenen Bsp. im Link, die Formatierung eines Edit mit Hilfe vom KeyPress-Ereignis, vorgegangen. Habe für verschiedene Edits jeweils im KeyPress-Ereignis diesen Code hereinkopiert und etwas angepasst (bestimmte Anzahl von Ziffern nach dem Komma):

    void __fastcall Tfrm_startPacker::edit_heightKeyPress(TObject *Sender, wchar_t &Key)
    {
    	// Zeiger auf Sender casten:
    	TEdit* pEdit = dynamic_cast<TEdit*>(Sender);
    	// Falls Punkt oder Komma eingegeben und noch kein Dezimaltrennzeichen
    	// im Eingabestring vorhanden, Dezimaltrennzeichen einsetzen:
    	if((Key == '.' || Key == ',') && !pEdit -> Text.Pos(DecimalSeparator))
    		Key = DecimalSeparator;
    	// Zeichen verwerfen, ohne Minus-Zeichen am Anfang des
    	// Eingabestrings noch eine Ziffer eingegeben:
    	else if(((Key < '0' || Key > '9') && Key != 8 && Key != '-'))
    		Key = 0;
    	// Erlaubt nur zwei Nachkommastellen
    	else if (((pEdit->Text.Length() - pEdit->Text.Pos(DecimalSeparator)) >= 2) &&
    			 Key != 8 && pEdit->Text.Pos(DecimalSeparator))
    		Key = 0;
    }
    

    So nun dachte ich mir, ich schreibe mir wieder eine eigene Funktion, wo ich dann den Sender und den Key übergebe beim Aufruf vom jeweiligen OnKeyPress des Edits.
    Aber irgendwas hab ich noch falsch gemacht. Hier mein neuer Code:

    void eingabecheck(TObject*, wchar_t, int);
    
    void eingabecheck(TObject *Sender, wchar_t &Key, int decimal){
    	// Zeiger auf Sender casten:
    	TEdit* pEdit = dynamic_cast<TEdit*>(Sender);
    	// Falls Punkt oder Komma eingegeben und noch kein Dezimaltrennzeichen
    	// im Eingabestring vorhanden, Dezimaltrennzeichen einsetzen:
    	if((Key == '.' || Key == ',') && !pEdit -> Text.Pos(DecimalSeparator))
    		Key = DecimalSeparator;
    	// Zeichen verwerfen, ohne Minus-Zeichen am Anfang des
    	// Eingabestrings noch eine Ziffer eingegeben:
    	else if(/*(Key == '-' && (pEdit->SelStart || pEdit->Text.Pos("-"))) ||*/
    		   ((Key < '0' || Key > '9') && Key != 8 && Key != '-'))
    		Key = 0;
    	// Erlaubt nur zwei Nachkommastellen
    	else if (((pEdit->Text.Length() - pEdit->Text.Pos(DecimalSeparator)) >= decimal) &&
    			 Key != 8 && pEdit->Text.Pos(DecimalSeparator))
    		Key = 0;
    
    }
    
    // und Aufruf der Funktion:
    eingabecheck(*Sender, Key, 2);
    


  • Hallo

    Aber irgendwas hab ich noch falsch gemacht.

    Ist keine ausreichende Fehlerbeschreibung! Fehlermeldung des Compilers?

    Auf jedenfall ist der Funktionsaufruf falsch. Du hast mit Sender schon einen Pointer. Du brauchst diesen nicht zu dereferenzieren.

    eingabecheck(Sender, Key, 2);  // Richtig
    

    bis bald
    akari



  • Hey akari, irgendwie habe ich gar nicht mitbekommen, dass du mir schon geantwortest hast ^^

    Ja also die Fehlermeldung kommt hier:

    [BCC32 Fehler] start.cpp(204): E2015 Mehrdeutigkeit zwischen 'eingabecheck(System::TObject *,wchar_t,int) at start.cpp:31' und 'eingabecheck(System::TObject *,wchar_t &,int) at dec.h:1'

    Ich habe das auch schon abgeändert, was du mir geschrieben hast, aber ist noch dieser Fehler oben da ...
    Ich hatte auch schon alle Möglichkeiten mit und ohne Stern durchprobiert xD aber leider ohne Erfolg.

    Edit:
    Hahaha 🙂 Ich habs rausgefunden! Es war ein dummer Deklarationsfehler:

    void eingabecheck(TObject*, wchar_t [b]&[/b], int);
    

    Das '&' fehlte hinter dem wchar_t ...

    Aber was ich gerne noch wissen würde, wie die Position des Cursers im Editfeld ausgedrückt wird. Denn wenn bei meinem Code man 2 Nachkommastellen hat, kann man leider keine Ziffern mehr vor dem Komma hinzufügen ... 😛 Also muss ich noch die Curserposition mit der des Kommas vergleichen.



  • Hallo

    😕 Die Cursorposition eines TEdit kannst du mit SelStart auslesen. Das hättest du aber auch in der BCB-Hilfe nachlesen können.

    bis bald
    akari



  • Also wenn man nur Zahlen, Komma und del-Taste möchte kann man es auch so machen:

    if((Key!='1')&&(Key!='2')&&(Key!='3')&&(Key!='4')&&(Key!='5')&&(Key!='6')&&(Key!='7')&&(Key!='8')&&(Key!='9')&&(Key!='0')&&(Key!=char(VK_BACK))&&(Key!=char(VK_DELETE)))
    {
    Key=char();
    }

    Jetzt ist nur noch das Problem das man eine Zahl mit 2 Kommas eingeben kann.

    Weiß da zufällig jemand wie man das macht das man nur 1 Komma eingeben kann?????????? (in Borland c++ mein ich jetzt)

    Wäre super

    Danke 👍 👍



  • weiß da niemand ne antwort drauf?


Anmelden zum Antworten