| 
| Autor | Beitrag |  
| Koyotee Hält's aus hier
 Beiträge: 12
 
 
 
 
 | 
Verfasst: Mo 31.03.25 15: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:
 
 | usesSystem.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 19: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 20: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Di 01.04.25 06: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Di 01.04.25 07: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 10: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Di 01.04.25 13: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: Di 01.04.25 23: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Mi 02.04.25 06: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 08: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Mi 02.04.25 09: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 12: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Mi 02.04.25 13: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 21: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. |  |  |  |