[C++ MFC] please enter an integer

sisela

Erfahrenes Mitglied
Hi Leute,

habe ein Dialog mit einem Textfeld, das mit einer integer Member verknüpft ist. Wenn man nun beim Ausführen die dort stehende "0" löscht, wird beim Verlassen des Dialoges eine MessageBox angezeigt mit "please enter an integer".
Eigentlich recht sinnvoll aber gibt es eine Möglichkeit, diese MessageBox zu umgehen. Wenn die Standard Null oder was weiß ich gelöscht wurde und nichts in dem Feld steht, kann ich ja im Programm darauf reagieren. Ich will diese MessageBox nicht!

Sicher man könnte ein String Member draus machen und den dann in einen Integer umwandeln, wäre aber irgendwie blöd.
Also hat jemand eine Idee wie man diese MessageBox wegbekommt?

mfg
 
Ich baue meine Dialoge meist so auf, dass bei jeder Zustandsänderung eines Controls (z.B. des Textfeldes) eine Funktion aufgerufen wird, die die Inhalte des Dialogs überprüft und dann den Okay-Button entsprechend aktiviert. Auf diese Weise wird verhindert, dass der Dialog ungültige Werte übernimmt, und dere User sieht bereits am deaktivierten Zustand des Buttons, das eine Eingabe ungültig ist.
 
Hi,
das ist ehrlich gesagt eine gute Idee.
Nur, bei mir ist das so, dass gewisse Werte beim Erstellen des Dialoges in die Felder übertragen werden. (Es geht um eine Suchfunktion) Der User kann nun die Werte belassen oder welche weglöschen. Bei einem String ist das kein Problem, denn dann ist der halt "". Aber wenn ich ein Feld für eine Zahl lösche ist es leer und nicht 0. Drückt man nun auf "ok" dann soll halt nicht nach dem Integerwert gesucht werden, sprich die Eingabe wäre eigentlich legitim. (für mich)
Aber MS hat entschieden, eine MessageBox erscheinen zu lassen und man muss erst eine 0 in das Integer-Feld eintragen, bis ich "ok" erfolgreich drücken kann.

Die Sache ist, dass das vorher kontrolliert wird, die OnOK() Funktion wird noch gar nicht erreicht. Die Integervariable muss eben einen gültigen Wert haben, denke ich mal.

OK, bin für weitere Vorschläge offen.
 
Aber MS hat entschieden, eine MessageBox erscheinen zu lassen und man muss erst eine 0 in das Integer-Feld eintragen, bis ich "ok" erfolgreich drücken kann.
Ach so. In dem Fall ist es wirklich das Beste, einen String zuverwenden anstelle einer Integer.
 
Die Prüfung findet in DoDataExchange statt in der entsprchenden DDX_..-Methode.

Wenn du in DoDataExchange den Inhalt des Editfeldes ausliest und nur dann die entsprechende DDX_.. Methode aufrufst, wenn der Inhalt nicht leer ist, kommt auch keine Meldung. Die Klassenvariable solltest du dann aber auf einen entsprechenden Wert setzen, damit der Inhalt der Variable dem Inhalt des Feldes entspricht.
Also z.B. 0 für ein leeres Feld. Wenn es keine Zahl gibt, die einem leeren Feld entspricht, kommst du nicht umhin statt eines Integer einen String zu verwenden.
 
Hi dorado,
also das ist an sich eine gute Idee, wenn du mir noch erklären könntest, wie ich überprüfe ob der Inhalt leer ist?
Zum einen kann ich ja nicht die IDC_EDIT_IRGENDEIN_INTEGER mit irgendwas vergleichen zum Anderen mit was sollte ich sie denn vergleichen, weil " " ist ja nicht 0 oder kleiner 0 oder wie soll ich das verstehen. Die Membervariable könnte ich vergleichen, dazu müsste ich aber die DDX Methode aufrufen.

Als wenn du mir noch einen Hinweis geben kannst, wie ich das umsetzen soll, wäre ich dir dankbar.

Gruß
 
Du holst dir den Inhalt des Control mit GetDlgItem(IDC_...)->GetWindowText(...)

Da erhältst du einen String. Wenn der String leer ist, dann weist du deiner Variablen z.B. den Wert 0 zu und rufst die DDX_.. Methode nicht auf.
Wenn der String nicht leer ist, rufst du die DDX_.. Methode auf.
Das solltest du aber nur machen, wenn pDX->m_bSaveAndValidate TRUE ist. Dann geht der Transfer von deinen Controls in die Membervariablen. Wenn es FALSE ist, von den Membervariablen in die Controls.
Also in etwa so
Code:
if(pDX->m_bSaveAndValidate)
{
CString str;
GetDlgItemText(IDC_SOLL_MAL_EIN_INT_WERDEN)->GetWindowText(str);
if(str.IsEmpty())
	 m_Soll_Ein_Int_Sein = 0; // beispielsweise, kann auch ein anderer Wert sein
else
	 DDX_...(...); // weiss leider die Syntax nicht auswendig
 
}
else
{
	 DDX_...(...); // weiss leider die Syntax nicht auswendig
	 ...
}
 
.. // jetzt folgen noch die anderen Aufrufe der DDX.. Methoden
	 // der Aufruf für das Integer Control/Variable darf hier nicht mit rein
 

Neue Beiträge

Zurück