[delphi7] Überprüfung auf numerischen Wert

DarkSean

Erfahrenes Mitglied
In der Schule sollten wir ein Programm programmieren, was uns nach Eingabe eines Monats angibt, wie viele Tage dieser Monat hat.
Soweit kein Problem, nur könnte ja jemand bei der Eingabe auf die Idee kommen, statt einer Zahl zwischen 1 und 12 (da ein Jahr 12 Monate hat), irgendwelche Buchstabenkombinationen einzutippen, die prompt eine Fehlermeldung verursachen.
Nun habe ich mir folgende Prozedur ausgedacht:
Code:
procedure Tmonat_tage_form.Edit1Change(Sender: TObject);
begin

  i := 0;
  
  while (inttostr(i) <> edit1.text) and (i < 12) do
    i := i + 1;

  if edit1.Text = inttostr(i) then
  begin
  monat := strtoint(edit1.text);
    case monat of
      1,3,5,7,8,10,12: edit2.Text := '31';
      4,6,9,11:        edit2.Text := '30';
      2:               edit2.Text := '28 bzw. 29 im Schaltjahr';
    end;
  end
  else edit2.text := '';

end;
Funktioniert wunderbar, nur kenne ich es aus VisualBasic viel einfacher, indem man einfach eine Eingabe mit IsNumeric auf einen numerischen Wert überprüfte.
Gibt es vielleicht auch einen ähnlichen Befehl in Delphi?
 
Jedes Edit hat ein Ereignis OnKeyPress, mit der du auch die gedrückte Taste auslesen kannst. Damit kannst du bei jedem Tastendruck überprüfen, welche Taste gedrückt wird, indem du den Parameter "Key" ausliest.
Andererseits könntest du auch mit try-except bzw try-finally arbeiten. Dadurch kann man schöne Fehlermeldungen ausgeben etc.
Andererseits könnte ich mir auch vorstellen, dass du "Monat" als String deklarierst und in der Case-Of-Verzweigung anstelle der Zahlen die entsprechenden Strings schreibst. Soweit ich weiß kannst du dann dahinter noch ein else setzen und damit eine Fehlermeldung ausgeben, wenn keiner der vorgegebenen Strings im Edit steht.

Vielleicht war ja die ein oder andere Anregung dabei.
Grüße
Hellie
 
Jedes Edit hat ein Ereignis OnKeyPress, mit der du auch die gedrückte Taste auslesen kannst. Damit kannst du bei jedem Tastendruck überprüfen, welche Taste gedrückt wird, indem du den Parameter "Key" ausliest.
Andererseits könntest du auch mit try-except bzw try-finally arbeiten. Dadurch kann man schöne Fehlermeldungen ausgeben etc.
Andererseits könnte ich mir auch vorstellen, dass du "Monat" als String deklarierst und in der Case-Of-Verzweigung anstelle der Zahlen die entsprechenden Strings schreibst. Soweit ich weiß kannst du dann dahinter noch ein else setzen und damit eine Fehlermeldung ausgeben, wenn keiner der vorgegebenen Strings im Edit steht.

Vielleicht war ja die ein oder andere Anregung dabei.
Grüße
Hellie
Danke für deine Vorschläge. Eine einfache Funktion zur Überprüfung auf einen numerischen Wert bei Delphi gibt es also nicht? Denn:
- Jede Tastenausgabe auslesen und auf Zifferprüfen ist rechenaufwendig und viel zu umständlich.
- try-except und try-finally kenne ich nicht, müsstest du mir erläutern.
- monat als string deklarieren funktioniert nicht, da die Variablen bei der Case-Of-Anweisung ordinal sein müssen, das heißt jede Variable muss einen direkten Vor- und Nachfolger haben.
 
Hi!

Zu der Idee mit den Strings: Ja, sorry, da hast du natürlich Recht, mit Char geht es, aber mit String natürlich nicht.

Zu der Tastaturabfrage: Ich finde, das ist nicht wirklich rechenaufwendig, ich vermute sogar, der Aufwand, die Eingabe auf dem Monitor darzustellen ist wesentlich höher. Die Abfrage ist ein Zweizeiler, wenn man bei einer Bedingung den "then"-Teil in eine neue Zeile schreibt.

Zu try-finally/ try-except: Damit kannst du versuchen, ob ein bestimmter Quellcode einen Fehler produziert oder nicht. In den "try"-Block kannst du sämtliche Anweisungen schreiben, in denen Fehler auftreten können. Wenn du etwas anderes machen willst, was irgendwo ein Fehler auftritt, benutzt du try-except:
Code:
try 
Anweisungsblock mit evtl. Fehler 
except 
Fehlermeldung
end;
Wenn du etwas nur machen willst, wenn kein Fehler entsteht, benutzt du try-finally:
Code:
try
Anweisungsblock mit evtl. Fehler
finally
Anweisungsblock, der ausgeführt wird, wenn kein Fehler entstanden ist
end;

Bei dir könnte es zB so aussehen:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var monat:integer;
begin
monat:=0;
try
monat:=Strtoint(edit1.text);
edit2.text:= 'Bitte gültiges Datum eingeben'; //Bei Zahlen >12 oder <1, kann auch als else-Anweisung hinter dem case-of-stehen!
case Monat of
      1,3,5,7,8,10,12: edit2.Text := '31';
      4,6,9,11:        edit2.Text := '30';
      2:               edit2.Text := '28 bzw. 29 im Schaltjahr';
  end;
except
edit2.text:='Bitte gültiges Datum eingeben!';
end;
end;
 
Zurück