Autor |
Beitrag |
theevilworm
      
Beiträge: 61
|
Verfasst: So 25.10.09 17:03
Hallo,
der Titel sagt alles. Ich weiß nicht recht, wie ich Val() benutzen soll.
Ich habe hier zwei Editfelder, die beide nur Zahlen akzeptieren sollen, jedoch keine Null als einzelnes, Nullen in Zahlen sind erlaubt (10, 20, 103: Ja. 0: Nein). Dazu habe ich durch Google dieses gute Tutorial hier gefunden:
www.delphi-treff.de/...lermeldungen/page/8/
Ich habe den Abschnitt, bei dem man Buchstabeneingaben komplett abfangen kann, befolgt und es klappt super. Leider ist ja nun auch noch das Einfügen von Buchstaben aus der Zwischenablage möglich. Dazu wollte ich die Funktion Val() aus dem Tutorial benutzen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; divisor: Integer; ErrorCode: Integer; begin Val(Edit1.Text, divisor, ErrorCode); if ErrorCode = 0 then ... |
Das habe ich versucht in mein Beispiel zu übertragen, und wie unerwartet: es funktioniert nicht.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button6Click(Sender: TObject); var ErrorCode:Integer; begin Val(Edit1.Text, edit2.text, ErrorCode);
end; |
"Inkompatible Typen"...
Kann mir jemand bitte hlefen?
Weiterhin habe ich probiert, die Null abzufangen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Button6Click(Sender: TObject);
begin If StrToInt(edit1.text) or StrToInt(edit2.text)=0 then showmessage ('Bitte Zahl größer Null eingeben!') |
Auch dies funktioniert nur, wenn ich in beide Felder eine 0 eingebe, und auch nur eine einzelne Null. 000 geht zum beispiel durch.
Wie kann ich das abfangen?
Zuletzt bearbeitet von theevilworm am So 25.10.09 17:10, insgesamt 1-mal bearbeitet
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 25.10.09 17:08
Vergleich doch einfach mal den zweiten Parameter, den du übergeben hast, mit dem aus dem Beispiel. 
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: So 25.10.09 17:12
Naja, mein Edit2.Text ist ein String, und divisoe im Beispiel ist ein Integer.
Aber genau das will ich ja mit Val() rausfinden, ob Edit2.Text ein Integer sein kann. Ich versteh nichtmal, warum der Autor des Tutorials divisor prüfen lässt.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 25.10.09 17:28
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: So 25.10.09 17:36
Hat mir nicht wirklich geholfen
Wie sollte denn der Code aussehen?
Das klappt auch nicht:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Button6Click(Sender: TObject); var ErrorCode, ValInteger:Integer; begin Val(Edit1.Text, edit2.text, valinteger, ErrorCode); end; |
|
|
Stundenplan
      
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: So 25.10.09 17:58
Das hat zwar weniger mit Val() zu tun, aber...vielleicht hilfts dir ja trotzdem:
Würde es nicht auch gehen, wenn du die Quersumme EINMALIG aus dem Wert berechnest und kuckst, ob sie > 0 ist?
Also nicht:
10273 -> 13 -> 4
sondern
10273 -> 13 STOP
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: So 25.10.09 18:22
Hat Val() irgendwas mit der Quersumme zu tun? Das wusste ich gar nicht, ich hab das nur in dem Tutorial aufgeschnappt.
Jetzt bin ich total verwirrt. Kann irgendjemand bitte einen funktionieren Code posten, der das mit Val() überprüft (und evt. auch noch eine Null-Eingabe abfängt)?
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 25.10.09 20:21
theevilworm hat folgendes geschrieben : | Hat Val() irgendwas mit der Quersumme zu tun? |
Nein. Die Funktion Val() konvertiert einen String S (erster Param) in das Integer- oder Gleitkomma-Format (abhäng. von V!) und weißt dieses Ergebnis einer Variablen V (zweiter Param) zu. Ist die Konvertierung ungültig, i.e. lässt sich der String nicht in eine Zahl umwandeln, so wird der Index des ersten ungültigen Zeichens der Variable C (dritter Param) übergeben.
Alternativ bieten sich für dein Vorhaben auch die Funktionen TryStrToFloat() und StrToFloatDef() an. Mehr dazu in der DOH. 
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: So 25.10.09 20:41
Ich glaube ich bin einfach zu doof... Was mache ich hier falsch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button6Click(Sender: TObject); var ErrorCode, ErrorCode2, ValInteger:Integer; begin val (edit1.text, valinteger, errorcode); val (edit2.text, valinteger, errorcode2); If not ((errorcode=0) or (errorcode2=0)) then begin showmessage ('Hier kann man nur Zahlen eingeben, Dulli'); end; end; |
Wenn ich in beiden Editfeldern Buchstaben eingebe, kriege ich die Message. Wenn in einem von beidem nur Zahlen sind, nicht. Dabei habe ich doch extra OR verwendet.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 25.10.09 21:22
weil du ein and statt einem or verwenden musst.  wegen dem not.
weil not (a or b) ist das gleiche wie ( not a) and ( not b). und da muss ja beides false sein damit es insgesamt als wahr gewertet wird.  deswegen wenn du not (a and b) schreibst, wird das als ( not a) or ( not b) gewertet.
andere methode wäre einfach das not wegzulasse und auf ungleichheiten zu überprüfen.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 25.10.09 21:24
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mo 26.10.09 00:20
der Ausdruck sagt dir, dass es wahr ist, wenn nicht einer von beiden wahr ist. Sprich, wenn beide falsch sind....
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 27.10.09 10:44
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 27.10.09 10:44
Wenn du nur prüfen willst, ob in einem Feld eine Zahl steht (Also ein Integer-Wert in Form eines Strings), dann reicht doch TryStrToInt zu nutzen: if TryStrToInt(myString, myInt) then else
Das findet man aber auch, wenn man die DOH zu TryStrToInt fragt, wie's schonmal empfohlen wurde
theevilworm hat folgendes geschrieben : | Weiterhin habe ich probiert, die Null abzufangen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Button6Click(Sender: TObject);
begin If StrToInt(edit1.text) or StrToInt(edit2.text)=0 then showmessage ('Bitte Zahl größer Null eingeben!') |
Auch dies funktioniert nur, wenn ich in beide Felder eine 0 eingebe, und auch nur eine einzelne Null. 000 geht zum beispiel durch.
Wie kann ich das abfangen? |
 Da kommt keine Fehlermeldung? Erstaunlich! Du behandelst da einen Integer als Ja/Nein-Wert. Deine Abfrage lässt sich wie folgt umformulieren (und wenn man das tut, merkt man, dass das keinen Sinn macht!):
Delphi-Quelltext 1: 2: 3:
| if StrToInt(edit1.text) then if StrToInt(edit2.text)=0 then showmessage('asd'); |
Die Syntax für Abfragen mit Boolschen Operatoren (and, or etc) ist immer: if Aussage_A or Aussage_B ... wobei die Aussagen in sich eine vollwertige "Abfrage" sein müssen, wie z.B. (StrToInt(edit1.text) = 0). Hier sind auch die Klammern unerlässlich. Richtig heißt es also: if (StrToInt(edit1.text) = 0) or (StrToInt(edit2.text) = 0) then
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
|