Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Fehlermeldung "Ungültige Gleitkommazahl"
m1sc - Do 09.05.13 19:46
Titel: Fehlermeldung "Ungültige Gleitkommazahl"
Ich habe momentan das Problem dass ich folgenden Fehler bekomme:
http://imageshack.us/f/6/61766561.jpg/
Soweit ich herausgefunden habe liegt das daran dass meine edits mit dem var wert double leer sind.
Das hab ich nun teilweise so lösen können dass wenn man nur 1 zahl eingibt die anderen 2 zu einer 0 gemacht werden.
Allerdings wenn man bei irgend einem fach keine note eingibt gibt es das error.
Hier mal die source es soll ein notendurchschnittsberechner werden die source is noch lange nich fertig, allerdings will ich erstmal den fehler beheben bevor ich weiter mache da es mir doch atm zu schwierig wird mit dem fehler weiter zu machen :D:
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376:
| procedure TForm1.Button_AusrechnenClick(Sender: TObject); var deutsch1, deutsch2, deutsch3, deutschergebnis1, deutschnote1: double; deutsch4, deutsch5, deutsch6, deutschergebnis2, deutschnote2: double; englisch1, englisch2, englisch3, englischergebnis1, englischnote1: double; englisch4, englisch5, englisch6, englischergebnis2, englischnote2: double; mathematik1, mathematik2, mathematik3, mathematikergebnis1, mathematiknote1: double; mathematik4, mathematik5, mathematik6, mathematikergebnis2, mathematiknote2: double; vido1, vido2, vido3, vidoergebnis1, vidonote1: double; vido4, vido5, vido6, vidoergebnis2, vidonote2: double; informatik1, informatik2, informatik3, informatikergebnis1, informatiknote1: double; informatik4, informatik5, informatik6, informatikergebnis2, informatiknote2: double; religion1, religion2, religion3, religionergebnis1, religionnote1: double; religion4, religion5, religion6, religionergebnis2, religionnote2: double; sozialkunde1, sozialkunde2, sozialkunde3, sozialkundeergebnis1, sozialkundenote1: double; sozialkunde4, sozialkunde5, sozialkunde6, sozialkundeergebnis2, sozialkundenote2: double; geteiltdeutsch1: double; geteiltenglisch1: double; geteiltmathematik1: double; geteiltinformatik1: double; geteiltvido1: double; geteiltreligion1: double; geteiltsozialkunde1: double;
geteiltdeutsch2: double; geteiltenglisch2: double; geteiltmathematik2: double; geteiltinformatik2: double; geteiltvido2: double; geteiltreligion2: double; geteiltsozialkunde2: double;
begin geteiltdeutsch1:= 0; geteiltdeutsch2:= 0; geteiltenglisch1:= 0; geteiltenglisch2:= 0; geteiltmathematik1:= 0; geteiltmathematik2:= 0; geteiltinformatik1:= 0; geteiltinformatik2:= 0; geteiltvido1:= 0; geteiltvido2:= 0; geteiltreligion1:= 0; geteiltreligion2:= 0; geteiltsozialkunde1:= 0; geteiltsozialkunde2:= 0;
if (Edit1_Deutsch.Text='') OR (Edit1_Deutsch.Text= '0') then Edit1_Deutsch.Text:='0' else geteiltdeutsch1:= geteiltdeutsch1 + 1; if (Edit2_Deutsch.Text='') OR (Edit2_Deutsch.Text='0') then Edit2_Deutsch.Text:='0' else geteiltdeutsch1:= geteiltdeutsch1 + 1; if (Edit3_Deutsch.Text='') OR (Edit3_Deutsch.Text='0') then Edit3_Deutsch.Text:='0' else geteiltdeutsch1:= geteiltdeutsch1 + 1;
if (Edit4_Deutsch.Text='') OR (Edit4_Deutsch.Text= '0') then Edit4_Deutsch.Text:='0' else geteiltdeutsch2:= geteiltdeutsch2 + 1; if (Edit5_Deutsch.Text='') OR (Edit5_Deutsch.Text='0') then Edit5_Deutsch.Text:='0' else geteiltdeutsch2:= geteiltdeutsch2 + 1; if (Edit6_Deutsch.Text='') OR (Edit6_Deutsch.Text='0') then Edit6_Deutsch.Text:='0' else geteiltdeutsch2:= geteiltdeutsch2 + 1;
if (Edit1_Englisch.Text='') OR (Edit1_Englisch.Text= '0') then Edit1_Englisch.Text:='0' else geteiltenglisch1:= geteiltenglisch1 + 1; if (Edit2_Englisch.Text='') OR (Edit2_Englisch.Text= '0') then Edit2_Englisch.Text:='0' else geteiltenglisch1:= geteiltenglisch1 + 1; if (Edit3_Englisch.Text='') OR (Edit3_Englisch.Text= '0') then Edit3_Englisch.Text:='0' else geteiltenglisch1:= geteiltenglisch1 + 1;
if (Edit4_Englisch.Text='') OR (Edit4_Englisch.Text= '0') then Edit4_Englisch.Text:='0' else geteiltenglisch2:= geteiltenglisch2 + 1; if (Edit5_Englisch.Text='') OR (Edit5_Englisch.Text= '0') then Edit5_Englisch.Text:='0' else geteiltenglisch2:= geteiltenglisch2 + 1; if (Edit6_Englisch.Text='') OR (Edit6_Englisch.Text= '0') then Edit6_Englisch.Text:='0' else geteiltenglisch2:= geteiltenglisch2 + 1;
if (Edit1_Mathematik.Text='') OR (Edit1_Mathematik.Text= '0') then Edit1_Mathematik.Text:='0' else geteiltmathematik1:= geteiltmathematik1 + 1; if (Edit2_Mathematik.Text='') OR (Edit2_Mathematik.Text= '0') then Edit2_Mathematik.Text:='0' else geteiltmathematik1:= geteiltmathematik1 + 1; if (Edit3_Mathematik.Text='') OR (Edit3_Mathematik.Text= '0') then Edit3_Mathematik.Text:='0' else geteiltmathematik1:= geteiltmathematik1 + 1;
if (Edit4_Mathematik.Text='') OR (Edit4_Mathematik.Text= '0') then Edit4_Mathematik.Text:='0' else geteiltmathematik2:= geteiltmathematik2 + 1; if (Edit5_Mathematik.Text='') OR (Edit5_Mathematik.Text= '0') then Edit5_Mathematik.Text:='0' else geteiltmathematik2:= geteiltmathematik2 + 1; if (Edit6_Mathematik.Text='') OR (Edit6_Mathematik.Text= '0') then Edit6_Mathematik.Text:='0' else geteiltmathematik2:= geteiltmathematik2 + 1;
if (Edit1_Informatik.Text='') OR (Edit1_Informatik.Text= '0') then Edit1_Informatik.Text:='0' else geteiltinformatik1:= geteiltinformatik1 + 1; if (Edit2_Informatik.Text='') OR (Edit2_Informatik.Text= '0') then Edit2_Informatik.Text:='0' else geteiltinformatik1:= geteiltinformatik1 + 1; if (Edit3_Informatik.Text='') OR (Edit3_Informatik.Text= '0') then Edit3_Informatik.Text:='0' else geteiltinformatik1:= geteiltinformatik1 + 1;
if (Edit4_Informatik.Text='') OR (Edit4_Informatik.Text= '0') then Edit4_Informatik.Text:='0' else geteiltinformatik2:= geteiltinformatik2 + 1; if (Edit5_Informatik.Text='') OR (Edit5_Informatik.Text= '0') then Edit5_Informatik.Text:='0' else geteiltinformatik2:= geteiltinformatik2 + 1; if (Edit6_Informatik.Text='') OR (Edit6_Informatik.Text= '0') then Edit6_Informatik.Text:='0' else geteiltinformatik2:= geteiltinformatik2 + 1;
if (Edit1_VIDO.Text='') OR (Edit1_VIDO.Text= '0') then Edit1_VIDO.Text:='0' else geteiltvido1:= geteiltvido1 + 1; if (Edit2_VIDO.Text='') OR (Edit2_VIDO.Text= '0') then Edit2_VIDO.Text:='0' else geteiltvido1:= geteiltvido1 + 1; if (Edit3_VIDO.Text='') OR (Edit3_VIDO.Text= '0') then Edit3_VIDO.Text:='0' else geteiltvido1:= geteiltvido1 + 1;
if (Edit4_VIDO.Text='') OR (Edit4_VIDO.Text= '0') then Edit4_VIDO.Text:='0' else geteiltvido2:= geteiltvido2 + 1; if (Edit5_VIDO.Text='') OR (Edit5_VIDO.Text= '0') then Edit5_VIDO.Text:='0' else geteiltvido2:= geteiltvido2 + 1; if (Edit6_VIDO.Text='') OR (Edit6_VIDO.Text= '0') then Edit6_VIDO.Text:='0' else geteiltvido2:= geteiltvido2 + 1;
if (Edit1_Sozialkunde.Text='') OR (Edit1_Sozialkunde.Text= '0') then Edit1_Sozialkunde.Text:='0' else geteiltvido1:= geteiltvido1 + 1; if (Edit2_Sozialkunde.Text='') OR (Edit2_Sozialkunde.Text= '0') then Edit2_Sozialkunde.Text:='0' else geteiltvido1:= geteiltvido1 + 1; if (Edit3_Sozialkunde.Text='') OR (Edit3_Sozialkunde.Text= '0') then Edit3_Sozialkunde.Text:='0' else geteiltvido1:= geteiltvido1 + 1;
if (Edit4_Sozialkunde.Text='') OR (Edit4_Sozialkunde.Text= '0') then Edit4_Sozialkunde.Text:='0' else geteiltvido2:= geteiltvido2 + 1; if (Edit5_Sozialkunde.Text='') OR (Edit5_Sozialkunde.Text= '0') then Edit5_Sozialkunde.Text:='0' else geteiltvido2:= geteiltvido2 + 1; if (Edit6_Sozialkunde.Text='') OR (Edit6_Sozialkunde.Text= '0') then Edit6_Sozialkunde.Text:='0' else geteiltvido2:= geteiltvido2 + 1;
if (Edit1_Religion.Text='') OR (Edit1_Religion.Text= '0') then Edit1_Religion.Text:='0' else geteiltvido1:= geteiltvido1 + 1; if (Edit2_Religion.Text='') OR (Edit2_Religion.Text= '0') then Edit2_Religion.Text:='0' else geteiltvido1:= geteiltvido1 + 1; if (Edit3_Religion.Text='') OR (Edit3_Religion.Text= '0') then Edit3_Religion.Text:='0' else geteiltvido1:= geteiltvido1 + 1;
if (Edit4_Religion.Text='') OR (Edit4_Religion.Text= '0') then Edit4_Religion.Text:='0' else geteiltvido2:= geteiltvido2 + 1; if (Edit5_Religion.Text='') OR (Edit5_Religion.Text= '0') then Edit5_Religion.Text:='0' else geteiltvido2:= geteiltvido2 + 1; if (Edit6_Religion.Text='') OR (Edit6_Religion.Text= '0') then Edit6_Religion.Text:='0' else geteiltvido2:= geteiltvido2 + 1;
deutsch1 := StrToFloat(Edit1_Deutsch.Text); deutsch2 := StrToFloat(Edit2_Deutsch.Text); deutsch3 := StrToFloat(Edit3_Deutsch.Text); deutschergebnis1 := deutsch1 + deutsch2 + deutsch3; deutschnote1 := deutschergebnis1/geteiltdeutsch1; LB_Deutsch1halbjahr.Caption := FloatToStr(deutschnote1);
deutsch4 := StrToFloat(Edit4_Deutsch.Text); deutsch5 := StrToFloat(Edit5_Deutsch.Text); deutsch6 := StrToFloat(Edit6_Deutsch.Text); deutschergebnis2 := deutsch4 + deutsch5 + deutsch6; deutschnote2 := deutschergebnis2/geteiltdeutsch2; LB_Deutsch2halbjahr.Caption := FloatToStr(deutschnote2);
englisch1 := StrToFloat(Edit1_Englisch.Text); englisch2 := StrToFloat(Edit2_Englisch.Text); englisch3 := StrToFloat(Edit3_Englisch.Text); englischergebnis1 := englisch1 + englisch2 + englisch3; englischnote1 := englischergebnis1/geteiltenglisch1; LB_Englisch1halbjahr.Caption := FloatToStr(englischnote1);
englisch4 := StrToFloat(Edit4_Englisch.Text); englisch5 := StrToFloat(Edit5_Englisch.Text); englisch6 := StrToFloat(Edit6_Englisch.Text); englischergebnis2 := englisch4 + englisch5 + englisch6; englischnote2 := englischergebnis2/geteiltenglisch2; LB_Englisch2halbjahr.Caption := FloatToStr(englischnote2);
mathematik1 := StrToFloat(Edit1_Mathematik.Text); mathematik2 := StrToFloat(Edit2_Mathematik.Text); mathematik3 := StrToFloat(Edit3_Mathematik.Text); mathematikergebnis1 := mathematik1 + mathematik2 + mathematik3; mathematiknote1 := mathematikergebnis1/geteiltmathematik1; LB_Mathematik1halbjahr.Caption := FloatToStr(mathematiknote1);
mathematik4 := StrToFloat(Edit4_Mathematik.Text); mathematik5 := StrToFloat(Edit5_Mathematik.Text); mathematik6 := StrToFloat(Edit6_Mathematik.Text); mathematikergebnis2 := mathematik4 + mathematik5 + mathematik6; mathematiknote2 := mathematikergebnis2/geteiltmathematik2; LB_Mathematik2halbjahr.Caption := FloatToStr(mathematiknote2);
informatik1 := StrToFloat(Edit1_Informatik.Text); informatik2 := StrToFloat(Edit2_Informatik.Text); informatik3 := StrToFloat(Edit3_Informatik.Text); informatikergebnis1 := informatik1 + informatik2 + informatik3; informatiknote1 := informatikergebnis1/geteiltinformatik1; LB_Informatik1halbjahr.Caption := FloatToStr(informatiknote1);
informatik4 := StrToFloat(Edit4_Informatik.Text); informatik5 := StrToFloat(Edit5_Informatik.Text); informatik6 := StrToFloat(Edit6_Informatik.Text); informatikergebnis2 := informatik4 + informatik5 + informatik6; informatiknote2 := informatikergebnis2/geteiltinformatik2; LB_Informatik2halbjahr.Caption := FloatToStr(informatiknote2);
vido1 := StrToFloat(Edit1_Vido.Text); vido2 := StrToFloat(Edit2_Vido.Text); vido3 := StrToFloat(Edit3_Vido.Text); vidoergebnis1 := vido1 + vido2 + vido3; vidonote1 := vidoergebnis1/geteiltvido1; LB_Vido1halbjahr.Caption := FloatToStr(vidonote1);
vido4 := StrToFloat(Edit4_Vido.Text); vido5 := StrToFloat(Edit5_Vido.Text); vido6 := StrToFloat(Edit6_Vido.Text); vidoergebnis2 := vido4 + vido5 + vido6; vidonote2 := vidoergebnis2/geteiltvido2; LB_Vido2halbjahr.Caption := FloatToStr(vidonote2);
sozialkunde1 := StrToFloat(Edit1_Sozialkunde.Text); sozialkunde2 := StrToFloat(Edit2_Sozialkunde.Text); sozialkunde3 := StrToFloat(Edit3_Sozialkunde.Text); sozialkundeergebnis1 := sozialkunde1 + sozialkunde2 + sozialkunde3; sozialkundenote1 := sozialkundeergebnis1/geteiltsozialkunde1; LB_Sozialkunde1halbjahr.Caption := FloatToStr(sozialkundenote1);
sozialkunde4 := StrToFloat(Edit4_Sozialkunde.Text); sozialkunde5 := StrToFloat(Edit5_Sozialkunde.Text); sozialkunde6 := StrToFloat(Edit6_Sozialkunde.Text); sozialkundeergebnis2 := sozialkunde4 + sozialkunde5 + sozialkunde6; sozialkundenote2 := sozialkundeergebnis2/geteiltsozialkunde2; LB_Sozialkunde2halbjahr.Caption := FloatToStr(sozialkundenote2);
religion1 := StrToFloat(Edit1_Religion.Text); religion2 := StrToFloat(Edit2_Religion.Text); religion3 := StrToFloat(Edit3_Religion.Text); religionergebnis1 := religion1 + religion2 + religion3; religionnote1 := religionergebnis1/geteiltreligion1; LB_Religion1halbjahr.Caption := FloatToStr(religionnote1);
religion4 := StrToFloat(Edit4_Religion.Text); religion5 := StrToFloat(Edit5_Religion.Text); religion6 := StrToFloat(Edit6_Religion.Text); religionergebnis2 := religion4 + religion5 + religion6; religionnote2 := religionergebnis2/geteiltreligion2; LB_Religion2halbjahr.Caption := FloatToStr(religionnote2); |
Moderiert von
Narses: Titel geändert, war: "Fehlermeldung "Ungültige Gleitkommerzahl"".
IhopeonlyReader - Do 09.05.13 20:18
StrToFloat liefert eine Gleitkommazahl, aber nur wenn es auch eine Zahl ist !
probier mal TryStrToFloat...
hier gibt es ein paramter mehr, wenn X zur gleitkommazahl werden soll, dann schreib das so
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if TryStrToFloat( EditkeineAhnungWas.Text, X) then begin Showmessage('Hat geklappt'); end else begin Showmessage('Konnte nicht umgewandelt werden'); end; |
m1sc - Do 09.05.13 20:28
Ich versteh nich was ich mit dem quellcode anfangen soll, wie soll der mir helfen das problem zu fixen?
IhopeonlyReader - Do 09.05.13 20:28
Und du könntest das ganze viel einfacher machen..
wenn du 3 EditFelder hast pro Fach (Halbjahr 1,2 und 3)
Dann kannst du doch einfach
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: 26: 27: 28: 29: 30:
| Function TForm1.GibDurchschnitt(Halbjahr1, Halbjahr2: TEdit): Single; var Gesamt: Byte; Note: Byte; AaN: Byte; begin
Gesamt := 0; AaN := 0;
if TryStrToInt( Halbjahr1.Text, Note) then begin inc(Gesamt, Note); inc(AaN); end;
if TryStrToInt( Halbjahr2.Text, Note) then begin inc(Gesamt, Note); inc(AaN); end;
if (AaN=0) then begin Showmessage('Du hast keine Noten angeben'); end else begin Result := Gesamt / AaN; end; end; |
das rechnet den Durchschnitt pro Halbjahr aus... die Jahresnote wäre dann
Delphi-Quelltext
1: 2: 3: 4: 5:
| var JahresNote: Single; begin Jahresnote := (GibDurchschnitt( DeutschEdit1, DeutschEdit2) + GibDurchschnitt(DeutschEdit3, DeutschEdit4)) /2; ErgebnisLabel.Caption := FloatToStr(Jahresnote); end; |
m1sc - Do 09.05.13 20:28
m1sc hat folgendes geschrieben : |
Ich versteh nich was ich mit dem quellcode anfangen soll, wie soll der mir helfen das problem zu fixen? |
Trystrtofloat funktioniert nicht.
IhopeonlyReader - Do 09.05.13 20:32
TryStrToInt würde auch reichen, da du ja ganze Noten (in Punkten) hast
Bedenke: 2 Paramenter !
Als 1 der String, das 2 das was dazu werden soll..
dann schreibst du anstatt
Delphi-Quelltext
1: 2: 3:
| X := StrToFloat(Edit1.Text); TryStrToFloat(Edit1.Text, X); |
m1sc - Do 09.05.13 20:37
//erstes halbjahr deutsch errechnet
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| TryStrToFloat(Edit1_Deutsch.Text, deutsch1); TryStrToFloat(Edit2_Deutsch.Text, deutsch2); TryStrToFloat(Edit3_Deutsch.Text, deutsch3); deutschergebnis1 := deutsch1 + deutsch2 + deutsch3; deutschnote1 := deutschergebnis1/geteiltdeutsch1; LB_Deutsch1halbjahr.Caption := FloatToStr(deutschnote1);
TryStrToFloat(Edit4_Deutsch.Text, deutsch4); TryStrToFloat(Edit5_Deutsch.Text, deutsch5); TryStrToFloat(Edit6_Deutsch.Text, deutsch6); deutschergebnis2 := deutsch4 + deutsch5 + deutsch6; deutschnote2 := deutschergebnis2/geteiltdeutsch2; LB_Deutsch2halbjahr.Caption := FloatToStr(deutschnote2); |
geht immernoch ned
IhopeonlyReader - Do 09.05.13 20:41
wenn du unbedingt deine ganzen variablen etc. beibehalten willst, dann musst du auch dafür sorgen, dass nur gerechnet wird, wenn alle strings in zahlen umgewandlet werden konnten also
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if TryStrToFloat(Edit1_Deutsch.Text, deutsch1) and TryStrToFloat(Edit2_Deutsch.Text, deutsch2) and TryStrToFloat(Edit3_Deutsch.Text, deutsch3) then begin deutschergebnis1 := deutsch1 + deutsch2 + deutsch3; deutschnote1 := deutschergebnis1/geteiltdeutsch1; LB_Deutsch1halbjahr.Caption := FloatToStr(deutschnote1); end else LB_Deutsch1halbjahr.Caption := 'Fehler'; |
m1sc - Do 09.05.13 20:46
Du verstehst glaub ich ganed was ich genau machen will.
Es soll möglich sein bis zu 3 Noten einzugeben.
Es soll aber auch ein Durchschnitt errechnet werden wenn man nur 2 zahlen eingibt.
Das bedeutet ich muss dem code mitteilwen dass wenn 3 noten da stehen durch 3 gerechnet wird und bei 2 durch 2.
Das Problem hab ich gelöst für ein 3er feld. Allerdings ist das Problem jetzt es müssen überall min 1 Zahl eingegeben werden.
Wenn man nun bei mathe sozi und deutsch was eingibt, alle andern aber frei lässt. Gibs den error.
Wenn man hingegen überall min 1 Zahl eingibt geht es.
[url=
http://imageshack.us/photo/my-images/189/49657314.jpg/]
[/URL]
Edit:
Hier mal das komplette projekt vllt siehst du dann was ich mein:
http://www.file-upload.net/download-7573074/Notendurchschnittsrechner.rar.html
IhopeonlyReader - Do 09.05.13 20:52
dir musst man schritt für schritt erklären oder? :D
TryStrToFloat lassen wir mal weg, und tauschen es gegen
TryStrToInt da es ja nur "ganze" Noten gibt (gibt ja keine 2.5)
Wenn ein Feld leer ist, liefert TryStrToInt das Ergebnis false
also mach es so wie ich es in meinem 3 post geschrieben habe.. stell mal bitte dein ganzen "Ordner" also dein ganzes Project hier rein, dann programmier ich dir das mal eben "anders" und kommentiere es dir aus...
IhopeonlyReader - Do 09.05.13 21:28
ich habe es jetzt programmiert, es fehlen noch 5 fächer.. aber da musst du nur kopieren und die Namen ersetzten.. es ist wirklich sehr einfach gehalten und ich denke es ist alles selbsterklärend
Falls es weitere Probleme gibt melde dich :)
oder falls du fragen zum code hast
m1sc - Do 09.05.13 22:07
Edit: ich geh pennen is mir alles gerade zu blöd
IhopeonlyReader - Do 09.05.13 22:37
ok, hast du dir das angeschaut und verstanden?
sonst bis morgen :)
Tranx - Fr 10.05.13 09:06
Also, ich würde die ganzen Noten in Arrays packen:
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: 26: 27:
| const MaxNr = 3; Deutsch = 1; Englisch = 2; Mathematik = 3; Informatik = 4; VIDO = 5; Sozialkunde = 6; Religion = 7;
HalbJahr1 = 1; HalbJahr2 = 2; GanzesJahr = 3;
type NotenArr = Array[HalbJahr1..HalbJahr2,Deutsch..Religion,1..MaxNr] of integer; NotenFeldArr = Array[HalbJahr1..Halbjahr2,Deutsch..Religion,1..MaxNr] of TEdit; TeilerArr = Array[HalbJahr1..HalbJahr2,Deutsch..Religion] of integer; ErgebnisArr = Array[Halbjahr1..GanzesJahr,Deutsch..Religion] of single; ErgebnisFeldArr = Array[Halbjahr1..GanzesJahr,Deutsch..Religion] of TEdit; var Note : NotenArr; NotenFeld : NotenFeldArr; Teiler: TeilerArr; Ergebnis : ErgebnisArr; ErgebnisFeld : ErgebnisFeldArr; |
Dann wird a) Dein Programmtext wesentlich übersichtlicher und b) Du kannst über Indices die Abfragen gestalten.
Am Anfang des Programms belegst Du das Array Notenfeld mit den Editkomponenten des , und dann kannst Du über Indices alle Abfragen wie folgt gestalten:
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
|
Dann kannst Du die Belegung wie folgt machen:
procedure TForm1.NotenfeldBelegung(Sender : TObject); var TC : TComponent; s : string; i, Halbjahr, Fach, Nr : integer; begin for i := 0 to ComponentCount-1 do begin TC := Components[i]; if TC = TEdit then begin s := TEdit(TC).Name; if s[1] = 'H' then begin try Halbjahr := StrToInt(Copy(s,2,1)); except Halbjahr := 0; end; try Fach := StrToInt(Copy(s,4,2)); except Fach = 0; end; try Nr := StrToInt(Copy(s,7,1)); except Nr := 0; end; if Halbjahr*Fach*Nr<>0 then begin Notenfeld[Halbjahr,Fach,Nr] := TEdit(TC); end else if (Halbjahr*Fach<>0) then begin ErgebnisFeld[HalbJahr,Fach] := TEdit(TC); end; end; end; end; end; |
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77:
| var Halbjahr, Fach, Nr : integer;
:
for Fach := Deutsch to Religion do begin Teiler[Halbjahr1,Fach] := 0; Teiler[Halbjahr2,Fach] := 0; for HalbJahr := Halbjahr1 to Halbjahr2 do begin for Nr = 1 to MaxNr do begin if (Notenfeld[Halbjahr,Fach,Nr].Text='') then Notenfeld[Halbjahr,Fach,Nr].Text='' := '0'; if (Notenfeld[Halbjahr,Fach,Nr].Text <> '0') then Inc(Teiler[Halbjahr,Fach]); try Note[HalbJahr,Fach,Nr] := StrToInt(Notenfeld[Halbjahr,Fach,Nr].Text); except Note[HalbJahr,Fach,Nr] := 0; Dec(Teiler[Halbjahr,Fach]); Notenfeld[Halbjahr,Fach,Nr].SetFocus; Exit; end; end; end; end;
for Fach := Deutsch to Religion do begin Ergebnis[Halbjahr1,Fach] := 0.0; Ergebnis[Halbjahr2,Fach] := 0.0; for HalbJahr := Halbjahr1 to Halbjahr2 do begin If Teiler[Halbjahr, Fach]>0 then begin for Nr = 1 to MaxNr do begin Ergebnis[Halbjahr,Fach] := Ergebnis[Halbjahr,Fach] + Note[HalbJahr,Fach,Nr]/Teiler[Halbjahr,Fach]; end; end else begin Ergebnis[Halbjahr,Fach] := 0.0; end; end; end;
for Fach := Deutsch to Religion do begin if Ergebnis[Halbjahr1,Fach] = 0.0 then begin if Ergebnis[Halbjahr2,Fach] = 0.0 then begin Ergebnis[GanzesJahr,Fach] := 0.0; end else begin Ergebnis[GanzesJahr,Fach] := Ergebnis[Halbjahr2,Fach]; end; end else if Ergebnis[Halbjahr2,Fach] = 0.0 then begin Ergebnis[GanzesJahr,Fach] := Ergebnis[Halbjahr1,Fach]; end else begin Ergebnis[GanzesJahr,Fach] := 0.5*(Ergebnis[Halbjahr1,Fach]+Ergebnis[Halbjahr1,Fach]); end; end; |
Nun, ist das übersichtlicher? Und auch bequemer um weitere Fächer (Sport, Bio, ....) oder vier, statt drei Teilnoten pro Halbjahr zu erweitern. In diesem Sinne, fröhliches Erlernden der Sprache Delphi!
>>>>ÄNDERUNG:<<<<<<<
Einführung eines Maxindex für Nummer, damit ohne Codeänderung das Programm auch bei 4,5,6 statt 3 Teilnoten je Halbjahr funktioniert.
IhopeonlyReader - Fr 10.05.13 20:28
ok, mit Arrays hat man die ganzen variablen noch, dass stimmt.. aber übersichtlicher ?
Also naja^^ bei mir gibt's eine Funktion und es werden nur andere Edits eingesetzt..
bei dir dagegen :D
jeder seine Meinung, ich finde meine "Art" übersichtlich...
und @
Tranx vielleicht solltest du dir die Funktion Copy nochmal anschauen ;)
Copy('Hallo', 2, 2) liefert 'al'
Du überspringst somit einige Buchstabenteile...
copy(s, 2, 1) liefert 2te zeichen
Copy(s, 4, 2) liefert 4te und 5te Zeichen.. was mit dem 3ten Zeichen?
Tranx - Sa 11.05.13 07:54
IhopeonlyReader hat folgendes geschrieben : |
ok, mit Arrays hat man die ganzen variablen noch, dass stimmt.. aber übersichtlicher ?
Also naja^^ bei mir gibt's eine Funktion und es werden nur andere Edits eingesetzt..
bei dir dagegen :D
jeder seine Meinung, ich finde meine "Art" übersichtlich...
und @ Tranx vielleicht solltest du dir die Funktion Copy nochmal anschauen ;)
Copy('Hallo', 2, 2) liefert 'al'
Du überspringst somit einige Buchstabenteile...
copy(s, 2, 1) liefert 2te Zeichen
Copy(s, 4, 2) liefert 4te und 5te Zeichen.. was mit dem 3ten Zeichen? |
Beachte bitte, wie ich vorgeschlagen habe, die Editfelder zu benennen: HxFyyNz
Dann frage ich nur das 2., das 4.+5. und das 7. Zeichen ab. Das sind die Nummern der Indices von Halbjahr, Fach und Nr. des Editfeld-Arrays. Es wäre sehr viel komplizierter, die Fächer in den Namen der Editfelder auszuschreiben und dann mit den Editfeldnamen das Array zu belegen, als so. Das 3. und 6. Zeichen dient nur dazu, dass nicht ein reiner Nummernsalat im Feldnamen steht. Was im Übrigen auch - soweit ich es weiß - nicht erlaubt ist (Feldernamen komplett mit Ziffern) Man kann auch den Feldnamen so definieren:
Halbjahr1Fach01Nr1, Dann wären die Teilbereiche für den Index Halbjahr: Copy(s, 9, 1), Fach: copy(s,14,2), Nr: Copy(s,18,1)
P.S. und was ist, wenn statt 3, 4 Teilnoten pro Halbjahr definiert werden? Dann muss man die Prozedur GibDurchschnitt ändern. Bei meiner Version benötigst Du nur die neuen Editfelder gemäß der Vorgaben und den Indexlauf von 1 ... 4 statt 1 .. 3 bei Nummer! Alles andere bleibt.
Und als Funktion kann man das ebenfalls organisieren:
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105:
| function TForm1.NormiereNotenfelder : boolean; var Halbjahr, Fach, Nr : integer; begin Result := FALSE; for Fach := Deutsch to Religion do begin Teiler[Halbjahr1,Fach] := 0; Teiler[Halbjahr2,Fach] := 0; for HalbJahr := Halbjahr1 to Halbjahr2 do begin for Nr = 1 to MaxNr do begin if (Notenfeld[Halbjahr,Fach,Nr].Text='') then Notenfeld[Halbjahr,Fach,Nr].Text='' := '0'; if (Notenfeld[Halbjahr,Fach,Nr].Text <> '0') then Inc(Teiler[Halbjahr,Fach]); try Note[HalbJahr,Fach,Nr] := StrToInt(Notenfeld[Halbjahr,Fach,Nr].Text); except
Note[HalbJahr,Fach,Nr] := 0; Dec(Teiler[Halbjahr,Fach]);
Notenfeld[Halbjahr,Fach,Nr].SetFocus; Exit; end; end; end; end; Result := TRUE; end;
function TForm.Halbjahresnote(Halbjahr, Fach : integer) : single; var Nr : integer; begin Result := 0.0; try If Teiler[Halbjahr, Fach]>0 then begin for Nr = 1 to MaxNr do begin Ergebnis[Halbjahr,Fach] := Ergebnis[Halbjahr,Fach] + Note[HalbJahr,Fach,Nr]/Teiler[Halbjahr,Fach]; end; end; except Result := 0.0; end; end;
function TForm1.Ganzjahrsnote(Fach : integer) : single; begin if Ergebnis[Halbjahr1,Fach] = 0.0 then begin if Ergebnis[Halbjahr2,Fach] = 0.0 then begin Result := 0.0; end else begin Result := Ergebnis[Halbjahr2,Fach]; end; end else if Ergebnis[Halbjahr2,Fach] = 0.0 then begin Result := Ergebnis[Halbjahr1,Fach]; end else begin Result := 0.5*(Ergebnis[Halbjahr1,Fach]+Ergebnis[Halbjahr1,Fach]); end; end;
procedure TForm1.Berechne(Sender : TObject); var Halbjahr, Fach : integer; begin if NormiereNotenfelder then begin for Fach := Deutsch to Religion do begin for HalbJahr := Halbjahr1 to Halbjahr2 do begin Ergebnis[Halbjahr, Fach] := Halbjahresnote(Halbjahr, Fach); end; Ergebnis[GanzesJahr, Fach] := Jahresnote(Fach); end; end else begin end; end; |
Was sagst Du dazu?
Blawen - Sa 11.05.13 10:00
m1sc hat folgendes geschrieben: |
Du verstehst glaub ich ganed was ich genau machen will. |
Es liegt selten an den Helfern ;-)
m1sc hat folgendes geschrieben : |
Edit: ich geh pennen is mir alles gerade zu blöd |
Bitte überfordert ihn nicht :roll: ;-)
Als kleiner und gut gemeinter Tipp:
Um die Lesbarkeit Deines Quellcodes zu erhöhen, ist es ungemein praktisch, wenn er schön formatiert ist.
Nebeneffekt: die Fehler und die Ablauflogik springen einem dabei förmlich ins Auge.
Tranx - Sa 11.05.13 10:28
Gerade bei Eingaben kann man viel verkehrt machen, da ja diese in TEdit-Feldern nicht kontrolliert werden. Gibt man z.B. in eines der Felder statt einer Ziffer z.B. "A" oder - noch schlimmer - ALT 255 (geschütztes Leerzeichen) ein, so wird dieses Feld bei der Umwandlung in eine Zahl einen Fehler produzieren. Besser wäre m.E. die Verwendung von SpinEdit-Komponenten. Dort kann man nur Zahlen eingeben, deren Bereich man auch noch begrenzen kann (z.B.: 0 .. 6), so dass nur gültige Noten eingegeben werden können. Vorteil ist auch noch, dass man über Cursor-Tasten den Wert des Feldes verändern kann. Wobei im vorliegenden Fall die 0 dann für "keine Note" stände.
Vielleicht denkst Du mal darüber nach. Zumal dann auch die Notenübergabe aus den Feldern in die Noten viel einfacher wäre:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| try Note := StrToInt(EditFeld.Text); if (Note<0) then Note := 0 else if (Note>6) then Note := 6; except Note := 0; end;
Note := SpinEditFeld.Value; |
Überzeugt?
Und gleich die Übertragung in meinen Vorschlag:
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184:
| const MaxNr = 3; Deutsch = 1; Englisch = 2; Mathematik = 3; Informatik = 4; VIDO = 5; Sozialkunde = 6; Religion = 7;
HalbJahr1 = 1; HalbJahr2 = 2; GanzesJahr = 3;
type NotenArr = Array[HalbJahr1..HalbJahr2,Deutsch..Religion,1..MaxNr] of integer; NotenFeldArr = Array[HalbJahr1..Halbjahr2,Deutsch..Religion,1..MaxNr] of TSpinEdit; TeilerArr = Array[HalbJahr1..HalbJahr2,Deutsch..Religion] of integer; ErgebnisArr = Array[Halbjahr1..GanzesJahr,Deutsch..Religion] of single; ErgebnisFeldArr = Array[Halbjahr1..GanzesJahr,Deutsch..Religion] of TEdit; var Note : NotenArr; NotenFeld : NotenFeldArr; Teiler: TeilerArr; Ergebnis : ErgebnisArr; ErgebnisFeld : ErgebnisFeldArr;
Dann kannst Du die Belegung wie folgt machen:
procedure TForm1.NotenfeldBelegung(Sender : TObject); var TC : TComponent; s : string; i, Halbjahr, Fach, Nr : integer; begin for i := 0 to ComponentCount-1 do begin TC := Components[i]; if TC is TSpinEdit then begin s := TSpinEdit(TC).Name; if s[1] = 'H' then begin try Halbjahr := StrToInt(Copy(s,2,1)); except Halbjahr := 0; end; try Fach := StrToInt(Copy(s,4,2)); except Fach = 0; end; try Nr := StrToInt(Copy(s,7,1)); except Nr := 0; end; if Halbjahr*Fach*Nr<>0 then begin Notenfeld[Halbjahr,Fach,Nr] := TSpinEdit(TC); end; end; end else if TC is TEdit then begin s := TEdit(TC).Name; if s[1] = 'H' then begin try Halbjahr := StrToInt(Copy(s,2,1)); except Halbjahr := 0; end; try Fach := StrToInt(Copy(s,4,2)); except Fach = 0; end; if Halbjahr*Fach<>0 then begin Ergebnisfeld[Halbjahr,Fach] := TEdit(TC); end; end; end; end; end;
procedure TForm1.BelegeNoten; var Halbjahr, Fach, Nr : integer; begin for Fach := Deutsch to Religion do begin Teiler[Halbjahr1,Fach] := 0; Teiler[Halbjahr2,Fach] := 0; for HalbJahr := Halbjahr1 to Halbjahr2 do begin for Nr = 1 to MaxNr do begin Note[HalbJahr,Fach,Nr] := Notenfeld[Halbjahr,Fach,Nr].Value; if Note[Halbjahr,Fach,Nr]>0 then Inc(Teiler[Halbjahr,Fach]); end; end; end; end;
function TForm.Halbjahresnote(Halbjahr, Fach : integer) : single; var Nr : integer; begin Result := 0.0; try If Teiler[Halbjahr, Fach]>0 then begin for Nr = 1 to MaxNr do begin Ergebnis[Halbjahr,Fach] := Ergebnis[Halbjahr,Fach] + Note[HalbJahr,Fach,Nr]/Teiler[Halbjahr,Fach]; end; end; except Result := 0.0; end; end;
function TForm1.Ganzjahrsnote(Fach : integer) : single; begin if Ergebnis[Halbjahr1,Fach] = 0.0 then begin if Ergebnis[Halbjahr2,Fach] = 0.0 then begin Result := 0.0; end else begin Result := Ergebnis[Halbjahr2,Fach]; end; end else if Ergebnis[Halbjahr2,Fach] = 0.0 then begin Result := Ergebnis[Halbjahr1,Fach]; end else begin Result := 0.5*(Ergebnis[Halbjahr1,Fach]+Ergebnis[Halbjahr1,Fach]); end; end;
procedure TForm1.Berechne(Sender : TObject); var Halbjahr, Fach : integer; begin BelegeNoten; for Fach := Deutsch to Religion do begin for HalbJahr := Halbjahr1 to Halbjahr2 do begin Ergebnis[Halbjahr, Fach] := Halbjahresnote(Halbjahr, Fach); ErgebnisFeld[Halbjahr,Fach].Text := FormatFloat('0.00',Ergebnis[Halbjahr, Fach]); end; Ergebnis[GanzesJahr, Fach] := Jahresnote(Fach); ErgebnisFeld[GanzesJahr,Fach].Text := FormatFloat('0.00',Ergebnis[GanzesJahr, Fach]); end; end; |
Delete - So 12.05.13 10:37
- Nachträglich durch die Entwickler-Ecke gelöscht -
WasWeißDennIch - So 12.05.13 10:59
Frühlingsrolle hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if TryStrToFloat(Noten[i], f) and (StrToFloat(Noten[i]) >= 1) and (StrToFloat(Noten[i]) <= 6) then Liste.Add(Noten[i]); end; |
|
Sieht nach "StrToFloateritis aus" :mrgreen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if TryStrToFloat(Noten[i], f) and (f >= 1) and (f <= 6) then Liste.Add(Noten[i]); end; |
Delete - So 12.05.13 11:15
- Nachträglich durch die Entwickler-Ecke gelöscht -
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!