![]() |
Edit-Felder auf Inhalt prüfen
Hallo Leute,
ich habe folgendes Problem: ich möchte 2 Edit-Felder, deren Inhalt für eine Berechnung notwendig ist, auf Inhalt überprüfen. Falls dort nichts steht soll eine Message gezeigt werden und im Edit-Feld, wo das Ergebnis gezeigt wird: Berechnung fehlgeschlagen!. Mein Quelltext: procedure TForm2.Button1Click(Sender: TObject); var V,Dichte,d,n,Re: real; begin V:= StrToFloat(edit1.text); Dichte:= StrToFloat(edit11.text); n:= StrToFloat(edit10.Text)/1000000; case combobox2.ItemIndex of 0: d:= 0.01; 1: d:= 0.012; 2: d:= 0.015; 3: d:= 0.02; 4: d:= 0.025; 5: d:= 0.032; 6: d:= 0.04; 7: d:= 0.05; end; Re:= 4*V*Dichte/d/n/3.1416; if Re >= 2320 then begin ShowMessage('Es liegt keine laminare Strömung mehr vor! Reduziere den Volumenstrom und/oder erhöhe den Rohrdurchmesser!'); end; if (edit1.Text='') or (edit2.text='') then begin ShowMessage('Es muss ein Wert angegeben werden!'); end; if (edit1.Text='') or (edit2.text='') then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; if not (edit1.text='') or (edit2.text='') then begin case combobox2.ItemIndex of 0: ... Berechnung ... end; end; if Re >=2320 then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; end; Für Re >= 2320 funktioniert alles. Bei leeren Edit-Feldern kommt die MEldung: " ist not al valid floating point value. Kann mir jemand weiterhelfen? Gruß |
AW: Edit-Felder auf Inhalt prüfen
Strukturier Deinen Code doch erst einmal. Mit den Delphi-Tags (die "Helm"-Schaltfläche im Beitragseditor) kannst Du ihn dann im Forum schön formatiert darstellen.
|
AW: Edit-Felder auf Inhalt prüfen
Prüfe doch, ob das Editfeld leer ist mit
Delphi-Quellcode:
if edxxx.text <> ''then
|
AW: Edit-Felder auf Inhalt prüfen
Das ist im Grunde genommen wurscht, wie man vergleicht. Aber man sollte das nach Möglichkeit nur einmal machen müssen. Tipp: zu einem If-Zweig kann man auch einen Else-Zweig schreiben.
|
AW: Edit-Felder auf Inhalt prüfen
Hallo Leute,
ich habe folgendes Problem: ich möchte 2 Edit-Felder, deren Inhalt für eine Berechnung notwendig ist, auf Inhalt überprüfen. Falls dort nichts steht soll eine Message gezeigt werden und im Edit-Feld, wo das Ergebnis gezeigt wird: Berechnung fehlgeschlagen!. Mein Quelltext:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var V,Dichte,d,n,Re: real; begin V:= StrToFloat(edit1.text); Dichte:= StrToFloat(edit11.text); n:= StrToFloat(edit10.Text)/1000000; case combobox2.ItemIndex of 0: d:= 0.01; 1: d:= 0.012; 2: d:= 0.015; 3: d:= 0.02; 4: d:= 0.025; 5: d:= 0.032; 6: d:= 0.04; 7: d:= 0.05; end; Re:= 4*V*Dichte/d/n/3.1416; if Re >= 2320 then begin ShowMessage('Es liegt keine laminare Strömung mehr vor! Reduziere den Volumenstrom und/oder erhöhe den Rohrdurchmesser!'); end; if (edit1.Text='') or (edit2.text='') then begin ShowMessage('Es muss ein Wert angegeben werden!'); end; if (edit1.Text='') or (edit2.text='') then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; if not (edit1.text='') or (edit2.text='') then begin case combobox2.ItemIndex of 0: ... Berechnung ... end; end; if Re >=2320 then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; end; Für Re >= 2320 funktioniert alles. Bei leeren Edit-Feldern kommt die MEldung: " ist not al valid floating point value. Kann mir jemand weiterhelfen? Gruß |
AW: Edit-Felder auf Inhalt prüfen
Wie oben von mir schon geschrieben. Prüfe beide Edits auf = '', dann steht in beiden nichts drin und du kannst eine Fehlermeldung ausgeben.
Du kannst auch
Delphi-Quellcode:
nutzen, um den Fehler abzufangen.
TryStrToFloat
|
AW: Edit-Felder auf Inhalt prüfen
Zähl doch mal, wie oft die folgenden Schnippsel in Deinem Code vorkommen:
Zitat:
Zitat:
Zitat:
|
AW: Edit-Felder auf Inhalt prüfen
Zitat:
Zitat:
Delphi-Quellcode:
[/edit]
procedure TForm3.Button1Click(Sender: TObject);
var Zahl1, Zahl2, Ergebnis: double; Ausgabe: string; begin //Pessimistische Vorbelegung des Augabestrings Ausgabe := 'Berechnung fehlgeschlagen'; if not TryStrToFloat(Edit1.Text, Zahl1) then begin ShowMessage('Ungültige Eingabe für die erste Zahl'); Edit1.SetFocus; Edit1.SelectAll; end else if not TryStrToFloat(Edit2.Text, Zahl2) then begin ShowMessage('Ungültige Eingabe für die zweite Zahl'); Edit2.SetFocus; Edit3.SelectAll; end //Hier können wir weitermachen, Zahl1 und Zahl2 sind aus den Eingaben befüllt else begin Ergebnis := Zahl1 + Zahl2; Ausgabe := FloatToStr(Ergebnis); end; //Ausgabestring darstellen //(enthält entweder das Rechenergebnis oder die Fehlermeldung von ganz oben) Edit3.Text := Ausgabe; end; |
AW: Edit-Felder auf Inhalt prüfen
Hey,
habe das jetzt mal so geändert: ich weiß leider nicht, was mit formatieren gemeint ist :oops:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var V,Dichte,n,Re,Laenge,Ergebnis,d: double; Ausgabe: string; begin V:= StrToFloat(edit1.text)/1000; Dichte:= StrToFloat(edit11.text); n:= StrToFloat(edit10.Text)/1000000; Ausgabe:= 'Berechnung fehlgeschlagen'; case combobox2.ItemIndex of 0: d:= 0.01; 1: d:= 0.012; 2: d:= 0.015; 3: d:= 0.02; 4: d:= 0.025; 5: d:= 0.032; 6: d:= 0.04; 7: d:= 0.05; 8: d:= 0.06; 9: d:= 0.065; 10: d:= 0.08; 11: d:= 0.1; end; Re:= 4*V*Dichte/d/n/3.1416; if Re >= 2320 then begin ShowMessage('Es liegt keine laminare Strömung mehr vor! Reduziere den Volumenstrom und/oder erhöhe den Rohrdurchmesser!'); if not TryStrToFloat(edit1.Text, V) then begin showmessage('Werte für Volumenstrom und Länge eingeben!'); edit1.SetFocus; edit1.SelectAll; end else if not TryStrToFloat(edit2.Text, Laenge) then begin showmessage('Werte für Volumenstrom und Länge eingeben!'); edit2.SetFocus; edit2.SelectAll; end else begin Ergebnis:= 40.744/1000000/d/d/d/d*StrToFloat(edit10.Text)*StrToFloat(edit1.Text)*StrToFloat(edit2.text); Ausgabe := FloatToStr(Ergebnis); end; edit3.text:= Ausgabe; if Re >=2320 then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; end; end; |
AW: Edit-Felder auf Inhalt prüfen
jetzt funktioniert die Rechnung sogar nicht mehr...
|
AW: Edit-Felder auf Inhalt prüfen
Zeile 1:
Zitat:
Zitat:
|
AW: Edit-Felder auf Inhalt prüfen
Hallo,
du musst die Prüfung vorher machen und nicht erst rechnen und dann weiter unten prüfen.
Delphi-Quellcode:
Das sind alles Funktionen, die "schief" gehen können. Wenn zum Beispiel ein Feld leer ist oder vielleicht ein Buchstabe eingetipt wurde.
V:= StrToFloat(edit1.text)/1000;
Dichte:= StrToFloat(edit11.text); n:= StrToFloat(edit10.Text)/1000000; Diese kannst du mit Tryxxx prüfen, ob die vermeintliche Zahl gewandelt werden konnte. Dann solltest du erst rechnen. |
AW: Edit-Felder auf Inhalt prüfen
Hey,
ich bekomms nicht hin :( ich will jetzt einfach nur, dass die Rechnung wieder funktioniert. Das soll dann reichen. Ich habe alles auf den Anfangszustand gebracht. Wisst ihr, warum das jetzt trotzdem nicht funktioniert? Es kommt die Meldung: Floating point overflow |
AW: Edit-Felder auf Inhalt prüfen
Wie sieht es denn aus mit dem Durchsteppen des Programms?
Dann wirst du sehen, wo es hängt. Versuche doch am Anfang alles mit Try in Float zu wandeln. Wenn die Funktion fehlschlägt, dann konnte der Wert nicht in einen Float Wert gewandelt werden. Das sollte doch machbar sein von dir oder? |
AW: Edit-Felder auf Inhalt prüfen
Zitat:
![]() Kurz gefasst die Strukturierung des Quelltextes zur besseren Les- und Wartbarkeit Ich habe das mal für deinen geposteten Quelltext versucht...
Delphi-Quellcode:
Dabei sieht man dann unter anderem, dass der gesamte Codeblock nach
procedure TForm2.Button1Click(Sender: TObject);
var V, Dichte, n, Re, Laenge, Ergebnis, d: Double; Ausgabe: string; begin V:= StrToFloat(edit1.text)/1000; Dichte:= StrToFloat(edit11.text); n:= StrToFloat(edit10.Text)/1000000; Ausgabe:= 'Berechnung fehlgeschlagen'; case combobox2.ItemIndex of 0: d:= 0.01; 1: d:= 0.012; 2: d:= 0.015; 3: d:= 0.02; 4: d:= 0.025; 5: d:= 0.032; 6: d:= 0.04; 7: d:= 0.05; 8: d:= 0.06; 9: d:= 0.065; 10: d:= 0.08; 11: d:= 0.1; end; Re:= 4*V*Dichte/d/n/3.1416; if Re >= 2320 then begin ShowMessage('Es liegt keine laminare Strömung mehr vor! Reduziere den Volumenstrom und/oder erhöhe den Rohrdurchmesser!'); if not TryStrToFloat(edit1.Text, V) then begin showmessage('Werte für Volumenstrom und Länge eingeben!'); edit1.SetFocus; edit1.SelectAll; end else if not TryStrToFloat(edit2.Text, Laenge) then begin showmessage('Werte für Volumenstrom und Länge eingeben!'); edit2.SetFocus; edit2.SelectAll; end else begin Ergebnis:= 40.744/1000000/d/d/d/d*StrToFloat(edit10.Text)*StrToFloat(edit1.Text)*StrToFloat(edit2.text); Ausgabe := FloatToStr(Ergebnis); end; edit3.text:= Ausgabe; if Re >=2320 then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; end; end;
Delphi-Quellcode:
auch nur in diesem Falle ausgeführt wird.
if Re >= 2320 then
|
AW: Edit-Felder auf Inhalt prüfen
Wie sollte das denn aussehen? Ich muss doch zwischen "end else begin" die Variablen zuweisen ansonsten kann doch nicht gerechnet werden oder?
Bin hier total am verzweifeln. Das Überprüfen ist nicht zwingend notwendig, aber dadurch, dass ich es versucht habe, klappt gar nichts mehr. Ich sehe woran es hängt, nämlich Re:= 4*..., allerdings kann ich damit rein gar nichts anfangen! |
AW: Edit-Felder auf Inhalt prüfen
Nochmal: erst auf gültige Eingaben prüfen und dann entweder rechnen oder Fehlermeldung ausgeben. Nicht andersherum.
|
AW: Edit-Felder auf Inhalt prüfen
Um vielleicht mal einen Ansatz mit etwas Quellcode zu liefern...
So fängt es bei dir an:
Delphi-Quellcode:
Und so sollte es anfangen
procedure TForm2.Button1Click(Sender: TObject);
var V, Dichte, n, Re, Laenge, Ergebnis, d: Double; Ausgabe: string; begin //schlägt fehl, wenn in Edit1 Mist drin steht -> exception V:= StrToFloat(edit1.text)/1000;
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var V, Dichte, n, Re, Laenge, Ergebnis, d: Double; Ausgabe: string; begin //hier wird versucht, V aus Edit1 einzulesen //wenn das funktioniert, geht es mit true weiter if TryStrToFloat(edit1.text, V) then begin V := V/1000; {weitere Werte einlesen, rechnen, Rechnung prüfen} end else begin showmessage('Werte für Volumenstrom und Länge eingeben!'); edit1.SetFocus; edit1.SelectAll; end; end; |
AW: Edit-Felder auf Inhalt prüfen
Bevor ich mich daran nochmal versuche, möchte ich aber, dass die Rechnung wieder einwandfrei läuft und ich das ganze dann nochmal abspeichern kann. Was ist denn jetzt daran falsch?:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var d,V,Dichte,n,Re: real; begin V:= StrToFloat(edit1.Text)/1000; Dichte:= StrToFloat(edit11.Text); n:= StrToFloat(edit10.Text)/1000000; case combobox2.ItemIndex of 0: d:= 0.01; 1: d:= 0.012; 2: d:= 0.015; 3: d:= 0.02; 4: d:= 0.025; 5: d:= 0.032; 6: d:= 0.04; 7: d:= 0.05; 8: d:= 0.06; 9: d:= 0.065; 10: d:= 0.08; 11: d:= 0.1; end; Re:= 4*V*Dichte/d/n/3.1416; if Re >= 2320 then begin ShowMessage('Es liegt keine laminare Strömung mehr vor! Reduziere den Volumenstrom und/oder erhöhe den Rohrdurchmesser!'); end; edit3.text:= FloatToStr(40.744/d/d/d/d*n*V*StrToFloat(edit2.text)); if Re >=2320 then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; end; |
AW: Edit-Felder auf Inhalt prüfen
Es wurden Dir achon viele Tipps gegeben, welche Du einfach so in den Wind schreibst (Formatierung Try<Typ>To<Typ> usw.)
|
AW: Edit-Felder auf Inhalt prüfen
Welche Programmierumgebung verwendest du denn? Bist du schonmal über den Debugger Schritt für Schritt durchgegangen?
Was genau läuft nicht so, wie es soll? |
AW: Edit-Felder auf Inhalt prüfen
Zitat:
|
AW: Edit-Felder auf Inhalt prüfen
Na vielleicht erhalten wir ja diesmal eine Antwort, anhand deren man weiterhelfen kann.
|
AW: Edit-Felder auf Inhalt prüfen
Debugger durchgehen?
Also wenn ich das Programm laufen lasse und berechnen will (also die Rechnung, in der Edit1 und Edit2 benutzt werden und in Edit3 das Ergebnis gezeigt wird) zeigt er mir das hier: "Re:= 4*V*Dichte/d/n/3.1416;" rot an. Dazu die Meldung "floating point overflow". Wenn ich F8 drücke (ist das mit debuggen gemeint?) zeigt er mir noch folgendes rot an: "if Re >=2320 then begin edit3.text:= 'Berechnung fehlgeschlagen'; end;". Hab den gleichen Quellcode in eine ältere Version des Programms kopiert, da läufts einwandfrei. Danke, dass ihr mich noch nicht aufgegeben habt :oops: |
AW: Edit-Felder auf Inhalt prüfen
Nochmals die Frage, welche Programmierumgebung.. Lazarus? Delphi?
Du solltest, wenn du auf die Leiste links des Quelltextes klickst, einen Haltepunkt setzen können. Der Debugger sollte dann an dieser Stelle anhalten und du solltest sehen können, welche Werte die Variablen zu diesem zeitpunkt haben. Das erklärt dann möglicherweise schon den Fehler.. |
AW: Edit-Felder auf Inhalt prüfen
Ich benutze Delphi7.
Ok also ich setze den Haltepunkt, die Zeile ist dann mit einem roten Punkt markiert. Dann starte ich mit F9. Wenn ich dann berechnen will, dann kommt wieder die gleiche Fehlermeldung wie beschrieben mit den rot markierten Formeln. |
AW: Edit-Felder auf Inhalt prüfen
Du compilierst den Programm mit F9, es startet ohne Fehlermeldung. Dann trägst du deine Werte in die Edit-Felder ein, klickst den Button zum Berechnen und dein Programm schmiert mit einer Exception "floating point overflow" ab?
Wenn du den Haltepunkt auf die erste Zeile deiner Prozedur (
Delphi-Quellcode:
) setzt - wird dieser Haltepunkt erreicht? Danach kannst du mit F8 Zeile für Zeile weitergehen und prüfen, mit welchen Werten konkret gerechnet wird.
V:= StrToFloat(edit1.Text)/1000;
Floating Point Overflow deutet auf Werte hin, die den Wertebreich deines Datentypen "sprengen", vielleicht ist ja einer deiner Werte nicht korrekt initialisiert. |
AW: Edit-Felder auf Inhalt prüfen
Ja, ich denke er wird erreicht. Es steht nun zumindest ein grünes Häkchen auf dem roten Punkt. Wenn ich dann mit F8 weiter gehe, sind diese Zeilen rot gefärbt:
Delphi-Quellcode:
wenn ich dann nochmal F8 drücke springt er zu
Dichte:= StrToFloat(edit11.Text);
n:= StrToFloat(edit10.Text)/1000000; case combobox2.ItemIndex of
Delphi-Quellcode:
wenn ich ein weiteres mal F8 drücke kommt wieder die Meldung "floating point overflow". Also hängt es mit der letzten Formel zusammen? Bei d ist auch ein anderer Wert angegeben wenn ich die Maus drauf halte. Wie kann das sein? Was muss ich ändern?
Re:= 4*V*Dichte/d/n/3.1416;
|
AW: Edit-Felder auf Inhalt prüfen
Wo wird d denn ein Wert zugewiesen, vor oder nach der Formel?
|
AW: Edit-Felder auf Inhalt prüfen
vorher
|
AW: Edit-Felder auf Inhalt prüfen
Nochmal der Quellcode:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var d,V,Dichte,n,Re: real; begin V:= StrToFloat(edit1.Text)/1000; Dichte:= StrToFloat(edit11.Text); n:= StrToFloat(edit10.Text)/1000000; case combobox2.ItemIndex of 0: d:= 0.01; 1: d:= 0.012; 2: d:= 0.015; 3: d:= 0.02; 4: d:= 0.025; 5: d:= 0.032; 6: d:= 0.04; 7: d:= 0.05; 8: d:= 0.06; 9: d:= 0.065; 10: d:= 0.08; 11: d:= 0.1; end; Re:= 4*V*Dichte/d/n/3.1416; if Re >= 2320 then begin ShowMessage('Es liegt keine laminare Strömung mehr vor! Reduziere den Volumenstrom und/oder erhöhe den Rohrdurchmesser!'); end; edit3.text:= FloatToStr(40.744/d/d/d/d*n*V*StrToFloat(edit2.text)); if Re >=2320 then begin edit3.text:= 'Berechnung fehlgeschlagen'; end; end; |
AW: Edit-Felder auf Inhalt prüfen
Dann kann ja kein anderer Wert drinstehen, es sei denn, er wird zwischendurch wieder überschrieben oder der ItemIndex der ComboBox passt zu keinem case-Label. Gibt denn der Compiler keine Meldungen/Warnungen aus?
|
AW: Edit-Felder auf Inhalt prüfen
Habe es gerade durch Zufall herausgefunden: Der Grund war wie DeddyH schreibt der itemindex der combobox. Der stand auf -1. Bin mir sicher, dass ich daran nichts geändert habe..naja mit itemindex 0 funktionierts wieder!
Vielen Dank euch!! |
AW: Edit-Felder auf Inhalt prüfen
Aber der itemindex der Combobox hängt doch davon ab, was du anklickst, nicht vom Programm :stupid:
|
AW: Edit-Felder auf Inhalt prüfen
Zitat:
Delphi-Quellcode:
uninitialisiert, was dann ein eher zufälliges Ergebnis produziert. ;)
d
|
AW: Edit-Felder auf Inhalt prüfen
Klar, er prüft ja auch sonst nichts - bloss frage ich mich, warum er sich über unsinnige Ergebnisse wundert, wenn er dem Programm nicht eingibt, was es rechnen soll...
Zitat:
|
AW: Edit-Felder auf Inhalt prüfen
Ich meine mich zu erinnern, das der ItemIndex auf -1 steht, solange man nichts in der Combo *verändert*, d.h. steht dort schon eine Auswahl drin (per OI reingepackt), habe ich dort eben die -1 drin.
Daher verlasse ich mich erst gar nicht auf den ItemIndex und setze ihn
Delphi-Quellcode:
(Komm mir keiner mit 'with' ist böse)
with ComboBox1 do ItemIndex := Items.IndexOf(Text);
Aber, was lehrt uns das? Immer! Immer und ohne Ausnahme: In ein Case-Statement gehört ein ELSE! |
AW: Edit-Felder auf Inhalt prüfen
Wobei in dem Fall ein case Statement ohnehin Unsinn ist:
Delphi-Quellcode:
const werte:array[0..10] of real = (xx, xx, ...);
... d:=werte[combobox2.ItemIndex] Zitat:
|
AW: Edit-Felder auf Inhalt prüfen
Zitat:
andersrum: es wird der Text angezeigt, der zu Itemindex passt, auch wenn im OI ein anderer text eingegeben wurde. Will man eine Vorauswahl haben, muss man im OI den Itemindex entprechend setzen - es hängt natürlich auch vom Style der Compbobox ab. Aber jedenfalls sieht der User, was er ausgewählt hat, wenn er auf den Execute-button (oder so) klickt. |
AW: Edit-Felder auf Inhalt prüfen
Hallo,
um noch mal auf das Abfangen leerer Edit-Felder zurückzukommen. Dein if editxxx.Text='' muss vor dem ersten StrToFloat(editxxx.Text) kommen. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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