![]() |
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 ;) ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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