如何在D5中实现VarIsNumeric?

时间:2015-05-20 12:00:03

标签: delphi delphi-5

我已经查看了D2009的来源,但我仍然不确定如何正确在Delphi 5中实现VarIsNumeric(Variants)函数(没有TVarType)。

我现在正在使用它:

function VarIsNumeric(const V: Variant): Boolean;
begin
  Result := VarType(V) in [varSmallInt, varInteger, varBoolean,
                           varByte,
                           varSingle,
                           varDouble];
end;

这是对的吗?

1 个答案:

答案 0 :(得分:5)

测试VarType()返回的值是正确的方法。您只需要确定哪些类型是数字。 Delphi 5与以后的版本具有非常不同的变体支持。实际上,Delphi 6在这方面做了很大的改变。

Delphi 5系统单元中定义的var类型是:

{ Variant type codes (wtypes.h) }
varEmpty    = $0000; { vt_empty       }
varNull     = $0001; { vt_null        }
varSmallint = $0002; { vt_i2          }
varInteger  = $0003; { vt_i4          }
varSingle   = $0004; { vt_r4          }
varDouble   = $0005; { vt_r8          }
varCurrency = $0006; { vt_cy          }
varDate     = $0007; { vt_date        }
varOleStr   = $0008; { vt_bstr        }
varDispatch = $0009; { vt_dispatch    }
varError    = $000A; { vt_error       }
varBoolean  = $000B; { vt_bool        }
varVariant  = $000C; { vt_variant     }
varUnknown  = $000D; { vt_unknown     }
                     { vt_decimal $e  }
                     { undefined  $f  }
                     { vt_i1      $10 }
varByte     = $0011; { vt_ui1         }
                     { vt_ui2     $12 }
                     { vt_ui4     $13 }
                     { vt_i8      $14 }
{ if adding new items, update varLast, BaseTypeMap and OpTypeMap }
varStrArg   = $0048; { vt_clsid    }
varString   = $0100; { Pascal string; not OLE compatible }
varAny      = $0101;
varTypeMask = $0FFF;
varArray    = $2000;
varByRef    = $4000;

在现代Delphi中VarIsNumeric实现为

Result := VarTypeIsOrdinal(AVarType) or VarTypeIsFloat(AVarType);

反过来

function VarTypeIsOrdinal(const AVarType: TVarType): Boolean;
begin
  Result := AVarType in [varSmallInt, varInteger, varBoolean, varShortInt,
                         varByte, varWord, varLongWord, varInt64, varUInt64];
end;

function VarTypeIsFloat(const AVarType: TVarType): Boolean;
begin
  Result := AVarType in [varSingle, varDouble, varCurrency];
end;

现在,在现代德尔福中,TVarType没有任何神秘感。它只是Word的别名:

type
  TVarType = Word;

因此,您肯定可以按照您在问题中提出的方式实施VarIsNumeric。辩论的唯一要点是要测试的var类型。要遵循现代Delphi,您将测试这些类型:

varSmallInt
varInteger
varBoolean
// varShortInt
varByte
// varWord
// varLongWord
// varInt64
// varUInt64
varSingle
varDouble
varCurrency

我已经注释掉了Delphi 5 RTL未定义的值。

如果您希望从可能使用其中某些类型的源接收变体,那么您可能需要定义缺失值并测试它们。缺少的值是:

varShortInt = $0010; { vt_i1          16 }
varWord     = $0012; { vt_ui2         18 }
varLongWord = $0013; { vt_ui4         19 }
varInt64    = $0014; { vt_i8          20 }
varUInt64   = $0015; { vt_ui8         21 }