# [C++] Zahl aus einer Textbox lesen!



## Termy2007 (8. Mai 2007)

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:

```
if(isdigit(textBox1->Text) == true)
{
       timer1->Interval = textBox1->Text;
}
```

Mfg Termy2007


----------



## SchindlerD (8. Mai 2007)

Hallo Termy2007!
Bei mir funktioniert es z.B. mit folgendem code:

```
timer1->Interval = System::Convert::ToInt16(textBox1->Text);
```

Viele Grüße, Daniela


----------



## MCoder (8. Mai 2007)

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:

```
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):

```
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


----------



## Termy2007 (8. Mai 2007)

Danke für die Antworten!
Ich werde es so machen wie MCoder es beschrieben hat!



> Im übrigen kannst du ja die Textbox auch so konfigurieren, dass nur Ziffern eingegeben werden können.


Wie mache ich das?

Mfg Termy2007


----------



## MCoder (8. Mai 2007)

Termy2007 hat gesagt.:


> Wie mache ich das?


Gute Frage  
Bei der WinAPI bzw. MFC gab's noch dafür noch eine Eigenschaft, die man einfach setzen konnte. Die ist bei .NET offensichtlich wegrationalisiert wurden, sehr schade. Damit lässt sich mein Tip wohl leider nur mit etwas Programmieraufwand umsetzen.

Gruß
MCoder


----------



## Termy2007 (8. Mai 2007)

Macht nix!
Ich hab ja jetzt alles was ich brauch!

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

Mfg Termy2007


----------



## Termy2007 (8. Mai 2007)

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:

```
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


----------



## Termy2007 (22. März 2008)

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

Mein Code bisher:

```
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());


----------



## jupp2oo8 (26. März 2008)

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:

```
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


----------

