4

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

4

2 回答 2

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 中但可能在您的程序中的代码。

于 2014-07-14T07:09:14.790 回答
2

$0111or是一种自定义变体类型,273已知VarFMTBcd存在于单元中Data.FmtBcd(或FmtBcd旧的 Delphi 版本)。

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

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;
于 2015-03-20T12:48:06.087 回答