Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - mehrfache berechnung von werten verhindern


apoc - So 12.12.04 20:50
Titel: mehrfache berechnung von werten verhindern
ich habe ein textfeld in dem eine zahl von 1-6 in 0,5er schritten steht diese zahl soll nach klicken eines buttons wie folgt umgewandelt werden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if edit1.text='1' then edit1.text:='12';
if edit1.text='1,5' then edit1.Text:='10';
if edit1.text='2' then edit1.text:='8';
if edit1.text='2,5' then edit1.text:='6';
if edit1.text='3' then edit1.text:='4';
if edit1.text='3,5' then edit1.text:='2';
if edit1.text='4' then edit1.text:='0';
if edit1.text='4,5' then edit1.text:='-2';
if edit1.text='5' then edit1.text:='-4';
if edit1.text='5,5' then edit1.text:='-6';
if edit1.text='6' then edit1.text:='-8';

es funktioniert bei allen werten, nur nicht beim wert 2,5 und 3 da kommt dann -8 und 0 raus.. woran liegt das???

hier ist der gesammte quelltext:

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:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
unit Comuniorechner;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Button1: TButton;
    Label12: TLabel;
    Button2: TButton;
    Label13: TLabel;
    Label14: TLabel;
    Button3: TButton;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Spieler1, Spieler2 , Spieler3, Spieler4, Spieler5, Spieler6, Spieler7, Spieler8, Spieler9, Spieler10, Spieler11, Stuermertore, Mittelfeldspielertore, Abwehrspielertore, GelbRoteKarten, RoteKarten, Gesamt: integer;


implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Spieler1 := StrToInt(Edit1.Text);
Spieler2 := StrToInt(Edit2.Text);
Spieler3 := StrToInt(Edit3.Text);
Spieler4 := StrToInt(Edit4.Text);
Spieler5 := StrToInt(Edit5.Text);
Spieler6 := StrToInt(Edit6.Text);
Spieler7 := StrToInt(Edit7.Text);
Spieler8 := StrToInt(Edit8.Text);
Spieler9 := StrToInt(Edit9.Text);
Spieler10 := StrToInt(Edit10.Text);
Spieler11 := StrToInt(Edit11.Text);
Stuermertore := StrToInt (Edit12.Text);
Mittelfeldspielertore := StrToInt (Edit13.Text);
Abwehrspielertore := StrToInt (Edit14.Text);
GelbRoteKarten := StrToInt (Edit15.Text);
RoteKarten := StrToInt (Edit16.Text);

Gesamt := Spieler1 + Spieler2 + Spieler3 + Spieler4 + Spieler5 + Spieler6 + Spieler7 + Spieler8 + Spieler9 + Spieler10 + Spieler11 + Stuermertore + Mittelfeldspielertore + Abwehrspielertore + GelbRoteKarten + RoteKarten;

Label12.Caption :=IntToStr(Gesamt);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if edit1.text='1' then edit1.text:='12';
if edit1.text='1,5' then edit1.Text:='10';
if edit1.text='2' then edit1.text:='8';
if edit1.text='2,5' then edit1.text:='6';
if edit1.text='3' then edit1.text:='4';
if edit1.text='3,5' then edit1.text:='2';
if edit1.text='4' then edit1.text:='0';
if edit1.text='4,5' then edit1.text:='-2';
if edit1.text='5' then edit1.text:='-4';
if edit1.text='5,5' then edit1.text:='-6';
if edit1.text='6' then edit1.text:='-8';

end;

end.


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


apoc - So 12.12.04 20:56

ok mir ist aufgefallen dass die zahlen mehrmals umgewandelt werden also wenn aus der 2,5 eine 6 werden soll wird die 6 weiter umgewandelt in eine -8
wie kann ich einstellen dass diese aktion nur einmal durchgefürht wird?


Alstar - So 12.12.04 21:01

z.B. so:


Delphi-Quelltext
1:
2:
3:
4:
5:
if edit1.text='1' then 
begin
  edit1.text:='12';
  exit;
end;


IngoD7 - So 12.12.04 21:37

apoc hat folgendes geschrieben:
wie kann ich einstellen dass diese aktion nur einmal durchgefürht wird?
íf ... then ... else


apoc - So 12.12.04 22:09

mit else klappt irgendwie nicht!?
ist der befehl dann:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if edit1.text='1' then edit1.text:='12' else;
if edit1.text='1,5' then edit1.Text:='10' else;
if edit1.text='2' then edit1.text:='8' else;
if edit1.text='2,5' then edit1.text:='6' else;
if edit1.text='3' then edit1.text:='4' else;
if edit1.text='3,5' then edit1.text:='2' else;
if edit1.text='4' then edit1.text:='0' else;
if edit1.text='4,5' then edit1.text:='-2' else;
if edit1.text='5' then edit1.text:='-4' else;
if edit1.text='5,5' then edit1.text:='-6' else;
if edit1.text='6' then edit1.text:='-8' else;

???

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


apoc - So 12.12.04 22:59

Alstar hat folgendes geschrieben:
z.B. so:


Delphi-Quelltext
1:
2:
3:
4:
5:
if edit1.text='1' then 
begin
  edit1.text:='12';
  exit;
