Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ist Eingabe eine Zahl (Real)


Holg_i - Di 17.08.10 07:16
Titel: Ist Eingabe eine Zahl (Real)
Mal eine kleine Frage zwischen durch. Geht das auch einfacher?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var Eingabewert: String;

procedure TForm1.Edit1Change(Sender: TObject);

Var Wert: Real;

begin
     try
       Wert:=StrToFloat(Edit1.Text);
       Eingabewert:=Edit1.Text
     except
       Eingabewert:='{'+Edit1.Text+'}';
     end;
end;

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


zuma - Di 17.08.10 07:53

schau dir mal

Delphi-Quelltext
1:
function TryStrToFloat(const S: stringout Value: Extended): Boolean; overload;                    

an ;)


jasocul - Di 17.08.10 07:55

"einfacher" ist Ansichtssache. :lol:
Du kannst eine Komponente für die Eingabe nehmen, die nur Zahlen zulässt oder du prüfst beim OnKeyPress-Ereignis, welche Taste gedrückt wurde und ob die zulässig ist. Es gibt auch noch Lösungen, die deine Prüfung in einer Funktion lösen. TryStrToFloat war das glaube ich.
Zur zweiten Möglichkeit gibts im Forum schon Lösungen. Hier ein Beispiel [http://www.delphi-forum.de/viewtopic.php?p=582114#582114]


Jason_Gregory - Di 24.08.10 14:31

Steuere mal auch ein Beispiel bei, da ich gerade an der gleiche Sache saß


Delphi-Quelltext
1:
2:
if NOT (Key in [#08'0'..'9']) then
    Key := #0;


Marc. - Di 24.08.10 15:03

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst eine Komponente für die Eingabe nehmen, die nur Zahlen zulässt oder du prüfst beim OnKeyPress-Ereignis, welche Taste gedrückt wurde und ob die zulässig ist.

Man bedenke aber, dass sich ungeachtet davon Text noch immer kopieren und einfügen lässt. Daher sollte die tatsächliche Eingabe auf jeden Fall geprüft werden. :P


Holg_i - Di 24.08.10 15:05

Nun ich wollte mit der Procedure


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var Eingabewert: String;

procedure TForm1.Edit1Change(Sender: TObject);

Var Wert: Real;

begin
     try
       Wert:=StrToFloat(Edit1.Text);
       Eingabewert:=Edit1.Text
     except
       Eingabewert:='{'+Edit1.Text+'}';
     end;
end;


dem String Eingabewert, sollte es sich um eine Real-Zahl handeln die Zahl in einem String speichern.. sollte das nicht der fall sein die eingabe mit einem { davor und einem } dahinter makieren.... es hat etwas mit einem Parser zu tun.

So weiß ich ob der Bnutzer eine Zahl benutzt für die weiterverarbeitung oder eine Variable z.B. pi...

Die Funktion TryStrToFloat steht so wie ich das nun mitbekommen habe leider in Delphi4 noch nicht zur verfügung... Hatte ich vergessen aufzuzeigen das ich mit Delphi4 arbeite.

Aber Danke für die Hilfestellung


elundril - Di 24.08.10 20:16

user profile iconJason_Gregory hat folgendes geschrieben Zum zitierten Posting springen:
Steuere mal auch ein Beispiel bei, da ich gerade an der gleiche Sache saß


Delphi-Quelltext
1:
2:
if NOT (Key in [#08'0'..'9']) then
    Key := #0;


Vielleicht sollte man hat noch den CommaSeperator hinzufügen. ;)

lg elundril


Marc. - Di 24.08.10 20:48

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJason_Gregory hat folgendes geschrieben Zum zitierten Posting springen:
Steuere mal auch ein Beispiel bei, da ich gerade an der gleiche Sache saß


Delphi-Quelltext
1:
2:
if NOT (Key in [#08'0'..'9']) then
    Key := #0;


Vielleicht sollte man hat noch den CommaSeperator hinzufügen. ;)

... und daran denken nur einen zuzulassen. Darüberhinaus Backspace nicht vergessen! ;)


Martok - Di 24.08.10 21:24

Ist euch mal aufgefallen, dass nur user profile iconzuma das Thema getroffen hat? :roll:

Du kannst TryStrToFloat verwenden. Das umgeht dann die Exception, ist also sauberer.


Marc. - Di 24.08.10 21:39

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst TryStrToFloat verwenden. Das umgeht dann die Exception, ist also sauberer.

user profile iconHolg_i hat folgendes geschrieben Zum zitierten Posting springen:
Die Funktion TryStrToFloat steht so wie ich das nun mitbekommen habe leider in Delphi4 noch nicht zur verfügung... Hatte ich vergessen aufzuzeigen das ich mit Delphi4 arbeite.

SysUtils eingebunden? :nixweiss:


jaenicke - Di 24.08.10 21:55

Daran liegt das nicht, die TryXXX Funktionen gibt es AFAIK erst seit Delphi 5 6.

// EDIT:
Ok, geht sogar erst ab Delphi 6.


Martok - Mi 25.08.10 00:58

Och Mensch, da wollte ich mal anderen "nicht lesen" vorwerfen, und bin selber nicht besser :?

TextToFloat ist aber schon public, so dass man die recht einfach selber bauen kann (oder aus den D7-Sourcen raubmordkopieren, so wie ich das hier gemacht hab):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function TryStrToFloat(const S: stringout Value: Extended): Boolean;
begin
  Result := TextToFloat(PChar(S), Value, fvExtended);
end;
//mit Double, wer nutzt denn Extended...
function TryStrToFloat(const S: stringout Value: Double): Boolean;
var
  LValue: Extended;
begin
  Result := TextToFloat(PChar(S), LValue, fvExtended);
  if Result then
    Value := LValue;
end;


Holg_i - Mi 25.08.10 10:13

So könnte ich also


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Edit1Change(Sender: TObject);

Var Wert: Real;

begin
     try
       Wert:=StrToFloat(Edit1.Text);
       Eingabewert:=Edit1.Text
     except
       Eingabewert:='{'+Edit1.Text+'}';
     end;
end;


gegen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Edit1Change(Sender: TObject);

Var Wert: Real;

begin
     Eingabewert:=Edit1.Text;
     IF TextToFloat(PChar(Eingabewert), Wert, fvExtended)=False then Eingabewert:='{'+Edit1.Text+'}';
end;


tauschen.

genau das war meine Frage :-)

Das einzig dumme an der Geschichte ist das Eingabewert ein ShortString ist. Nunja aber das ist ein anderes Problem.