Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler E2015 falscher Operandentyp


Samkirchner - Mo 05.05.08 12:21
Titel: Fehler E2015 falscher Operandentyp
Hallo,

ich habe folgendes mir unklares Problem. Ich habe drei Textfelder, einen Button und eine Label gemacht. Nun will ich einen Dreisatz berechnen.

Der Code bzw. die Problemstelle lautet:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm4.cmdBerechnungDreClick(Sender: TObject);
begin
Merker := StrtoFloat ((txtdreiDrei*txtzweiDrei)/txteinsDrei);

end;

Merker habe ich auf real deklariert

Er gibt mir jedoch falscher Operandentyp (E2015) an. In der Hilfe steht jedoch nicht arg viel was mir helfen könnte, daher dieser Thread.

Für eventuelle Hilf bzw. wieso dies falsch ist, wäre ich sehr dankbar.

LG Sam

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


iKilledKenny - Mo 05.05.08 12:27

Du kannst nicht Texte miteinander multiplizieren/dividieren. Du musst zuerst die Texte in eine Zahl umwandeln (z.B. mit StrToFloat) und dann die Rechenoperationen durchführen.


Samkirchner - Mo 05.05.08 12:34

Ok, danke! Also muss ich wirklich jeden Text einzeln umwandeln, denn ich dachte bisher das es reicht, wenn ich am Anfang einmal StrtoFloat schreibe. Gibt es da nicht noch ne schönere Lösung??? Ich meine da ich erst vor ein paar Tagen mit Delphi begonnen habe, versuche ich mir gleich die schönere Arten einzuprägen.

Zumal er mir mit


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm4.cmdBerechnungDreClick(Sender: TObject);
begin
Merker := StrtoFloat (txtdreiDrei)* StrtoFloat (txtzweiDrei)/ StrtoFloat (txttxteinsdrei);

end;


