Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.09.10 16:37 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 11.09.10 17:09 
Bei nur 2 möglichen Werten ist ein Case-konstrkt sowieso überflüssig

_________________
Markus Kinzler.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.09.10 17:33 
In diesem Fall sind es ja mehr. :mrgreen:

Aber das ist ja auch genau der Punkt. Beispiel:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.09.10 17:58 
Ja, natürlich. ;-)
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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:

ausblenden 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Dummy_Bool:=meinefunktion(a+b);

//jetzt habe ich ja entweder ein True ODER ein False im Ergebnis Dummy_Bool und setze mein Case-Konstrukt ein.

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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Dummy_Bool:=dieapifunktion(a+b)=1;

//jetzt habe ich ja auch wieder ENTWEDER ein True ODER ein False im Ergebnis Dummy_Bool und setze mein Case-Konstrukt ein.

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:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Dummy_Int:=irgendeinefunktion(a+b);

if (Dummy_Int = 0or (Dummy_Int = 1or (Dummy_Int = 2or (Dummy_Int = 3or (Dummy_Int = 4or (Dummy_Int = 5then
ShowMessage('0-5')
else if (Dummy_Int = 6or (Dummy_Int = 7or (Dummy_Int = 8or (Dummy_Int = 9or (Dummy_Int = 10then
showmessage('6-10')
else if (Dummy_Int = 11or (Dummy_Int = 12or (Dummy_Int = 13or (Dummy_Int = 15then
ShowMessage('11-13 und 15')
else if (Dummy_Int = 14then
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 11.09.10 18:14 
Der Case ist trotzdem überflüssig weil Dummy-Bool ja ein Boolean ist!
ausblenden Delphi-Quelltext
1:
if Dummy then ...					

ausblenden Delphi-Quelltext
1:
if not Dummy then ...					

_________________
Markus Kinzler.
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: Sa 11.09.10 18:25 
user profile icontrm:

Erstens gibt es einen Operator in. Du kannst also genauso gut schreiben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if a in [135..9then
begin
  // Ausgeführt wenn a = 1, 3, 5, 6, 7, 8 oder 9
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function IsTrue(a: Byte): Boolean;
begin
  Result := not (a = 0);
end;


und das so einsetzen:

ausblenden Delphi-Quelltext
1:
2:
a := dieapifunktion(arg1, arg2, ..., argn);
bool := IsTrue(a); // bool ist true, wenn a <> 0, und false, wenn a = 0


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Dummy_Int:=irgendeinefunktion(a+b);

if (Dummy_Int = 0or (Dummy_Int = 1or (Dummy_Int = 2or (Dummy_Int = 3or (Dummy_Int = 4or (Dummy_Int = 5then
ShowMessage('0-5')
else if (Dummy_Int = 6or (Dummy_Int = 7or (Dummy_Int = 8or (Dummy_Int = 9or (Dummy_Int = 10then
showmessage('6-10')
else if (Dummy_Int = 11or (Dummy_Int = 12or (Dummy_Int = 13or (Dummy_Int = 15then
ShowMessage('11-13 und 15')
else if (Dummy_Int = 14then
ShowMessage('14')
else
ShowMessage('Nichts von 0-15');


ist doch etwas zu komplex geraten, es ginge auch so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Dummy_Int:=irgendeinefunktion(a+b);

if (Dummy_Int >= 0and (Dummy_Int <= 5then
ShowMessage('0-5')
else if (Dummy_Int >= 6and (Dummy_Int <= 10then
showmessage('6-10')
else if ((Dummy_Int >= 11and (Dummy_Int <= 13)) or (Dummy_Int = 15then
ShowMessage('11-13 und 15')
else if (Dummy_Int = 14then
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
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: Sa 11.09.10 18:37 
Oder so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Dummy_Int:=irgendeinefunktion(a+b);
// 0..5
if Dummy_int in [0..5then
  ShowMessage('0-5')
// 6..10
else if Dummy_int in [6..10then
  showmessage('6-10')
// 1..3, 15
else if Dummy_Int in [11..1315then
  ShowMessage('11-13 und 15')
// 14
else if Dummy_Int = 14 then
   ShowMessage('14')
// sonst
else
  ShowMessage('Nichts von 0-15');
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Sa 11.09.10 18:49 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Oder so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Dummy_Int:=irgendeinefunktion(a+b);
// 0..5
if Dummy_int in [0..5then
  ShowMessage('0-5')
// 6..10
else if Dummy_int in [6..10then
  showmessage('6-10')
// 1..3, 15
else if Dummy_Int in [11..1315then
  ShowMessage('11-13 und 15')
// 14
else if Dummy_Int = 14 then
   ShowMessage('14')
// sonst
else
  ShowMessage('Nichts von 0-15');
Warum in dem Fall nicht case ?
ausblenden Delphi-Quelltext
1:
2:
3:
Case Dummy_Int of
  0..5  : Showmessage('0..5');
  6..19 : Showmessage('6..19');
Henneberg
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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)
ausblenden 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
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.12.10 20:52 
user profile iconHenneberg hat folgendes geschrieben Zum zitierten Posting springen:
if Checkbox1.Checked then Edit3.Visible := true else Edit3.Visible := False;
Wie wäre es mit:
ausblenden Delphi-Quelltext
1:
Edit3.Visible := Checkbox1.Checked;					


user profile iconHenneberg hat folgendes geschrieben Zum zitierten Posting springen:
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



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


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 02.12.10 23:23 
user profile iconmkinzler hat folgendes geschrieben Zum zitierten Posting springen:
CrossPost DP


Unwichtig und unsubstantiiert. Jeder hat das Recht, an verschiedenen Orten nachzufragen. Es sind zudem sogar denkbar, daß nicht dieselbe Person dahintersteckt.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 02.12.10 23:31 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
//
// "if xx=TRUE then" ist identisch mit "if xx then"
//
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 02.12.10 23:45 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
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, user profile iconDelphi-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.