VarType(aVariant)= 273(或$ 111)是什么意思?

时间:2014-07-14 06:59:56

标签: delphi delphi-xe5 variants

什么意思是VarType(aVariant) = 273(或$ 111)?它是未记录的变体类型。 VarTypeAsText(aVariant)会返回Expression illegal in evaluator错误。

2 个答案:

答案 0 :(得分:4)

从系统单元的源代码:

const
{ Variant type codes (wtypes.h) }

  varEmpty    = $0000; { vt_empty        0 }
  varNull     = $0001; { vt_null         1 }
  varSmallint = $0002; { vt_i2           2 }
  varInteger  = $0003; { vt_i4           3 }
  varSingle   = $0004; { vt_r4           4 }
  varDouble   = $0005; { vt_r8           5 }
  varCurrency = $0006; { vt_cy           6 }
  varDate     = $0007; { vt_date         7 }
  varOleStr   = $0008; { vt_bstr         8 }
  varDispatch = $0009; { vt_dispatch     9 }
  varError    = $000A; { vt_error       10 }
  varBoolean  = $000B; { vt_bool        11 }
  varVariant  = $000C; { vt_variant     12 }
  varUnknown  = $000D; { vt_unknown     13 }
//varDecimal  = $000E; { vt_decimal     14 } {UNSUPPORTED as of v6.x code base}
//varUndef0F  = $000F; { undefined      15 } {UNSUPPORTED per Microsoft}
  varShortInt = $0010; { vt_i1          16 }
  varByte     = $0011; { vt_ui1         17 }
  varWord     = $0012; { vt_ui2         18 }
  varLongWord = $0013; { vt_ui4         19 }
  varInt64    = $0014; { vt_i8          20 }
  varUInt64   = $0015; { vt_ui8         21 }
  varRecord   = $0024; { VT_RECORD      36 }
{  if adding new items, update Variants' varLast, BaseTypeMap and OpTypeMap }

  varStrArg   = $0048; { vt_clsid        72 }
  varObject   = $0049; {                 73 }
  varUStrArg  = $004A; {                 74 }
  varString   = $0100; { Pascal string  256 } {not OLE compatible }
  varAny      = $0101; { Corba any      257 } {not OLE compatible }
  varUString  = $0102; { Unicode string 258 } {not OLE compatible }
  // custom types range from $110 (272) to $7FF (2047)

请参阅列表最底部的评论。换句话说,$111是自定义变体类型。究竟是什么取决于定义该类型的代码。代码不在RTL中,可能在您的程序中。

答案 1 :(得分:1)

$0111273是一个自定义变体类型,单位VarFMTBcd中的Data.FmtBcd知道(旧版Delphi版本为FmtBcd)。

您可以强制(如果需要)转换为单个类型,如下所示:

PS:这只是一个例子,即验证使用证明。

function GetValue<T>(const AValue: TField): T;
var
  Value : TValue;
begin
  try
    Value := TValue.FromVariant(AValue.AsVariant);
  except
    on E:EVariantTypeCastError do
    begin
      if (TVarData(AValue.AsVariant).VType = VarFMTBcd) then
        Value := TValue.FromVariant(AValue.AsExtended)
      else
        raise;
    end;
  end;
  Result := Value.AsType<T>;
end;

使用:

var
  Price : Currency;
begin
  Price := GetValue<Currency>(Query.FieldByName('Price'));
end;