hi,
ich lasse user in einem textfeld zahlen eingeben. die sind dort zunächst texte.
wenn ich mit diesen zahlen rechnen will (- was heißt will? ich muss!), muss ich sie zuerst in zahlen verwandeln; z.b. mit:
strtofloat(edit2.text)
jetzt gibts natürlich user, die in diese textfelder KEINE zahlen eingeben, sondern z.b. buchstaben. da funktioniert dann strtofloat nicht mehr - fehlermeldung; hänger.
wie kann ich zunächst überprüfen, ob der inhalt des felds als zahl aufgefasst werden kann (= umgewandelt werden kann) oder nicht?
‚try‘ … aber geht nicht
hi,
ich hab auf meine frage jetzt eine antwort gefunden: try-anweisung.
ich hab das folgendermaßen geschrieben:
try
zahl2 := strtofloat(edit2.text);
except
On EConvertError do showMessage(‚Bitte nur Zahlen eingeben!‘);
end;
aber das fängt den eingabefehler nicht ab, sondern produziert ihn weiterhin.
???
m.
ich lasse user in einem textfeld zahlen eingeben. die sind
dort zunächst texte.
wenn ich mit diesen zahlen rechnen will (- was heißt will? ich
muss!), muss ich sie zuerst in zahlen verwandeln; z.b. mit:
strtofloat(edit2.text)
jetzt gibts natürlich user, die in diese textfelder KEINE
zahlen eingeben, sondern z.b. buchstaben. da funktioniert dann
strtofloat nicht mehr - fehlermeldung; hänger.
wie kann ich zunächst überprüfen, ob der inhalt des felds als
zahl aufgefasst werden kann (= umgewandelt werden kann) oder
nicht?
wie kann ich zunächst überprüfen, ob der inhalt des felds als
zahl aufgefasst werden kann (= umgewandelt werden kann) oder
nicht?
indem Du Dir eine entsprechende Funktion schreibst, wie sonst?
Studier mal diesen Code (sollte selbsterklärend sein):
FUNCTION StringIstFloatZahl (s: STRING): BOOLEAN;
VAR d: DOUBLE; // Dummy-Variable
begin
Result := TRUE;
TRY
d := StrToFloat(s);
EXCEPT
Result := FALSE
END
end;
PROCEDURE TForm1.Edit1Change(Sender: TObject);
VAR x: DOUBLE;
begin
IF StringIstFloatZahl(Edit1.Text) THEN
begin
Caption := 'OK: String ist Zahl' // nur zum Testen
x := FloatToStr(Edit1.Text); // geht garantiert ohne Fehler!
[Irgendwas mit x anstellen]
end
ELSE
begin
Caption := 'Fehler: String ist KEINE ZAHL' // nur zum Testen
end
end;
try
zahl2 := strtofloat(edit2.text);
except
On EConvertError do showMessage(‚Bitte nur Zahlen eingeben!‘);
end;
Ist grundsätzlich schon richtig so.
aber das fängt den eingabefehler nicht ab, sondern produziert
ihn weiterhin.
Na ja, wenn Du als Reaktion auf den EConvertError auch ausgerechnet ne MessageBox generierst…
try
zahl2 := strtofloat(edit2.text);
except
On EConvertError do showMessage(‚Bitte nur Zahlen eingeben!‘);
end;
aber das fängt den eingabefehler nicht ab, sondern produziert
ihn weiterhin.
bist du dabei im Debugger? Der stoppt standardmäßig auch bei einem try-Block. In den Optionen kann man das unterbinden.
Wenn du die exe direkt aus dem Win-Explorer startest, sollte eigentlich der von dir gewünschte except-Block ausgeführt werden.
Es gibt auch die Möglichkeit, in einem OnKeyPress-Ereignis schon gleich die Eingabe falscher Zeichen zu unterdrücken:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['1','2','3','4','5','6','7','8','9','0', #8, DecimalSeparator]) then
Key := #0;
if (Key = DecimalSeparator) and (pos(Key, (Sender as TCustomEdit).Text) \> 0) then
Key := #0;
end;
Hier wird im ersten IF einfach überprüft, ob die gedrückte Taste zu den zulässigen Zeichen gehört. Dabei ist DecimalSeparator das auf dem System eingestellte Dezimaltrennzeichen (also ‚.‘ oder ‚,‘) und #8 ist der Backspace („rückwärts löschen“).
Das zweite IF verhindert, dass das Dezimaltrennzeichen mehrfach eingegeben wird. Der Cast (Sender as TCustomEdit) erlaubt die Benutzung der Przedur für alle von TCustomEdit abgeleiteten Objekte. D.h. du brauchst nicht für jedes Editierfeld eine eigene OnKeyPress-Prozedur zu schreiben, sondern kannst sie einfach mit dieser einen verknüpfen (im Objektinspektor).