Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.09;
Скачать: CL | DM;

Вниз

"Правильно" преобразовать тип Variant   Найти похожие ветки 

 
Jungle   (2008-05-26 17:13) [0]

var
i: Шnteger;
v: Variant;
....
v := 1.5;
i := VarAsType(v, varInteger);
...

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

Вопрос: есть ли стандартный способ правильно сконвертировать значение, чтобы корректно отловить оба типа исключений (переполнение и несоответствие типов) и не городить при этом кучу лишнего кода?


 
Palladin ©   (2008-05-26 17:15) [1]


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

такого исключения нет, суть есть ошибка компиляции


 
clickmaker ©   (2008-05-26 17:21) [2]

if (VarType(v) <> TypeToConvert) then
 несоответствие типов
?


 
Jungle   (2008-05-27 08:28) [3]

Palladin
Под исключением о несоответствии типов я имел в виду что-то типаEConvertError или EVariantTypeCastError.

clickmaker
А если у меня v = "1" (строковый), а TypeToConvert = varInteger? В этом случае VarType(v) <> TypeToConvert, но я могу преобразовать v в Integer. Если v = "1,5", то в результате преобразования получу опять 2.


 
Gadenysh   (2008-05-27 08:39) [4]

ну так и сравни результаты приведения к Integer и Float


 
Jungle   (2008-05-27 09:26) [5]

Gadenysh
Точно. Благодарю. А то я как всегда в дебри полез :)


 
Anatoly Podgoretsky ©   (2008-05-27 09:39) [6]

raise EConvertError .Create;


 
Leonid Troyanovsky ©   (2008-05-27 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 ©   (2008-05-27 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.



Страницы: 1 вся ветка

Текущий архив: 2009.08.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
6-1205611995
art36
2008-03-15 23:13
2009.08.09
Обмен данными с тайм-сервером (сервером точного времени)


11-1204994235
Blackman
2008-03-08 19:37
2009.08.09
[KOL-CE] Есть какие-нибудь библиотеки сжатия для KOL-CE?


8-1196172352
DeadMeat
2007-11-27 17:05
2009.08.09
Щелчки при воспроизведении звука


2-1242669062
winsockuser
2009-05-18 21:51
2009.08.09
WinSock, передача файлов, клиент получает в два раза больше


2-1243594194
DevilDevil
2009-05-29 14:49
2009.08.09
Разные результаты StretchBlt