Zitat von
Muetze1:
Und genau deshalb ergibt Ord(Boolean(True)) immer 1
Das ist ein unsinniger Ausdruck. True ist bereits vom Typ Boolean. Eine Umtypung ist nicht noetig.
Mal genauer:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
B: Boolean;
BB: ByteBool;
WB: WordBool;
LB: LongBool;
begin
B := True;
BB := B;
WB := B;
LB := B;
ShowMessageFmt('%d %d %d %d', [Ord(B), Ord(BB), Ord(WB), Ord(LB)]);
end;
Das ergibt "1 -1 -1 -1".
Damit ist klar das ByteBool, WordBool und LongBool vorzeichenbehaftet sind (trotz ihres Namens).
Bei der Zuweisung von B wird eine Signextension vorgenommen, obwohl Boolean formal vorzeichenlos ist.
Intern wird fuer Boolean True auch definitiv 1 genommen. Aendert man naemlich Ord(B) im oben gezeigten Beispiel in Byte(B),
so wird immer noch "1" ausgegeben.
Der Grund fuer -1 als True in ByteBool etc ist Visual Basic das mit 0 und -1 in einem Long operiert.