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

Вниз

Оператор Is   Найти похожие ветки 

 
TStas ©   (2008-06-29 23:19) [0]

Жизнь сложилась так, что потребовалось хранить в вариантах указатели на объекты. Естественно, что хотелось бы перед использованием проверять, а туда ли, куда нужно, они указывают. Раньше я во-первых, никогда не пользовался просто вариантом, только OLEVariant"ом, а, во-вторых, как-то не задумывался, как же работает оператор Is.
Вот, решил провести простой эксперимент.  Есть окно, на окне SpinEdit и кнопочка. В OnCreate окна написано SpinEdit1.Value := Integer(TstringList.Create); Ну, то есть, создаю список строк, привожу его к целому числу и вписываю в эдит.
А вот дальше. Есть кнопка. Вот ейный обработчик
procedure TForm1.Button1Click(Sender: TObject);
var
 x: TObject;
begin
 x := TObject(SpinEdit1.Value);
 if x is TStringList then ShowMessage("x is TStringList = True") else ShowMessage("x is TStringList = False");
end;
Сейчас получается, что при щелчке на кнопку, если не изменялось значение в СпинЕдите, то выдается Тру, а если изменялось, то возникает ошибка.
Раньше я пробовал писать x: TStringList; Тогда всегда было "Да". Даже если я изменял значения, вписанные в СпинЕдит.
Как же всё-таки Is работает? Ведь, судя по всему, где-то есть класс, и проверяется указатель на него?


 
Игорь Шевченко ©   (2008-06-30 00:32) [1]

Казалось бы причем тут варианты ?


> Раньше я пробовал писать x: TStringList; Тогда всегда было
> "Да"


Потому что компилятор в этом случае генерировал только проверку на nil.
А когда ты объявляешь как TObject, то компилятор генерирует код вызова оператора Is.


 
Palladin ©   (2008-06-30 08:40) [2]


> Сейчас получается, что при щелчке на кнопку, если не изменялось
> значение в СпинЕдите, то выдается Тру, а если изменялось,
>  то возникает ошибка.

не "если не изменялось", а если там 0, что является по совместительству значением Nil

Is - оперирует данными класса объекта


 
ЮЮ ©   (2008-06-30 09:31) [3]

> если не изменялось значение в СпинЕдите, то выдается Тру,
> а если изменялось, то возникает ошибка.


Если изменишь SpinEdit1.Value, то получишь невалидный адрес, который ни в коем случае нельзя приводить к TObject


> Раньше я пробовал писать x: TStringList; Тогда всегда было
> "Да".


Не верю! TSpinEdit от TStringList-а в этом смысле ничем не отличаются.

И, кстати, не одного варианта в эксперименте над вариантами.


 
Игорь Шевченко ©   (2008-06-30 09:36) [4]


> Не верю!


проверь


 
Сергей М. ©   (2008-06-30 10:14) [5]


> потребовалось хранить в вариантах указатели на объекты


Так а зачем же тогда эти эксперименты с приведением указателя к типу Integer ?
Варианты ведь имеют для этой цели вполне подходящий тип - Pointer ..


 
Плохиш ©   (2008-06-30 10:47) [6]


> TStas ©   (29.06.08 23:19)  


> SpinEdit1.Value := Integer(TstringList.Create); Ну, то есть,
>  создаю список строк, привожу его к целому числу и вписываю
> в эдит.
> А вот дальше. Есть кнопка. Вот ейный обработчик
> procedure TForm1.Button1Click(Sender: TObject);
> var
>  x: TObject;
> begin
>  x := TObject(SpinEdit1.Value);
>  if x is TStringList then ShowMessage("x is TStringList
> = True") else ShowMessage("x is TStringList = False");
> end;
> Сейчас получается, что при щелчке на кнопку, если не изменялось
> значение в СпинЕдите, то выдается Тру, а если изменялось,
>  то возникает ошибка.


Что-то мне подсказывает, что это вполне логично...


 
ЮЮ ©   (2008-06-30 11:08) [7]

> [4] Игорь Шевченко ©   (30.06.08 09:36)
> > Не верю!
> проверь


Проверил :) TObject(<битый указатель>) is TStringList тоже даеё ошибку.


 
Игорь Шевченко ©   (2008-06-30 11:18) [8]


> Проверил :) TObject(<битый указатель>) is TStringList тоже
> даеё ошибку.


var x: TStringList;
begin
 x := TStringList(SpinEdit1.Value);
 if x is TstringList then
   ...

вот это проверь


 
ЮЮ ©   (2008-06-30 11:44) [9]

> вот это проверь


Понятно. Так даже не додумался :) Ибо, если ожидается объект одного класса, то и сам is использовать бы не стал, а проверял ьы на 0 (nil).


 
Игорь Шевченко ©   (2008-06-30 12:36) [10]


> Ибо, если ожидается объект одного класса, то и сам is использовать
> бы не стал, а проверял ьы на 0 (nil).


вот компилятор аналогично считает  :)


 
TStas ©   (2008-06-30 23:38) [11]

Да, приведение битого указателя даёт не Фолс, а именно исключение.
Прямое присвоение x(: Variant) := TStringList даёт ошибку. Проблема решена без использования вариантов.
Задача возникла очень просто: была программа, появилась идея к ней кое-что приделать. Так строка превратилась в список строк и появилась идея заменить строку вначале вариантом (успешно сделано), а вариант - списком строк. (Не вышло).


 
Palladin ©   (2008-06-30 23:51) [12]


>приведение битого указателя даёт не Фолс, а именно исключение

какая свежая мысль...


>Задача возникла очень просто: была программа, появилась идея к ней кое-что приделать.

и всем сразу стало понятно при чем здесь варианты...

особенно ясно это стало когда строка размножилась



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

Текущий архив: 2008.07.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
2-1214306045
Тын-Дын
2008-06-24 15:14
2008.07.27
Корректность конструкции при переопределении конструктора


15-1213126413
wl
2008-06-10 23:33
2008.07.27
oracle getting started


15-1212779576
DillerXX
2008-06-06 23:12
2008.07.27
Хорошая капча


2-1214592884
batya-x
2008-06-27 22:54
2008.07.27
Векторная графика


15-1213097229
Заочник-самоучка
2008-06-10 15:27
2008.07.27
Хочу совет