überladene Version von StrtoFloat ausgibt :-(

Danke jedoch für deine schnelle Antwort

LG Sam

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


zuma - Mo 05.05.08 12:37
Titel: Re: Fehler E2015 falscher Operandentyp
was iKilledKenny meint, ist in etwa sowas:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm4.cmdBerechnungDreClick(Sender: TObject);
begin
Merker := StrtoFloat(txtdreiDrei) * StrtoFloat(txtzweiDrei) / StrtoFloat(txteinsDrei);
end;


Sauberer wäre es aber mit z.b 3 Var's (Zahl1, Zahl2, Zahl3), die immer bei der Eingabe belegt werden. Z.B. beim OnExit des Feldes mit der ersten Zahl prüfen, ob eine Zahl eingegeben wurde, wenn ja, diese in Zahl1 merken. Dasselbe mit den beiden anderen Feldern.
Dann könnte deine Berechnung so aussehen:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm4.cmdBerechnungDreClick(Sender: TObject);
begin
Merker := Zahl1 * Zahl2 / Zahl3;
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Samkirchner - Mo 05.05.08 12:53

Hm, ich glaube ich habe ein größeres Problem, denn es gehen beide Arten nicht wirklich.
Um alles zu sehen, stelle ich mal meinen kompletten Code rein, denn ich befürchte das da etwas anderes nicht stimmt, da er mir schon wieder folgendes bringt:

[Pascal Fehler] Unit4.pas(155): E2250 Es gibt keine überladene Version von 'StrToFloat', die man mit diesen Argumenten aufrufen kann

Das momentane Thema ist bei zeile 153

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:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    tab2: TPageControl;
    TabSheet1: TTabSheet;
    Label1: TLabel;
    txtEingabe: TEdit;
    cmd1: TButton;
    cmd2: TButton;
    cmdPlus: TButton;
    cmdErgebnis: TButton;
    cmd3: TButton;
    cmd4: TButton;
    cmd5: TButton;
    cmd6: TButton;
    cmd7: TButton;
    cmd8: TButton;
    cmd9: TButton;
    cmd0: TButton;
    cmdMinus: TButton;
    cmdMal: TButton;
    cmdGeteilt: TButton;
    cmdC: TButton;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    TabSheet6: TTabSheet;
    txteinsdrei: TEdit;
    lblgleinsdrei: TLabel;
    txtzweiDrei: TEdit;
    txtdreiDrei: TEdit;
    Label2: TLabel;
    lblergebnis: TLabel;
    cmdBerechnungDre: TButton;
    procedure cmd1Click(Sender: TObject);
    procedure cmd2Click(Sender: TObject);
    procedure cmdPlusClick(Sender: TObject);
    procedure cmdErgebnisClick(Sender: TObject);
    procedure cmd3Click(Sender: TObject);
    procedure cmd4Click(Sender: TObject);
    procedure cmd5Click(Sender: TObject);
    procedure cmd6Click(Sender: TObject);
    procedure cmd7Click(Sender: TObject);
    procedure cmd8Click(Sender: TObject);
    procedure cmd9Click(Sender: TObject);
    procedure cmd0Click(Sender: TObject);
    procedure cmdMinusClick(Sender: TObject);
    procedure cmdMalClick(Sender: TObject);
    procedure cmdGeteiltClick(Sender: TObject);
    procedure cmdCClick(Sender: TObject);
    procedure cmdBerechnungDreClick(Sender: TObject);



  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form4: TForm4;
  Zahl1, Zahl2, Zahl3,Merker,Rechner,Ergebnis: real;
  Rechenart : integer;
  test : boolean;

implementation

{$R *.dfm}
procedure TForm4.cmd1Click(Sender: TObject);
begin
If test then
txtEingabe.text := '';
test:=false;

txtEingabe.text := txtEingabe.Text + '1';
end;

procedure TForm4.cmd2Click(Sender: TObject);
begin
if test  then
txtEingabe.text := '';
test:= false;

txtEingabe.text := txtEingabe.Text + '2';
end;

procedure TForm4.cmd3Click(Sender: TObject);
begin
If test then
txtEingabe.Text := '';
test := false;

txtEingabe.text:= txtEingabe.Text + '3';
end;
 
procedure TForm4.cmd4Click(Sender: TObject);
begin
if test  then
txtEingabe.Text := '';
test:= false;
txtEingabe.Text := txtEingabe.Text + '4';
end;

procedure TForm4.cmd5Click(Sender: TObject);
begin
if test then
txtEingabe.text := '';
test:= false;
txtEingabe.Text := txtEingabe.Text + '5';
end;

procedure TForm4.cmd6Click(Sender: TObject);
begin
if test then
txtEingabe.Text :='';
test:= false;
txtEingabe.Text := txtEingabe.Text + '6';
end;

procedure TForm4.cmd7Click(Sender: TObject);
begin
if test then
txtEingabe.Text := '';
test := false;
 txtEingabe.Text := txtEingabe.Text + '7';
end;

procedure TForm4.cmd8Click(Sender: TObject);
begin
if test then
txtEingabe.text := '';
test := false;
txtEingabe.Text := txtEingabe.Text + '8';
end;

procedure TForm4.cmd9Click(Sender: TObject);
begin
if test then
txtEingabe.Text := '';
test:= false;
txtEingabe.Text := txtEingabe.Text + '9';
end;

procedure TForm4.cmdBerechnungDreClick(Sender: TObject);
begin
txteinsdrei := StrtoFloat (Zahl1);
txtzweiDrei := StrtoFloat (Zahl2);
txtdreiDrei := StrtoFloat (Zahl3);
Merker := Zahl1 * Zahl2 / Zahl3;

end;

procedure TForm4.cmdCClick(Sender: TObject);
begin
txtEingabe.text := '';
end;

procedure TForm4.cmd0Click(Sender: TObject);
begin
if test then
txtEingabe.Text :='';
test :=false;
txtEingabe.Text := txtEingabe.Text + '0';
end;

procedure TForm4.cmdPlusClick(Sender: TObject);
begin
Merker:= strtofloat(txtEingabe.text);
txteingabe.text := '';
Rechenart := 0;
end;



procedure TForm4.cmdMalClick(Sender: TObject);
begin
Merker := StrToFloat (txtEingabe.Text);
txtEingabe.Text := '';
Rechenart := 2;
end;

procedure TForm4.cmdMinusClick(Sender: TObject);
begin
 Merker := StrToFloat (txtEingabe.Text);
 txtEingabe.text := '';
 Rechenart := 1;
end;

procedure TForm4.cmdGeteiltClick(Sender: TObject);
begin
Merker := StrToFloat (txtEingabe.text);
txtEingabe.Text := '';
Rechenart := 3;
end;

procedure TForm4.cmdErgebnisClick(Sender: TObject);
begin
Test := true;
case Rechenart of
0:begin
  Rechner := strtofloat(txteingabe.Text);
  ergebnis := merker + rechner;
  txteingabe.Text := floattostr(ergebnis);
  end;
1:begin
  Rechner := strToFloat (txtEingabe.text);
  ergebnis := merker - rechner;
  txtEingabe.text := FloatToStr (ergebnis);
  end;
2:begin
  Rechner:= strToFloat (txtEingabe.Text);
  ergebnis := merker * rechner;
  txtEingabe.Text := FloattoStr (ergebnis);
  end;
3:begin
  rechner := strToFloat (txtEingabe.Text);
  if rechner = 0 then
  label1.Caption := 'Fehler'
  else
  ergebnis := merker / rechner;
  txtEingabe.Text := FloatToStr (ergebnis);
  end;
end;



end;





end.


Sorry, wenn ich mich ein wenig dumm anstelle, aber Delphi ist neu für mich, da wir in der Berufsschule Java haben und ich Delphi für meine neue Lehrstelle benötige mache ich das erst seit ein paar Tagen.

LG Sam

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt


mkinzler - Mo 05.05.08 12:56

Zahlx ist ja schon eine Fließkommazahl. Es sollte wohl eher:

Delphi-Quelltext
1:
txteinsdrei := FloatToStr (Zahl1);                    

heißen


Samkirchner - Mo 05.05.08 13:04

Ok, der Compiler erkennt es nun, danke!!! Leider kommt nun ein Gleitkomma Fehler der wie folgt lautet:

Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EInvalidOp mit Meldung 'Ungültige Gleitkommaoperation'. Prozess Project2.exe (2348)

Man o Meter ist das kompliziert.


iKilledKenny - Mo 05.05.08 13:06

Ich denke eher andersrum:


Delphi-Quelltext
1:
ZahlXYZ := StrToFloat (textXYZ);                    


8)


