![]() |
Einlesefehler bei MemoBox
Halli hallo liebe Delphi-Cracks :),
ich habe mal wieder irgendein dummes Anfänger-Problem :roll: : Über eine MemoBox möchte ich gerne einzelne Werte (Zahlen) pro Zeile einlesen lassen, um damit weiterzurechnen. Mein Problem: Egal was für Zahlen ich eingebe: jedes Mal bekomme ich "" ist kein gültiger Gleitkommawert :(. Hier mal der relevante Code-Abschnitt (beim Proggi handelt es sich um Qualitätskontrolle von Wellen, nur so am Rande):
Delphi-Quellcode:
kurze Erläuterung: es sollen jeweils die Anzahl der getesteten Wellen, der kleinste, mittlere, größte Durchmesser, sowie die Anzahl der Wellen ausgegeben werden, die einen eingegebenen Toleranzwert über- bzw. unterschreiten.
summe:=0;
unter:=0; über:=0; max:=strtofloat(memo1.Lines[1]); min:=strtofloat(memo1.lines[1]); soll:=strtofloat(edit1.text); plus:=strtofloat(edit2.Text); minus:=strtofloat(edit3.Text); ug:= soll-minus; üg:= soll+plus; zahl:= Memo1.Lines.count; for i:= 1 to memo1.Lines.Count do begin if strtofloat(memo1.Lines[i]) < min then min:= strtofloat(memo1.Lines[i]); if strtofloat(memo1.Lines[i]) > max then max:= strtofloat(memo1.Lines[i]); if strtofloat(memo1.lines[i])<ug then unter:=unter+1; if strtofloat(memo1.lines[i])>üg then über:= über+1; summe:= summe+strtofloat(memo1.lines[i]); end; Außer dieser Fehlermeldung scheint das Programm ganz gut zu laufen. Ich hoffe, ihr könnt mir weiterhelfen, auch noch diesen Fehler auszubügeln :D Liebe Grüße Giertier ^^ |
Re: Einlesefehler bei MemoBox
Irgendwo hast Du leere Strings im Memo. Sind da vielleicht Leerzeilen drin?
Versuch mal if Memo1.Lines[i] <> '' then und dann erst die Konvertierung. Grüße, Messie |
Re: Einlesefehler bei MemoBox
Hallo...
Zitat:
...noch eine Tasse Kaffe und ich schau noch mal drüber :P |
Re: Einlesefehler bei MemoBox
Nunja, das Problem ist das Du am Ende wohl eine Leerzeile hast. Und ein Leerer String ist nunmal wirklich kein gültiger Float Wert ;). Benutz lieber StrToFloatDef(). Das produziert keinen Fehler, sondern gibt - falls ein String ungültig sein sollte - einfach einen frei definierbaren Default Wert zurück.
|
Re: Einlesefehler bei MemoBox
Hallo,
vielleicht ist die Ursache auch nur ein falscher Zugriff. Die Indexwerte für die Memozeilen beginnen bei 0. Gruß Hawkeye |
Re: Einlesefehler bei MemoBox
Und wenn wir jetzt mal alles zusammenfassen:
Delphi-Quellcode:
Ich hoffe, ich habe jetzt nichts übersehen.
summe:=0;
unter:=0; ueber:=0; aktuell := 0; //erspart uns die ständige Konvertierung if Memo1.Lines.Count > 0 then begin max:=strtofloatdef(memo1.Lines[0],0); min:=strtofloatdef(memo1.lines[0],0); end else begin max := 0; min := 0; end; soll:=strtofloatdef(edit1.text,0); plus:=strtofloatdef(edit2.Text,0); minus:=strtofloatdef(edit3.Text,0); ug:= soll-minus; ueg:= soll+plus; zahl:= Memo1.Lines.count; //wozu wird zahl gebraucht? for i:= 0 to memo1.Lines.Count - 1 do begin aktuell := strtofloatdef(memo1.Lines[i],0); if aktuell < min then min:= aktuell; if aktuell > max then max:= aktuell; if aktuell < ug then inc(unter); if aktuell > ueg then inc(ueber); summe:= summe + aktuell; end; |
Re: Einlesefehler bei MemoBox
... Kaffee ist leer. :(
...und DeddyH hat schon alles gesagt :thumb: |
Re: Einlesefehler bei MemoBox
Guten Abend,
um unnötige Konvertierungen zu vermeiden, könntest Du auch so vorgehen.
Delphi-Quellcode:
Grüße
var
value: extended; .... for i:= 0 to memo1.Lines.Count -1 do begin if memo1.Lines[i] <> '' then begin value:= StrToFloat(memo1.Lines[i]); if value < min then min:= value; if value > max then max:= value; if value <ug then unter:=unter+1; if value >ueg then ueber:= ueber+1; summe:= summe+value; end; end; Klaus P.S. Die Version von DeddyH hat den Nachteil das wenn es einen min Wert gibt der größer 0 ist hier immer der minWert 0 ist. |
Re: Einlesefehler bei MemoBox
Dafür kommt meine Version auch mit "Blödsinn" im Memo zurecht ;). Richtig gut wäre es wahrscheinlich, mittels einer Boolean-Variable zu kennzeichnen, wann die erste gültige Zeile ausgewertet wurde. Aber das ist wohl eher eine Aufgabe für den TE :zwinker:
|
Re: Einlesefehler bei MemoBox
Hallo ^^
vielen Dank euch allen erstmal für eure superschnellen Antworten, mein Quelltext sieht jetzt zumindest um einiges übersichtlicher aus, wenn ich auf die unnötigen Konvertierungsschritte verzichte :wink: Leider gibt es das alte Problem immernoch :(. Da ich es aus den von Klaus genannten Gründen eher vermeiden möchte, max und min im Voraus gleich null zu setzen, würde ich gerne wissen, ob es noch eine andere Möglichkeit gibt, außer min und max vorher so zu deklarieren:
Delphi-Quellcode:
Wenn ich die Werte eingebe habe ich eigentlich auch keine (sichtbare) Leerzeile :?, ich verstehs einfach nicht...
max:=strtofloat(memo1.Lines[1]);
min:=strtofloat(memo1.lines[1]); Trotzdem nochmal vielen Dank für eure bisherigen Vorschläge :D @Deddy: die variable zahl gibt die Anzahl der getesteten Wellen an (,falls man bei dem ganzen Getippe den Überblick verloren hat und nicht nochmal nachzählen will ;) ) |
Re: Einlesefehler bei MemoBox
Was steht den in der zweiten Zeile? Und warum weist du dem minimum das Gleiche wie dem Maximum zu?
|
Re: Einlesefehler bei MemoBox
Einen Initialwert brauchst Du ja zum Vergleich, wobei hier Memo1.Lines[0] natürlich sinniger wäre.
|
Re: Einlesefehler bei MemoBox
Zitat:
Ich weiß jetzt nicht genau, was du mit zweiter Zeile meinst, deswegen packe ich jetzt hier mal den kompletten Code der Button procedure hin und nicht nur ein Stück:
Delphi-Quellcode:
Vielleicht hab ich ja doch noch wo anders nen fehler gemacht...
procedure TForm1.Button2Click(Sender: TObject);
var soll,plus,minus,min,max,mittel,ug,ueg,summe,pruefwert,wert:single; zahl,unter,ueber,i:integer; begin if edit1.Text = '' then begin application.MessageBox('Bitte füllen Sie alle Eingabefelder aus!', 'Leeres Feld', MB_ok); exit; end; if edit2.Text = '' then begin application.MessageBox('Bitte füllen Sie alle Eingabefelder aus!', 'Leeres Feld', MB_ok); exit; end; if edit3.Text = '' then begin application.MessageBox('Bitte füllen Sie alle Eingabefelder aus!', 'Leeres Feld', MB_ok); exit; end; if memo1.lines.count = 0 then begin application.MessageBox('Bitte geben Sie mindestens einen Messwert ein!', 'Leeres Feld', MB_ok); exit; end; if not TryStrToFloat(edit1.Text,pruefwert) then begin application.MessageBox('Sie haben einen Eingabefehler gemacht!', 'Eingabefehler', MB_ok); exit; end; if not TryStrToFloat(edit2.Text,pruefwert) then begin application.MessageBox('Sie haben einen Eingabefehler gemacht!', 'Eingabefehler', MB_ok); exit; end; if not TryStrToFloat(edit3.Text,pruefwert) then begin application.MessageBox('Sie haben einen Eingabefehler gemacht!', 'Eingabefehler', MB_ok); exit; end; for i:= 1 to memo1.lines.count do if not TryStrToFloat(memo1.Lines[i],pruefwert) then begin application.MessageBox('Sie haben einen Eingabefehler gemacht!', 'Eingabefehler', MB_ok); exit; end; summe:=0; unter:=0; ueber:=0; soll:=strtofloat(edit1.text); plus:=strtofloat(edit2.Text); minus:=strtofloat(edit3.Text); ug:= soll-minus; ueg:= soll+plus; zahl:= Memo1.Lines.count; max:=strtofloat(memo1.Lines[1]); min:=strtofloat(memo1.lines[1]); for i:= 1 to memo1.Lines.Count do begin if memo1.Lines[i] <> '' then begin wert:= StrToFloat(memo1.Lines[i]); if wert < min then min:= wert; if wert > max then max:= wert; if wert <ug then unter:=unter+1; if wert >ueg then ueber:= ueber+1; summe:= summe+wert; end; end; mittel:= summe/zahl; label18.Caption:= inttostr(zahl); label19.Caption:= floattostr(round(min*100)/100)+' mm'; label20.Caption:= floattostr(round(max*100)/100)+' mm'; label21.Caption:= floattostr(round(mittel*100)/100)+' mm'; label23.Caption:= inttostr(unter); label24.caption:= inttostr(ueber); end; procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); begin if not (key in['0','1','2','3','4','5','6','7','8','9',',',#8,#13]) then key := #0; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in['0','1','2','3','4','5','6','7','8','9',',',#8]) then key := #0; end; procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin if not (key in['0','1','2','3','4','5','6','7','8','9',',',#8]) then key := #0; end; procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char); begin if not (key in['0','1','2','3','4','5','6','7','8','9',',',#8]) then key := #0; end; end. |
Re: Einlesefehler bei MemoBox
Ich meinte die 2. Zeile in deinem Memofeld
|
Re: Einlesefehler bei MemoBox
Zitat:
Naja, je nachdem ob ich mehr oder weniger Werte eingebe, steht dann da entweder ein Wert, oder wenn ich nur einen Wert eingebe, steht halt nichts da, aber dann springe ich auch gar nicht erst in die Zeile, deswegen verstehe ich auch nicht, warum er mir trotzdem was von '' ist kein gültiger Gleitkommawert erzählt :? |
Re: Einlesefehler bei MemoBox
Und was steht da genau?
|
Re: Einlesefehler bei MemoBox
Ahhhhh, ich bin so bekloppt :wall: .
Hab vergessen, von i:= 0 bis count -1 zu zählen, wie ihr mir das ja auch schon geraten habt ;). Den Fehler mach ich bestimmt nicht nochmal :-D Vielen vielen Dank nochmal an alle hier im Thread, ihr seid spitze :thumb: lg, Giertier ^^ |
Re: Einlesefehler bei MemoBox
Selbstkritik ist der beste Weg zur Besserung... 8)
...aber nur so lernt man :thumb: |
Re: Einlesefehler bei MemoBox
Ich benutze noch D5 Pro. Da gibts anscheinend noch kein StrToFloatDef - kann mal jemand die Sourcen der Function posten? Danke!
|
Re: Einlesefehler bei MemoBox
Hier hab ich auch nur Delphi 5, aber man kann doch StrToIntDef auf Float anpassen:
Delphi-Quellcode:
Ich möchte fast wetten, dass das Original auch nicht viel anders aussieht.
function StrToFloatDef(const S: string; Default: Extended): Extended;
var E: Integer; begin Val(S, Result, E); if E <> 0 then Result := Default; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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