Variablentyp überprüfen

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?

any help appreciated :wink:
m.

‚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?

any help appreciated :wink:
m.

Hi Michael,

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… :wink:

Gruß
Martin

Hallo,

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).

Gruß, Niels

1 Like

Hallo,

evtl. denke ich in die falsche Richtung, aber löst ein
MaskEdit nicht das ganze Konvertierproblem, bevor es entsteht ?

Ciao

Sven

http://www.Sven-of-Nine.de

Hi Namensvetter,

ich weiss leider nicht mit welcher Version von Delphi du arbeitest, aber Delphi 7 bietet die Funktion TryStrToFloat die.

if not TryStrToFloat(Edit1.Text,F) then
 ShowMessage('Bitte nur Zahlen eingeben!');

F muss natürlich vorher deklariert werden

var F : Double;

bei älteren Delphiversionen gibt es die Funktion TextToFloat

if not TextToFloat(PChar(Edit1.Text), F, fvExtended)
 ShowMessage('Bitte nur Zahlen eingeben!');

F muss natürlich auch hier vorher deklariert werden

Gruß

Mike

thx
an alle …
m.