[C++] Zahl aus einer Textbox lesen!

Termy2007

Mitglied
Hi @all!
Ich hab mal wieder eines meiner berühmt/berüchtigten kleinen Problemchen!:)

Diesmal will ich aus einer Textbox eine Zahl auslesen!
Diese Ausgabe beim Compilieren ist glaube ich selbstbeschreibend:
error C2664: 'isdigit' : cannot convert parameter 1 from 'System::String ^' to 'int'

Hier der Code:
Code:
if(isdigit(textBox1->Text) == true)
{
       timer1->Interval = textBox1->Text;
}

Mfg Termy2007
 
Hallo Termy2007!
Bei mir funktioniert es z.B. mit folgendem code:
C++:
				timer1->Interval = System::Convert::ToInt16(textBox1->Text);

Viele Grüße, Daniela
 
Hallo,

die Funktion "isdigit()" testet immer nur ein einziges Zeichen, der String kann aber mehrere Zeichen enthalten. Daher kannst du mit "isdigit()" nicht den gesamten String testen, sondern du müsstest das für jeden Zeichen einzeln tun. Außerdem, da du mit .NET arbeitest, ist es besser, dafür auch .NET-Klassen zu verwenden:
C++:
bool bIsNumber = true;

for( int i = 0; i < textBox1->Text->Length; i++ )
{
    if( !System::Char::IsDigit(textBox1->Text, i) )
    {
        bIsNumber = false;
        break;
    }                                       
}    

if( bIsNumber )
{
    // ... String enthält nur Ziffern
}        
else
{
    // ... String enthält auch andere Zeichen
}

Da du den Inhalt der Textbox als Timerintervall verwenden willst, musst du den String aber noch in einen double-Wert umwandeln. Daher würde ich auf den aufwendigen Test verzichten und gleich versuchen, den String in einen "double" zu wandeln. Falls der String nicht passt, ist das Ergebnis Null, was als Timerintervall ohnehin keinen Sinn macht, so dass du nur auf größer Null prüfen brauchst (kleiner Null macht ja auch keinen Sinn):
C++:
double dValue = System::Convert::ToDouble(textBox1->Text);

if( dValue > 0 )
{
    timer1->Interval = dValue;
}
Im übrigen kannst du ja die Textbox auch so konfigurieren, dass nur Ziffern eingegeben werden können. Damit kannst du schon mal eine gültige Eingabe sicherstellen. Die Konvertierung nach "double" brauchst du aber trotzdem noch.

Gruß
MCoder
 
Macht nix!
Ich hab ja jetzt alles was ich brauch!

Danke nochmals! (Es kommt garantiert mal wieder ein kleines Problemchen:rolleyes: )

Mfg Termy2007
 
So! Ich hab das ganze mal getestet!
Beim Ausführen bricht dein Vorschlag (MCoder) leider zusammen!
Wenn ich Buchstaben eingebe und dann auf Übernehmen drücke, kommt ein Laufzeitfehler! (Falsches Format...)

Hab das jetzt so gelöst:
Code:
try
{
        double dValue = System::Convert::ToDouble(textBox1->Text);
}

catch(...)
{
        MessageBox::Show("Bitte eine Zahl eingeben! Keine Buchstaben!", "Klicker", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
        textBox1->ResetText();
}

Mfg Termy2007
 
Zuletzt bearbeitet:
Um das Thema von mir nochmal aufzugreifen:
Weiß jemand wie das ganze dann bei reinem C++ aussieht

Mein Code bisher:
Code:
void KlickerFrm::WxButton1Click(wxCommandEvent& event)
{
	string p1 = static_cast<string>(WxEdit1->GetValue());
	int returnvalue = 0;
	char * temp = new char[p1.length()];
    strcpy(temp,p1.c_str());
	unsigned int i;
	for (i=0; i < p1.length(); i++)
	{
	    if (isdigit(temp[i]))
	    {
		    returnvalue = 1;
	    }
	    else
	    {
		    returnvalue = 0;
		    break;
	    }
	}
	if (returnvalue == 1)
	{
        intervall_time = static_cast<int>(WxEdit1->GetValue());
    }
    else
    {
        MessageBox(NULL, "Der eingegebene Intervall ist keine Zahl!!", "Klicker", MB_OK | MB_ICONWARNING);
    }
}

Das das letzte static_cast nicht funktioniert ist klar...

Mfg Termy2007

EDIT: Hat sich erledigt!!
Lösung: intervall_time = atoi(p1.c_str());
 
Zuletzt bearbeitet:
Damit jemand nur Zahlen eingeben kann (und keine Buchstaben), kann man ein on OnKeyPress Ereignis für das Feld machen und eine kleine Überprüfung schreiben, wie etwa:
Code:
if ((Key>='0') && (Key<='9'))  	{Edit2->Text=Edit2->Text;}
else 	   		{Key=0;};

Somit werden in dem Feld nur Ziffern angenommen. Find ich ganz praktisch. Denn auch wenn du schreibst: "Bitte nur Zahlen eingeben" ist es halt blöd, wenn das Programm abstürzt, nur weil jemand doch was anderes eintippt...
;) Gruß; jupp
 
Zurück