Home » Tutorials » Object Pascal/RTL » Programmierung mit Boolean-Werten

Programmierung mit Boolean-Werten

Programmieren mit Boolean-Werten

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

Boolean-Variablen

var
  b: Boolean;

Boolean-Variablen werden genau so 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…

Funktionsrückgabewert

Viele Funktionen liefern als Ergebnis einen Boolean-Wert zurück. Dieser lässt sich dann auch in einer Variablen speichern:

var
  ok: Boolean;
begin
  ok := OpenDialog1.Execute; // Execute() gibt einen Boolean-Wert zurück
  // oder gleich auswerten:
  if SaveDialog1.Execute then
    SaveFile;

Properties

if CheckBox1.Checked then
  ...

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… 😉

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 Assigned(Objekt) then
begin
  if Objekt.Eigenschaft then
  begin
     ...
  end;
end;

statt

if (Assigned(Objekt)) 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…