prüfen ob eingabe string oder nicht??



  • wie kann ich den absturz von einem programm verhidern wenn statt einer geforderten zahl ein wort eingegeben wird??? hab schon öfter vesucht den inhalt eines editfeldes auf string oder int zu prüfen aber das funzt immer net.

    weis jemand rat??
    😃



  • Versuch es mal mit der Funktion ToIntDef(), anstatt ToInt().
    Alternativ kannst Du auch das ToInt in try, catch() setzen.



  • PomBär schrieb:

    weis jemand rat??

    Ja, die Suchfunktion liefert dazu mit Sicherheit einiges.
    Anstatt im Nachhinein auf Gültigkeit zu prüfen, solltest Du versuchen, ungültige Eingaben erst
    gar nicht zuzulassen (z.B. auf Events reagieren, MaskEdit verwenden). Das findest Du aber
    alles hier im Forum.

    Gruß,

    Alexander



  • er sagt das ToIntDef() ein undefiniertes symbol ist.
    ich habs bei mir so geschrieben:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    double w;
    double e, z;
    if((ToIntDef(Edit1->Text))&&(ToIntDef(Edit2->Text)))
    {
    w = StrToFloat(Edit1->Text);
    e = StrToFloat(Edit2->Text);
    
    z = berechnung(w,e);
    Edit3->Text = FloatToStr(z);
    }
    }
    

    das mit dem MaskedEdit werde ich mal suchen und ausprobiern, danke



  • PomBär schrieb:

    er sagt das ToIntDef() ein undefiniertes symbol ist.

    Such doch mal in der Hilfe nach ToIntDef(), dann weißt Du sicherlich gleich, was falsch ist.

    Gruß,

    Alexander



  • wegen dem "MaskedEdit" und dem "Eingaben erst
    gar nicht zuzulassen".
    wo hast du das gefunden? wie heist der beitrag oder der link dazu?
    hab nichts gefunden.



  • Sorry, ich bin von int ausgegangen, bei Fließkommazahlen gibt es kein ToFloatDef().

    Einfachste Lösung:

    AnsiString astest;
    	double dtest;
    
    	astest = "H123";
    
    	try
    	{
    		dtest = astest.ToDouble();	
    	}
    	catch (EConvertError &Err)
    	{
    		ShowMessage("Überprüfen Sie die Eingabe");
    	}
    


  • PomBär schrieb:

    wegen dem "MaskedEdit" und dem "Eingaben erst
    gar nicht zuzulassen".
    wo hast du das gefunden?

    Das Ding heißt "MaskEdit" - mein Fehler. Damit findest Du einige Links über die Suche.
    Schau aber doch einfach mal in der BCB-Hilfe nach.

    Gruß,

    Alexander



  • Siehe FAQ, "Edit - nur Zahlen erlauben".



  • Hi!

    Und für floats:

    void __fastcall TForm33::Edit1KeyPress(TObject *Sender, char &Key)
    {
      // Zeiger auf Sender casten:
      bool kommaerlaubt = false;
      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) && kommaerlaubt)
        Key = DecimalSeparator;
      // Zeichen verwerfen, falls weder Minus-Zeichen am Anfang des
      // Eingabestrings noch eine Ziffer eingegeben:
      else if(((Key < '0' || Key > '9') && Key != 8 && Key != '-'))
        Key = 0;
      // Wenn Zeichen Minus-Zeichen, nur erlauben, wenn dies am
      // Anfang des Eingabestrings eingegeben wird.
      else if (Key == '-')
        if (pEdit->SelStart != 0) Key = 0;        
    }
    

    tschüss
    Robert



  • @Robert,

    das scheitert schon, wenn man was aus der Zwischenablage in das Edit einfügt... Ich hab' gehört es gibt böse Leute, die machen so etwas. 🙂



  • Hallo!

    Sowas faules 🙂

    #include <Clipbrd.hpp>
    
    //...
    
     if ((Key != '\x03') && (Key != '\x16') && (Key != '\x18'))
      {
        bool kommaerlaubt = true;
        // 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) && kommaerlaubt)
          Key = DecimalSeparator;
        // Zeichen verwerfen, falls weder Minus-Zeichen am Anfang des
        // Eingabestrings noch eine Ziffer eingegeben:
        else if(((Key < '0' || Key > '9') && Key != 8 && Key != '-'))
          Key = 0;
        // Wenn Zeichen Minus-Zeichen, nur erlauben, wenn dies am
        // Anfang des Eingabestrings eingegeben wird.
        else if (Key == '-')
          if (pEdit->SelStart != 0) Key = 0;
      }
      else
      {
        TEdit* pEdit = dynamic_cast<TEdit*>(Sender);
        try
        {
          if (Key == '\x16') StrToFloat(pEdit->Text + Clipboard()->AsText);
          else StrToFloat(pEdit->Text);
        }
        catch(...)
        {
          throw Exception("In diesem Feld sind nur Zahlen erlaubt");
        }
      }
    

    Nen Edit-Style für Floats gibts wohl nicht? Nur SetWindowLong( Edit1->Handle, GWL_STYLE, dwStyle | ES_NUMBER); für ints... schade, die Sprechblase würde mir nämlich gefallen, die da (unter WinXP?) auftaucht...

    tschüss
    Robert



  • und dann gibt es auch noch Benutzer, die tatsächlich die 1000er-Trennpunkte mit eingeben wollen....

    Ich weiß nicht ob es einen Edit-Style für Floats gibt, aber wenn, dann ist er so gut versteckt, dass er mir bisher nicht begegnet ist. 🙂 Aber ich bleib dabei:

    Joe_M. schrieb:

    Einfachste Lösung:

    AnsiString astest;
    	double dtest;
    
    	astest = "H123";
    
    	try
    	{
    		dtest = astest.ToDouble();	
    	}
    	catch (EConvertError &Err)
    	{
    		ShowMessage("Überprüfen Sie die Eingabe");
    	}
    


  • Hi!

    Schlechte Methode!
    Wenn ich eingebe 123a meckert der zwar, das a bleibt aber drin stehen. Wenn ich dann z.B. die Einstellungen mit "OK" abspeichere, ist das Kraut fett.

    Ansonsten müsstest du nämlich beim Speichern nocheinmal durchgehen und wieder prüfen, ob ne Exception auftritt. Und dann meckert der wieder 25 mal, weil der Benutzer ein Ober-DAU ist und trotz der "Warnings" nicht reagiert hat.

    Ich in meinen Einstellungen zumindest habe den ersten Code von mir drin, ohne der Zwischenablage-Möglichkeit - weil ich bisher einfach noch nicht drangedacht habe. Bei einer Zahl, die meisstens eh nur im 2-3 stelligen Bereich liegt, brauche ich idR. auch keine Zwischenablage... Aber ermöglichen sollte man es trotzdem, da hast du Recht!
    In dem anderen Thread, wo du dich gerade mit dem Nullbyte und den AnsiStrings auseinander setzt, hatte ich eigentlich schon den Eindruck, dass du dich auskennst, dass du aber so ein Pfuscher bist, konnte ich nicht ahnen 🙂
    (Bitte mit Humor aufnehmen, Danke!)
    Mit dieser "Einfachsten Lösung" bekommst du von mir auf jedenfall nicht Recht 🙂

    Besser gar nicht zulassen, was nicht sein darf 🙂

    tschüss
    Robert



  • rowisoft schrieb:

    Mit dieser "Einfachsten Lösung" bekommst du von mir auf jedenfall nicht Recht 🙂

    Besser gar nicht zulassen, was nicht sein darf 🙂

    Da gebe ich Dir Recht. Allerdings könnte man Joe_M.'s Lösung auch im OnChange-Ereignis nutzen
    und gegebenfalls die Eingabe zurücksetzen. Da solltest Du auch Änderungen durch Einfügen mit-
    bekommen.
    Die vermutlich immer noch beste Lösung, bei der man das Rad auch nicht neu erfinden muß, ist
    aber wahrscheinlich die Verwendung von TMaskEdit.

    Gruß,

    Alexander



  • Dann mach die Überprüfung in der OnExit des Edits, und setz den Focus wieder auf das Edit, dann kann er das Feld nicht verlassen, ohne die Eingabe zu kontrollieren. Und ein Speichern-Button, der enabled ist, obwohl noch nicht alle Felder ausgefüllt sind, oder nicht korrekt ausgefüllt sind, gehört verboten. 🙂


Anmelden zum Antworten