Цитирование из справки Delphi 2007:
Используйте GetEnumName для преобразования перечислимого значения Delphi в символическое имя, которое представляет его в коде.
Это означает, что вы не можете использовать его для этой цели, так как TVarData.VType является не перечисляемым значением, а целым числом, которое установлено в одну из констант в System.pas, которые принимаются из файла Windows SDK wtypes.h . Посмотрите на источник GetEnumName () , он сразу же возвращает строку, содержащую значение целого числа.
Edit:
есть ли другой способ получить строковое представление TVarData.VType
Вы можете определить строковое представление вручную. Во-первых, вы должны знать, что в этом целом числе закодировано несколько битов информации, поэтому простой оператор case или поиск в массиве работать не будут. Младшие 12 битов являются маской типа, а верхние биты кодируют информацию о том, является ли это вектором или типом массива и задан ли он ссылкой или нет. Важные части:
const
varTypeMask = $0FFF;
varArray = $2000;
varByRef = $4000;
Так что вы можете сделать что-то вроде:
function VariantTypeName(const AValue: TVarData): string;
begin
case AValue.VType and varTypeMask of
vtInteger: Result := 'integer';
// ...
end;
if AValue.VType and varArray <> 0 then
Result := 'array of ' + Result;
if AValue.VType and varByRef <> 0 then
Result := Result + ' by ref';
end;