Boolean-Variablen Funktionsrückgabewert Properties Boolean-Ausdrücke Kurzschluss?

Object Pascal im Detail - Datentypen www.delphi-treff.de 59 b1 := True; b2 := True; if b1 = b2 then ... wird ausgeführt

4.2.2.1.5. xor

o A ti ale z, e klusi es ode ist u das aus de allge ei e “p a hge au h eka te „e t ede ...ode . Der resultierende Wahrheitswert ist genau dann wahr, wenn entweder der eine oder der andere, nicht aber beide Werte wahr sind also unterschiedlich: var b1, b2: Boolean; begin b1 := True; b2 := True; if b1 xor b2 then ... wird nicht ausgeführt

4.2.2.2. Programmieren mit Boolean-Werten

Genug der grauen Theorie. Sehen wir uns nun einmal an, wo uns beim Programmieren überall Boolean-Werte begegnen:

4.2.2.2.1. Boolean-Variablen

var b: Boolean; Boolean-Variablen werden genauso deklariert, wie Integer und Stringvariablen z.B. auch. Rechnen kann man damit, wie oben beschrieben, mit den Operatoren and, or, not, xor und =. Dabei ist auch die Klammerung wichtig. Also im Zweifelsfall lieber mehr Klammern setzen...

4.2.2.2.2. Funktionsrückgabewert

Viele Funktionen liefern als Ergebnis einen Boolean-Wert zurück. Dieser lässt sich dann auch in einer Variablen speichern: Object Pascal im Detail - Datentypen www.delphi-treff.de 60 var ok: Boolean; begin ok := OpenDialog1.Execute; Execute gibt einen Boolean-Wert zurück oder gleich auswerten: if SaveDialog1.Execute then SaveFile;

4.2.2.2.3. Properties

if CheckBox1.Checked then ...

4.2.2.2.4. Boolean-Ausdrücke

if a b then DoSth; a b ist hierbei ein Boolean-Ausdruck. Dieser ist genau dann True, wenn a größer als b ist... ;- 4.2.2.2.5. Kurzschluss? Zur Auswertung von Boolean-Ausdrücken ist noch Folgendes zu sagen: Bei if a and b then wird u.U. b gar nicht mehr geprüft, wenn a schon false ist. Ebenso ist es mit if a or b Hier wird die Auswertung unterbrochen, wenn a schon true ist. Dieses Verhalten wird manchmal Kurzschluss- Auswertung short-circuit evaluation genannt. In den Projektoptionen Projekt--Optionen--Compiler-- Vollst. Boolesche Auswertung kann man dieses Verhalten abstellen. Dies ist jedoch nicht zu empfehlen, da die VCL diese teilweise recht ausgiebig nutzt. Über entsprechende Compiler-Direktiven lässt sich die Kurzschlussauswertung auch für bestimmte Code-Teile separat ausschalten: {B} Vollständige Auswertung {B-} Kurzschluss-Auswertung; default Am einfachsten und übersichtlichsten ist es jedoch, wenn man entsprechende If-Anweisungen einfach schachtelt: if AssignedObjekt then begin Object Pascal im Detail - Datentypen www.delphi-treff.de 61 if Objekt.Eigenschaft then begin ... end; end; statt if AssignedObjekt and Objekt.Eigenschaft then begin ... end; So ist auf jeden Fall sicher gestellt, dass auf das Objekt nur zugegriffen wird, wenn dieses auch wirklich existiert... 4.2.2.3. Typische Anfängerfehler Viele Anfänger haben so ihre Probleme mit den Boolean-Werten. Die wichtigsten Anfänger-Fehler seien hier einmal genannt, damit man auch gleich lernen kann, sie zu vermeiden. 4.2.2.3.1. Doppelt gemoppelt hält besser if FileExistsFileName = True then ... oder if FileExistsFileName = False then ... oder var b := Boolean; begin b := True; if b = True then ... Das alles ist ... falsch, wenn es auch in den meisten Fällen funktioniert. Warum ist es nun falsch? Das hat im Großen und Ganzen zwei Gründe. Der einleuchtendste zuerst: Ein Boolean ist bereits Boolean. Man schreibt ja auch nicht: if a b = True then Es ist ei fa h „doppelt ge oppelt . Für den zweiten Grund gibts erst einmal ein Codebeispiel: Object Pascal im Detail - Datentypen www.delphi-treff.de 62 Diese Funktion soll das Verhalten mancher WinAPI-Funktionen imitieren: function GaaanzFieseAPIFunktion: Boolean; asm mov eax, -01 end; procedure TForm1.Button1ClickSender: TObject; begin if GaaanzFieseAPIFunktion = True then ShowMessage Pech gehabt. Mich sieht man gar nicht ; if GaaanzFieseAPIFunktion then ShowMessage Hallo ; end; Nanu, was passiert denn hier? Es wird ja wirklich nur die zweite Message angezeigt... Das hängt mit der internen Darstellung zusammen. Ein Boolean wird als ganzes Byte gespeichert einzelne Bits lassen sich nicht direkt speichern. Nun hat aber ein Byte 256 mögliche Werte und nicht nur 2. Es gibt nun ziemlich viele Möglichkeiten, wie man einen Boolean in einem Byte kodieren kann. Nicht alle sind sinnvoll, aber es gibt immerhin mehrere sinnvolle Möglichkeiten. In Delphi ist False 0 und 1 ist True, wobei alles andere erstmal nicht vorgesehen ist. Das ist aber nicht überall so. Andere Programmiersprachen, Frameworks, APIs Co. könnten Boolean-Werte ganz anders kodieren und tun dies auch. Sobald man also mit irgendetwas in Berührung kommt, was nicht 100 Delphi ist, muss man vorsichtig sein. Und das ist schneller passiert als man vielleicht vermutet. Z.B. dann, wenn man auf WinAPI-Funktionen zugreift. Und genau das simuliert dieser Quelltext. Die Dummy-API-Funktion liefert -1 also für die WinApi True zurück. Da aber -1 1 True ist, funktioniert das nicht ganz so, wie vielleicht gewünscht[4]. Wie macht mans also richtig? statt if FileExistsFileName = True then ganz einfach if FileExistsFileName then statt if FileExistsFileName = False then richtig: if not FileExistsFileName then var b := Boolean; begin b := True; statt if b = True then Object Pascal im Detail - Datentypen www.delphi-treff.de 63 richtig: if b then 4.2.2.3.2. für was denn not?