Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оператор Is


TStas ©   (2008-06-29 23:19:00) 

Жизнь сложилась так, что потребовалось хранить в вариантах указатели на объекты. Естественно, что хотелось бы перед использованием проверять, а туда ли, куда нужно, они указывают. Раньше я во-первых, никогда не пользовался просто вариантом, только 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 работает? Ведь, судя по всему, где-то есть класс, и проверяется указатель на него?


Palladin   (2008-06-30 23:51:00) [1]


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

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


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

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

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


TStas   (2008-06-30 23:38:00) [2]

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


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


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


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


ЮЮ   (2008-06-30 11:44:00) [4]

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


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


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


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


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

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


ЮЮ   (2008-06-30 11:08:00) [6]

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


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


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


> 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 10:14:00) [8]


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


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


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


> Не верю!


проверь


ЮЮ   (2008-06-30 09:31:00) [10]

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


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


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


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

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


Palladin   (2008-06-30 08:40:00) [11]


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

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

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


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

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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо