Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - problem mit ''if'' *FERTIG*


G-McKree - Do 15.05.03 19:42
Titel: problem mit ''if'' *FERTIG*
also ich hab eine Stelle im Quelltext und die sieht so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
if BlueDirection = 0 or 2 or 3 or 4 or 5 or 6 or 7 then
  begin
  BlueDirection:= 1;
  Blue.Picture.LoadFromFile(Path + 'BlueUP-LE.bmp');
  end;

BlueDirection (ne real variable) ist aber 0, was bedeutet, das delphi das ausführen muss, was nach ''then'' kommt, macht es aber nicht. Undich wüsste gern warum

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Christian S. - Do 15.05.03 20:27

Auch wenn sich die Sache erledigt hat, könnte es Dir vielleicht helfen, Dir den Beitrag zu IF-Anweisungen in den FAQs zu Object Pascal hier im Forum anzuschauen!

MfG,
Peter


G-McKree - Do 15.05.03 20:49

die frage gilt noch, nur das 2. post war n fehler
wo gibts denn das FAQ? kanns nich finden


Christian S. - Do 15.05.03 20:58

Komisch, der FAQ-Beitrage wurde in die Tutorials verschoben. Hier [http://www.delphi-forum.de/viewtopic.php?t=2971] ist er.

Zu Deiner Frage (die auch in dem Beitrag, der so tut, als wäre er ein FAQ-Beitrag beantwortet wird): mit dem logischen Operator "OR" werden Bool'sche Ausdrücke verknüpft. Also nur Ausdrücke, die zu einem True oder eine False ausgewertet werden können.
Du verknüpfst einen Bool'schen Ausdruck (BlueDirection = 0) mit Integer-Werten (2,3,4, ...). Um dieses Problem zu umgehen, musst Du zusehen, dass Deine gesamte IF-Anweisung nur aus Bool'schen Ausdrücken besteht.
Das Äquivalent zu dem, was Du geschrieben hast, wäre folgendes:

Delphi-Quelltext
1:
if (BlueDirection = 0Or (BlueDirection = 2) ... then                    


Besser wäre aber:

Delphi-Quelltext
1:
IF BlueDirection IN [0,2,3,4,5,6,7then                    


Noch besser:

Delphi-Quelltext
1:
IF BlueDirection IN [0,2..7then                    



MfG,
Peter

//edit: ach ja, könntest Du in Deinem ersten Posting die "quote"-Tags durch "Delphi"-Tags ersetzen? Dann wird der Quellcode besser angezeigt!


Simon Joker - Fr 16.05.03 09:20

@Peter

es ist nicht korrekt, das die logischen Operatoren NUR für bool'sche Ausdrücke gelten. Viel API-Funktionen verwenden Integer-Flags, bei denen jedes Bit eine Bedeutung hat. Um jetzt einzelne Werte zu kombinieren ist es möglicht diese mit OR zu verknüpfen. Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
const
  Flag1=1//bin -> 0001
  Flag2=2//bin -> 0010
  Flag3=4//bin -> 0100
  Flag4=8//bin -> 1000

//Aufruf irgendeiner Funktion mit diesen Flags
...
  MacheWas(Flag1 or Flag3);
  //Die Flags werden bitweise kombiniert:
  //     0001
  // or  0100
  // =   0101
...


Christian S. - Fr 16.05.03 11:53

@Simon Joker: zum einen ging es hier ja um IF-Abfragen. Zum anderen ist die bitweise Verknüpfung, wie Du sie beschreibst, eine Verwendung von OR bei Bool'schen Ausdrücken, eben den einzelnen Bits!


Delete - Sa 17.05.03 07:24

Simon Joker hat folgendes geschrieben:
es ist nicht korrekt, das die logischen Operatoren NUR für bool'sche Ausdrücke gelten.

Doch eigentlich schon. Bei C sieht man den Unterschied. Ein Vergleich wird dort nämlich mit && (and) bzw. || (or) ausgeführt, während du bitweise mit & bzw. | arbeitest.

Bei Delphi heißen die Operatoren zufälligerweise in beiden Fällen and bzw. or, was aber an der Sprache liegt. Den Unterschied gibt es streng genommen also auch hier, man sieht ihn nur nicht. :wink: