Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bedingung, leeres Textfeld?


Tony-S - Fr 24.04.09 19:24
Titel: Bedingung, leeres Textfeld?
Hallo Community, ich arbeite zur Zeit an einem Programm welches alle Berechnungen von Körpern und Formen beeinhaltet.
Es soll Alles zu Allem rechnen können, d.h., wenn ich bei einem Quadrat nur A gegeben habe, soll es mir direkt
auch e, U, und e berechnen.

Dafür wollte ich die Bedingung nutzen das die jeweils drei leeren Textfelder die Bedingung für die jeweils umgestellte Formel ist.
Mein Problem ist eigentlich nur das icht nicht weiß wie ich meinem Programm sage, das das Textfeld wirklich leer ist.

So wollte ich das lösen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
if  (TF_e_Q.Text<>''or      (TF_FL_Quadrat.Text<>''or (TF_U_Q.Text<>''then
     // Das Textfeld
     // für die Diagonale "e" // für die Fläche A         // für den Umfang U

// daraus ergibt sich ja das in diesem Falle nur etwas im Textfeld für die Seite a drinn steht.
begin
     A_Q:= a * a;
     U_Q:= a * 4;
     e_Q:= a*sqrt(2);

     TF_Fl_Quadrat.Text:= FloatToStr(A_Q);
     TF_e_Q.Text:= FloatToStr(e_Q);
     TF_U_Q.Text:= FloatToStr(U_Q);

end;
Ich bekomme den Fehler das '' kein Fließkommawert ist.
Es wäre sehr nett von euch, wenn ihr mir einen Rat geben könntet wie ich mein Problem lösen kann. Thx.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Fr 24.04.09 19:27

Nimm lieber TryStrToFloat. ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
var
  a, b: Single;
...
if TryStrToFloat(TF_e_Q.Text, a) and TryStrToFloat(TF_FL_Quadrat.Text, b) ... then
  ... a und b benutzen


Tony-S - Fr 24.04.09 19:41

Danke für deine schnelle Antwort, du bist ja fix, btw kannte ich den Befehl bis gerade eben noch nicht ^^.


Ich bekomm jetzt den Fehler, "there is no overloaded version of 'TryStrToFloat' that can be called with this arguments"

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if TryStrToFloat(TF_e_Q.Text, e_Q) and TryStrToFloat(TF_FL_Quadrat.Text, A_Q) and TryStrToFloat(TF_U_Q.Text, U_Q) then
begin
   A_Q:= a * a;
   U_Q:= a * 4;
   e_Q:= a*sqrt(2);

   TF_Fl_Quadrat.Text:= FloatToStr(A_Q);
   TF_e_Q.Text:= FloatToStr(e_Q);
   TF_U_Q.Text:= FloatToStr(U_Q);
end;

Was ist denn da noch falsch, ich hääte zunächst einmal gedacht ich müsste als L.-Operator "or" nehmen, da es ja vorkommt,
das mehr als nur eine Eingabe vorhanden ist, aber vllt versteh ich da was falsch.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Fr 24.04.09 19:45

Was für ein Typ ist denn s_Q usw.? Wenn das Variablen vom Typ Double sind, dann sollte das so klappen.

Ja, or ist bei deinem ursprünglichen Code richtig, wenn du nach diesem if die weitere Berechnung abbrichst.

Nebenbei sind Unterstriche eher nicht so schön in Variablen und anderen Bezeichnern. Das ist natürlich kein Muss, aber du könntest dir einmal den Styleguide anschauen. ;-)
http://dn.codegear.com/article/10280 (englisch)
http://www.delphi-treff.de/delphi-styleguide/ (deutsch)


Tony-S - Fr 24.04.09 19:56

Die Variablen sind alle Real müsste ja korrekt sein, nicht?

Naja finde Unterstriche ganz ok, weil sich das auch schnell so schreibt ^^.


jaenicke - Fr 24.04.09 20:25

user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Die Variablen sind alle Real müsste ja korrekt sein, nicht?
Real entspricht zwar Double, ist aber bei TryStrToFloat nicht berücksichtigt worden. Nimm also Double, das ist ja vom Datentyp her das selbe.

user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Naja finde Unterstriche ganz ok, weil sich das auch schnell so schreibt ^^.
Das schon, aber schnell und gut lesbar finde ich das nicht.
Ich nehme lieber sowas wie edtVolume, edtCircleDiameter, ... und für das Formular frmMain, ...

Wobei es aber immerhin schon gut ist, dass du sie überhaupt bezeichnest. ;-)


Tony-S - Fr 24.04.09 21:48

Ok hab jetzt mal Double genommen, es tritt nun kein Fehler mehr auf.

Aber ein neues Problem, wenn ich 2 der 4 Textfelder mit einer Zahl (egal welche)
fülle und meine Prozedur aufrufe erhalte ich für


A = 0
e = 2,9650301940214E-307
U = 8,38637182646159E-307

Also e stimmt ja noch fast (es wäre 2,8 ) bei einer Seitenlänge von a = 2 aber der Rest kann ja mal gar nicht stimmen.
Habe auch mal anstatt and, or genommen, selber Fehler.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TFrm_Viereck.Btn_QuadratClick(Sender: TObject);
var
a: Double;
A_Q:Double;
e_Q:Double;
U_Q:Double;
begin
if TryStrToFloat(TF_e_Q.Text, e_Q) or TryStrToFloat(TF_FL_Quadrat.Text, A_Q) or TryStrToFloat(TF_U_Q.Text, U_Q) then
begin
   A_Q:= a * a;
   U_Q:= a * 4;
   e_Q:= a*sqrt(2);

   TF_Fl_Quadrat.Text:= FloatToStr(A_Q);
   TF_e_Q.Text:= FloatToStr(e_Q);
   TF_U_Q.Text:= FloatToStr(U_Q);
end;
end;

Das ist die prozedur mal im ganzen. Hab ich da einen Fehler?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Fr 24.04.09 21:54

Ach jetzt sehe ich erst was du eigentlich vor hast. Da musst du aber ja unterscheiden welche Angaben gegeben sind. Wie das geht habe ich vor ein paar Tagen erst korrigiert:
http://www.delphi-forum.de/viewtopic.php?p=558828#558828


Tony-S - Fr 24.04.09 22:05

Sorry aber da blick ich nicht wirklich durch was da was macht... :0

Naja die Unterscheidung wollte ich ja machen damit lösen, das ich angeben welche Textfelder leer sind also ''.
Was muss ich denn an meinem Beispiel ändern damit ich wenn nur a gegeben ist, die 3 übrigen Werte erhalte, weil dort blick ich nicht sooo sehr durch.


jaenicke - Fr 24.04.09 22:08

Du musst schauen wo etwas drin steht. Wenn du mit TryStrToInt feststellst, dass in A etwas drin steht, dann berechnest du daraus die anderen Werte, sonst wenn in U etwas drin steht, dann berechnest du daraus die anderen Werte, ...
Und am Ende gibst du die eben aus.


Tony-S - Fr 24.04.09 22:09

Das habe ich doch, oder etwa nicht ;-)

Es kommen wie gesagt nur Werte raus, wenn ich 2 Textfelder befülle, und auch immer nur derselbe Wert.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

SORRY blöder fehler meinerseits,

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if TryStrToFloat(TF_a_Quadrat.Text, a)  then
begin
   A_Q:= a * a;
   U_Q:= a * 4;
   e_Q:= a*sqrt(2);

   TF_Fl_Quadrat.Text:= FloatToStr(A_Q);
   TF_e_Q.Text:= FloatToStr(e_Q);
   TF_U_Q.Text:= FloatToStr(U_Q);
end;
so stimmts wohl :)
hatte nur die flasche variable ... danke dir erstmal, vllt hab ich ja noch Fragen ;-)
Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


freak4fun - Fr 24.04.09 23:12

OT: Tony-S, benutze doch bitte Delpi-Tags. :)