Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Kurz-If-Abfrage bei Variablenfüllung
Delete - Di 05.05.09 14:33
Titel: Kurz-If-Abfrage bei Variablenfüllung
Hallo liebe Leute,
ich würde gerne bei der Füllung einer Variable eine IF-Abfrage laufen lassen.
Bei PHP geht das ja ganz einfach in der Form:
zinssatz = (if == true) ? dann : sonst;
Bei Delphi funktioniert das allerdings nicht.
zinssatz := (edit3.text = '') ? strtofloat(edit3.text) : 10;
Ich hoffe, ihr versteht mein Problem dabei. Ich will mir die lange IF-Abfrage sparen, sowas ist nervig. Ich hoffe, dass ihr da ne Lösung habt und ich nur einen Syntax-Fehler drin habe.
Vielen Dank schon einmal im Voraus
Gr33tZ
Rn
BenBE - Di 05.05.09 14:36
IIf, ist aber unsauber und sollte man vermeiden, wenn nicht nötig. Zudem solltest Du beachten, dass im Falle von IIf IMMER alle Teile des Ausdrucks ausgewertet werden, was bei PHP nicht der Fall ist.
ffgorcky - Di 05.05.09 15:22
Meinst Du das so?:
Delphi-Quelltext
1: 2: 3: 4:
| if not Edit3.Text='' then zinssatz :=strtofloat(edit3.text)/10 else MessageBox(Form1,'Kein Eintrag!','Sie sollten doch erst mal einen Eintrag machen, den Sie haben wollen.'+#13#10+'Danke!'); |
Wobei ich immer nicht so ganz weiß, welche Abfrage sauberer ist - so gehts ja auch (also eben einmal mit dem "nicht" davor und jetzt noch einmal mit einem "ungleich"):
Delphi-Quelltext
1: 2: 3: 4:
| if Edit3.Text<>'' then zinssatz :=strtofloat(edit3.text)/10 else MessageBox(Form1,'Kein Eintrag!','Sie sollten doch erst mal einen Eintrag machen, den Sie haben wollen.'+#13#10+'Danke!'); |
BenBE - Di 05.05.09 15:30
Letzteres ...
Mit '' verhält es sich wie mit Trinärlogik bei Booleans: '' und String(nil) sind beide leer, aber manche Routinen unterscheiden das ... (die RTL nimmt übrigens meistens String(nil) für Leerstrings ;-) - aber eben halt nicht immer).
Wenn Du auf ungleich prüfst, wird der korrekte Vergleich angestellt.
Für deinen Fall sind aber TryStrToInt bzw. StrToIntDef sinnvoller.
Jakob_Ullmann - Di 05.05.09 16:00
BenBE hat folgendes geschrieben : |
IIf, ist aber unsauber und sollte man vermeiden, wenn nicht nötig. Zudem solltest Du beachten, dass im Falle von IIf IMMER alle Teile des Ausdrucks ausgewertet werden, was bei PHP nicht der Fall ist. |
was ist IIf?
BenBE - Di 05.05.09 16:03
Funktion ab D7, die X := IIf(bool, trueVal, falseVal) diefert ... Halt aanlog dem Trinäroperator von C und PHP, sowie anderer Sprachen.
Delete - Di 05.05.09 16:17
Genau das habe ich gesucht.
Aber warum ist das unsauber?
GTA-Place - Di 05.05.09 17:41
Gibt es übrigens auch als IfThen(); :)
BenBE - Di 05.05.09 18:12
regsnerven hat folgendes geschrieben : |
Aber warum ist das unsauber? |
Hatte ich mehr oder weniger schon angeschnitten:
BenBE hat folgendes geschrieben : |
Zudem solltest Du beachten, dass im Falle von IIf IMMER alle Teile des Ausdrucks ausgewertet werden, was bei PHP nicht der Fall ist. |
Heißt konkret:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var X,Y:Integer; Begin Y := 42; X := 0;
X := IIf(X = 0, Y*2, Y div X); end; |
führt zu einer Division durch 0, obwohl bei der ausgeschriebenen Variante dieser Fehler nicht auftreten würde.
Noch schlimmer wird das, wenn man Funktionsrückgabewerte von Funktionen auswertet, die einen Nebeneffekt verursachen.
Delete - Mi 06.05.09 23:09
Das mit der Nebenfunktion hab ich jetzt nicht verstanden ^^
Also wenn ich das ausgeschrieben hätte, dann wäre dort ein Fehler gekommen oder wie? Weil Division durch 0 geht ja nicht.
Und was ist mit diesem IfThen()? Ist das genau so unsauber?
BenBE - Do 07.05.09 08:30
regsnerven hat folgendes geschrieben : |
Das mit der Nebenfunktion hab ich jetzt nicht verstanden ^^
Also wenn ich das ausgeschrieben hätte, dann wäre dort ein Fehler gekommen oder wie? Weil Division durch 0 geht ja nicht. |
Ne, andersrum: WENN Du diese Funktionen (IIf oder IfThen) nutzt, würde dieser Fehler auftauchen, weil immer alles ausgewertet wird.
Wenn Du das mit einer If-Abfrage schreibst, wird wirklich nur ausgeführt, was benötigt wird.
regsnerven hat folgendes geschrieben : |
Und was ist mit diesem IfThen()? Ist das genau so unsauber? |
Jap ;-)
Regan - Do 07.05.09 11:54
BenBE hat folgendes geschrieben : |
Ne, andersrum: WENN Du diese Funktionen (IIf oder IfThen) nutzt, würde dieser Fehler auftauchen, weil immer alles ausgewertet wird.
Wenn Du das mit einer If-Abfrage schreibst, wird wirklich nur ausgeführt, was benötigt wird. |
Um das mal zu veranschaulichen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var X,Y:Integer; dummy1, dummy2: Integer; Begin Y := 42; X := 0; X := IIf(X = 0, Y*2, Y div X); dummy1 := Y*2; dummy2 := Y div X; if X = 0 then X := dummy1 else X := dummy2; end; |
Das ist vielleicht etwas unrealistisch, aber das Prinzip sollte klar werden :wink: .
Delete - Do 07.05.09 16:36
Ganz ehrlich...Delphi macht manchmal so einen Schrott. Anstatt das einfach zu lösen, wie bei PHP. Das wäre doch wohl kein Problem gewesen ~.~
Naja. Danke für eure Hilfe :D
Gr33tZ
Rn
Jakob_Ullmann - Do 07.05.09 20:29
Doch, das wäre ein Problem gewesen. :D
BenBE - Fr 08.05.09 07:59
Diesen Operator gibt es in der Sprachdefinition einfach nicht. Also kann man das nicht ohne Weiteres bauen.
Delete - Mi 20.05.09 21:13
Irgendwer hat diese Sprache doch erfunden. Hätte dabei doch dran denken können, oder nicht?
Dunkel - Mi 20.05.09 22:05
regsnerven hat folgendes geschrieben : |
Irgendwer hat diese Sprache doch erfunden. Hätte dabei doch dran denken können, oder nicht? |
Mein Backofen kann keine Wäsche waschen. Der, der den Backofen erfunden hat, hätte doch auch daran denken können... :roll:
Aya - Do 21.05.09 00:04
Dunkel hat folgendes geschrieben : |
regsnerven hat folgendes geschrieben : | Irgendwer hat diese Sprache doch erfunden. Hätte dabei doch dran denken können, oder nicht? |
Mein Backofen kann keine Wäsche waschen. Der, der den Backofen erfunden hat, hätte doch auch daran denken können... :roll: |
Delphi wurde über die Jahre immer weiter erweitert... z.B. überladene operatoren. Da hätten sie sowas wirklich auch mal einbauen können.
Aya
Jakob_Ullmann - Do 21.05.09 08:23
Aya hat folgendes geschrieben : |
Dunkel hat folgendes geschrieben : | regsnerven hat folgendes geschrieben : | Irgendwer hat diese Sprache doch erfunden. Hätte dabei doch dran denken können, oder nicht? |
Mein Backofen kann keine Wäsche waschen. Der, der den Backofen erfunden hat, hätte doch auch daran denken können... :roll: |
Delphi wurde über die Jahre immer weiter erweitert... z.B. überladene operatoren. Da hätten sie sowas wirklich auch mal einbauen können. |
Also ich finde, Delphi ist schon inkompatibel genug mit früheren Versionen. Da braucht man so nen Mist nicht auch noch. Zur Not lässt sich sowas wie IIf schnell nachrüsten, wenn man sowas wie
a = b do a else c einbaut, geht das kaum.
Beim Tippen sollte das seit Delphi 2006 eh keinen Unterschied mehr machen, da man nur noch
if tippen muss und Delphi darauf hin schon ein gesamtes Gerüst einbaut, durch das mittels [TAB] navigiert werden kann.
jaenicke - Do 21.05.09 09:04
Nicht nur das, durch IfThen ist ja auch eine ähnliche Lösung vorhanden. Die kostet zwar einige Prozessortakte, aber funktioniert ja.
Insgesamt finde ich, dass durch einen Operator oder IfThen die Lesbarkeit teilweise deutlich leidet, das sieht man auch an manchen Javaquelltexten. Auch wenn ich dort den Operator schon öfter mal benutze. Aber nach 3 Jahren oder so drüber stolpere ich beim Lesen etwas, weil es unübersichtlicher ist als es normal zu schreiben.
Dazu kommt der bereits angesprochene Nachteil mit der Geschwindigkeit und möglichen Fehlern ähnlich der vollständigen boolschen Auswertung. Auch dadurch können ja Fehler auftreten, wenn man ein bestimmtes Verhalten voraussetzt ohne explizit das einzustellen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!