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

Вниз

Забавная конвертация в variant е   Найти похожие ветки 

 
bss   (2010-06-15 18:52) [0]

Интересно, почему этот код:

procedure TForm1.FormCreate(Sender: TObject);
var
 v: variant ;
begin
 v := "test" ;
 showmessage(inttostr(5 div v)) ;
end;

Генерирует исключение:
""Could not convert variant of type (String) into type (Boolean)"

Причем, два раза возникает... Забавно )))


 
Плохиш ©   (2010-06-15 18:59) [1]

Почему бы не задать этот вопрос разработчикам?


 
KilkennyCat ©   (2010-06-15 19:02) [2]

Попробуй так и подумай
procedure TForm1.FormCreate(Sender: TObject);
var
v: variant ;
begin
v := "true" ;
showmessage(inttostr(5 div v)) ;
end;


 
Anatoly Podgoretsky ©   (2010-06-15 19:35) [3]

> KilkennyCat  (15.06.2010 19:02:02)  [2]

Смешно 5 div "test"


 
bss   (2010-06-16 11:29) [4]

Ну да, судя по всему он строку приводит к числу через boolean... Вопрос только в том - почему? ))


 
картман ©   (2010-06-16 11:37) [5]


> bss   (15.06.10 18:52)
>
> Интересно, почему этот код:

Интересно, как ты до него додумался?


 
George   (2010-06-16 11:41) [6]


> картман ©   (16.06.10 11:37) [5]

Вещества :)


 
bss   (2010-06-16 12:05) [7]


> Интересно, как ты до него додумался?

я знал, что кто-то задаст этот вопрос ))

Не знаю, сидел думал чего-то и вдруг подумалось - а что будет, если сделать вот так то? Сделал - и получил ))

Причем именно "div", так как если написать: showmessage(inttostr(5 / v)) ; то все нормально, будет исключение приведения к float.

Но вот если "5 div v" - то возникнет исключение ДВА РАЗА (я так подозреваю второе исключение возникает в обработчике первого исключения) и при этом о приведении к boolean ))


 
brother ©   (2010-06-16 12:11) [8]

D6 на код в [0] говорит: Invalid variant type conversion (один раз), что я делаю не так?)


 
brother ©   (2010-06-16 12:13) [9]

и еще:
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;


 
bss   (2010-06-16 12:32) [10]


> что я делаю не так?)

значит, в D6 все ок ))

Я эксперименты проводил на D2006, там как видишь пишут более подробно из чего в чего не получилась конвертация, но с косячками ))


 
brother ©   (2010-06-16 12:36) [11]

uses свой покажи уже... впрочем, дело скорее всего в variants...


 
brother ©   (2010-06-16 12:37) [12]

> Я эксперименты проводил на D2006,

на будущее: не плохо бы это сразу было указать при создании темы...


 
bss   (2010-06-16 13:04) [13]


> uses свой покажи уже... впрочем, дело скорее всего в variants.
> ..

а причем тут uses? )) Он самый стандартный, тут налицо недочет при конвертации. Тем более, что при "5 / div" - все верно...


> на будущее: не плохо бы это сразу было указать при создании
> темы...

ага, забыл. Ну, думаю, в твоем сердце найдется место для прощения )


 
George   (2010-06-16 13:07) [14]


> Тем более, что при "5 / div" - все верно...

вах, а че это? :)


 
12 ©   (2010-06-16 13:09) [15]

на Ёксель еще поделите

 v := CreateOleObject("Excel.Application");
 showmessage(inttostr(5 div v)) ;


 
bss   (2010-06-16 13:10) [16]


> вах, а че это? :)

см. пост  [7]

Очепятался, в смысле если написать:

procedure TForm1.FormCreate(Sender: TObject);
var
 v: variant ;
begin
 v := "test" ;
 showmessage(inttostr(5 / v)) ;
end;


вот тут все верно, ошибка приведения к float.


 
bss   (2010-06-16 13:12) [17]


> на Ёксель еще поделите
>

гыыы )))

Ну на самом деле все верно, пишет "Invalid variant operation", исключение один раз возникает, что логично.


 
Дмитрий С ©   (2010-06-17 06:07) [18]

2010 тот же результат дает:
---------------------------
Project2
---------------------------
Could not convert variant of type (UnicodeString) into type (Boolean)
---------------------------
ОК  
---------------------------

А зло, похоже кроется в Variants:

function VarToIntAsString(const V: TVarData): Integer;
var
 S: WideString;
 LResult: HResult;
begin
 _VarToWStr(S, V);
 LResult := VarI4FromStr(S, VAR_LOCALE_USER_DEFAULT, 0, Result);
 case LResult of
   VAR_OK:; // in this case the OS function has put the value into result
   VAR_TYPEMISMATCH:
     if not TryStrToInt(S, Result) then
       Result := Integer(_VarToBoolean(V));
 else
   VarResultCheck(LResult, V.VType, varInteger);
 end;
end;



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

Форум: "Прочее";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
2-1276760149
john-s
2010-06-17 11:35
2010.09.12
Не могу добавить данные типа float в mysql


15-1273957893
NailMan
2010-05-16 01:11
2010.09.12
Свершилось чудо Маниту


2-1276678632
Desyatnik
2010-06-16 12:57
2010.09.12
Динамические запросы


2-1276357423
DROWSY
2010-06-12 19:43
2010.09.12
2 запроса в Firebird 1.5


15-1276584640
Неокубинец
2010-06-15 10:50
2010.09.12
Автоматизированный загрузчик





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский