Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
ВнизОператор 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c