end;


das funktioniert bei mir nicht.. es kommt die fehlermeldung

[Error] Comuniorechner.pas(97): Declaration expected but 'IF' found


Tino - So 12.12.04 23:05

apoc hat folgendes geschrieben:
mit else klappt irgendwie nicht!?
ist der befehl dann:
{...}

Dann schau dir mal in der Delphi-Hilfe (F1) an wie man ELSE anwendet. Hier im Forum findest du auch einige Beispiele.


JayEff - Mo 13.12.04 00:05

Tino hat folgendes geschrieben:
Hier im Forum findest du auch einige Beispiele.

... einige 100.000 glaub ich... moment... ne, nur 478:
DelphiForumSuche hat folgendes geschrieben:
Die Suche hat 478 Ergebnisse ergeben.

Ich wette, du findest in mind. 90% der Ergebnisse eine korrekte Verwendung von
if <bedingung> then <anweisung> else <anweisung>;

PS: Ich meins nicht böse :D nicht so auffassen, ok?


IngoD7 - Mo 13.12.04 10:46

apoc hat folgendes geschrieben:
mit else klappt irgendwie nicht!?
ist der befehl dann:

Delphi-Quelltext
1:
2:
if edit1.text='1' then edit1.text:='12' else;
[...]

???


Wieso stocherst du so herum?
Benutze die Delphi-Hilfe! Suche im Index mal "if-Anweisungen" und arbeite das durch, damit du nicht nur irgendwann irgendetwas abschreibst und herumprobierst, bis es passt, sondern das auch verstehst.


.Chef - Mo 13.12.04 10:53


Delphi-Quelltext
1:
Edit1.Text:=IntToStr(12-(StrToInt(Edit1.Text)-1)*4);                    

Grobe Schätzung ...

Gruß,
Jörg


IngoD7 - Mo 13.12.04 11:04

.Chef hat folgendes geschrieben:
Grobe Schätzung ...

Stimmt, 8) da seine Edit-Inhalte nicht so wirklich nach Integer aussehen. :shock: :wink:


.Chef - Mo 13.12.04 11:20

Jaaa, dann halt StrToFloat und Round ums Ganze. Ich wollte eher aufs Prinzip hinweisen. :roll:


IngoD7 - Di 14.12.04 12:29

.Chef hat folgendes geschrieben:
Ich wollte eher aufs Prinzip hinweisen. :roll:

Achsooooo. Ja dann kann es natürlich so stehen bleiben. :lol:


patrick - Di 14.12.04 13:15

apoc hat folgendes geschrieben:
mit else klappt irgendwie nicht!?
ist der befehl dann:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if edit1.text='1' then edit1.text:='12' else;
if edit1.text='1,5' then edit1.Text:='10' else;
if edit1.text='2' then edit1.text:='8' else;
if edit1.text='2,5' then edit1.text:='6' else;
if edit1.text='3' then edit1.text:='4' else;
if edit1.text='3,5' then edit1.text:='2' else;
if edit1.text='4' then edit1.text:='0' else;
if edit1.text='4,5' then edit1.text:='-2' else;
if edit1.text='5' then edit1.text:='-4' else;
if edit1.text='5,5' then edit1.text:='-6' else;
if edit1.text='6' then edit1.text:='-8' else;

???

versuchs mal ohne die ";" nach dem else
:wink:


JayEff - Di 14.12.04 15:13

übersetze mal die wörter if und else ins deutsche: "WENN" und "ANSONSTEN" !!!! das sollte dir aufschluss auf die syntax geben. Sprachlogisches Konstrukt:

Quelltext
1:
WENN <bedingung> DANN <anweisung> ANSONSTEN <anweisung>;                    

alles klar?


UGrohne - Di 14.12.04 15:21

Wieso denn so kompliziert? Wie wärs mit einer Case-Anweisung? Hoffe, ich hab das so richtig aus dem Ärmel geschüttelt, ich mach das net oft:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
case Round((StrToFloatDef(Edit1.Text,0)*10)) of
  10:Edit1.Text:='12'
  15:Edit1.Text:='10'
  20:Edit1.Text:='8'
  25:Edit1.Text:='6'
  30:Edit1.Text:='4'
  35:Edit1.Text:='2'
  40:Edit1.Text:='0'
  45:Edit1.Text:='-2'
  50:Edit1.Text:='-4'
  55:Edit1.Text:='-6'
  60:Edit1.Text:='-8'
  end;

Ich glaub, das ist einmal übersichtlicher, aber im Endeffekt (trotz der Umwandlungen) schneller als diese if-else-Geschichten


IngoD7 - Di 14.12.04 15:45

Übersichtlicher: Ja.
Schneller: Du lieber Gott, er kennt die bedingten Verzweigungen noch nicht mal; da wird er doch nicht an Geschwindigkeitsoptimierung denken. :wink:
Den Ansatz mit der Formel von .Chef gibt es ja im übrigen auch noch.

Aber alles das könnte er nur abschreiben - nicht verstehen. Ich bin, wie andere auch, der Meinung, er müsse sich erstmal die Grundlagen aneignen. Hier somit die if-then-else-Strukturen.