Форум: "Прочее";
Текущий архив: 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