Wenn es Ordinal (varSmallInt, varInteger, varBoolean, varShortInt, varByte, varWord, varUInt32, varInt64 oder varUInt64) ist, dann kann es niemals Empty oder Null (varEmpty oder varNull) sein.
Nunja, ein UInt32, Int64 oder UInt64 darin wird in den Integer (Int32) nicht rein passen.
Delphi-Quellcode:
var
V: Variant;
i: Integer;
begin
V := Int64(1234567890123);
if VarIsOrdinal(V) then
i := V
else
i := 123;
if i = 0 then ;
end;
Ergibt zwar keinen VarCastError, aber zumindestens ein ERangeError (Fehler bei Bereichsprüfung) kommt raus.
Warum schaust du also nicht selbst etwas in die Funkionen rein und guckst, wo/wann ein CastError geworfen wird?
System.Variants._VarToInteger liefert einen CastError bei Null oder bei einem unpassendem String, aber nichts davon kommt am VarIsOrdinal vorbei.
Fazit: Dein VarIsEmptyOrNull ist dran Schuld, auch wenn niemand weiß was das macht, weil jemand vergaß es zu sagen.