Autor Beitrag
Koyotee
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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

ausblenden volle Höhe 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:
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; // Ergebnis
 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;
   // Ergebnis zurückgeben
   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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
owModulo:   erg := Round(StrToFloat(wert1)) mod Round(StrToFloat(wert2));					

ub60
Koyotee Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 31.03.25 21:02 
Hi,
Danke, habe
ausblenden Delphi-Quelltext
1:
owModulo:   erg := StrToInt(wert1) mod StrToInt(wert2);					

durch deinen Code ersetzt, gleiches Ergebnis "...kein gültiger integerwert"

VG
Harald

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 01.04.25 07:47 
user profile iconKoyotee hat folgendes geschrieben Zum zitierten Posting springen:
der Fehler "1,5511 ist kein gültiger integerwert" angezeigt

Naja, 1,5511 ist auch kein Integerwert, sondern ein Floatwert.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 01.04.25 08:08 
user profile iconKoyotee hat folgendes geschrieben Zum zitierten Posting springen:
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

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Text := '' +                              //edit3= edit1 mal edit7 (wert= 1,2375)
     Berechnen(owmal, Edit1.Text, Edit7.Text);  //edit1 (wert= 1,5) edit7 (wert= 0,825)
  
 edit12.text:='' +                              //edit12 (wert= 1237,5)
 berechnen (owmal, Edit3.Text, Edit9.Text);     //edit3 (wert= 1,2375) mal edit9 (wert = 1000)
 end;


VG
Harald
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ausblenden volle Höhe 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
function TForm2.Berechnen(operator: TOperatorWahl; wert1, wert2: string): string;
 var
   erg: Double; // Ergebnis

    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;
   // Ergebnis zurückgeben
   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);
 {Edit3.Text := IntToStr(Trunc(1)) ; }     //siehe unten *
edit4.text:=''  +
Berechnen(owmal, Edit3.Text, Edit9.Text);  //hier wird mit 1000 multipl. um einen 4-stelligen Vorkommawert zu erhalten
Edit11.Text := edit4.Text ;                //der 4-stellige Wert wird in Edit11 von Edit4 geschrieben
Edit11.text :=inttostr(Trunc(1.5)) ;       //danach der trunc Befehl (auch wenn ich ihn wie oben * ausführen lasse, egal es wird immer nur 
                                           //1 gerundete Zahl vor dem Komma angezeigt 


end;


Irgendwie begreif ich's halt nett, sorry.

VG
Harald
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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:
ausblenden 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.
ausblenden 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); // Erstmal aus dem Editfeld eine Zahl machen, die man verarbeiten kann
  IntWert := Trunc(DoubleWert); // Wir brauchen von der Zahl nur den Vorkommaanteil
  Edit11.text := inttostr(IntWert); // Damit es im Edit11 angezeigt werden kann, muss aus dem Integer wieder ein String gemacht werden
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:
ausblenden 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; // Ergebnis
   zwerg1, zwerg2 : Integer; // Zwischenergebnis

    begin
    case operator of
   
     owMal:      erg := StrToFloat(wert1) * StrToFloat(wert2);
     owPlus:     erg := StrTofloat(wert1) + StrToFloat(wert2);
     owModulo: begin
       zwerg1 := trunc(StrToFloat(wert1)); // Erstmal aus dem String eine Zahl machen und dann die Nachkommastellen abschneiden
       zwerg2 := trunc(StrToFloat(wert2)); // Erstmal aus dem String eine Zahl machen und dann die Nachkommastellen abschneiden
       erg := zwerg1 mod zwerg2;
     end;
     owdiv:      erg := StrToFloat(wert1) / StrToFloat (wert2);
     owsub:      erg := StrToFloat(wert1) - StrToFloat(wert2);

   end;
   // Ergebnis zurückgeben
   result:= floatTostr(erg);

   end;

Deine Hauptmethode sähe dann so aus:
ausblenden 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>); // Die Werte müssen noch korrekt übergeben werden
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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 02.04.25 09:46 
Guten Morgen Peter,
ja, du hast recht, ich bin noch immer blutiger Anfänger mit meinen >70 Jahren :roll:

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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 02.04.25 10:44 
Hi Harald,

es gibt Menschen, die älter sind als ich und sich neu auf Programmierung einlassen? RESPEKT! :zustimm:
Ich bin erst über 60 :wink:

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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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.