Vergleichen Sie niemals mit Boolean-Konstanten
Ein oft gesehener Fehler: Vergleiche mit false oder (noch schlimmer) true. Vielleicht werden Sie sich nun fragen, was daran falsch sein bzw. wie man das anders machen soll.
Nehmen wir einmal an, Sie haben eine tolle Komponentensammlung im Internet entdeckt und installiert. Diese ruft irgendwelche Win32-API-Funktionen auf, die bei Fehler 0 zurückgeben, ansonsten eine andere Zahl.
Intern könnte das dann beispielweise so aussehen:
Dieses Beispiel ist übrigens ein guter Beweis für die These Murphy lauert überall ;)
function SomeAPIFunc: integer; begin Result := 42; //das könnte jetzt z.B. ein Handle oder etwas in der Art sein end; function BooleanFunc: Boolean; begin Result := Boolean(SomeAPIFunc); end;Sie als Benutzer dieser Komponente möchten nun BooleanFunc auswerten.
procedure TFormTest.ButtonCheckClick(Sender: TObject); var IsTrue: Boolean; begin IsTrue := BooleanFunc; if IsTrue = true then ShowMessage('IsTrue ist true'); if IsTrue then ShowMessage('IsTrue ist zutreffend'); end;Preisfrage: Welche Message(s) wird/werden ausgegeben? Nach der ganzen Vorrede wird es Sie kaum verwundern, dass lediglich die 2. erscheint.
Wieso ist das so?
False und True sind als Konstanten deklariert, wobei False mit 0 und True mit 1 belegt ist. Im obigen Beispiel vergleichen wir also 42 mit 1 auf Gleichheit, was nicht zutrifft. Deshalb wird die 1. Message nicht ausgegeben. Der 2. Vergleich hingegen prüft auf <> 0, deshalb bekommen Sie die 2. Message auch zu Gesicht. Aus diesem Grund wäre auch eine Abfrage auf <> false zulässig, aber das sieht irgendwie unelegant aus, finden Sie nicht? Gut, man könnte einwenden, dass der harte Cast von 42 nach Boolean auch nicht der Weisheit letzter Schluss ist, aber darauf haben wir ja in der angenommenen Situation keinen Einfluss (es sei denn, wir haben den Source und können ihn korrigieren, aber wer will sich in umfangreichen Bibliotheken schon diese Arbeit machen?). Außerdem hat dieses Beispiel ja gezeigt, dass das Problem auf einfache Art und Weise zu umschiffen ist.Merken wir uns daher:
Wir vermeiden generell den Vergleich mit den Boolean-Konstanten. Stattdessen schreiben wir eleganteren und fehlerunanfälligeren Code.if Dings = truewird zu
if Dingsund
if Dings = falsewird zu
if not Dings
Dieses Beispiel ist übrigens ein guter Beweis für die These Murphy lauert überall ;)