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:
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 = true
wird zu
if Dings
und
if Dings = false
wird zu
if not Dings

Dieses Beispiel ist übrigens ein guter Beweis für die These Murphy lauert überall ;)