Autor |
Beitrag |
Koyotee
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 31.03.25 16:42
Hallo,
benötige nochmals eure Hilfe:
Im Projekt werden über Edit-Felder Berechnungen ausgeführt (hier gehts nur um Edit1-3 den Rest habe ich aus dem Code rausgenommen), einige Felder werden keine ganzen Zahlen enthalten (z.B. 0.123 bzw. 0,123)
die addiert werden. Als Nachkommastelle benötige ich nur 3 Stellen.
Ich habe mir schon einige Beispiele (Zahl *100 / 100) angeschaut, komme aber damit nicht klar.
Komischerweise wird die Berechnung zwar durchgeführt (1,5511 *2,3 = 3,56753), es wird aber vorher der Fehler "1,5511 ist kein gültiger integerwert" angezeigt
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:
| uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListBox, FMX.ScrollBox, FMX.ExtCtrls, FMX.Edit;
type
TOperatorWahl = (owMal,owsub,owdiv,owPlus,owModulo); TForm1 = class(TForm) PresentedScrollBox1: TPresentedScrollBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject);
private function Berechnen(operator: TOperatorWahl; wert1, wert2: string): string; public
end;
var Form1: TForm1;
implementation
{$R *.fmx}
function TForm1.Berechnen(operator: TOperatorWahl; wert1, wert2: string): string; var erg: Double; begin case operator of
owMal: erg := StrToFloat(wert1) * StrToFloat(wert2); owPlus: erg := StrTofloat(wert1) + StrToFloat(wert2); owModulo: erg := StrToInt(wert1) mod StrToInt(wert2); owdiv: erg := StrToFloat (wert1) / StrToFloat (wert2); owsub: erg := StrToFloat(wert1) - StrToFloat(wert2);
end; result:= floatTostr(erg);
end;
procedure TForm1.Button1Click(Sender: TObject); begin Edit3.Text := '' + Berechnen(owmal, Edit1.Text, Edit2.Text); Edit3.Text:= inttostr(Round(strtoint(edit1.Text)/strtoint(edit2.Text)));
end;
end. |
Wäre für die Korrektur des Codes sehr dankbar.
VG
Harald
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Mo 31.03.25 20:12
Integer sind ganze Zahlen. Den mod-Operator kannst Du sowieso nur mit ganzen Zahlen benutzen, Du verwendest aber Dezimalbrüche.
Eventuell meinst Du ja:
Delphi-Quelltext 1:
| owModulo: erg := Round(StrToFloat(wert1)) mod Round(StrToFloat(wert2)); |
ub60
|
|
Koyotee 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 31.03.25 21:02
Hi,
Danke, habe
Delphi-Quelltext 1:
| owModulo: erg := StrToInt(wert1) mod StrToInt(wert2); |
durch deinen Code ersetzt, gleiches Ergebnis "...kein gültiger integerwert"
VG
Harald
Moderiert von Th69: Delphi-Tags hinzugefügt
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 01.04.25 07:47
Koyotee hat folgendes geschrieben : | der Fehler "1,5511 ist kein gültiger integerwert" angezeigt |
Naja, 1,5511 ist auch kein Integerwert, sondern ein Floatwert.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 01.04.25 08:08
Koyotee hat folgendes geschrieben : | Komischerweise wird die Berechnung zwar durchgeführt (1,5511 *2,3 = 3,56753), es wird aber vorher der Fehler "1,5511 ist kein gültiger integerwert" angezeigt
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| case operator of
owMal: erg := StrToFloat(wert1) * StrToFloat(wert2);
[...]
procedure TForm1.Button1Click(Sender: TObject); begin Edit3.Text := '' + Berechnen(owmal, Edit1.Text, Edit2.Text); Edit3.Text:= inttostr(Round(strtoint(edit1.Text)/strtoint(edit2.Text)));
end; |
|
Dann schauen wir doch einmal, was da passiert:
Du rufst zuerst Berechnen mit owmal auf. Also wird die Zeile mit StrToFloat ausgeführt, multipliziert und das Ergebnis landet in Edit3.Text. Das siehst du aber noch nicht, da weitere Befehle folgen und daher die Oberfläche noch nicht neu gezeichnet wurde.
Danach folgt die von mir hervorgehobene Zeile. Dazu zwei Punkte:
- Du packst das Ergebnis wieder in Edit3.Text. Damit wäre das Ergebnis der ersten Zeile überschrieben und nicht mehr da.
- Du verwendest StrToInt, obwohl in Edit1.Text mit 1,5511 gar keine ganze Zahl steht. Dadurch gibt es den Fehler und die Zeile wird nicht zu Ende ausgeführt. Dadurch bleibt das Ergebnis aus der vorherigen Zeile erhalten.
Kommentiere die zweite Zeile einfach mal aus oder entferne sie. Dann wird es auch keinen Fehler mehr geben.
|
|
Koyotee 
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 01.04.25 11:07
Hallo Sebastian,
Danke, soweit klar.
Aber wie bekomme ich jetzt das Runden hin.
Ich habe es ersteinmal soweit hinbekommen, dass ich durch multipl. mit 1000 auf eine Vorkommazahl komme und nun möchte ich die Nachkommazahl auf ganze Zahl auf- abrunden.
VG
Harald
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); begin Edit3.Text := '' + Berechnen(owmal, Edit1.Text, Edit7.Text); edit12.text:='' + berechnen (owmal, Edit3.Text, Edit9.Text); end; |
VG
Harald
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 01.04.25 14:14
Hallo Harald,
schaue dir in der Delphi-Hilfe die Funktionen round, roundto und trunc für Details an.
round rundet nach der üblichen amerikanischen Weise. Sogenanntes Bankersrounding. Mit bestimmten Einstellungen kann man aber z.B. immer Auf- oder Abrunden. Deswegen Details in der Hilfe ansehen.
roundto steht in der Bilbiothek math und rundet, wie bei uns üblich nach der 4/5-Rundung. Manchmal auch kaufmännisches Runden genannt.
Trunc schneidet einfach die Nachkommastellen ab.
|
|
Koyotee 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 02.04.25 00:09
Hi Jasocul,
OK, habe mir mal die Hilfe zu Gemüte geführt, bin aber noch immer nicht daraus schlau geworden denn Trunc funktioniert nicht wie du geschrieben hast
Zitat: | ....Trunc schneidet einfach die Nachkommastellen ab... |
hier mal inzwischen mein code
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:
| function TForm2.Berechnen(operator: TOperatorWahl; wert1, wert2: string): string; var erg: Double; begin case operator of owMal: erg := StrToFloat(wert1) * StrToFloat(wert2); owPlus: erg := StrTofloat(wert1) + StrToFloat(wert2); owModulo: erg := StrToInt(wert1) mod StrToInt(wert2); owdiv: erg := StrToFloat (wert1) / StrToFloat (wert2); owsub: erg := StrToFloat(wert1) - StrToFloat(wert2);
end; result:= floatTostr(erg);
end;
procedure TForm2.Button1Click(Sender: TObject); begin edit6.text:='' + Berechnen(owdiv, Edit5.Text, Edit2.Text); edit3.text:='' + Berechnen(owdiv, Edit6.Text, Edit7.Text); edit4.text:='' + Berechnen(owmal, Edit3.Text, Edit9.Text); Edit11.Text := edit4.Text ; Edit11.text :=inttostr(Trunc(1.5)) ;
end; |
Irgendwie begreif ich's halt nett, sorry.
VG
Harald
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 02.04.25 07:37
Das Problem scheint zu sein, dass du nicht weißt, was du da machst. Aufgrund des Sources hatte ich vorausgesetzt, dass du grundsätzlich mit Delphi umgehen kannst. Das ist übrigens kein Vorwurf.
Fangen wir also etwas weiter vorne an.
Eine Zuweisung Edit11.Text := edit4.Text; bringt nichts, wenn du diese hinterher wieder überschreibst Edit11.text :=inttostr(Trunc(1.5));. "edit11.Text" wird am Schluss immer den Inhalt aus der zweiten Zuwesiung haben.
Warum immer "1" in edit11.Text steht:
Du machst ein Trunc auf 1.5. Das heißt, du schneidest von 1.5 die Nachkommastellen ab. Das Ergebnis ist 1. Wenn du andere Ergebnisse haben möchtest, musst du Trunc auch was anderes als Parameter übergeben. Ich vermute, dass du den Inhalt von Edit4.Text ohne Nachkommastellen an Edit11.Text übergeben möchtest.
Das könnte dann so aussehen:
Delphi-Quelltext 1:
| Edit11.text := inttostr(Trunc(StrToFloat(edit4.Text))); |
Das ist weit entfernt davon für dich lesbarer Code zu sein. Daher möchte ich dir zeigen, was im einzelnen passiert.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm2.Button1Click(Sender: TObject); var DoubleWert : Double; IntWert : Integer; begin edit6.text := Berechnen(owdiv, Edit5.Text, Edit2.Text); edit3.text := Berechnen(owdiv, Edit6.Text, Edit7.Text); edit4.text := Berechnen(owmal, Edit3.Text, Edit9.Text);
DoubleWert := StrToFloat(edit4.Text); IntWert := Trunc(DoubleWert); Edit11.text := inttostr(IntWert); end; |
Das ist aber nur zur Veranschaulichung, denn eigentlich willst du das für die Modulo-Berechnung haben. Also muss das in deine Function "Berechnen".
Die könnte dann so aussehen:
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:
| function TForm2.Berechnen(operator: TOperatorWahl; wert1, wert2: string): string; var erg: Double; zwerg1, zwerg2 : Integer; begin case operator of owMal: erg := StrToFloat(wert1) * StrToFloat(wert2); owPlus: erg := StrTofloat(wert1) + StrToFloat(wert2); owModulo: begin zwerg1 := trunc(StrToFloat(wert1)); zwerg2 := trunc(StrToFloat(wert2)); erg := zwerg1 mod zwerg2; end; owdiv: erg := StrToFloat(wert1) / StrToFloat (wert2); owsub: erg := StrToFloat(wert1) - StrToFloat(wert2);
end; result:= floatTostr(erg);
end; |
Deine Hauptmethode sähe dann so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm2.Button1Click(Sender: TObject); begin edit6.text := Berechnen(owdiv, Edit5.Text, Edit2.Text); edit3.text := Berechnen(owdiv, Edit6.Text, Edit7.Text); edit4.text := Berechnen(owmal, Edit3.Text, Edit9.Text); edit11.text := Berechnen(owModulo, <erster Wert>, <zweiter Wert>); end; |
Ob das jetzt wirklich das ist, was du haben wolltest, weiß ich nicht. Aber vielleicht hilft das, um zu verstehen, was gemacht werden muss.
|
|
Koyotee 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 02.04.25 09:46
Guten Morgen Peter,
ja, du hast recht, ich bin noch immer blutiger Anfänger mit meinen >70 Jahren
Ich werde es mal so ausprobieren und melde mich wieder.
Als du Modulo geschrieben hast ist es mir wie Schuppen von den Augen gefallen, das hatte ich in einem früheren Projekt schon mal verwendet und da wurde, so wie ich es benötigte, "gerundet".
BTW, du hast das für mich wunderbar erklärt, dafür erst einmal herzlichen Dank (wo befindet sich denn der "Danke" Button?)
BG Harald
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 02.04.25 10:44
Hi Harald,
es gibt Menschen, die älter sind als ich und sich neu auf Programmierung einlassen? RESPEKT!
Ich bin erst über 60
Für Hilfe ist das Forum da. Leider ist hier immer weniger los und ich schaue auch nicht mehr so oft vorbei. Ich rufe aber fast täglich die Delphi-Praxis auf. Der Ton ist dort in seltenen Fällen ein wenig rauer, aber dafür ist dort mehr los.
Achso, der Danke-Button ist unten links und heißt "THX". Aber ich helfe auch gerne ohne ein besonderes Danke
Gruß
Peter
Für diesen Beitrag haben gedankt: Koyotee
|
|
Koyotee 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 02.04.25 13:19
Hallo Peter,
ne, ne, der Danke Eintrag gehört dir schon und das von Herzen.
Hab's mal in meinen Code übertragen und es funktioniert einwandfrei.
Sofern ich noch Fragen (zu anderen für mich Ungereimtheiten) habe, darf ich dir auch eine PN schicken?
Das Projekt ist fast abgeschlossen, es fehlen nur noch, so glaube ich, Kleinigkeiten:
2Finger Gesten in Android (werd ich aber erst mal selbst ergründen)
Bild einfügen Timage (Größe wird mom. abgeschnitten und wandert beim scrollen mit, auch das eruiere ich erst mal selbst)
BG
Harald
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 02.04.25 14:12
Bitte keine PN.
Wenn ich uns Forum sehe, bin ich meistens nicht angemeldet. Daher sehe ich es nicht, wenn ich eine PN bekomme.
Außerdem hilft die öffentliche Bearbeitung von Problemen auch Anderen, wenn diese über ein ähnliches Problem stolpern.
|
|
Koyotee 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 02.04.25 22:00
Guten Abend Peter,
geht klar!
Zitat: | Bild einfügen Timage (Größe wird mom. abgeschnitten und wandert beim scrollen mit, auch das eruiere ich erst mal selbst) |
Hat sich erledigt, Form war wohl irgendwie "beschädigt", Neue Form angelegt, alles klar.
|
|
|