Конференция "Основная" » "Правильно" преобразовать тип Variant [D7, WinXP]
 
  • Jungle (26.05.08 17:13) [0]
    var
    i: Шnteger;
    v: Variant;
    ....
    v := 1.5;
    i := VarAsType(v, varInteger);
    ...

    В данном случае i = 2, а хотелось бы, чтоб генерировалось исключение о несоответствии типов. Можно, конечно, сначала преобразовать значение v в строковое, а потом воспользоваться функцией StrToInt. В этом случае будет генерироваться EConvertError, однако это же исключение будет генерироваться и в случае слишком большого значения v. А функция VarAsType в случае переполнения генерирует EVariantOverflowError.

    Вопрос: есть ли стандартный способ правильно сконвертировать значение, чтобы корректно отловить оба типа исключений (переполнение и несоответствие типов) и не городить при этом кучу лишнего кода?
  • Palladin © (26.05.08 17:15) [1]

    > исключение о несоответствии типов

    такого исключения нет, суть есть ошибка компиляции
  • clickmaker © (26.05.08 17:21) [2]
    if (VarType(v) <> TypeToConvert) then
     несоответствие типов
    ?
  • Jungle (27.05.08 08:28) [3]
    Palladin
    Под исключением о несоответствии типов я имел в виду что-то типаEConvertError или EVariantTypeCastError.

    clickmaker
    А если у меня v = '1' (строковый), а TypeToConvert = varInteger? В этом случае VarType(v) <> TypeToConvert, но я могу преобразовать v в Integer. Если v = '1,5', то в результате преобразования получу опять 2.
  • Gadenysh (27.05.08 08:39) [4]
    ну так и сравни результаты приведения к Integer и Float
  • Jungle (27.05.08 09:26) [5]
    Gadenysh
    Точно. Благодарю. А то я как всегда в дебри полез :)
  • Anatoly Podgoretsky © (27.05.08 09:39) [6]
    raise EConvertError .Create;
  • Leonid Troyanovsky © (27.05.08 11:01) [7]

    > 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:14) [8]

    > 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.
 
Конференция "Основная" » "Правильно" преобразовать тип Variant [D7, WinXP]
Есть новые Нет новых   [134491   +8][b:0][p:0.001]