Entwickler-Ecke

Sonstiges (Delphi) - entscheidung ob string oder zahl????


ttauch - Fr 24.09.04 12:34
Titel: entscheidung ob string oder zahl????
HI!
Bin neu bei delphi also lacht mich nicht aus:-)
Ich hab eine Art Taschenrechner programmiert. Dabei werden die Eingaben in ein editX-Feld geschrieben und dann per StrToFLoat in reele Zahl umgewandelt. Wenn ich allerdings anstatt eine zahl ein wort oder ähnliches in das edit Feld reinschreibe dann schmiert das progi ab. wie kann ich das verhindern und eine "showmessage" ausgeben?
vielen Dank für die Hilfe


iKilledKenny - Fr 24.09.04 12:42


Delphi-Quelltext
1:
2:
3:
4:
5:
try
  f := StrToFloat (Trim (Edit1.Text));
except
  ShowMessage ('Keine gültige Zahl');
end;


grüße
alex


jasocul - Fr 24.09.04 13:15

Du kannst auch ein TMaskEdit nehmen. Obwohl es da bessere Komponenten gibt, die die Eingabe reiner Zahlenwerte steuern. Ich nehme in solchen Fällen immer etwas aus der RXLib-Sammlung. Sind aber nicht Standard bei Delphi.


GSE - Fr 24.09.04 14:34

oder im KeyDown oder KeyPress die anderen Tasten "abfangen", brauch man eigentlich keien Fremdkompos (Forumsuche)

mfg
GSE


ttauch - Fr 24.09.04 15:19

das mit dem TRIM funktioniert nicht:-( und das mit dem Keydown und Keypress versteh ich nicht. Was hat das Thema mit Tasten zu tun?


.Chef - Fr 24.09.04 15:25

ttauch hat folgendes geschrieben:
und das mit dem Keydown und Keypress versteh ich nicht. Was hat das Thema mit Tasten zu tun?

Wenn du nur Zahlen zur Eingabe ins Editfeld zulässt, steht logischerweise am Ende auch ne Zahl drin.


Johannes Maier - Fr 24.09.04 15:27

Was das Trim angeht: Schau nach ob die Units SysUtils bei dir unter uses steht, wenn nicht schreib sie rein.
Das mit dem KeyPress oder KeyDown:
Wenn du beim Ereignis OnKeyPress z.B. testest, ob die Taste eine Ziffer ist, und ansonsten nichts reinschreibst bzw. das letzte Zeichen wieder löschst, dann kannst du sicher sein, dass keine Buchstaben drinstehen ;)


ttauch - Fr 24.09.04 16:11

und wie würde sowas im quelltext aussehen? :lol: :cry:


.Chef - Fr 24.09.04 16:25

Ich hab dir hier mal was aus 'nem Projekt von mir ausgeschnitten. Ist für ein Integer-Editfeld, was positive und negative Zahlen zulässt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TIntEditForm.Edit2Change(Sender: TObject);
var
  a : Integer;
  s : string;
begin
  s:=Edit2.Text;
  s:=UpperCase(s);
  for a:=1 to Length(s) do
    if ((Ord(s[a]) < 48or (Ord(s[a]) > 57)) and
       ((s[a] <> '-'or (a > 1)) then s[a]:='x';
  while Pos('x',s) > 0 do s:=Copy(s,1,Pos('x',s)-1)+Copy(s,Pos('x',s)+1,Length(s));
  if s <> Edit2.Text then Edit2.Text:=s;
end;

procedure TIntEditForm.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  Key:=UpCase(Key);
  if ((Ord(Key) >= 48and (Ord(Key) <= 57)) or
     (Ord(Key) = 8or (Key = '-'then Exit;
  Key:=chr(0);
end;


GSE - Fr 24.09.04 16:27

Zitat:
(Forumsuche)
http://www.delphi-forum.de/viewtopic.php?t=28310&highlight=%2Akeypress

mfg
GSE


ttauch - Fr 24.09.04 19:10

das is mir alles zu kompliziert:-(
Hab aber was andres gefunden:
StrToIntDef <---versteh ich:-)
StrToFloatDef(S:string;Def:extended): <--- versteh ich net was meinen die mit extendet???

jetzt bräucht ich nur noch was was mir keinen wert zurückliefert sondern irgendwie true und false
gibts da was?


.Chef - Fr 24.09.04 19:15

ttauch hat folgendes geschrieben:
das is mir alles zu kompliziert:-(

Mich beschleicht das Gefühl, dass du dir keine Mühe geben willst. Hast du zu StrToFloat und Konsorten überhaupt schonmal in die Hilfe geschaut?


GSE - Fr 24.09.04 22:53

Zitat:
extended
F1!

mfg
GSE


ttauch - Fr 24.09.04 23:13

ok die frage mit dem extended war dumm. Eigentlich wusste ich was das is nur gabs in der Zeile immer eine Fehlermeldung, die ich fälschlicherweise auf das extended zurückführte.
Jetzt aber bitte zurück zu meiner letzten Frage.


ttauch - Sa 25.09.04 14:40

ich hab was in den FAQ gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.Button1Click(Sender: TObject);  
var  
  S: String;  
begin  
  S := '123456';  
  if IsValidInteger(S)  
    then ShowMessage(Format('%s ist eine gültige Integer Zahl', [S]))  
    else ShowMessage(Format('%s ist keine gültige Integer Zahl', [S]));  

 
  ShowMessage(  
    Format('"%s" ist das gültiger Dezimaltrennzeichen', [Decimalseparator]));  

 
  S := '922337203685477,5807';  
  if IsValidCurrency(S)  
    then ShowMessage(Format('%s ist eine gültige Currency Zahl', [S]))  
    else ShowMessage(Format('%s ist keine gültige Currency Zahl', [S]));  

 
  S := '1,1e4932';  
  if IsValidExtended(S)  
    then ShowMessage(Format('%s ist eine gültige Extended Zahl', [S]))  
    else ShowMessage(Format('%s ist keine gültige Extended Zahl', [S]));  
end;

nur funktioniert das nicht selbst wenn ich den code unverändert reinkopiere.
Da steht immer, dass das IsValidExtended, IsValidCurrency, IsValidInteger undefinierte bezeichner sind. was mache ich falsch?


in der FAQ steht noch etwas von der zeile:
function IsValid...(S: String): Boolean;
muss ich die noch irgendwo einbauen?und wenn ja wo?
hoffe auf hilfe:-)