Entwickler-Ecke

Sonstiges (Delphi) - Problem bei If-then Formulierung.


Delete - Do 14.10.04 19:57
Titel: Problem bei If-then Formulierung.
Hi Leute!

Ich habe da mal ein sehr kleines Programm geschrieben und komme bei einer Formulierung nicht weiter.

Ein kleiner Auszug aus meinem Programm:


Delphi-Quelltext
1:
2:
If Edit2.Text=FloatToStr(x/y)
then form1.label5.visible:=true;´


Es werden zufällig Aufgaben gestellt, die ich dann beantworten muss, wenn ich sie richtig beantworte erscheint Label5 'richtig' und zeigt es mir.
Also wenn die Aufgabe z.B. 10 / 5 ist, muss ich 2 eintippen damit das Label mit der Schrift Richtig erscheint.

Wie muss ich dann formulieren wenn ich was falsches schreibe also nicht die Lösung von x/y, dass dann ein anderes Label erscheint mit falsch.

Schönen Abend noch.

Method_Man

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


Delete - Do 14.10.04 20:10

Besser ist es, Zahlen statt Strings zu vergleichen. Du machst genau das Gegenteil. So ist es besser:

Delphi-Quelltext
1:
If strtofloat(Edit2.Text) = (x/y) then...                    

Das Gegenstück dazu wäre dann eben:

Delphi-Quelltext
1:
If strtofloat(Edit2.Text) <> (x/y) then...                    


Generell wäre es außerdem besser, wenn du von vorherein mit Intergers statt mit Reals arbeitest und somit das Teilen mit div bewerkstelligst.


gitta - Do 14.10.04 20:20

Hallo wenn ich Dich richtig verstanden habe meinst Du folgendes

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
If Edit2.Text=FloatToStr(x/y)then
begin
  form1.label5.visible:=true; {für richtig}
  form1.label6.visible:=false; {für falsch}
end else
begin
  form1.label5.visible:=false; {für richtig}
  form1.label6.visible:=true; {für falsch}
end;


oder Du schreibst:

Delphi-Quelltext
1:
2:
form1.label5.visible := ( Edit2.Text = FloatToStr(x/y) );
form1.label6.visible := ( Edit2.Text <> FloatToStr(x/y) );


Gruß Gitta

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


BenBE - Do 14.10.04 20:45

Könntest du bitte deinen Code in Delphi-Tags einfassen? Dann wird das Syntax-Highlighting aktiviert und der Code ist besser lesbar.


Christian S. - Do 14.10.04 20:50

Hallo!

Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Delphi-Forum.de Richtlinien:

Richtlinien hat folgendes geschrieben:
1.2 Beiträge
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]

Einfach oben bei Deinem ersten Beitrag auf "Edit" klicken und den Titel ändern. Dank Dir!

Grüße
Christian :-)


Delete - Do 14.10.04 21:42

Danke für die schnelle Hilfe!

Mit dem Delphi-Tags wusste ich nicht, mache ich nächstes mal immer, sorry. :oops:

Jetzt läuft das Programm aber, es erscheint eine Fehlermeldung, manchmal.

Benachrichtung über Debugger-Exception

Im Projekt Project.exe ist eine Exception der Klasse EConvertError aufgetreten.
Meldung:"ist kein gültiger Gleitkommawert'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.


Ich habe echt keine Ahnung warum der Fehler macht.
Hier das ganze Programm nochmal.


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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button5: TButton;
    Edit3: TEdit;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  x,y:Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Randomize;            
x:=Random(50);
y:=Random(50);
Edit1.Text:= IntToStr(x)+'+'+IntToStr(y);
Edit2.Text:='';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Randomize;
x:=Random(50);
y:=Random(50);
Edit1.Text:= IntToStr(x)+'-'+IntToStr(y);
Edit2.Text:='';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Randomize;
x:=Random(10);
y:=Random(10);
Edit1.Text:= IntToStr(x)+'*'+IntToStr(y);
Edit2.Text:='';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Randomize;
x:=Random(10);
y:=Random(10);
Edit1.Text:= IntToStr(x)+'/'+IntToStr(y);
Edit2.Text:='';
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
If Edit2.Text=IntToStr(x+y)
then form1.label5.visible:=true;
If strtofloat(Edit2.Text) <> (x+y)
then form1.Label4.Visible:=true;

If Edit2.Text=IntToStr(x-y)
then form1.label5.visible:=true;
If strtofloat(Edit2.Text) <> (x-y)
then form1.Label4.Visible:=true;

If Edit2.Text=IntToStr(x*y)
then form1.label5.visible:=true;
If strtofloat(Edit2.Text) <> (x*y)
then form1.Label4.Visible:=true;

If Edit2.Text=FloatToStr(x/y)
then form1.label5.visible:=true;
If strtofloat(Edit2.Text) <> (x/y)
then form1.Label4.visible:=true;

end;

procedure TForm1.Button7Click(Sender: TObject);
begin
Edit3.Text:=IntToStr(x+y);
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
Edit3.Text:=IntToStr(x-y);
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
Edit3.Text:=IntToStr(x*y);
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
Edit3.Text:=FloatToStr(x/y);
end;

end.


smiegel - Do 14.10.04 21:57

Hallo,

wahrscheinlich steht in irgendeinem Deiner Edits nichts drin oder Du hast statt einem Punkt ein Komma genommen. Du musst also, bevor Du mit StrToFloat ein Wert umwandeln willst, zuerst prüfen, ob Edit.Text eine gültige Zeichenfolge enthält.

Eine ander Möglichkeit besteht darin, FloatToStr in einen Try-Except-Block zu kapseln. Dadurch kannst Du den EConvertError abfangen und entsprechend darauf reagieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  ...
  try
    if strtofloat(Edit2.Text) <> (x+y)  then form1.Label4.Visible:=true; 
  except
    on E: EConvertError do
    begin
      ShowMessage('Edit 2 enthält einen falschen Wert, bitte korrigieren');
      Edit2.SetFocus;
      Edit2.SelectAll;
    end// on
  end// try
  ...


Delete - Fr 15.10.04 23:42

Hi Leute!

Ich wollte mal ein Dialog in meinem Programm reinbringen, wie könnte ich das machen?

Z.B. soll er mir eine Frage stellen, die dann mit meiner Antwort zusammen in einem Satz ausgestrahlt werden soll.

Frage: Wie heissen Sie?
Antwort: Mr.X

'Guten Tag Herr Mr.X'

Wäre sehr dankbar für Antworten

Gruss Method_Man


BenBE - Sa 16.10.04 00:41

Bitte immer nur eine Frage pro Thread.

Aber bei der hier gehts kurz zu halten:
Guck dir mal die Befehle InputBox und MessageDlg an.