-
var i: Шnteger; v: Variant; .... v := 1.5; i := VarAsType(v, varInteger); ...
В данном случае i = 2, а хотелось бы, чтоб генерировалось исключение о несоответствии типов. Можно, конечно, сначала преобразовать значение v в строковое, а потом воспользоваться функцией StrToInt. В этом случае будет генерироваться EConvertError, однако это же исключение будет генерироваться и в случае слишком большого значения v. А функция VarAsType в случае переполнения генерирует EVariantOverflowError.
Вопрос: есть ли стандартный способ правильно сконвертировать значение, чтобы корректно отловить оба типа исключений (переполнение и несоответствие типов) и не городить при этом кучу лишнего кода?
-
> исключение о несоответствии типов
такого исключения нет, суть есть ошибка компиляции
-
if (VarType(v) <> TypeToConvert) then несоответствие типов ?
-
Palladin Под исключением о несоответствии типов я имел в виду что-то типаEConvertError или EVariantTypeCastError.
clickmaker А если у меня v = '1' (строковый), а TypeToConvert = varInteger? В этом случае VarType(v) <> TypeToConvert, но я могу преобразовать v в Integer. Если v = '1,5', то в результате преобразования получу опять 2.
-
ну так и сравни результаты приведения к Integer и Float
-
Gadenysh Точно. Благодарю. А то я как всегда в дебри полез :)
-
raise EConvertError .Create;
-
> Jungle (26.05.08 17:13) > Вопрос: есть ли стандартный способ правильно сконвертировать > значение, чтобы корректно отловить оба типа исключений (переполнение > и несоответствие типов) и не городить при этом кучу лишнего > кода?
function VarToInt(v: variant): Longint;
begin
try
Result := StrToInt(v);
except
on E: EConvertError do
raise EVariantError.CreateFmt('Invalid variant type conversion: %s', [E.Message]);
end;
end;
-- Regards, LVT.
-
> Leonid Troyanovsky © (27.05.08 11:01) [7]
> raise EVariantError.CreateFmt('Invalid variant type > conversion: %s', [E.Message]);
uses SysConst;
raise EVariantError.CreateFmt('%s: %s', [SInvalidVarCast, E.Message]);
-- Regards, LVT.
|