Главная страница
    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
4-1240171103
9899100
2009-04-19 23:58
2010.09.12
Найти окно по имени и классу из сервиса


2-1276295129
HRustBB
2010-06-12 02:25
2010.09.12
как получить указатель на экземпляр класса


2-1276788915
RET
2010-06-17 19:35
2010.09.12
Помогите с передачей строкового аргумента


15-1276528983
Юрий Зотов
2010-06-14 19:23
2010.09.12
А вот еще один холиварчик по поводу стиля кодинга


15-1276959726
ArtGrek
2010-06-19 19:02
2010.09.12
Protocol





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