Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];

Вниз

"Правильно" преобразовать тип 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
15-1244734543
12
2009-06-11 19:35
2009.08.09
Кодировка в неком мобильном устройстве + ADOquery


2-1244657306
dnepr
2009-06-10 22:08
2009.08.09
Окно программы виснет


2-1244727308
pest
2009-06-11 17:35
2009.08.09
Вставить из буфера в cxShellListView


15-1244444698
Cerberus
2009-06-08 11:04
2009.08.09
Проблемы локальной сети.


15-1244179520
DelphiN!
2009-06-05 09:25
2009.08.09
Какая какая из мышек произвела действие?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский