Autor Beitrag
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 05.05.09 14:33 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Di 05.05.09 15:22 
Meinst Du das so?:
ausblenden 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"):
ausblenden 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!');


Zuletzt bearbeitet von ffgorcky am Di 05.05.09 15:31, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 05.05.09 16:00 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 05.05.09 16:17 
Genau das habe ich gesucht.
Aber warum ist das unsauber?
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 05.05.09 17:41 
Gibt es übrigens auch als IfThen(); :)

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 05.05.09 18:12 
user profile iconregsnerven hat folgendes geschrieben Zum zitierten Posting springen:
Aber warum ist das unsauber?

Hatte ich mehr oder weniger schon angeschnitten:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 07.05.09 08:30 
user profile iconregsnerven hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconregsnerven hat folgendes geschrieben Zum zitierten Posting springen:
Und was ist mit diesem IfThen()? Ist das genau so unsauber?

Jap ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Do 07.05.09 11:54 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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);
  //= die Kurzform für:
  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: .
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Do 07.05.09 20:29 
Doch, das wäre ein Problem gewesen. :D
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 08.05.09 07:59 
Diesen Operator gibt es in der Sprachdefinition einfach nicht. Also kann man das nicht ohne Weiteres bauen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.05.09 21:13 
Irgendwer hat diese Sprache doch erfunden. Hätte dabei doch dran denken können, oder nicht?
Dunkel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: Mi 20.05.09 22:05 
user profile iconregsnerven hat folgendes geschrieben Zum zitierten Posting springen:
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:

_________________
Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 21.05.09 00:04 
user profile iconDunkel hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconregsnerven hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
Aya
I aim for my endless dreams and I know they will come true!
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Do 21.05.09 08:23 
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDunkel hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconregsnerven hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.