Samkirchner - Mo 05.05.08 13:13

user profile iconiKilledKenny hat folgendes geschrieben:
Ich denke eher andersrum:


Delphi-Quelltext
1:
ZahlXYZ := StrToFloat (textXYZ);                    


8)


Ja, so geht es!!! Wobei ich nicht verstehe, wieso er sich bei


Quelltext
1:
txteinDrei.Text := FloattoString (Zahl1);                    


aufhängt und bei


Delphi-Quelltext
1:
ZahlXYZ := StrToFloat (textXYZ);                    


nicht!!! Müsste doch eigentlich das selbe sein! *grübel*

Danke an alle die mir geholfen haben :-).

LG sam


Xion - Mo 05.05.08 13:13

user profile iconSamkirchner hat folgendes geschrieben:

da wir in der Berufsschule Java haben und ich Delphi für meine neue Lehrstelle benötige

cool, welchen beruf lernst denn du?


Samkirchner - Mo 05.05.08 13:15

user profile iconXion hat folgendes geschrieben:
user profile iconSamkirchner hat folgendes geschrieben:

da wir in der Berufsschule Java haben und ich Delphi für meine neue Lehrstelle benötige

cool, welchen beruf lernst denn du?


Anwendungsentwickler (bin aber erst im ersten Lehrjahr) :-)


jakobwenzel - Mo 05.05.08 13:24

Das eine macht aus einem String eine Zahl, und das andere halt das umgekehrte.
Warum du nicht 2 mal das selbe machen kannst ist ja eigentlich klar: Du kannst ja z.B. einen eingepackten Brief nicht nochmal einpacken (in einen Umschlag gleicher Größe, das passt ja gar nicht) und dann erwarten, dass er ausgepackt ist.