Autor |
Beitrag |
ttauch
Hält's aus hier
Beiträge: 14
|
Verfasst: Fr 24.09.04 12:34
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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: Fr 24.09.04 14:34
oder im KeyDown oder KeyPress die anderen Tasten "abfangen", brauch man eigentlich keien Fremdkompos (Forumsuche)
mfg
GSE
_________________ Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
|
|
ttauch 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
      
Beiträge: 1112
|
Verfasst: 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.
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: 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 
_________________ MfG
Johannes ehem. jbmaier
|
|
ttauch 
Hält's aus hier
Beiträge: 14
|
Verfasst: Fr 24.09.04 16:11
und wie würde sowas im quelltext aussehen? 
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: 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]) < 48) or (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) >= 48) and (Ord(Key) <= 57)) or (Ord(Key) = 8) or (Key = '-') then Exit; Key:=chr(0); end; |
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
GSE
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: Fr 24.09.04 16:27
_________________ Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
|
|
ttauch 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
      
Beiträge: 1112
|
Verfasst: 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?
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
GSE
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: Fr 24.09.04 22:53
_________________ Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
|
|
ttauch 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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:-)
|
|