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

Вниз

Забавная конвертация в 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1276497223
tippa
2010-06-14 10:33
2010.09.12
про 2 потока и общий стринглист


15-1276664088
И. Павел
2010-06-16 08:54
2010.09.12
Самоучители/документация по ABAP и SAP


2-1276534233
akosh12345
2010-06-14 20:50
2010.09.12
Вывод кнопок динамически


2-1276848535
LDV
2010-06-18 12:08
2010.09.12
проверка существования поля в таблицах


2-1276760149
john-s
2010-06-17 11:35
2010.09.12
Не могу добавить данные типа float в mysql