| Autor |
Beitrag |
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 16:37
trm hat folgendes geschrieben : | | Oder sollte man, so wie ich es ganz gern mache - da ich persönlich else - Konstrukte HASSE (wegen der unübersichtlichkeit - folgendes nutzen: |
Der Logik wegen sind die aber durchaus sinnvoll. Denn wenn du darauf verzichtest, musst du darauf achten, dass die weiteren if-Abfragen nicht durch das erste if verändert werden (es sei denn das ist gewollt).
Das kann man natürlich auch lösen, ich finde es nur nicht wirklich übersichtlicher als mit else. Aber das ist Ansichtssache.
trm hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4:
| Case panel1.visible of True: showmessage('panel1 ist sichtbar'); False: showmessage('panel1 ist NICHT sichtbar'); end; | |
Genau das ist nicht gut. Denn auch hier prüfst du auf True oder False. Du kannst natürlich noch ein else hinzufügen, aber das ist dann erst recht unübersichtlich.
Die drei anderen Varianten sind alle ok.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 11.09.10 17:09
Bei nur 2 möglichen Werten ist ein Case-konstrkt sowieso überflüssig
_________________ Markus Kinzler.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 17:33
In diesem Fall sind es ja mehr.
Aber das ist ja auch genau der Punkt. Beispiel: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var a: Boolean; c: PByte; begin c := @a; c^ := Byte(-1); case a of True: ShowMessage('case a: True'); False: ShowMessage('case a: False'); else ShowMessage('case a: else'); end; end; | Es wird else ausgelöst.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 11.09.10 17:55
Aber nur wiel auf True geprüft wird! Ein Boolean hat nur 2 mögliche Werte!
_________________ Markus Kinzler.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 17:58
Ja, natürlich. 
|
|
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Sa 11.09.10 18:11
Hm, danke für die Antworten.
Noch eine Frage.
Ich nutze in meinen Variablen meistens Dummy-Vars, die ich z.B. so deklariere:
Delphi-Quelltext 1: 2: 3: 4:
| var Dummy_Bool:Boolean; Dummy_Int:Integer; [usw] |
Wenn ich nun eine Funktion ausführe, die ich selbst erstellt habe, nur, um ein Ergebnis zu erhalten, ob die Funktion fehlerfrei/fehlerhaft war, gebe ich als Result True oder False zurück.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Dummy_Bool:=meinefunktion(a+b);
Case Dummy_Bool of True: ; False: ; end; |
Wenn ich nun aber z.B. eine Api-Funktion aufrufe, von der ich den Ergebnistyp nicht kenne, mache ich das dennoch genauso:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Dummy_Bool:=dieapifunktion(a+b)=1;
Case Dummy_Bool of True: ; False: ; end; |
Demzufolge benötige ich nicht, da ich dennoch auf True teste, einen case-Block.
Und das Beste an der Sache: die Lesbarkeit ist um ein vielfaches höher als in if .. else .. - Konstrukten.
Ansonsten, wenn ich keinen Boolean benötige, sondern einen Integer oder sonstwas, nutze ich ebenfalls einen Case-Block:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Dummy_Int:=irgendeinefunktion(a+b);
Case Dummy_Int of 0..5: ; 6..10: ; 11,12,13,15: ; 14: ; else: ; end; |
Bei einem if.. else wäre das unglaublich komplizierter zu erstellen UND im Anschluß SCHWER lesbar nachzuvollziehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Dummy_Int:=irgendeinefunktion(a+b);
if (Dummy_Int = 0) or (Dummy_Int = 1) or (Dummy_Int = 2) or (Dummy_Int = 3) or (Dummy_Int = 4) or (Dummy_Int = 5) then ShowMessage('0-5') else if (Dummy_Int = 6) or (Dummy_Int = 7) or (Dummy_Int = 8) or (Dummy_Int = 9) or (Dummy_Int = 10) then showmessage('6-10') else if (Dummy_Int = 11) or (Dummy_Int = 12) or (Dummy_Int = 13) or (Dummy_Int = 15) then ShowMessage('11-13 und 15') else if (Dummy_Int = 14) then ShowMessage('14') else ShowMessage('Nichts von 0-15'); |
..und das waren 'nur' zwei Typen, die ich als Beispiel benutzt habe.
Viele Grüße
~Mathias
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 11.09.10 18:14
_________________ Markus Kinzler.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 11.09.10 18:25
trm:
Erstens gibt es einen Operator in. Du kannst also genauso gut schreiben:
Delphi-Quelltext 1: 2: 3: 4:
| if a in [1, 3, 5..9] then begin end; |
Dahinter stecken sets.
Und zweitens hast du das Problem offenbar nicht verstanden: True ist 1. dieapifunktion()=1 ist genauso falsch, wenn nicht sogar noch schlimmer. Wenn man sowas oft braucht, kann man ja gerne sowas verwenden:
Delphi-Quelltext 1: 2: 3: 4:
| function IsTrue(a: Byte): Boolean; begin Result := not (a = 0); end; |
und das so einsetzen:
Delphi-Quelltext 1: 2:
| a := dieapifunktion(arg1, arg2, ..., argn); bool := IsTrue(a); |
Aber einen Vergleich auf true sollte man nach wie vor vermeiden.
Ich hoffe, wir können das Thema beenden. Wir sind seid mehr als 50% des Threads off-topic.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 11.09.10 18:29
Ich gebe Dir Recht, dass Case für integerabfragen sicher einfacher als if..then..else-abfragen sind. Doch Dein Konstrukt
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Dummy_Int:=irgendeinefunktion(a+b);
if (Dummy_Int = 0) or (Dummy_Int = 1) or (Dummy_Int = 2) or (Dummy_Int = 3) or (Dummy_Int = 4) or (Dummy_Int = 5) then ShowMessage('0-5') else if (Dummy_Int = 6) or (Dummy_Int = 7) or (Dummy_Int = 8) or (Dummy_Int = 9) or (Dummy_Int = 10) then showmessage('6-10') else if (Dummy_Int = 11) or (Dummy_Int = 12) or (Dummy_Int = 13) or (Dummy_Int = 15) then ShowMessage('11-13 und 15') else if (Dummy_Int = 14) then ShowMessage('14') else ShowMessage('Nichts von 0-15'); |
ist doch etwas zu komplex geraten, es ginge auch so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Dummy_Int:=irgendeinefunktion(a+b);
if (Dummy_Int >= 0) and (Dummy_Int <= 5) then ShowMessage('0-5') else if (Dummy_Int >= 6) and (Dummy_Int <= 10) then showmessage('6-10') else if ((Dummy_Int >= 11) and (Dummy_Int <= 13)) or (Dummy_Int = 15) then ShowMessage('11-13 und 15') else if (Dummy_Int = 14) then ShowMessage('14') else ShowMessage('Nichts von 0-15'); |
Aber - wie gesagt, Case ist übersichtlicher und auch leichter zu editieren. Doch manchmal geht es eben nicht, wenn keine aufzählbaren Typen abgefragt werden, oder nicht nur eine Variable oder gar ein Funktionsergebnis. Dann kommt man um if..then..else nicht drum rum, oder?
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 11.09.10 18:37
Oder so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Dummy_Int:=irgendeinefunktion(a+b); if Dummy_int in [0..5] then ShowMessage('0-5') else if Dummy_int in [6..10] then showmessage('6-10') else if Dummy_Int in [11..13, 15] then ShowMessage('11-13 und 15') else if Dummy_Int = 14 then ShowMessage('14') else ShowMessage('Nichts von 0-15'); |
|
|
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Sa 11.09.10 18:45
Ich wollte noch bemerken, dass es Sets gibt, dachte mir aber, dass dies von Euch nicht gesehen wird
@Jakob:
Danke, habe ich nicht bedacht.
~Für mich ist das Thema hier genug erörtert, danke Euch
Viele Grüße
~Mathias
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
guinnes
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Sa 11.09.10 18:49
|
|
Henneberg
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 01.12.10 20:45
Hey ich hab jetzt nochma ne frage dazu..
wir sollten für die schule ein programm mit einigen edits und checkboxen schreiben
allerdings sollte z.B. edit3 nur dann zu sehen sein wenn checkbox1.checked..
also hab ich das so gemacht(Edit3 ist schon auf visible=false)
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.FormCreate(Sender: TObject); begin if Checkbox1.Checked then Edit3.Visible := true else Edit3.Visible := False; end; | da sieht man es gar nicht egal was man macht..
und wenn ich es so mache
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:
| procedure TForm1.Button1Click(Sender: TObject); var Alter, Jahre,Zigaretten :real; begin Alter := StrToFloat (Edit1.Text); Jahre := 60; Zigaretten :=StrToFloat (Edit3.Text);
if Checkbox1.Checked then Edit3.Visible := true else Edit3.Visible := False; if Checkbox1.Checked then Jahre:=Jahre-15-(Zigaretten*1.5); if Checkbox2.Checked then Jahre:=Jahre-5; if Checkbox3.Checked then Jahre:=Jahre+10; If Checkbox4.Checked then Jahre:=Jahre-20; If Checkbox6.Checked then Jahre:=Jahre+15; If Checkbox8.Checked then Jahre:=Jahre+15; If Checkbox7.Checked then Jahre:=Jahre+2; if Checkbox9.Checked then Edit5.Text:=FLoatToStr (Jahre); |
zeigt er es nur an nachdem ich den button geklickt hat.. wieso?
danke im vorraus
henneberg
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 01.12.10 20:52
Henneberg hat folgendes geschrieben : | | if Checkbox1.Checked then Edit3.Visible := true else Edit3.Visible := False; |
Wie wäre es mit:
Delphi-Quelltext 1:
| Edit3.Visible := Checkbox1.Checked; |
Henneberg hat folgendes geschrieben : | da sieht man es gar nicht egal was man macht..
[..]
zeigt er es nur an nachdem ich den button geklickt hat.. wieso? |
Wie jetzt? Du schreibst es in OnCreate des Formulars, das ja beim Erzeugen des Formulars ausgeführt wird, und wunderst dich, dass das nicht von alleine auch später plötzlich nochmal ausgeführt wird?
Bzw. du legst es in OnClick des Buttons und wunderst dich, dass es auch erst dann passiert?
Wenn du willst, dass es bei einem Klick auf die CheckBox ausgeführt wird, dann musst du es natürlich auch in das OnClick der CheckBox schreiben. Woher soll denn Delphi wissen, dass der Code dann ausgeführt werden soll, wenn du das nicht schreibst?
|
|
Henneberg
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 01.12.10 20:55
ah ja ich sehs auch grad. ich habs ins falsche procedure gemacht ;D
danke jetzt funzts ;D
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Do 02.12.10 23:23
Unwichtig und unsubstantiiert. Jeder hat das Recht, an verschiedenen Orten nachzufragen. Es sind zudem sogar denkbar, daß nicht dieselbe Person dahintersteckt.
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Do 02.12.10 23:31
jaenicke hat folgendes geschrieben : | Tranx hat folgendes geschrieben : | Delphi-Quelltext | Setzen, 6. Das ist schlicht falsch. Siehe mein Beispiel im Post über dir.
Nur weil es meistens das Gewünschte macht ist es noch lange nicht richtig und schon gar nicht identisch. |
Logisch ist es korrekt, wenn auch redundant. Da if fragt, ob etwas true ist (oder nicht) und damit eigentlich schon ausreicht, muß logischerweise eine if-Abfrage eines Vergleich mit true denselben Wertevorrat haben. Da hilft, tut mir leid, mich hier genötigt zu fühlen, es hier so deutlich zu schreiben, auch keine oberlehrerhafte (und m.E. schon arrogante) Zensierung nicht. So kenne ich Dich, Jänicke, sonst nicht.
Daß der Vergleich mit true in der Praxis dieser Theorie nicht standhält, halte ich inzwischen sogar für einen eindeutigen Compilerfehler, den man allerdings kennen sollte.
Bitte jetzt nicht mit irgendwelchen dahinterstehenden Bytes mit und ohne Vorzeichen kommen, das ist alles irrelevant. Schließlich basiert Delphi auf Pascal als Hoch(!)sprache, in der man sich konstruktionsbedingt nicht mit solchen Untiefen auseinandersetzen muß (oder leider müßte). True und false sind nun einmal die einzigen möglichen Werte boolscher Variablen.
Wenn Anfänger diesen angeblichen Fehler begehen, beweisen sie nur, daß sie (auch) logisch denken können, jedoch (noch?) nicht so betriebsblind sind, logische und demnach Programmierfehler des Compilers als solche gar nicht mehr zu erkennen und die Compiler"logik" mit der generellen Logik fälschlicherweise gleichzusetzen.
Für diesen Beitrag haben gedankt: trm
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 02.12.10 23:45
Delphi-Laie hat folgendes geschrieben : | | Unwichtig und unsubstantiiert. Jeder hat das Recht, an verschiedenen Orten nachzufragen. Es sind zudem sogar denkbar, daß nicht dieselbe Person dahintersteckt. |
Richtlinen, 2.3 impliziert, dass Crossposts immer angegeben werden müssen. Erlaubt sind sie natürlich, aber man muss es dranschreiben!
Das Thema Boolean-Vergleiche wurde an anderer Stelle zu Genüge diskutiert, (Hint: du liegst falsch, Delphi-Laie), das Hauptthema ist auch durch, also:
*geschlossen*
Viele Grüße,
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|