![]() |
ungültiger Gleitkommawert?
Hallo Leute,
Ich hoffe das Thema ist hier richtig (Bin neu hier). Ich beschäftige mich nun schon rund 2 Monate mit Delphi, deshalb wollte ich mir einen Notenrechner schreiben, der mir meine Zeugnisnoten errechnet. Ich habe also mehrere Stunden überlegt und geschrieben. Jetzt wollte ich es testen und da wird mir angezeigt das der Wert ''' kein gültiger Gleidkommawert ist. Ich kann mir echt nicht mehr weiterhelfen. Vielleicht könnt ihr es ja. Hoffe auf viele Antworten. :-D PS.: Hier ist mein ganzes Projekt. Wenn Fragen aufkommen, einfach anschreien. ![]()
Delphi-Quellcode:
unit Unit3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm3 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Edit9: TEdit; Label9: TLabel; Edit10: TEdit; Edit11: TEdit; Label10: TLabel; Label11: TLabel; Edit12: TEdit; Label12: TLabel; Button1: TButton; Button2: TButton; Label13: TLabel; Label14: TLabel; Edit13: TEdit; Edit14: TEdit; Edit8: TEdit; Edit15: TEdit; Label8: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real; kkdurchschnitt : real; kadurchschnitt : real; notendurchschnitt : real; { Private-Deklarationen } public { Public-Deklarationen } end; var Form3: TForm3; kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real; kkdurchschnitt : real; kadurchschnitt : real; notendurchschnitt : real; implementation {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); begin Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear; Edit5.Clear; Edit6.Clear; Edit7.Clear; Edit8.Clear; Edit9.Clear; Edit10.Clear; Edit11.Clear; Edit12.Clear; Edit13.Clear; Edit14.Clear; Edit15.Clear; end; procedure TForm3.Button2Click(Sender: TObject); var kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3, kas : real; kkdurchschnitt : real; kadurchschnitt : real; notendurchschnitt : real; begin if edit1.text='' then edit1.Text:= '0'; if edit2.text='' then edit2.Text:= '0'; if edit3.text='' then edit3.Text:= '0'; if edit4.text='' then edit4.Text:= '0'; if edit5.text='' then edit5.Text:= '0'; if edit6.text='' then edit6.Text:= '0'; if edit7.text='' then edit7.Text:= '0'; if edit8.text='' then edit8.Text:= '0'; if edit15.text='' then edit15.Text:= '0'; // // if edit15.text='0' then edit13.Text := '8'; if edit8.text='0' then edit13.Text := '7'; if edit7.text='0' then edit13.text := '6'; if edit6.text='0' then edit13.text := '5'; if edit5.text='0' then edit13.text := '4'; if edit4.text='0' then edit13.text := '3'; if edit3.text='0' then edit13.text := '2'; if edit2.text='0' then edit13.text := '1'; if edit1.text='0' then edit13.text := '0'; kk1 := strtofloat(edit1.text); kk2 := strtofloat(edit2.text); kk3 := strtofloat(edit3.text); kk4 := strtofloat(edit4.text); kk5 := strtofloat(edit5.text); kk6 := strtofloat(edit6.text); kk7 := strtofloat(edit7.text); kk8 := strtofloat(edit8.text); kk9 := strtofloat(edit15.text); // if edit9.text='' then edit9.Text:= '0'; if edit10.text='' then edit10.Text := '0'; if edit11.text='' then edit11.Text := '0'; if edit11.text='0' then edit14.text := '2'; if edit10.text='0' then edit14.text := '1'; if edit9.text='0' then edit14.text := '0'; ka1 := strtofloat(edit9.text); ka2 := strtofloat(edit10.text); ka3 := strtofloat(edit11.text); kas := ka1 + ka2 + ka3; kks := kk1+ kk2+ kk3+ kk4+ kk5+ kk6+ kk7+ kk8+ kk9; // Label13.Caption := floattostr(kks); Label14.Caption := floattostr(kas); kkdurchschnitt := kks/ strtofloat(edit13.text); kadurchschnitt := kas/ strtofloat(edit14.text); notendurchschnitt := kkdurchschnitt*(2/3)+kadurchschnitt*(1/3); Edit12.Text := floattostr (notendurchschnitt); end; end. |
AW: ungültiger Gleitkommawert?
Hallo,
tritt das Problem hier auf
Delphi-Quellcode:
Edit13 wird nur unter bestimmmten Bedingungen ein Wert zugewiesen.
kkdurchschnitt := kks/ strtofloat(edit13.text);
kadurchschnitt := kas/ strtofloat(edit14.text); Ansonsten ist Edit13.Text leer und ein leerer Text ist nunmal ein ungültiger Gleitkommawert. Grüße Klaus |
AW: ungültiger Gleitkommawert?
Eines Deiner Editfelder enthält keinen gültigen "Floatwert" ...
|
AW: ungültiger Gleitkommawert?
Aber auch eine Vorbelegung mit 0, wie bei den anderen Feldern wäre nicht gut ( 1 wäre weniger fehlerträchtig)
|
AW: ungültiger Gleitkommawert?
@Eltonmaster
Ohne mir jetzt deinen Code angeguckt zu haben, möchte ich dich mit einer Funktion bekannt machen. Du kennst wohl die Funktion StrToFloat. Diese Funktion ist grundsätzlich fehleranfällig, genau wie StrToInt, denn die Funktionen verlangen gültige Zahlen als String (die eine Real, die andere Integer). Es gibt zwei Möglichkeiten einer Fehlermeldung vorzubeugen: die eine ist den String vorher auf einen gültigen Wert zu prüfen und notfalls zu reagieren. Diese Methode ist meiner Meinung nach die Bessere. Die zweite Methode ist statt StrToFloat die Funktion StrToFloatDef zu nehmen. Bei StrToFloatDef kann man für den Fall, dass der String kein gültiger Wert ist, einen Default-Wert (Ersatz-Wert) nehmen. Allerdings, auch wenn hier in dem Fall dann keine Fehlermeldung mehr kommt, weiß man nie so genau ob es jetzt mit dem richtigen Wert gerechnet wurde oder Defaultwert. Also mit Bedacht einsetzten.
Delphi-Quellcode:
x := StrToFloatDef('ca. 3,14', 3.1415926);
|
AW: ungültiger Gleitkommawert?
Also ich würde das gesamte Programm komplett neu aufbauen.
Anstatt jede Note in ein Editfeld einzutragen ist es viel einfacher alle Noten in ein mehrzeiliges Memofeld zu schreiben (jede Note in eine Zeile).
Delphi-Quellcode:
procedure TForm1.BerechneDurchschnitt;
var i : integer; zeile : string; summe,note : double; anzahl : integer; begin summe := 0; anzahl := 0; // Noten aufsummieren for i := 0 to Memo1.Lines.Count-1 do begin zeile := Memo1.Lines[i]; note := StrToFloatDef(zeile, -1); if note > 0.0 then begin summe := summe + note; Inc(anzahl); end; end; // Durchschnitt berechnen und anzeigen if anzahl > 0 then EditDurchschnitt.Text := FloatToStr(summe / anzahl) else EditDurchschnitt.Text := 'keine Noten vorh.'; end; |
AW: ungültiger Gleitkommawert?
Vielen Dank für die Antworten.
Zu Popov. Es dürften ja nur zugelassenen Werte (Zahlen) eingetragen werden, oder nicht? 0-6 Und sonst versuche ich es mal mit dem memofeld (könnt ihr mir mal erklähren wie die Rechnung dann aufgebaut ist, weil nur abkopieren ist ja sinnfrei ;)) Außerdem, muss ich denn keinen Button betätiegen wenn ich diese Variante (memo) verwende? |
AW: ungültiger Gleitkommawert?
Ganz anderer Vorschlag: statt der Edits ComboBoxen nehmen, Items zur Designtime eintragen, Style auf z.B. csOwnerDrawFixed und ItemIndex mit 0 vorbelegen. So kann es gar keine Fehleingaben geben.
|
AW: ungültiger Gleitkommawert?
Delphi-Quellcode:
Ich sehe eigentlich keinen Grund warum Du die Variablen dreimal definiert hast.
private
kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real; kkdurchschnitt : real; kadurchschnitt : real; notendurchschnitt : real; { Private-Deklarationen } public { Public-Deklarationen } end; var Form3: TForm3; kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real; kkdurchschnitt : real; kadurchschnitt : real; notendurchschnitt : real; implementation procedure TForm3.Button2Click(Sender: TObject); var kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3, kas : real; kkdurchschnitt : real; kadurchschnitt : real; notendurchschnitt : real; Ebenso solltest Du statt real double oder single benutzen. Gruß K-H |
AW: ungültiger Gleitkommawert?
Das wahr ein Fehler von mir ;)
Und ich will nochmal darauf hinweisen: Ich bin ein neuling ;) d.h. Auch die Methode mit der Box klingt gut, ich weiß aber nicht wie ich sie umsetzen soll. Ps.: wenn ich double nehme wie heißt das dann (strto...) ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz