Что означает VarType(aVariant) = 273 (или $111)?

Что означает VarType(aVariant) = 273 (или 111 долларов)? Это недокументированный тип варианта. VarTypeAsText(aVariant) возвращается Expression illegal in evaluator ошибка.

2 ответа

Решение

Из исходного кода системного блока:

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 и предположительно есть в вашей программе.

$0111 или же 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;
Другие вопросы по тегам