In TEdit nur Zahlen und Punkt zulassen



  • Auf Zahlen kann ich die Eingabe beschränken. Aber ich möchte außerdem den Dezimalpunkt zulassen. Ungünstig, daß ich die GWL_STYLE's nicht in der Referenz finde. Auch die Suche erbrachte nur mehrfach ES_NUMBER. Kann jemand helfen? Bisher benutz ich:

    long Style;
        Style = GetWindowLong(WidthBox->Handle, GWL_STYLE);
        Style = (Style | ES_NUMBER);
        SetWindowLong(WidthBox->Handle, GWL_STYLE, Style);
    


  • hi, du kannst in das KeyPress-Event der Edit-Box diesen FilterCode einsetzen:

    if ((Key<'0' || Key>'9') && Key!='.' && Key!='\b')
         Key=0;  //kein zeichen in die box tun
    

    dann wird alles verhindert außer Ziffern, Punkt und Backspace

    [ Dieser Beitrag wurde am 02.02.2003 um 01:53 Uhr von crass editiert. ]



  • *Haue*. Wenn man mal auf einem Trip ist...

    Dabei geht's elegant, spezifisch und ohne API. 🕶 Dank dir sehr, @crass.



  • "Haue" hättest du vor allem dafür verdient, den quasi-identischen FAQ-Beitrag zum Thema ignoriert zu haben! 😉



  • BvK + Ehrgeiz. Hab die Routine schon mal so weit zusammen, nur der Handler für den Punkt fehlt. Da konzentriert man (der ich 😉 ) sich nur auf die entsprechenden Stichworte. - Dabei ist es schon (fast) eine Standardübung... Bis auf das Setzen aller unerwünschten Tasten auf NULL, das find ich genial.

    Zur Straffung jetzt noch die Routine, die wohl in den Praxis den üblichen Nutzen + Komfort verspricht: Zahlen, Punkt und VK_BACK, auch die beiden schreibweisen als char und als Virtual Key sind enthalten:

    void __fastcall TLurker::Edit1KeyPress(TObject *Sender, char &Key)
    {
        if ((Key<'0' || Key>'9') && Key!='.' && Key!=VK_BACK)
             Key=0;
    }
    


  • naja also trenner der zahlen solltest du dann schon DecimalSeparator nehmen, damits auf jedem system funktioniert.

    was ist mit ...

    - negativen zahlen?
    - dezimalpunkt nur einmal zulassen?
    - usw.



  • Was ist ein DecimalSeparator? Ich brauch hier zB. float mit 1 und 2 Nachkommastellen und int.

    Um den Punkt nur einmal zuzulassen, wird man wohl um eine Suchroutine nicht umhin kommen. Eine hochgezählte Variable müßte ich beim OnExit ja wieder zurücksetzen. Bei einem erneuten Eintrag könnte man ja einen weiteren Punkt dazusetzen.

    Wer negative Zahlen braucht und das '-' auch in der Position überwachen will, braucht sowieso eine Suchfunktion.

    Wer höhere und gleichwertige Anforderungen stellt, sollte sicher auf MaskEdit zurückgreifen - oder eben eine entsprechend ausgefeilte Routine schreiben.



  • Um den Punkt nur einmal zuzulassen, wird man wohl um eine Suchroutine nicht umhin kommen.
    Wer negative Zahlen braucht und das '-' auch in der Position überwachen will, braucht sowieso eine Suchfunktion.

    man braucht nix komplizierter machen als es ist..

    dieser code funzt zB ganz gut:

    if ((Key=='-') && (Edit1->SelStart==0)) return;  // Minus am Anfang zulassen
    if (Key=='.' && !Edit1->Text.Pos(".")) return; // Punkt einmal zulassen
    if ((Key<'0' || Key>'9') && Key!='\b') // bissel filtern
       Key=0;
    

    wobei Edit1 natürlich die entsprechende EditBox is

    [ Dieser Beitrag wurde am 03.02.2003 um 01:13 Uhr von crass editiert. ]



  • kleiner schönheitsfheler bei der sache ist, daß das copy&pasten nicht mehr richtig funktioniert..

    wenn mans perfekt machen will, fängt man wohl anstatt OnKeypress OnChange ab und formatiert den String in der Box wie mans braucht



  • Hallo,

    also wenns perfekt werden soll (mit Zwischenablage), da gibts bei B&M ein wunderschönes und gut dokumentiertes Snippet.

    Phips



  • *Hey*, das ist interessant und *edel*. Darauf wär ich nicht so leicht gekommen. Ich frag ja ab, bevor die chars ins Edit gelangen.

    Das Codebeispiel ist echt gut. Der Aufwand für's Clipboard ist auch ganz nett, aber lohnend, wenn man es braucht. Für das Grafiktool hier richte ich für die Edit-Felder nicht mal das Clipboard-Handling ein. - Aber man weiß nie, die Beispielsammlung ist nun um einen wertvollen Beitrag reicher. 🙂

    Ich dank euch sehr. Die Problemstellung ist nun rundum geklärt. *freu*


Anmelden zum Antworten