Ich brauche Hilfe bei einer val-Funktion

Guten Tag,
Ich habe ein Programm geschrieben, bei dem ich über ein Edit-Feld Daten in ein Array schreibe, allerdings will ich mithilfe einer val-Funktion es so machen, dass wenn ich beim Programm Buchstaben eingebe, es nicht abstürzt, sondern eine Fehlermeldung kommt.

Hier ist einmal mein Quelltext:

procedure Tform.einfügen ;
var s :extended;
t :integer;

begin
Temp[TagNr]:=StrTofloat(edteinfügen.text);
val (edteinfügen.text, s, t);

if s0
then begin
stg.cells[0,tagx]:=IntToStr(tagx);
stg.cells[1,tagx]:=floatToStr(Temp[tagx]);
tagx:=tagx+1;
edttag.text:=inttostr(tagx);
edteinfügen.text:=’’;
end

else
showmessage(‚falsch‘);
end;

bei den variablen weiß ich auch nicht, ob es so richtig ist. Ich hoffe ihr könnt mir schnell helfen.

Hallo,

Du hast also in edteinfügen.text einen text stehen, der als Zahl interpretiert werden soll. Hier kötte der User aber auch einen text eingegeben haben, der nicht als Zahl interpretiert werden kann. Diesen Fall möchtest du mit der Funktion val abfangen.

Bevor du also irgendetwas mit edteinfügen.text machst, läßt du diesen Text mit val in eine Zahl umwandeln und schaust dir anhand der Arguments code an, ob das geklappt hat. Die Funktion val liefert im Argument code einen ganzahligen Wert zurück; dieser ist 0, wenn alles ok ist. Ansonsten ist er größer Null und gibt die Position im Text zurück, an der ein Fehler auftrat. Dieser code ist bei dir im Beispiel die Variable „t“.

var zahlenwert :extended;
 fehlercode :integer;
begin
 // erst umwandeln und prüfen:
 val (edteinfügen.text, zahlenwert, fehlercode);
 if fehlercode=0 
 then begin
 // kein Fehler, alles klar:
 Temp[TagNr] := zahlenwert;
 // usw...
 end 
 else
 // fehlercode ist nicht Null: keine gültige Zahl
 showmessage('falsch');
end;

Eine Alternative ist die Verwendung von try-except-Blöcken:

begin
 try
 Temp[TagNr] := StrToFloat(edteinfügen.text);
 except
 on exception 
 do begin 
 // Ein Fehler ist bei der Umwandlung des Textes aufgetreten
 // Meldung machen und raus aus der Prozedur
 showmessage('falsch');
 exit;
 end 
 end;
 // Hier wird nur weitergemacht, wenn kein Fehler auftrat
 // ...
end;

Im Exception-Block könntest du auch noch die Fehlermeldung abfragen und ausgeben, aber das führt hier zu weit.

LG
Jochen