![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оператор 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.